about summary refs log tree commit diff
path: root/time/mktime.c
diff options
context:
space:
mode:
authorRoland McGrath <roland@gnu.org>1995-09-18 19:00:32 +0000
committerRoland McGrath <roland@gnu.org>1995-09-18 19:00:32 +0000
commitc22164805d6fed3359e7f606c02974ae53d5e3de (patch)
tree90275c9f8c053c60c4a88d28f8692e67d2dbbefa /time/mktime.c
parentaa9109070f2919ab519de474e00274c9fff5dcff (diff)
downloadglibc-c22164805d6fed3359e7f606c02974ae53d5e3de.tar.gz
glibc-c22164805d6fed3359e7f606c02974ae53d5e3de.tar.xz
glibc-c22164805d6fed3359e7f606c02974ae53d5e3de.zip
Mon Sep 18 12:39:22 1995 Paul Eggert <eggert@twinsun.com>
	* mktime.c (localtime_r): Add substitute if the system doesn't
	provide one.

Mon Sep 18 14:39:20 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>

	* time/gmtime.c (gmtime_r): Define as weak alias.
	* time/localtime.c (localtime_r): Define as weak alias.
	* time/time.h [__USE_REENTRANT] (gmtime_r, localtime_r): Declare them.

	* errno.h: Only define _ERRNO_H #ifndef __need_Emath.
	#undef __need_Emath after including errnos.h.
	[_ERRNO_H]: Protect decls with this.

Sun Sep 17 08:22:12 1995  Paul Eggert  <eggert@twinsun.com>

	Fix mktime so that it does not write over localtime's returned value.
	* localtime.c (__localtime_r): New function, with extra arg
	specifying where to store result.
	(localtime): Use it.
	(_tmbuf): New var.
	* gmtime.c (__gmtime_r, gmtime, _tmbuf): Likewise.
	* mktime.c (__mktime_internal):	Conversion function is now
	__localtime_r style, not localtime style.
	(mktime): Pass __localtime_r, not localtime.
	* timegm.c (timegm): Pass __gmtime_r, not gmtime.
	* offtime.c (__offtime): New arg specifying where to store result.
	* time.h (__mktime_internal, __offtime): Adjust decls accordingly.
	(__gmtime_r, __localtime_r): New decls.

	* time/localtime.c: <stddef.h>, <ctype.h>, <stdio.h>,
	<stdlib.h>, <string.h>: Remove includes.
	<errno.h>: Add include.

	* time/mktime.c, time/time.h, time/timegm.c (__mktime_internal):
	Renamed from _mktime_internal to avoid namespace pollution.

	* time/gmtime.c: Clear tm_isdst.

	* misc/efgcvt_r.c (ecvt_r, fcvt_r): Last arg is size_t, not int.
	* stdlib/stdlib.h (ecvt_r, fcvt_r): Fix type of last arg: make it
	size_t.

	* sysdeps/mach/hurd/fpathconf.c: Call __io_pathconf instead of
	__file_pathconf.
	* sysdeps/mach/hurd/pathconf.c: Likewise.
Diffstat (limited to 'time/mktime.c')
-rw-r--r--time/mktime.c29
1 files changed, 25 insertions, 4 deletions
diff --git a/time/mktime.c b/time/mktime.c
index f86496a941..5b91c15f81 100644
--- a/time/mktime.c
+++ b/time/mktime.c
@@ -217,9 +217,9 @@ do_normalization (tmptr)
 #define BAD_STRUCT_TM ((time_t) -1)
 
 time_t
-_mktime_internal (timeptr, producer)
+__mktime_internal (timeptr, producer)
      struct tm *timeptr;
-     struct tm *(*producer) __P ((const time_t *));
+     struct tm *(*producer) __P ((const time_t *, struct tm *));
 {
   struct tm our_tm;		/* our working space */
   struct tm *me = &our_tm;	/* a pointer to the above */
@@ -276,6 +276,7 @@ _mktime_internal (timeptr, producer)
 
   {
     struct tm *guess_tm;
+    struct tm guess_struct;
     time_t guess = 0;
     time_t distance = 0;
     time_t last_distance = 0;
@@ -288,7 +289,7 @@ _mktime_internal (timeptr, producer)
 
 	times_through_search++;     
       
-	guess_tm = (*producer) (&guess);
+	guess_tm = (*producer) (&guess, &guess_struct);
       
 #ifdef DEBUG
 	if (debugging_enabled)
@@ -399,6 +400,26 @@ _mktime_internal (timeptr, producer)
   return result;
 }
 
+#if ! HAVE_LOCALTIME_R && ! defined (localtime_r)
+#ifdef _LIBC
+#define localtime_r __localtime_r
+#else
+/* Approximate localtime_r as best we can in its absence.  */
+#define localtime_r my_localtime_r /* Avoid clash with system localtime_r.  */
+static struct tm *
+localtime_r (t, tp)
+     const time_t *t;
+     struct tm *tp;
+{ 
+  struct tm *l = localtime (t);
+  if (! l)
+    return NULL;
+  *tp = *l;
+  return tp;
+}
+#endif /* ! _LIBC */
+#endif /* ! HAVE_LOCALTIME_R && ! defined (localtime_r) */
+
 time_t
 #ifdef DEBUG			/* make it work even if the system's
 				   libc has it's own mktime routine */
@@ -408,7 +429,7 @@ mktime (timeptr)
 #endif
      struct tm *timeptr;
 {
-  return _mktime_internal (timeptr, localtime);
+  return __mktime_internal (timeptr, localtime_r);
 }
 
 #ifdef weak_alias