New module 'timegm'.
authorBruno Haible <bruno@clisp.org>
Mon, 1 Sep 2003 17:47:35 +0000 (17:47 +0000)
committerBruno Haible <bruno@clisp.org>
Mon, 1 Sep 2003 17:47:35 +0000 (17:47 +0000)
ChangeLog
MODULES.html.sh
lib/ChangeLog
lib/timegm.c [new file with mode: 0644]
lib/timegm.h [new file with mode: 0644]
m4/ChangeLog
m4/timegm.m4 [new file with mode: 0644]
modules/timegm [new file with mode: 0644]

index a7020e2..714da67 100644 (file)
--- 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.
index 76b705e..5b552b7 100755 (executable)
@@ -1533,6 +1533,7 @@ func_all_modules ()
 
   func_begin_table
   func_module getdate
+  func_module timegm
   func_end_table
 
   element="Input/Output <stdio.h>"
index 82542c8..9f5c07e 100644 (file)
@@ -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.
diff --git a/lib/timegm.c b/lib/timegm.c
new file mode 100644 (file)
index 0000000..a7b953d
--- /dev/null
@@ -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));
+}
diff --git a/lib/timegm.h b/lib/timegm.h
new file mode 100644 (file)
index 0000000..18df981
--- /dev/null
@@ -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
index d973385..1e3ac03 100644 (file)
@@ -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.
diff --git a/m4/timegm.m4 b/m4/timegm.m4
new file mode 100644 (file)
index 0000000..a0ba0e3
--- /dev/null
@@ -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)
+])
diff --git a/modules/timegm b/modules/timegm
new file mode 100644 (file)
index 0000000..34002c4
--- /dev/null
@@ -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