diff options
author | Ulrich Drepper <drepper@redhat.com> | 1998-05-20 12:13:55 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 1998-05-20 12:13:55 +0000 |
commit | 5f404e9ae7a7886aa6508fe367441490c291a51a (patch) | |
tree | 36b15dd71fac885dc080e47ab737e4a04524b8eb | |
parent | aba1a7ffb32493410ad88463ff528aa86647394a (diff) |
(__tzfile_compute): Undo last change. Instead take struct tm
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.
-rw-r--r-- | time/tzfile.c | 60 |
1 files changed, 34 insertions, 26 deletions
diff --git a/time/tzfile.c b/time/tzfile.c index dff80dad9b..0a452b632f 100644 --- a/time/tzfile.c +++ b/time/tzfile.c @@ -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) 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; |