Make read-only array really read-only. Saves a few bytes in the .data segment.
[gnulib.git] / lib / gettimeofday.c
index 59c565c..f2fad8c 100644 (file)
@@ -1,7 +1,9 @@
 /* Work around the bug in some systems whereby gettimeofday clobbers the
    static buffer that localtime uses for it's return value.  The gettimeofday
    function from Mac OS X 10.0.4, i.e. Darwin 1.3.7 has this problem.
-   Copyright (C) 2001 Free Software Foundation, Inc.
+   The tzset replacement is necessary for at least Solaris 2.5, 2.5.1, and 2.6.
+
+   Copyright (C) 2001, 2002, 2003, 2006 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
 
    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.  */
+   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
 
 /* written by Jim Meyering */
 
 #include <config.h>
 
-/* Disable the definition of gettimeofday (from config.h) so we can use
-   the library version.  */
+/* Disable the definitions of these functions (from config.h)
+   so we can use the library versions here.  */
 #undef gettimeofday
+#undef gmtime
+#undef localtime
+#undef tzset
 
 #include <sys/types.h>
 
 #endif
 
 #include <stdlib.h>
-#include "gtod.h"
 
 static struct tm *localtime_buffer_addr;
 
-void
-GTOD_init (void)
+/* This is a wrapper for localtime.  It is used only on systems for which
+   gettimeofday clobbers the static buffer used for localtime's result.
+
+   On the first call, record the address of the static buffer that
+   localtime uses for its result.  */
+
+struct tm *
+rpl_localtime (const time_t *timep)
 {
-  time_t t = 0;
-  localtime_buffer_addr = localtime (&t);
+  struct tm *tm = localtime (timep);
+
+  if (! localtime_buffer_addr)
+    localtime_buffer_addr = tm;
+
+  return tm;
+}
+
+/* Same as above, since gmtime and localtime use the same buffer.  */
+struct tm *
+rpl_gmtime (const time_t *timep)
+{
+  struct tm *tm = gmtime (timep);
+
+  if (! localtime_buffer_addr)
+    localtime_buffer_addr = tm;
+
+  return tm;
 }
 
 /* This is a wrapper for gettimeofday.  It is used only on systems for which
@@ -60,8 +86,13 @@ int
 rpl_gettimeofday (struct timeval *tv, struct timezone *tz)
 {
   struct tm save;
+  int result;
+
   if (! localtime_buffer_addr)
-    abort ();
+    {
+      time_t t = 0;
+      localtime_buffer_addr = localtime (&t);
+    }
 
   save = *localtime_buffer_addr;
   result = gettimeofday (tv, tz);
@@ -69,3 +100,23 @@ rpl_gettimeofday (struct timeval *tv, struct timezone *tz)
 
   return result;
 }
+
+/* This is a wrapper for tzset. It is used only on systems for which
+   tzset may clobber the static buffer used for localtime's result.
+   Save and restore the contents of the buffer used for localtime's
+   result around the call to tzset.  */
+void
+rpl_tzset (void)
+{
+  struct tm save;
+
+  if (! localtime_buffer_addr)
+    {
+      time_t t = 0;
+      localtime_buffer_addr = localtime (&t);
+    }
+
+  save = *localtime_buffer_addr;
+  tzset ();
+  *localtime_buffer_addr = save;
+}