changeset 4616:40e97ca1f46c

New module 'timegm'.
author Bruno Haible <bruno@clisp.org>
date Mon, 01 Sep 2003 17:47:35 +0000
parents 4a92cb1cc115
children 90bb5772c4a8
files ChangeLog MODULES.html.sh lib/ChangeLog lib/timegm.c lib/timegm.h m4/ChangeLog m4/timegm.m4 modules/timegm
diffstat 8 files changed, 188 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2003-08-31  Simon Josefsson  <jas@extundo.com>
+
+	* modules/timegm: New file.
+	* MODULES.html.sh (func_all_modules): Add timegm.
+
 2003-08-22  Simon Josefsson  <jas@extundo.com>
 
 	* modules/strndup (Makefile.am): Add strndup.h to lib_SOURCES.
--- a/MODULES.html.sh
+++ b/MODULES.html.sh
@@ -1533,6 +1533,7 @@
 
   func_begin_table
   func_module getdate
+  func_module timegm
   func_end_table
 
   element="Input/Output <stdio.h>"
--- a/lib/ChangeLog
+++ b/lib/ChangeLog
@@ -1,3 +1,8 @@
+2003-08-31  Simon Josefsson  <jas@extundo.com>
+
+	* timegm.h: New file.
+	* timegm.c: New file.  Based on wget-1.8.2/src/http.c:mktime_from_utc.
+
 2003-08-31  Karl Berry  <karl@gnu.org>
 
 	* argp.h: update from libc.
new file mode 100644
--- /dev/null
+++ b/lib/timegm.c
@@ -0,0 +1,96 @@
+/* Convert calendar time to simple time, inverse of mktime.
+   Copyright (C) 1995, 1996, 1997, 1998, 2000, 2001, 2003
+   Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software Foundation,
+   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+
+#if HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+/* Specification.  Get mktime and gmtime declarations.  */
+#include "timegm.h"
+
+/* Converts struct tm to time_t, assuming the data in tm is UTC rather
+   than local timezone.
+
+   mktime is similar but assumes struct tm, also known as the
+   "broken-down" form of time, is in local time zone.  mktime_from_utc
+   uses mktime to make the conversion understanding that an offset
+   will be introduced by the local time assumption.
+
+   mktime_from_utc then measures the introduced offset by applying
+   gmtime to the initial result and applying mktime to the resulting
+   "broken-down" form.  The difference between the two mktime results
+   is the measured offset which is then subtracted from the initial
+   mktime result to yield a calendar time which is the value returned.
+
+   tm_isdst in struct tm is set to 0 to force mktime to introduce a
+   consistent offset (the non DST offset) since tm and tm+o might be
+   on opposite sides of a DST change.
+
+   Some implementations of mktime return -1 for the nonexistent
+   localtime hour at the beginning of DST.  In this event, use
+   mktime(tm - 1hr) + 3600.
+
+   Schematically
+   mktime(tm)   --> t+o
+   gmtime(t+o)  --> tm+o
+   mktime(tm+o) --> t+2o
+   t+o - (t+2o - t+o) = t
+
+   Note that glibc contains a function of the same purpose named
+   `timegm' (reverse of gmtime).  But obviously, it is not universally
+   available, and unfortunately it is not straightforwardly
+   extractable for use here.  Perhaps configure should detect timegm
+   and use it where available.
+
+   Contributed by Roger Beeman <beeman@cisco.com>, with the help of
+   Mark Baushke <mdb@cisco.com> and the rest of the Gurus at CISCO.
+   Further improved by Roger with assistance from Edward J. Sabol
+   based on input by Jamie Zawinski.  */
+
+time_t
+timegm (struct tm *tm)
+{
+  time_t tl, tb;
+  struct tm *tg;
+
+  tl = mktime (tm);
+  if (tl == (time_t) -1)
+    {
+      tm->tm_hour--;
+      tl = mktime (tm);
+      if (tl == (time_t) -1)
+	return (time_t) -1;
+      tl += 3600;
+    }
+#if HAVE_GMTIME_R && HAVE_DECL_GMTIME_R
+  tg = gmtime_r (&tl, tg);
+#else
+  tg = gmtime (&tl);
+#endif
+  tg->tm_isdst = 0;
+  tb = mktime (tg);
+  if (tb == (time_t) -1)
+    {
+      tg->tm_hour--;
+      tb = mktime (tg);
+      if (tb == (time_t) -1)
+	return (time_t) -1;
+      tb += 3600;
+    }
+  return (tl - (tb - tl));
+}
new file mode 100644
--- /dev/null
+++ b/lib/timegm.h
@@ -0,0 +1,31 @@
+/* Convert calendar time to simple time, inverse of mktime.
+   Copyright (C) 2003 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software Foundation,
+   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+
+#ifdef HAVE_TIMEGM
+
+/* Get timegm declaration.  */
+#include <time.h>
+
+#else
+
+/* Get time_t and struct tm.  */
+#include <time.h>
+
+/* Convert calendar time to simple time, inverse of mktime.  */
+extern time_t timegm (struct tm *tm);
+
+#endif
--- a/m4/ChangeLog
+++ b/m4/ChangeLog
@@ -1,3 +1,7 @@
+2003-08-31  Simon Josefsson  <jas@extundo.com>
+
+	* timegm.m4: New file.
+
 2003-08-26  Bruno Haible  <bruno@clisp.org>
 
 	* fnmatch.m4 (_AC_LIBOBJ_FNMATCH): Remove AC_DEFINE of fnmatch here.
new file mode 100644
--- /dev/null
+++ b/m4/timegm.m4
@@ -0,0 +1,25 @@
+# timegm.m4 serial 1
+dnl Copyright (C) 2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+AC_DEFUN([gl_FUNC_TIMEGM],
+[
+  AC_REPLACE_FUNCS(timegm)
+  if test $ac_cv_func_timegm = no; then
+    gl_PREREQ_TIMEGM
+  fi
+])
+
+# Prerequisites of lib/timegm.c.
+AC_DEFUN([gl_PREREQ_TIMEGM], [
+  AC_CHECK_DECLS(gmtime_r,,,[
+#ifdef HAVE_TIME_H
+#include <time.h>
+#endif
+])
+  AC_CHECK_FUNCS(gmtime_r)
+])
new file mode 100644
--- /dev/null
+++ b/modules/timegm
@@ -0,0 +1,21 @@
+Description:
+Convert calendar time to simple time, inverse of mktime.
+
+Files:
+lib/timegm.h
+lib/timegm.c
+m4/timegm.m4
+
+Depends-on:
+
+configure.ac:
+gl_FUNC_TIMEGM
+
+Makefile.am:
+lib_SOURCES += timegm.h
+
+Include:
+"timegm.h"
+
+Maintainer:
+Simon Josefsson