Hash :
d3bc6917
Author :
Date :
2015-07-27T16:41:17
time_rz: port better to MinGW Don't change tzname, as this makes MinGW dump core (Bug#21020). Instead, store the tzname copy in the struct tm_zone object. Problem reported by Eli Zaretskii in: http://bugs.gnu.org/21020#48 * lib/strftime.c [!_LIBC]: * lib/time_rz.c: Include time-internal.h. * lib/strftime.c (strftime_case_) [!HAVE_TM_ZONE]: Infer the zone name from *TZ rather than from TZNAME, doable because *TZ now has a tzname_copy member. * lib/time-internal.h: New file, with contents taken from lib/time_rz.c. It's separate because strftime.c now accesses struct tm_zone members. (struct tm_zone) [HAVE_TZNAME && !HAVE_TM_ZONE]: New member tzname_copy. * lib/time_rz.c (struct tm_zone): Move to time-internal.h. (tzalloc) [HAVE_TZNAME && !HAVE_TM_ZONE]: Initialize tzname_copy member. (save_abbr) [HAVE_TZNAME && !HAVE_TM_ZONE]: Save abbreviation in tzname_copy member. (revert_tz) [HAVE_TZNAME]: Remove no-longer-needed tzname saving. (restore_tzname): Remove; no longer needed. All calls removed. * modules/time_rz (Files): Add lib/time-internal.h.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
/* Time internal interface
Copyright 2015 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, see <http://www.gnu.org/licenses/>. */
/* Written by Paul Eggert. */
/* A time zone rule. */
struct tm_zone
{
/* More abbreviations, should they be needed. Their TZ_IS_SET
members are zero. */
struct tm_zone *next;
#if HAVE_TZNAME && !HAVE_TM_ZONE
/* Copies of recent strings taken from tzname[0] and tzname[1].
The copies are in ABBRS, so that they survive tzset. Null if unknown. */
char *tzname_copy[2];
#endif
/* If nonzero, the rule represents the TZ environment variable set
to the first "abbreviation" (this may be the empty string).
Otherwise, it represents an unset TZ. */
char tz_is_set;
/* A sequence of null-terminated strings packed next to each other.
The strings are followed by an extra null byte. If TZ_IS_SET,
there must be at least one string and the first string (which is
actually a TZ environment value value) may be empty. Otherwise
all strings must be nonempty.
Abbreviations are stored here because otherwise the values of
tm_zone and/or tzname would be dead after changing TZ and calling
tzset. Abbreviations never move once allocated, and are live
until tzfree is called. */
char abbrs[FLEXIBLE_ARRAY_MEMBER];
};