| Index: source/tools/tzcode/zdump.c
|
| diff --git a/source/tools/tzcode/zdump.c b/source/tools/tzcode/zdump.c
|
| index 3ed4242647e60df10119c3146aff2cce8b6c4312..c47c180ccff1215abdab6a47254395f852b66a25 100644
|
| --- a/source/tools/tzcode/zdump.c
|
| +++ b/source/tools/tzcode/zdump.c
|
| @@ -1,25 +1,29 @@
|
| -static char elsieid[] = "@(#)zdump.c 8.8";
|
| +/*
|
| +** This file is in the public domain, so clarified as of
|
| +** 2009-05-17 by Arthur David Olson.
|
| +*/
|
| +
|
| +#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.
|
| +**
|
| +** However, include private.h when debugging, so that it overrides
|
| +** time_t consistently with the rest of the package.
|
| */
|
|
|
| -/*
|
| - * ICU note: Mr. Arthur David Olson (olsona@dc37a.nci.nih.gov) stated that
|
| - * "zdump.c is indeed in the public domain" in e-mail on Feb 22, 2007.
|
| - * This version of zdump.c is modified by ICU team to change output format
|
| - * and some additional options.
|
| - */
|
| -
|
| +#ifdef time_tz
|
| +# include "private.h"
|
| +#endif
|
|
|
| #include "stdio.h" /* for stdout, stderr, perror */
|
| #include "string.h" /* for strcpy */
|
| #include "sys/types.h" /* for time_t */
|
| #include "time.h" /* for struct tm */
|
| #include "stdlib.h" /* for exit, malloc, atoi */
|
| -#include "float.h" /* for FLT_MAX and DBL_MAX */
|
| +#include "limits.h" /* for CHAR_BIT, LLONG_MAX */
|
| #include "ctype.h" /* for isalpha et al. */
|
|
|
| /* Enable extensions and modifications for ICU. */
|
| @@ -33,6 +37,52 @@ static char elsieid[] = "@(#)zdump.c 8.8";
|
| #define isascii(x) 1
|
| #endif /* !defined isascii */
|
|
|
| +/*
|
| +** Substitutes for pre-C99 compilers.
|
| +** Much of this section of code is stolen from private.h.
|
| +*/
|
| +
|
| +#ifndef HAVE_STDINT_H
|
| +# define HAVE_STDINT_H \
|
| + (199901 <= __STDC_VERSION__ || 2 < (__GLIBC__ + (0 < __GLIBC_MINOR__)))
|
| +#endif
|
| +#if HAVE_STDINT_H
|
| +# include "stdint.h"
|
| +#endif
|
| +#ifndef HAVE_INTTYPES_H
|
| +# define HAVE_INTTYPES_H HAVE_STDINT_H
|
| +#endif
|
| +#if HAVE_INTTYPES_H
|
| +# include <inttypes.h>
|
| +#endif
|
| +
|
| +#ifndef INT_FAST32_MAX
|
| +# if INT_MAX >> 31 == 0
|
| +typedef long int_fast32_t;
|
| +# else
|
| +typedef int int_fast32_t;
|
| +# endif
|
| +#endif
|
| +
|
| +#ifndef INTMAX_MAX
|
| +# if defined LLONG_MAX || defined __LONG_LONG_MAX__
|
| +typedef long long intmax_t;
|
| +# define strtoimax strtoll
|
| +# define PRIdMAX "lld"
|
| +# ifdef LLONG_MAX
|
| +# define INTMAX_MAX LLONG_MAX
|
| +# else
|
| +# define INTMAX_MAX __LONG_LONG_MAX__
|
| +# endif
|
| +# else
|
| +typedef long intmax_t;
|
| +# define strtoimax strtol
|
| +# define PRIdMAX "ld"
|
| +# define INTMAX_MAX LONG_MAX
|
| +# endif
|
| +#endif
|
| +
|
| +
|
| #ifndef ZDUMP_LO_YEAR
|
| #define ZDUMP_LO_YEAR (-500)
|
| #endif /* !defined ZDUMP_LO_YEAR */
|
| @@ -100,9 +150,20 @@ static char elsieid[] = "@(#)zdump.c 8.8";
|
| #define isleap_sum(a, b) isleap((a) % 400 + (b) % 400)
|
| #endif /* !defined isleap_sum */
|
|
|
| -#define SECSPERDAY ((long) SECSPERHOUR * HOURSPERDAY)
|
| +#define SECSPERDAY ((int_fast32_t) SECSPERHOUR * HOURSPERDAY)
|
| #define SECSPERNYEAR (SECSPERDAY * DAYSPERNYEAR)
|
| #define SECSPERLYEAR (SECSPERNYEAR + SECSPERDAY)
|
| +#define SECSPER400YEARS (SECSPERNYEAR * (intmax_t) (300 + 3) \
|
| + + SECSPERLYEAR * (intmax_t) (100 - 3))
|
| +
|
| +/*
|
| +** True if SECSPER400YEARS is known to be representable as an
|
| +** intmax_t. It's OK that SECSPER400YEARS_FITS can in theory be false
|
| +** even if SECSPER400YEARS is representable, because when that happens
|
| +** the code merely runs a bit more slowly, and this slowness doesn't
|
| +** occur on any practical platform.
|
| +*/
|
| +enum { SECSPER400YEARS_FITS = SECSPERLYEAR <= INTMAX_MAX / 400 };
|
|
|
| #ifndef HAVE_GETTEXT
|
| #define HAVE_GETTEXT 0
|
| @@ -122,13 +183,11 @@ static char elsieid[] = "@(#)zdump.c 8.8";
|
| #endif /* !defined lint */
|
| #endif /* !defined GNUC_or_lint */
|
|
|
| -#ifndef INITIALIZE
|
| -#ifdef GNUC_or_lint
|
| -#define INITIALIZE(x) ((x) = 0)
|
| -#else /* !defined GNUC_or_lint */
|
| -#define INITIALIZE(x)
|
| -#endif /* !defined GNUC_or_lint */
|
| -#endif /* !defined INITIALIZE */
|
| +#if 2 < __GNUC__ || (__GNUC__ == 2 && 96 <= __GNUC_MINOR__)
|
| +# define ATTRIBUTE_PURE __attribute__ ((__pure__))
|
| +#else
|
| +# define ATTRIBUTE_PURE /* empty */
|
| +#endif
|
|
|
| /*
|
| ** For the benefit of GNU folk...
|
| @@ -155,21 +214,27 @@ extern char * optarg;
|
| extern int optind;
|
| extern char * tzname[2];
|
|
|
| -static time_t absolute_min_time;
|
| -static time_t absolute_max_time;
|
| +/* The minimum and maximum finite time values. */
|
| +static time_t const absolute_min_time =
|
| + ((time_t) -1 < 0
|
| + ? (time_t) -1 << (CHAR_BIT * sizeof (time_t) - 1)
|
| + : 0);
|
| +static time_t const absolute_max_time =
|
| + ((time_t) -1 < 0
|
| + ? - (~ 0 < 0) - ((time_t) -1 << (CHAR_BIT * sizeof (time_t) - 1))
|
| + : -1);
|
| static size_t longest;
|
| static char * progname;
|
| static int warned;
|
|
|
| static char * abbr(struct tm * tmp);
|
| static void abbrok(const char * abbrp, const char * zone);
|
| -static long delta(struct tm * newp, struct tm * oldp);
|
| +static intmax_t delta(struct tm * newp, struct tm * oldp) ATTRIBUTE_PURE;
|
| static void dumptime(const struct tm * tmp);
|
| static time_t hunt(char * name, time_t lot, time_t hit);
|
| -static void setabsolutes(void);
|
| static void show(char * zone, time_t t, int v);
|
| static const char * tformat(void);
|
| -static time_t yeartot(long y);
|
| +static time_t yeartot(intmax_t y) ATTRIBUTE_PURE;
|
| #ifdef ICU
|
| typedef struct listentry {
|
| char * name;
|
| @@ -187,8 +252,7 @@ static void getzones(char * basedir, char * subdir, struct listentry ** last, in
|
| #define my_localtime localtime
|
| #else /* !defined TYPECHECK */
|
| static struct tm *
|
| -my_localtime(tp)
|
| -time_t * tp;
|
| +my_localtime(time_t *tp)
|
| {
|
| register struct tm * tmp;
|
|
|
| @@ -199,7 +263,7 @@ time_t * tp;
|
|
|
| tm = *tmp;
|
| t = mktime(&tm);
|
| - if (t - *tp >= 1 || *tp - t >= 1) {
|
| + if (t != *tp) {
|
| (void) fflush(stdout);
|
| (void) fprintf(stderr, "\n%s: ", progname);
|
| (void) fprintf(stderr, tformat(), *tp);
|
| @@ -221,12 +285,10 @@ time_t * tp;
|
| #endif /* !defined TYPECHECK */
|
|
|
| static void
|
| -abbrok(abbrp, zone)
|
| -const char * const abbrp;
|
| -const char * const zone;
|
| +abbrok(const char *const abbrp, const char *const zone)
|
| {
|
| register const char * cp;
|
| - register char * wp;
|
| + register const char * wp;
|
|
|
| if (warned)
|
| return;
|
| @@ -259,27 +321,24 @@ const char * const zone;
|
| }
|
|
|
| static void
|
| -usage(const char *progname, FILE *stream, int status)
|
| +usage(FILE * const stream, const int status)
|
| {
|
| (void) fprintf(stream,
|
| -_("%s: usage is %s [ --version ] [ --help ] [ -v ] [ -c [loyear,]hiyear ] zonename ...\n\
|
| -\n\
|
| -Report bugs to tz@elsie.nci.nih.gov.\n"),
|
| - progname, progname);
|
| +_("%s: usage: %s [--version] [--help] [-{vV}] [-{ct} [lo,]hi] zonename ...\n"
|
| + "\n"
|
| + "Report bugs to %s.\n"),
|
| + progname, progname, REPORT_BUGS_TO);
|
| exit(status);
|
| }
|
|
|
| int
|
| -main(argc, argv)
|
| -int argc;
|
| -char * argv[];
|
| +main(int argc, char *argv[])
|
| {
|
| register int i;
|
| - register int c;
|
| register int vflag;
|
| + register int Vflag;
|
| register char * cutarg;
|
| - register long cutloyear = ZDUMP_LO_YEAR;
|
| - register long cuthiyear = ZDUMP_HI_YEAR;
|
| + register char * cuttimes;
|
| register time_t cutlotime;
|
| register time_t cuthitime;
|
| register char ** fakeenv;
|
| @@ -299,8 +358,8 @@ char * argv[];
|
| FILE * fp = stdout;
|
| #endif
|
|
|
| - INITIALIZE(cutlotime);
|
| - INITIALIZE(cuthitime);
|
| + cutlotime = absolute_min_time;
|
| + cuthitime = absolute_max_time;
|
| #if HAVE_GETTEXT
|
| (void) setlocale(LC_ALL, "");
|
| #ifdef TZ_DOMAINDIR
|
| @@ -311,49 +370,54 @@ char * argv[];
|
| progname = argv[0];
|
| for (i = 1; i < argc; ++i)
|
| if (strcmp(argv[i], "--version") == 0) {
|
| - (void) printf("%s\n", elsieid);
|
| + (void) printf("zdump %s%s\n", PKGVERSION, TZVERSION);
|
| exit(EXIT_SUCCESS);
|
| } else if (strcmp(argv[i], "--help") == 0) {
|
| - usage(progname, stdout, EXIT_SUCCESS);
|
| + usage(stdout, EXIT_SUCCESS);
|
| }
|
| - vflag = 0;
|
| - cutarg = NULL;
|
| + vflag = Vflag = 0;
|
| + cutarg = cuttimes = NULL;
|
| #ifdef ICU
|
| aflag = 0;
|
| iflag = 0;
|
| dirarg = NULL;
|
| - nextopt = 1;
|
| - while(nextopt) {
|
| - c = getopt(argc, argv, "ac:d:iv");
|
| - switch(c) {
|
| - case 'a':
|
| - aflag = 1;
|
| - break;
|
| - case 'c':
|
| - cutarg = optarg;
|
| - break;
|
| - case 'd':
|
| - dirarg = optarg;
|
| - break;
|
| - case 'i':
|
| - iflag = 1;
|
| - break;
|
| - case 'v':
|
| - vflag = 1;
|
| - break;
|
| + for (;;)
|
| + switch(getopt(argc, argv, "ac:d:it:vV")) {
|
| + case 'a': aflag = 1; break;
|
| + case 'c': cutarg = optarg; break;
|
| + case 'd': dirarg = optarg; break;
|
| + case 'i': iflag = 1; break;
|
| + case 't': cuttimes = optarg; break;
|
| + case 'v': vflag = 1; break;
|
| + case 'V': Vflag = 1; break;
|
| + case -1:
|
| + if (! (optind == argc - 1 && strcmp(argv[optind], "=") == 0))
|
| + goto arg_processing_done;
|
| + /* Fall through. */
|
| default:
|
| - nextopt = 0;
|
| - break;
|
| - }
|
| - }
|
| - if ((c != EOF && c != -1) ||
|
| - (optind == argc - 1 && strcmp(argv[optind], "=") == 0)) {
|
| (void) fprintf(stderr,
|
| - _("%s: usage is %s [ --version ] [ -a ] [ -v ] [ -i ] [ -c [loyear,]hiyear ] [ -d dir ] [ zonename ... ]\n"),
|
| + _("%s: usage is %s [ --version ] [ -a ] [ -v ] [ -V ] [ -i ] [ -c [loyear,]hiyear ] [ -t [lotime,]hitime] ][ -d dir ] [ zonename ... ]\n"),
|
| progname, progname);
|
| exit(EXIT_FAILURE);
|
| - }
|
| + }
|
| +#else
|
| + for (;;)
|
| + switch (getopt(argc, argv, "c:t:vV")) {
|
| + case 'c': cutarg = optarg; break;
|
| + case 't': cuttimes = optarg; break;
|
| + case 'v': vflag = 1; break;
|
| + case 'V': Vflag = 1; break;
|
| + case -1:
|
| + if (! (optind == argc - 1 && strcmp(argv[optind], "=") == 0))
|
| + goto arg_processing_done;
|
| + /* Fall through. */
|
| + default:
|
| + usage(stderr, EXIT_FAILURE);
|
| + }
|
| +#endif
|
| + arg_processing_done:;
|
|
|
| +#ifdef ICU
|
| if (dirarg != NULL) {
|
| DIR * dp;
|
| /* create the output directory */
|
| @@ -364,37 +428,63 @@ char * argv[];
|
| }
|
| closedir(dp);
|
| }
|
| -#else
|
| - while ((c = getopt(argc, argv, "c:v")) == 'c' || c == 'v')
|
| - if (c == 'v')
|
| - vflag = 1;
|
| - else cutarg = optarg;
|
| - if ((c != EOF && c != -1) ||
|
| - (optind == argc - 1 && strcmp(argv[optind], "=") == 0)) {
|
| - usage(progname, stderr, EXIT_FAILURE);
|
| - }
|
| -#endif
|
| - if (vflag) {
|
| +#endif ICU
|
| +
|
| + if (vflag | Vflag) {
|
| + intmax_t lo;
|
| + intmax_t hi;
|
| + char *loend, *hiend;
|
| + register intmax_t cutloyear = ZDUMP_LO_YEAR;
|
| + register intmax_t cuthiyear = ZDUMP_HI_YEAR;
|
| if (cutarg != NULL) {
|
| - long lo;
|
| - long hi;
|
| - char dummy;
|
| -
|
| - if (sscanf(cutarg, "%ld%c", &hi, &dummy) == 1) {
|
| + lo = strtoimax(cutarg, &loend, 10);
|
| + if (cutarg != loend && !*loend) {
|
| + hi = lo;
|
| + cuthiyear = hi;
|
| + } else if (cutarg != loend && *loend == ','
|
| + && (hi = strtoimax(loend + 1, &hiend, 10),
|
| + loend + 1 != hiend && !*hiend)) {
|
| + cutloyear = lo;
|
| cuthiyear = hi;
|
| - } else if (sscanf(cutarg, "%ld,%ld%c",
|
| - &lo, &hi, &dummy) == 2) {
|
| - cutloyear = lo;
|
| - cuthiyear = hi;
|
| } else {
|
| (void) fprintf(stderr, _("%s: wild -c argument %s\n"),
|
| progname, cutarg);
|
| exit(EXIT_FAILURE);
|
| }
|
| }
|
| - setabsolutes();
|
| - cutlotime = yeartot(cutloyear);
|
| - cuthitime = yeartot(cuthiyear);
|
| + if (cutarg != NULL || cuttimes == NULL) {
|
| + cutlotime = yeartot(cutloyear);
|
| + cuthitime = yeartot(cuthiyear);
|
| + }
|
| + if (cuttimes != NULL) {
|
| + lo = strtoimax(cuttimes, &loend, 10);
|
| + if (cuttimes != loend && !*loend) {
|
| + hi = lo;
|
| + if (hi < cuthitime) {
|
| + if (hi < absolute_min_time)
|
| + hi = absolute_min_time;
|
| + cuthitime = hi;
|
| + }
|
| + } else if (cuttimes != loend && *loend == ','
|
| + && (hi = strtoimax(loend + 1, &hiend, 10),
|
| + loend + 1 != hiend && !*hiend)) {
|
| + if (cutlotime < lo) {
|
| + if (absolute_max_time < lo)
|
| + lo = absolute_max_time;
|
| + cutlotime = lo;
|
| + }
|
| + if (hi < cuthitime) {
|
| + if (hi < absolute_min_time)
|
| + hi = absolute_min_time;
|
| + cuthitime = hi;
|
| + }
|
| + } else {
|
| + (void) fprintf(stderr,
|
| + _("%s: wild -t argument %s\n"),
|
| + progname, cuttimes);
|
| + exit(EXIT_FAILURE);
|
| + }
|
| + }
|
| }
|
|
|
| #ifdef ICU
|
| @@ -434,10 +524,9 @@ char * argv[];
|
|
|
| for (i = 0; environ[i] != NULL; ++i)
|
| continue;
|
| - fakeenv = (char **) malloc((size_t) ((i + 2) *
|
| - sizeof *fakeenv));
|
| - if (fakeenv == NULL ||
|
| - (fakeenv[0] = (char *) malloc(longest + 4)) == NULL) {
|
| + fakeenv = malloc((i + 2) * sizeof *fakeenv);
|
| + if (fakeenv == NULL
|
| + || (fakeenv[0] = malloc(longest + 4)) == NULL) {
|
| (void) perror(progname);
|
| exit(EXIT_FAILURE);
|
| }
|
| @@ -453,7 +542,7 @@ char * argv[];
|
| static char buf[MAX_STRING_LENGTH];
|
|
|
| (void) strcpy(&fakeenv[0][3], argv[i]);
|
| - if (!vflag) {
|
| + if (! (vflag | Vflag)) {
|
| show(argv[i], now, FALSE);
|
| continue;
|
| }
|
| @@ -493,9 +582,11 @@ char * argv[];
|
| * a transition when -i option is set */
|
| if (!iflag) {
|
| #endif
|
| - show(argv[i], t, TRUE);
|
| - t += SECSPERHOUR * HOURSPERDAY;
|
| - show(argv[i], t, TRUE);
|
| + if (!Vflag) {
|
| + show(argv[i], t, TRUE);
|
| + t += SECSPERDAY;
|
| + show(argv[i], t, TRUE);
|
| + }
|
| #ifdef ICU
|
| }
|
| #endif
|
| @@ -507,9 +598,11 @@ char * argv[];
|
| (void) strncpy(buf, abbr(&tm), (sizeof buf) - 1);
|
| }
|
| for ( ; ; ) {
|
| - if (t >= cuthitime || t >= cuthitime - SECSPERHOUR * 12)
|
| + newt = (t < absolute_max_time - SECSPERDAY / 2
|
| + ? t + SECSPERDAY / 2
|
| + : absolute_max_time);
|
| + if (cuthitime <= newt)
|
| break;
|
| - newt = t + SECSPERHOUR * 12;
|
| newtmp = localtime(&newt);
|
| if (newtmp != NULL)
|
| newtm = *newtmp;
|
| @@ -556,12 +649,13 @@ char * argv[];
|
| /* skip displaying info for the highest time, which is actually not
|
| * a transition when -i option is used*/
|
| #endif
|
| - t = absolute_max_time;
|
| - t -= SECSPERHOUR * HOURSPERDAY;
|
| - show(argv[i], t, TRUE);
|
| - t += SECSPERHOUR * HOURSPERDAY;
|
| - show(argv[i], t, TRUE);
|
| -
|
| + if (!Vflag) {
|
| + t = absolute_max_time;
|
| + t -= SECSPERDAY;
|
| + show(argv[i], t, TRUE);
|
| + t += SECSPERDAY;
|
| + show(argv[i], t, TRUE);
|
| + }
|
| #ifdef ICU
|
| }
|
| /* close file */
|
| @@ -592,79 +686,45 @@ char * argv[];
|
| return EXIT_FAILURE;
|
| }
|
|
|
| -static void
|
| -setabsolutes(void)
|
| -{
|
| - if (0.5 == (time_t) 0.5) {
|
| - /*
|
| - ** time_t is floating.
|
| - */
|
| - if (sizeof (time_t) == sizeof (float)) {
|
| - absolute_min_time = (time_t) -FLT_MAX;
|
| - absolute_max_time = (time_t) FLT_MAX;
|
| - } else if (sizeof (time_t) == sizeof (double)) {
|
| - absolute_min_time = (time_t) -DBL_MAX;
|
| - absolute_max_time = (time_t) DBL_MAX;
|
| - } else {
|
| - (void) fprintf(stderr,
|
| -_("%s: use of -v on system with floating time_t other than float or double\n"),
|
| - progname);
|
| - exit(EXIT_FAILURE);
|
| - }
|
| - } else if (0 > (time_t) -1) {
|
| - /*
|
| - ** time_t is signed. Assume overflow wraps around.
|
| - */
|
| - time_t t = 0;
|
| - time_t t1 = 1;
|
| -
|
| - while (t < t1) {
|
| - t = t1;
|
| - t1 = 2 * t1 + 1;
|
| - }
|
| -
|
| - absolute_max_time = t;
|
| - t = -t;
|
| - absolute_min_time = t - 1;
|
| - if (t < absolute_min_time)
|
| - absolute_min_time = t;
|
| - } else {
|
| - /*
|
| - ** time_t is unsigned.
|
| - */
|
| - absolute_min_time = 0;
|
| - absolute_max_time = absolute_min_time - 1;
|
| - }
|
| -}
|
| -
|
| static time_t
|
| -yeartot(y)
|
| -const long y;
|
| +yeartot(const intmax_t y)
|
| {
|
| - register long myy;
|
| - register long seconds;
|
| - register time_t t;
|
| + register intmax_t myy, seconds, years;
|
| + register time_t t;
|
|
|
| myy = EPOCH_YEAR;
|
| t = 0;
|
| - while (myy != y) {
|
| - if (myy < y) {
|
| + while (myy < y) {
|
| + if (SECSPER400YEARS_FITS && 400 <= y - myy) {
|
| + intmax_t diff400 = (y - myy) / 400;
|
| + if (INTMAX_MAX / SECSPER400YEARS < diff400)
|
| + return absolute_max_time;
|
| + seconds = diff400 * SECSPER400YEARS;
|
| + years = diff400 * 400;
|
| + } else {
|
| seconds = isleap(myy) ? SECSPERLYEAR : SECSPERNYEAR;
|
| - ++myy;
|
| - if (t > absolute_max_time - seconds) {
|
| - t = absolute_max_time;
|
| - break;
|
| - }
|
| - t += seconds;
|
| + years = 1;
|
| + }
|
| + myy += years;
|
| + if (t > absolute_max_time - seconds)
|
| + return absolute_max_time;
|
| + t += seconds;
|
| + }
|
| + while (y < myy) {
|
| + if (SECSPER400YEARS_FITS && y + 400 <= myy && myy < 0) {
|
| + intmax_t diff400 = (myy - y) / 400;
|
| + if (INTMAX_MAX / SECSPER400YEARS < diff400)
|
| + return absolute_min_time;
|
| + seconds = diff400 * SECSPER400YEARS;
|
| + years = diff400 * 400;
|
| } else {
|
| - --myy;
|
| - seconds = isleap(myy) ? SECSPERLYEAR : SECSPERNYEAR;
|
| - if (t < absolute_min_time + seconds) {
|
| - t = absolute_min_time;
|
| - break;
|
| - }
|
| - t -= seconds;
|
| + seconds = isleap(myy - 1) ? SECSPERLYEAR : SECSPERNYEAR;
|
| + years = 1;
|
| }
|
| + myy -= years;
|
| + if (t < absolute_min_time + seconds)
|
| + return absolute_min_time;
|
| + t -= seconds;
|
| }
|
| return t;
|
| }
|
| @@ -673,7 +733,6 @@ static time_t
|
| hunt(char *name, time_t lot, time_t hit)
|
| {
|
| time_t t;
|
| - long diff;
|
| struct tm lotm;
|
| register struct tm * lotmp;
|
| struct tm tm;
|
| @@ -686,7 +745,7 @@ hunt(char *name, time_t lot, time_t hit)
|
| (void) strncpy(loab, abbr(&lotm), (sizeof loab) - 1);
|
| }
|
| for ( ; ; ) {
|
| - diff = (long) (hit - lot);
|
| + time_t diff = hit - lot;
|
| if (diff < 2)
|
| break;
|
| t = lot;
|
| @@ -716,13 +775,11 @@ hunt(char *name, time_t lot, time_t hit)
|
| ** Thanks to Paul Eggert for logic used in delta.
|
| */
|
|
|
| -static long
|
| -delta(newp, oldp)
|
| -struct tm * newp;
|
| -struct tm * oldp;
|
| +static intmax_t
|
| +delta(struct tm * newp, struct tm *oldp)
|
| {
|
| - register long result;
|
| - register int tmy;
|
| + register intmax_t result;
|
| + register int tmy;
|
|
|
| if (newp->tm_year < oldp->tm_year)
|
| return -delta(oldp, newp);
|
| @@ -751,7 +808,7 @@ show(char *zone, time_t t, int v)
|
| (void) printf(tformat(), t);
|
| } else {
|
| dumptime(tmp);
|
| - (void) printf(" UTC");
|
| + (void) printf(" UT");
|
| }
|
| (void) printf(" = ");
|
| }
|
| @@ -773,8 +830,7 @@ show(char *zone, time_t t, int v)
|
| }
|
|
|
| static char *
|
| -abbr(tmp)
|
| -struct tm * tmp;
|
| +abbr(struct tm *tmp)
|
| {
|
| register char * result;
|
| static char nada;
|
| @@ -793,18 +849,19 @@ struct tm * tmp;
|
| static const char *
|
| tformat(void)
|
| {
|
| - if (0.5 == (time_t) 0.5) { /* floating */
|
| - if (sizeof (time_t) > sizeof (double))
|
| - return "%Lg";
|
| - return "%g";
|
| - }
|
| if (0 > (time_t) -1) { /* signed */
|
| + if (sizeof (time_t) == sizeof (intmax_t))
|
| + return "%"PRIdMAX;
|
| if (sizeof (time_t) > sizeof (long))
|
| return "%lld";
|
| if (sizeof (time_t) > sizeof (int))
|
| return "%ld";
|
| return "%d";
|
| }
|
| +#ifdef PRIuMAX
|
| + if (sizeof (time_t) == sizeof (uintmax_t))
|
| + return "%"PRIuMAX;
|
| +#endif
|
| if (sizeof (time_t) > sizeof (unsigned long))
|
| return "%llu";
|
| if (sizeof (time_t) > sizeof (unsigned int))
|
| @@ -813,8 +870,7 @@ tformat(void)
|
| }
|
|
|
| static void
|
| -dumptime(timeptr)
|
| -register const struct tm * timeptr;
|
| +dumptime(register const struct tm *timeptr)
|
| {
|
| static const char wday_name[][3] = {
|
| "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
|
|
|