1
0
mirror of https://frontier.innolan.net/rainlance/amiga-tz.git synced 2025-11-21 20:59:33 +00:00

more year work

SCCS-file: zdump.c
SCCS-SID: 7.49
This commit is contained in:
Arthur David Olson
2004-11-18 13:04:19 -05:00
committed by Paul Eggert
parent ce64c7c95b
commit 45e9478454

144
zdump.c
View File

@ -1,3 +1,8 @@
/*
** XXX--handle systems where time_t is floating
** XXX--handle systems where asctime/localtime return NULL
*/
static char elsieid[] = "%W%";
/*
@ -12,6 +17,14 @@ static char elsieid[] = "%W%";
#include "time.h" /* for struct tm */
#include "stdlib.h" /* for exit, malloc, atoi */
#ifndef ZDUMP_LO_YEAR
#define ZDUMP_LO_YEAR (-1000)
#endif /* !defined ZDUMP_LO_YEAR */
#ifndef ZDUMP_HI_YEAR
#define ZDUMP_HI_YEAR 5000
#endif /* !defined ZDUMP_HI_YEAR */
#ifndef MAX_STRING_LENGTH
#define MAX_STRING_LENGTH 1024
#endif /* !defined MAX_STRING_LENGTH */
@ -71,6 +84,10 @@ static char elsieid[] = "%W%";
#define isleap_sum(a, b) isleap((a) % 400 + (b) % 400)
#endif /* !defined isleap_sum */
#define SECSPERDAY ((long) SECSPERHOUR * HOURSPERDAY)
#define SECSPERNYEAR (SECSPERDAY * DAYSPERNYEAR)
#define SECSPERLYEAR (SECSPERNYEAR + SECSPERDAY)
#if HAVE_GETTEXT
#include "locale.h" /* for setlocale */
#include "libintl.h"
@ -127,13 +144,17 @@ extern char * optarg;
extern int optind;
extern char * tzname[2];
static char * abbr P((struct tm * tmp));
static long delta P((struct tm * newp, struct tm * oldp));
static time_t hunt P((char * name, time_t lot, time_t hit));
static time_t absolute_min_time;
static time_t absolute_max_time;
static size_t longest;
static char * progname;
static void show P((char * zone, time_t t, int v));
static char * abbr P((struct tm * tmp));
static long delta P((struct tm * newp, struct tm * oldp));
static void dumptime P((const struct tm * tmp));
static time_t hunt P((char * name, time_t lot, time_t hit));
static void setabsolutes();
static void show P((char * zone, time_t t, int v));
static time_t yeartot P((long y));
int
@ -145,20 +166,17 @@ char * argv[];
register int c;
register int vflag;
register char * cutarg;
register int havecutloyear;
long cutloyear;
long cuthiyear;
register long cutloyear = ZDUMP_LO_YEAR;
register long cuthiyear = ZDUMP_HI_YEAR;
register time_t cutlotime;
register time_t cuthitime;
char ** fakeenv;
time_t now;
time_t t;
time_t newt;
time_t hibit;
struct tm tm;
struct tm newtm;
havecutloyear = FALSE;
INITIALIZE(cutlotime);
INITIALIZE(cuthitime);
#if HAVE_GETTEXT
@ -184,38 +202,36 @@ char * argv[];
(optind == argc - 1 && strcmp(argv[optind], "=") == 0)) {
(void) fprintf(stderr,
_("%s: usage is %s [ --version ] [ -v ] [ -c [loyear,]hiyear ] zonename ...\n"),
argv[0], argv[0]);
progname, progname);
(void) exit(EXIT_FAILURE);
}
if (cutarg != NULL) {
int y;
char dummy;
if (vflag) {
if (cutarg != NULL) {
long lo;
long hi;
char c;
if (sscanf(cutarg, "%ld%c", &cuthiyear, &dummy) == 1) {
cuthitime = yeartot(cuthiyear);
} else if (sscanf(cutarg, "%ld,%ld%c",
&cutloyear, &cuthiyear, &dummy) == 2) {
havecutloyear = TRUE;
if (cutloyear >= cuthiyear) {
(void) fprintf(stderr, _("%s: cutloyear >= cuthiyear in -c argument %s\n"),
argv[0], cutarg);
(void) exit(EXIT_FAILURE);
}
cutlotime = yeartot(cutloyear);
cuthitime = yeartot(cuthiyear);
} else {
if (sscanf(cutarg, "%ld%c", &hi, &c) == 1) {
cuthiyear = hi;
} else if (sscanf(cutarg, "%ld,%ld%c",
&lo, &hi, &c) == 2) {
cutloyear = lo;
cuthiyear = hi;
} else {
(void) fprintf(stderr, _("%s: wild -c argument %s\n"),
argv[0], cutarg);
(void) exit(EXIT_FAILURE);
progname, cutarg);
(void) exit(EXIT_FAILURE);
}
}
setabsolutes();
cutlotime = yeartot(cutloyear);
cuthitime = yeartot(cuthiyear);
}
(void) time(&now);
longest = 0;
for (i = optind; i < argc; ++i)
if (strlen(argv[i]) > longest)
longest = strlen(argv[i]);
for (hibit = 1; (hibit << 1) != 0; hibit <<= 1)
continue;
{
register int from;
register int to;
@ -245,24 +261,18 @@ _("%s: usage is %s [ --version ] [ -v ] [ -c [loyear,]hiyear ] zonename ...\n"),
show(argv[i], now, FALSE);
continue;
}
/*
** Get lowest value of t.
*/
t = hibit;
if (t > 0) /* time_t is unsigned */
t = 0;
t = absolute_min_time;
show(argv[i], t, TRUE);
t += SECSPERHOUR * HOURSPERDAY;
show(argv[i], t, TRUE);
if (cutarg != NULL)
t = cutlotime;
t = cutlotime;
tm = *localtime(&t);
(void) strncpy(buf, abbr(&tm), (sizeof buf) - 1);
for ( ; ; ) {
if (cutarg != NULL && t >= cuthitime)
if (t >= cuthitime)
break;
newt = t + SECSPERHOUR * 12;
if (cutarg != NULL && newt >= cuthitime)
if (newt >= cuthitime)
break;
if (newt <= t)
break;
@ -278,19 +288,14 @@ _("%s: usage is %s [ --version ] [ -v ] [ -c [loyear,]hiyear ] zonename ...\n"),
t = newt;
tm = newtm;
}
/*
** Get highest value of t.
*/
t = ~((time_t) 0);
if (t < 0) /* time_t is signed */
t &= ~hibit;
t = absolute_max_time;
t -= SECSPERHOUR * HOURSPERDAY;
show(argv[i], t, TRUE);
t += SECSPERHOUR * HOURSPERDAY;
show(argv[i], t, TRUE);
}
if (fflush(stdout) || ferror(stdout)) {
(void) fprintf(stderr, "%s: ", argv[0]);
(void) fprintf(stderr, "%s: ", progname);
(void) perror(_("Error writing standard output"));
(void) exit(EXIT_FAILURE);
}
@ -301,25 +306,60 @@ _("%s: usage is %s [ --version ] [ -v ] [ -c [loyear,]hiyear ] zonename ...\n"),
continue;
}
static void
setabsolutes()
{
if (0.5 == (time_t) 0.5) {
/*
** time_t is floating.
*/
(void) fprintf(stderr, _("%s: cannot use -v on system with floating time_t\n"),
progname);
(void) exit(EXIT_FAILURE);
} else if (0 > (time_t) -1) {
/*
** time_t is signed.
*/
register time_t hibit;
for (hibit = 1; (hibit << 1) != 0; hibit <<= 1)
continue;
absolute_min_time = hibit;
absolute_max_time = ~hibit;
} else {
/*
** time_t is unsigned.
*/
absolute_min_time = 0;
absolute_max_time = ~0;
}
}
static time_t
yeartot(y)
const long y;
{
register time_t t;
register long myy;
register long seconds;
register time_t t;
t = 0;
myy = EPOCH_YEAR;
t = 0;
while (myy != y) {
if (myy < y) {
t += DAYSPERNYEAR + isleap(myy);
seconds = isleap(myy) ? SECSPERLYEAR : SECSPERNYEAR;
++myy;
if (absolute_max_time - t < seconds)
return absolute_max_time;
t += seconds;
} else {
--myy;
t -= DAYSPERNYEAR + isleap(myy);
seconds = isleap(myy) ? SECSPERLYEAR : SECSPERNYEAR;
if (t - absolute_min_time < seconds)
return absolute_min_time;
t -= seconds;
}
}
t *= (long) SECSPERHOUR * (long) HOURSPERDAY;
return t;
}