From c22164805d6fed3359e7f606c02974ae53d5e3de Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Mon, 18 Sep 1995 19:00:32 +0000 Subject: Mon Sep 18 12:39:22 1995 Paul Eggert * mktime.c (localtime_r): Add substitute if the system doesn't provide one. Mon Sep 18 14:39:20 1995 Roland McGrath * 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 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: , , , , : Remove includes. : 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. --- time/mktime.c | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) (limited to 'time/mktime.c') 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 -- cgit v1.2.3