entered into RCS
authorroland <roland>
Mon, 17 May 1993 00:01:27 +0000 (00:01 +0000)
committerroland <roland>
Mon, 17 May 1993 00:01:27 +0000 (00:01 +0000)
time/localtime.c

index 4466929..3377b80 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 1992 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 1992, 1993 Free Software Foundation, Inc.
 This file is part of the GNU C Library.
 
 The GNU C Library is free software; you can redistribute it and/or
 This file is part of the GNU C Library.
 
 The GNU C Library is free software; you can redistribute it and/or
@@ -36,8 +36,13 @@ Cambridge, MA 02139, USA.  */
 struct tm *
 DEFUN(localtime, (timer), CONST time_t *timer)
 {
 struct tm *
 DEFUN(localtime, (timer), CONST time_t *timer)
 {
-  extern int EXFUN(__tz_compute, (time_t, struct tm));
+  extern int __use_tzfile;
+  extern int EXFUN(__tz_compute, (time_t timer, struct tm *tp));
+  extern int EXFUN(__tzfile_compute, (time_t timer,
+                                     long int *leap_correct, int *leap_hit));
   register struct tm *tp;
   register struct tm *tp;
+  long int leap_correction;
+  int leap_extra_secs;
 
   if (timer == NULL)
     {
 
   if (timer == NULL)
     {
@@ -45,14 +50,33 @@ DEFUN(localtime, (timer), CONST time_t *timer)
       return NULL;
     }
 
       return NULL;
     }
 
-  tp = gmtime(timer);
-  if (tp == NULL)
-    return NULL;
+  {
+    /* Make sure the database is initialized.  */
+    extern int __tzset_run;
+    if (! __tzset_run)
+      __tzset ();
+  }
 
 
-  if (!__tz_compute (*timer, *tp))
-    return NULL;
+  if (__use_tzfile)
+    {
+      if (! __tzfile_compute (*timer, &leap_correction, &leap_extra_secs))
+       return NULL;
+    }
+  else
+    {
+      tp = gmtime (timer);
+      if (tp == NULL)
+       return NULL;
+
+      if (! __tz_compute (*timer, tp))
+       return NULL;
+
+      leap_correction = 0L;
+      leap_extra_secs = 0;
+    }
 
 
-  tp = __offtime(timer, __timezone);
+  tp = __offtime (timer, __timezone - leap_correction);
+  tp->tm_sec += leap_extra_secs;
   tp->tm_isdst = __daylight;
   tp->tm_gmtoff = __timezone;
   tp->tm_zone = __tzname[__daylight];
   tp->tm_isdst = __daylight;
   tp->tm_gmtoff = __timezone;
   tp->tm_zone = __tzname[__daylight];