mirror of
git://sourceware.org/git/glibc.git
synced 2025-04-06 14:10:30 +08:00
(__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.
This commit is contained in:
parent
aba1a7ffb3
commit
5f404e9ae7
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user