]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
(__tzfile_compute): Undo last change. Instead take struct tm
authorUlrich Drepper <drepper@redhat.com>
Wed, 20 May 1998 12:13:55 +0000 (12:13 +0000)
committerUlrich Drepper <drepper@redhat.com>
Wed, 20 May 1998 12:13:55 +0000 (12:13 +0000)
parameter and set tm_isdst, tm_zone and tm_offset if use_localtime.
(__tzfile_compute): Take new arguments.  Store
DST information and offset in them.

time/tzfile.c

index dff80dad9b3bf3baa6f041f4767e790664b2f150..0a452b632f90264fafb103e2e6f2f63380f201df 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 92, 93, 95, 96, 97 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 92, 93, 95, 96, 97, 98 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
@@ -54,6 +54,8 @@ static unsigned char *type_idxs = NULL;
 static size_t num_types;
 static struct ttinfo *types = NULL;
 static char *zone_names = NULL;
+static long int rule_stdoff;
+static long int rule_dstoff;
 static size_t num_leaps;
 static struct leap *leaps = NULL;
 
@@ -88,7 +90,6 @@ __tzfile_read (const char *file)
   struct tzhead tzhead;
   size_t chars;
   register size_t i;
-  struct ttinfo *info;
 
   __use_tzfile = 0;
 
@@ -266,15 +267,32 @@ __tzfile_read (const char *file)
 
   fclose (f);
 
-  info = find_transition (0);
+  /* Find the standard and daylight time offsets used by the rule file.
+     We choose the offsets in the types of each flavor that are
+     transitioned to earliest in time.  */
+  __tzname[1] = NULL;
   for (i = 0; i < num_types && i < sizeof (__tzname) / sizeof (__tzname[0]);
        ++i)
     __tzname[types[i].isdst] = __tzstring (&zone_names[types[i].idx]);
-  if (info->isdst < sizeof (__tzname) / sizeof (__tzname[0]))
-    __tzname[info->isdst] = __tzstring (&zone_names[info->idx]);
+  if (__tzname[1] == NULL)
+    __tzname[1] = __tzname[0];
 
   compute_tzname_max (chars);
 
+  rule_stdoff = rule_dstoff = 0;
+  for (i = 0; i < num_transitions; ++i)
+    {
+      if (!rule_stdoff && !types[type_idxs[i]].isdst)
+       rule_stdoff = types[type_idxs[i]].offset;
+      if (!rule_dstoff && types[type_idxs[i]].isdst)
+       rule_dstoff = types[type_idxs[i]].offset;
+      if (rule_stdoff && rule_dstoff)
+       break;
+    }
+
+  __daylight = rule_stdoff != rule_dstoff;
+  __timezone = -rule_stdoff;
+
   __use_tzfile = 1;
   return;
 
@@ -291,7 +309,6 @@ __tzfile_default (const char *std, const char *dst,
                  long int stdoff, long int dstoff)
 {
   size_t stdlen, dstlen, i;
-  long int rule_offset, rule_stdoff, rule_dstoff;
   int isdst;
 
   __tzfile_read (TZDEFRULES);
@@ -319,24 +336,9 @@ __tzfile_default (const char *std, const char *dst,
   memcpy (zone_names, std, stdlen);
   memcpy (&zone_names[stdlen], dst, dstlen);
 
-  /* Find the standard and daylight time offsets used by the rule file.
-     We choose the offsets in the types of each flavor that are
-     transitioned to earliest in time.  */
-  rule_stdoff = rule_dstoff = 0;
-  for (i = 0; i < num_transitions; ++i)
-    {
-      if (!rule_stdoff && !types[type_idxs[i]].isdst)
-       rule_stdoff = types[type_idxs[i]].offset;
-      if (!rule_dstoff && types[type_idxs[i]].isdst)
-       rule_dstoff = types[type_idxs[i]].offset;
-      if (rule_stdoff && rule_dstoff)
-       break;
-    }
-
   /* Now correct the transition times for the user-specified standard and
      daylight offsets from GMT.  */
   isdst = 0;
-  rule_offset = rule_offset;
   for (i = 0; i < num_transitions; ++i)
     {
       struct ttinfo *trans_type = &types[type_idxs[i]];
@@ -412,21 +414,27 @@ find_transition (time_t timer)
 \f
 int
 __tzfile_compute (time_t timer, int use_localtime,
-                 long int *leap_correct, int *leap_hit)
+                 long int *leap_correct, int *leap_hit,
+                 struct tm *tp)
 {
   register size_t i;
 
   if (use_localtime)
     {
       struct ttinfo *info = find_transition (timer);
-      __daylight = info->isdst;
-      __timezone = -info->offset;
+      __daylight = rule_stdoff != rule_dstoff;
+      __timezone = -rule_stdoff;
+      __tzname[1] = NULL;
       for (i = 0;
           i < num_types && i < sizeof (__tzname) / sizeof (__tzname[0]);
           ++i)
        __tzname[types[i].isdst] = &zone_names[types[i].idx];
-      if (info->isdst < sizeof (__tzname) / sizeof (__tzname[0]))
-       __tzname[info->isdst] = &zone_names[info->idx];
+      if (__tzname[1] == NULL)
+       /* There is no daylight saving time.  */
+       __tzname[1] = __tzname[0];
+      tp->tm_isdst = info->isdst;
+      tp->tm_zone = &zone_names[info->idx];
+      tp->tm_gmtoff = info->offset;
     }
 
   *leap_correct = 0L;