diff options
| author | Joseph Myers <joseph@codesourcery.com> | 2018-12-10 13:11:58 +0000 |
|---|---|---|
| committer | Joseph Myers <joseph@codesourcery.com> | 2018-12-10 13:11:58 +0000 |
| commit | 0afcb29d50312409f0b698001d1ee2b535d06a3c (patch) | |
| tree | 810bf1bbcabd4ad6cc535fb15de39c22b7aeac2e /timezone | |
| parent | b93f4052fc171f456c8f594d4ae4aeb02ec5b3b6 (diff) | |
| download | glibc-0afcb29d50312409f0b698001d1ee2b535d06a3c.tar.xz glibc-0afcb29d50312409f0b698001d1ee2b535d06a3c.zip | |
Update timezone code from tzcode 2018g.
This patch updates files coming from tzcode to the versions in tzcode
2018g. No changes elsewhere in glibc were needed.
Tested for x86_64.
* timezone/private.h: Update from tzcode 2018g.
* timezone/tzfile.h: Likewise.
* timezone/tzselect.ksh: Likewise.
* timezone/zdump.c: Likewise.
* timezone/zic.c: Likewise.
Diffstat (limited to 'timezone')
| -rw-r--r-- | timezone/private.h | 236 | ||||
| -rw-r--r-- | timezone/tzfile.h | 6 | ||||
| -rwxr-xr-x | timezone/tzselect.ksh | 33 | ||||
| -rw-r--r-- | timezone/zdump.c | 131 | ||||
| -rw-r--r-- | timezone/zic.c | 530 |
5 files changed, 599 insertions, 337 deletions
diff --git a/timezone/private.h b/timezone/private.h index e2f23f5f40..1ead14793b 100644 --- a/timezone/private.h +++ b/timezone/private.h @@ -1,3 +1,5 @@ +/* Private header for tzdb code. */ + #ifndef PRIVATE_H #define PRIVATE_H @@ -15,6 +17,16 @@ ** Thank you! */ +/* +** zdump has been made independent of the rest of the time +** conversion package to increase confidence in the verification it provides. +** You can use zdump to help in verifying other implementations. +** To do this, compile with -DUSE_LTZ=0 and link without the tz library. +*/ +#ifndef USE_LTZ +# define USE_LTZ 1 +#endif + /* This string was in the Factory zone through version 2016f. */ #define GRANDPARENTED "Local time zone must be set--see zic manual page" @@ -27,13 +39,28 @@ #define HAVE_DECL_ASCTIME_R 1 #endif +#if !defined HAVE_GENERIC && defined __has_extension +# if __has_extension(c_generic_selections) +# define HAVE_GENERIC 1 +# else +# define HAVE_GENERIC 0 +# endif +#endif +/* _Generic is buggy in pre-4.9 GCC. */ +#if !defined HAVE_GENERIC && defined __GNUC__ +# define HAVE_GENERIC (4 < __GNUC__ + (9 <= __GNUC_MINOR__)) +#endif +#ifndef HAVE_GENERIC +# define HAVE_GENERIC (201112 <= __STDC_VERSION__) +#endif + #ifndef HAVE_GETTEXT #define HAVE_GETTEXT 0 #endif /* !defined HAVE_GETTEXT */ #ifndef HAVE_INCOMPATIBLE_CTIME_R #define HAVE_INCOMPATIBLE_CTIME_R 0 -#endif /* !defined INCOMPATIBLE_CTIME_R */ +#endif #ifndef HAVE_LINK #define HAVE_LINK 1 @@ -43,10 +70,18 @@ #define HAVE_POSIX_DECLS 1 #endif +#ifndef HAVE_STDBOOL_H +#define HAVE_STDBOOL_H (199901 <= __STDC_VERSION__) +#endif + #ifndef HAVE_STRDUP #define HAVE_STRDUP 1 #endif +#ifndef HAVE_STRTOLL +#define HAVE_STRTOLL 1 +#endif + #ifndef HAVE_SYMLINK #define HAVE_SYMLINK 1 #endif /* !defined HAVE_SYMLINK */ @@ -76,13 +111,23 @@ #define ctime_r _incompatible_ctime_r #endif /* HAVE_INCOMPATIBLE_CTIME_R */ -/* Enable tm_gmtoff and tm_zone on GNUish systems. */ +/* Enable tm_gmtoff, tm_zone, and environ on GNUish systems. */ #define _GNU_SOURCE 1 /* Fix asctime_r on Solaris 11. */ #define _POSIX_PTHREAD_SEMANTICS 1 /* Enable strtoimax on pre-C99 Solaris 11. */ #define __EXTENSIONS__ 1 +/* To avoid having 'stat' fail unnecessarily with errno == EOVERFLOW, + enable large files on GNUish systems ... */ +#ifndef _FILE_OFFSET_BITS +# define _FILE_OFFSET_BITS 64 +#endif +/* ... and on AIX ... */ +#define _LARGE_FILES 1 +/* ... and enable large inode numbers on Mac OS X 10.5 and later. */ +#define _DARWIN_USE_64_BIT_INODE 1 + /* ** Nested includes */ @@ -105,7 +150,6 @@ #undef tzfree #include <sys/types.h> /* for time_t */ -#include <stdio.h> #include <string.h> #include <limits.h> /* for CHAR_BIT et al. */ #include <stdlib.h> @@ -126,19 +170,8 @@ #include <libintl.h> #endif /* HAVE_GETTEXT */ -#if HAVE_SYS_WAIT_H -#include <sys/wait.h> /* for WIFEXITED and WEXITSTATUS */ -#endif /* HAVE_SYS_WAIT_H */ - -#ifndef WIFEXITED -#define WIFEXITED(status) (((status) & 0xff) == 0) -#endif /* !defined WIFEXITED */ -#ifndef WEXITSTATUS -#define WEXITSTATUS(status) (((status) >> 8) & 0xff) -#endif /* !defined WEXITSTATUS */ - #if HAVE_UNISTD_H -#include <unistd.h> /* for F_OK, R_OK, and other POSIX goodness */ +#include <unistd.h> /* for R_OK, and other POSIX goodness */ #endif /* HAVE_UNISTD_H */ #ifndef HAVE_STRFTIME_L @@ -149,9 +182,22 @@ # endif #endif -#ifndef F_OK -#define F_OK 0 -#endif /* !defined F_OK */ +#ifndef USG_COMPAT +# ifndef _XOPEN_VERSION +# define USG_COMPAT 0 +# else +# define USG_COMPAT 1 +# endif +#endif + +#ifndef HAVE_TZNAME +# if _POSIX_VERSION < 198808 && !USG_COMPAT +# define HAVE_TZNAME 0 +# else +# define HAVE_TZNAME 1 +# endif +#endif + #ifndef R_OK #define R_OK 4 #endif /* !defined R_OK */ @@ -236,15 +282,19 @@ typedef int int_fast32_t; #ifndef INTMAX_MAX # ifdef LLONG_MAX typedef long long intmax_t; -# define strtoimax strtoll +# if HAVE_STRTOLL +# define strtoimax strtoll +# endif # define INTMAX_MAX LLONG_MAX # define INTMAX_MIN LLONG_MIN # else typedef long intmax_t; -# define strtoimax strtol # define INTMAX_MAX LONG_MAX # define INTMAX_MIN LONG_MIN # endif +# ifndef strtoimax +# define strtoimax strtol +# endif #endif #ifndef PRIdMAX @@ -294,12 +344,14 @@ typedef unsigned long uintmax_t; #define SIZE_MAX ((size_t) -1) #endif -#if 2 < __GNUC__ + (96 <= __GNUC_MINOR__) +#if 3 <= __GNUC__ # define ATTRIBUTE_CONST __attribute__ ((const)) +# define ATTRIBUTE_MALLOC __attribute__ ((__malloc__)) # define ATTRIBUTE_PURE __attribute__ ((__pure__)) # define ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec)) #else # define ATTRIBUTE_CONST /* empty */ +# define ATTRIBUTE_MALLOC /* empty */ # define ATTRIBUTE_PURE /* empty */ # define ATTRIBUTE_FORMAT(spec) /* empty */ #endif @@ -326,6 +378,16 @@ typedef unsigned long uintmax_t; #ifndef EPOCH_OFFSET # define EPOCH_OFFSET 0 #endif +#ifndef RESERVE_STD_EXT_IDS +# define RESERVE_STD_EXT_IDS 0 +#endif + +/* If standard C identifiers with external linkage (e.g., localtime) + are reserved and are not already being renamed anyway, rename them + as if compiling with '-Dtime_tz=time_t'. */ +#if !defined time_tz && RESERVE_STD_EXT_IDS && USE_LTZ +# define time_tz time_t +#endif /* ** Compile with -Dtime_tz=T to build the tz package with a private @@ -335,6 +397,12 @@ typedef unsigned long uintmax_t; ** typical platforms. */ #if defined time_tz || EPOCH_LOCAL || EPOCH_OFFSET != 0 +# define TZ_TIME_T 1 +#else +# define TZ_TIME_T 0 +#endif + +#if TZ_TIME_T # ifdef LOCALTIME_IMPLEMENTATION static time_t sys_time(time_t *x) { return time(x); } # endif @@ -367,6 +435,8 @@ typedef time_tz tz_time_t; # define posix2time tz_posix2time # undef posix2time_z # define posix2time_z tz_posix2time_z +# undef strftime +# define strftime tz_strftime # undef time # define time tz_time # undef time2posix @@ -389,10 +459,34 @@ typedef time_tz tz_time_t; # define tzset tz_tzset # undef tzsetwall # define tzsetwall tz_tzsetwall +# if HAVE_STRFTIME_L +# undef strftime_l +# define strftime_l tz_strftime_l +# endif +# if HAVE_TZNAME +# undef tzname +# define tzname tz_tzname +# endif +# if USG_COMPAT +# undef daylight +# define daylight tz_daylight +# undef timezone +# define timezone tz_timezone +# endif +# ifdef ALTZONE +# undef altzone +# define altzone tz_altzone +# endif char *ctime(time_t const *); char *ctime_r(time_t const *, char *); -double difftime(time_t, time_t); +double difftime(time_t, time_t) ATTRIBUTE_CONST; +size_t strftime(char *restrict, size_t, char const *restrict, + struct tm const *restrict); +# if HAVE_STRFTIME_L +size_t strftime_l(char *restrict, size_t, char const *restrict, + struct tm const *restrict, locale_t); +# endif struct tm *gmtime(time_t const *); struct tm *gmtime_r(time_t const *restrict, struct tm *restrict); struct tm *localtime(time_t const *); @@ -406,18 +500,29 @@ void tzset(void); extern char *asctime_r(struct tm const *restrict, char *restrict); #endif -#if !HAVE_POSIX_DECLS -# ifdef USG_COMPAT -# ifndef timezone +#ifndef HAVE_DECL_ENVIRON +# if defined environ || defined __USE_GNU +# define HAVE_DECL_ENVIRON 1 +# else +# define HAVE_DECL_ENVIRON 0 +# endif +#endif + +#if !HAVE_DECL_ENVIRON +extern char **environ; +#endif + +#if TZ_TIME_T || !HAVE_POSIX_DECLS +# if HAVE_TZNAME +extern char *tzname[]; +# endif +# if USG_COMPAT extern long timezone; -# endif -# ifndef daylight extern int daylight; -# endif # endif #endif -#if defined ALTZONE && !defined altzone +#ifdef ALTZONE extern long altzone; #endif @@ -427,25 +532,25 @@ extern long altzone; */ #ifdef STD_INSPIRED -# if !defined tzsetwall || defined time_tz +# if TZ_TIME_T || !defined tzsetwall void tzsetwall(void); # endif -# if !defined offtime || defined time_tz +# if TZ_TIME_T || !defined offtime struct tm *offtime(time_t const *, long); # endif -# if !defined timegm || defined time_tz +# if TZ_TIME_T || !defined timegm time_t timegm(struct tm *); # endif -# if !defined timelocal || defined time_tz +# if TZ_TIME_T || !defined timelocal time_t timelocal(struct tm *); # endif -# if !defined timeoff || defined time_tz +# if TZ_TIME_T || !defined timeoff time_t timeoff(struct tm *, long); # endif -# if !defined time2posix || defined time_tz +# if TZ_TIME_T || !defined time2posix time_t time2posix(time_t); # endif -# if !defined posix2time || defined time_tz +# if TZ_TIME_T || !defined posix2time time_t posix2time(time_t); # endif #endif @@ -479,10 +584,10 @@ time_t mktime_z(timezone_t restrict, struct tm *restrict); timezone_t tzalloc(char const *); void tzfree(timezone_t); # ifdef STD_INSPIRED -# if !defined posix2time_z || defined time_tz +# if TZ_TIME_T || !defined posix2time_z time_t posix2time_z(timezone_t, time_t) ATTRIBUTE_PURE; # endif -# if !defined time2posix_z || defined time_tz +# if TZ_TIME_T || !defined time2posix_z time_t time2posix_z(timezone_t, time_t) ATTRIBUTE_PURE; # endif # endif @@ -492,12 +597,12 @@ time_t time2posix_z(timezone_t, time_t) ATTRIBUTE_PURE; ** Finally, some convenience items. */ -#if __STDC_VERSION__ < 199901 +#if HAVE_STDBOOL_H +# include <stdbool.h> +#else # define true 1 # define false 0 # define bool int -#else -# include <stdbool.h> #endif #define TYPE_BIT(type) (sizeof (type) * CHAR_BIT) @@ -513,27 +618,32 @@ time_t time2posix_z(timezone_t, time_t) ATTRIBUTE_PURE; #define MINVAL(t, b) \ ((t) (TYPE_SIGNED(t) ? - TWOS_COMPLEMENT(t) - MAXVAL(t, b) : 0)) -/* The minimum and maximum finite time values. This implementation - assumes no padding if time_t is signed and either the compiler is - pre-C11 or time_t is not one of the standard signed integer types. */ -#if 201112 <= __STDC_VERSION__ -static time_t const time_t_min - = (TYPE_SIGNED(time_t) - ? _Generic((time_t) 0, - signed char: SCHAR_MIN, short: SHRT_MIN, - int: INT_MIN, long: LONG_MIN, long long: LLONG_MIN, - default: MINVAL(time_t, TYPE_BIT(time_t))) - : 0); -static time_t const time_t_max - = (TYPE_SIGNED(time_t) - ? _Generic((time_t) 0, - signed char: SCHAR_MAX, short: SHRT_MAX, - int: INT_MAX, long: LONG_MAX, long long: LLONG_MAX, - default: MAXVAL(time_t, TYPE_BIT(time_t))) - : -1); +/* The extreme time values, assuming no padding. */ +#define TIME_T_MIN_NO_PADDING MINVAL(time_t, TYPE_BIT(time_t)) +#define TIME_T_MAX_NO_PADDING MAXVAL(time_t, TYPE_BIT(time_t)) + +/* The extreme time values. These are macros, not constants, so that + any portability problem occur only when compiling .c files that use + the macros, which is safer for applications that need only zdump and zic. + This implementation assumes no padding if time_t is signed and + either the compiler lacks support for _Generic or time_t is not one + of the standard signed integer types. */ +#if HAVE_GENERIC +# define TIME_T_MIN \ + _Generic((time_t) 0, \ + signed char: SCHAR_MIN, short: SHRT_MIN, \ + int: INT_MIN, long: LONG_MIN, long long: LLONG_MIN, \ + default: TIME_T_MIN_NO_PADDING) +# define TIME_T_MAX \ + (TYPE_SIGNED(time_t) \ + ? _Generic((time_t) 0, \ + signed char: SCHAR_MAX, short: SHRT_MAX, \ + int: INT_MAX, long: LONG_MAX, long long: LLONG_MAX, \ + default: TIME_T_MAX_NO_PADDING) \ + : (time_t) -1) #else -static time_t const time_t_min = MINVAL(time_t, TYPE_BIT(time_t)); -static time_t const time_t_max = MAXVAL(time_t, TYPE_BIT(time_t)); +# define TIME_T_MIN TIME_T_MIN_NO_PADDING +# define TIME_T_MAX TIME_T_MAX_NO_PADDING #endif /* @@ -550,7 +660,7 @@ static time_t const time_t_max = MAXVAL(time_t, TYPE_BIT(time_t)); ** INITIALIZE(x) */ -#ifdef lint +#ifdef GCC_LINT # define INITIALIZE(x) ((x) = 0) #else # define INITIALIZE(x) @@ -633,7 +743,7 @@ char *ctime_r(time_t const *, char *); ** or ** isleap(a + b) == isleap(a % 400 + b % 400) ** This is true even if % means modulo rather than Fortran remainder -** (which is allowed by C89 but not C99). +** (which is allowed by C89 but not by C99 or later). ** We use this to avoid addition overflow problems. */ diff --git a/timezone/tzfile.h b/timezone/tzfile.h index 0e51dce1d7..27a38cc74d 100644 --- a/timezone/tzfile.h +++ b/timezone/tzfile.h @@ -1,3 +1,5 @@ +/* Layout and location of TZif files. */ + #ifndef TZFILE_H #define TZFILE_H @@ -20,11 +22,11 @@ */ #ifndef TZDIR -#define TZDIR "/usr/local/etc/zoneinfo" /* Time zone object file directory */ +#define TZDIR "/usr/share/zoneinfo" /* Time zone object file directory */ #endif /* !defined TZDIR */ #ifndef TZDEFAULT -#define TZDEFAULT "localtime" +#define TZDEFAULT "/etc/localtime" #endif /* !defined TZDEFAULT */ #ifndef TZDEFRULES diff --git a/timezone/tzselect.ksh b/timezone/tzselect.ksh index d2c3a6d1dd..18fce27e24 100755 --- a/timezone/tzselect.ksh +++ b/timezone/tzselect.ksh @@ -1,12 +1,11 @@ #!/bin/bash +# Ask the user about the time zone, and output the resulting TZ value to stdout. +# Interact with the user via stderr and stdin. PKGVERSION='(tzcode) ' TZVERSION=see_Makefile REPORT_BUGS_TO=tz@iana.org -# Ask the user about the time zone, and output the resulting TZ value to stdout. -# Interact with the user via stderr and stdin. - # Contributed by Paul Eggert. This file is in the public domain. # Porting notes: @@ -17,9 +16,9 @@ REPORT_BUGS_TO=tz@iana.org # If your host lacks both Bash and the Korn shell, you can get their # source from one of these locations: # -# Bash <http://www.gnu.org/software/bash/bash.html> +# Bash <https://www.gnu.org/software/bash/> # Korn Shell <http://www.kornshell.com/> -# Public Domain Korn Shell <http://www.cs.mun.ca/~michael/pdksh/> +# MirBSD Korn Shell <https://www.mirbsd.org/mksh.htm> # # For portability to Solaris 9 /bin/sh this script avoids some POSIX # features and common extensions, such as $(...) (which works sometimes @@ -29,8 +28,8 @@ REPORT_BUGS_TO=tz@iana.org # If your host lacks awk, or has an old awk that does not conform to Posix, # you can use either of the following free programs instead: # -# Gawk (GNU awk) <http://www.gnu.org/software/gawk/> -# mawk <http://invisible-island.net/mawk/> +# Gawk (GNU awk) <https://www.gnu.org/software/gawk/> +# mawk <https://invisible-island.net/mawk/> # Specify default values for environment variables if they are unset. @@ -55,7 +54,7 @@ location_limit=10 zonetabtype=zone1970 usage="Usage: tzselect [--version] [--help] [-c COORD] [-n LIMIT] -Select a time zone interactively. +Select a timezone interactively. Options: @@ -327,7 +326,7 @@ while eval ' doselect '"$quoted_continents"' \ "coord - I want to use geographical coordinates." \ - "TZ - I want to specify the time zone using the Posix TZ format." + "TZ - I want to specify the timezone using the Posix TZ format." continent=$select_result case $continent in Americas) continent=America;; @@ -342,8 +341,10 @@ while while echo >&2 'Please enter the desired value' \ 'of the TZ environment variable.' - echo >&2 'For example, GST-10 is a zone named GST' \ - 'that is 10 hours ahead (east) of UTC.' + echo >&2 'For example, AEST-10 is abbreviated' \ + 'AEST and is 10 hours' + echo >&2 'ahead (east) of Greenwich,' \ + 'with no daylight saving time.' read TZ $AWK -v TZ="$TZ" 'BEGIN { tzname = "(<[[:alnum:]+-]{3,}>|[[:alpha:]]{3,})" @@ -360,7 +361,7 @@ while exit 0 }' do - say >&2 "'$TZ' is not a conforming Posix time zone string." + say >&2 "'$TZ' is not a conforming Posix timezone string." done TZ_for_date=$TZ;; *) @@ -386,8 +387,7 @@ while BEGIN { FS = "\t" } { print $NF } '` - echo >&2 'Please select one of the following' \ - 'time zone regions,' + echo >&2 'Please select one of the following timezones,' \ echo >&2 'listed roughly in increasing order' \ "of distance from $coord". doselect $regions @@ -437,7 +437,7 @@ while esac - # Get list of names of time zone rule regions in the country. + # Get list of timezones in the country. regions=`$AWK \ -v country="$country" \ -v TZ_COUNTRY_TABLE="$TZ_COUNTRY_TABLE" \ @@ -460,8 +460,7 @@ while # If there's more than one region, ask the user which one. case $regions in *"$newline"*) - echo >&2 'Please select one of the following' \ - 'time zone regions.' + echo >&2 'Please select one of the following timezones.' doselect $regions region=$select_result;; *) diff --git a/timezone/zdump.c b/timezone/zdump.c index bf75800101..608f288691 100644 --- a/timezone/zdump.c +++ b/timezone/zdump.c @@ -1,3 +1,5 @@ +/* Dump time zone data in a textual format. */ + /* ** This file is in the public domain, so clarified as of ** 2009-05-17 by Arthur David Olson. @@ -5,21 +7,16 @@ #include "version.h" -/* -** This code has been made independent of the rest of the time -** conversion package to increase confidence in the verification it provides. -** You can use this code to help in verifying other implementations. -** To do this, compile with -DUSE_LTZ=0 and link without the tz library. -*/ - #ifndef NETBSD_INSPIRED # define NETBSD_INSPIRED 1 #endif -#ifndef USE_LTZ -# define USE_LTZ 1 -#endif #include "private.h" +#include <stdio.h> + +#ifndef HAVE_SNPRINTF +# define HAVE_SNPRINTF (199901 <= __STDC_VERSION__) +#endif #ifndef HAVE_LOCALTIME_R # define HAVE_LOCALTIME_R 1 @@ -72,14 +69,11 @@ enum { SECSPER400YEARS_FITS = SECSPERLYEAR <= INTMAX_MAX / 400 }; # define timezone_t char ** #endif -extern char ** environ; - #if !HAVE_POSIX_DECLS extern int getopt(int argc, char * const argv[], const char * options); extern char * optarg; extern int optind; -extern char * tzname[]; #endif /* The minimum and maximum finite time values. */ @@ -144,7 +138,7 @@ sumsize(size_t a, size_t b) /* Return a pointer to a newly allocated buffer of size SIZE, exiting on failure. SIZE should be nonzero. */ -static void * +static void * ATTRIBUTE_MALLOC xmalloc(size_t size) { void *p = malloc(size); @@ -263,7 +257,7 @@ tzfree(timezone_t env) } #endif /* ! USE_LOCALTIME_RZ */ -/* A UTC time zone, and its initializer. */ +/* A UT time zone, and its initializer. */ static timezone_t gmtz; static void gmtzinit(void) @@ -278,7 +272,7 @@ gmtzinit(void) } } -/* Convert *TP to UTC, storing the broken-down time into *TMP. +/* Convert *TP to UT, storing the broken-down time into *TMP. Return TMP if successful, NULL otherwise. This is like gmtime_r(TP, TMP), except typically faster if USE_LOCALTIME_RZ. */ static struct tm * @@ -390,7 +384,7 @@ static void usage(FILE * const stream, const int status) { fprintf(stream, -_("%s: usage: %s OPTIONS ZONENAME ...\n" +_("%s: usage: %s OPTIONS TIMEZONE ...\n" "Options include:\n" " -c [L,]U Start at year L (default -500), end before year U (default 2500)\n" " -t [L,]U Start at time L, end before time U (in seconds since 1970)\n" @@ -550,6 +544,7 @@ main(int argc, char *argv[]) } if (t < cutlotime) t = cutlotime; + INITIALIZE (ab); tm_ok = my_localtime_rz(tz, &t, &tm) != NULL; if (tm_ok) { ab = saveabbr(&abbrev, &abbrevsize, &tm); @@ -565,11 +560,10 @@ main(int argc, char *argv[]) : cuthitime); struct tm *newtmp = localtime_rz(tz, &newt, &newtm); bool newtm_ok = newtmp != NULL; - if (! (tm_ok & newtm_ok - ? (delta(&newtm, &tm) == newt - t - && newtm.tm_isdst == tm.tm_isdst - && strcmp(abbr(&newtm), ab) == 0) - : tm_ok == newtm_ok)) { + if (tm_ok != newtm_ok + || (tm_ok && (delta(&newtm, &tm) != newt - t + || newtm.tm_isdst != tm.tm_isdst + || strcmp(abbr(&newtm), ab) != 0))) { newt = hunt(tz, argv[i], t, newt); newtmp = localtime_rz(tz, &newt, &newtm); newtm_ok = newtmp != NULL; @@ -685,17 +679,15 @@ hunt(timezone_t tz, char *name, time_t lot, time_t hit) } /* -** Thanks to Paul Eggert for logic used in delta. +** Thanks to Paul Eggert for logic used in delta_nonneg. */ |
