zdump.c revision ac04d0bbe12b3ef54518635711412f178cb4d16
1ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic char	elsieid[] = "@(#)zdump.c	8.3";
2ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/*
4ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru** This code has been made independent of the rest of the time
5ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru** conversion package to increase confidence in the verification it provides.
6ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru** You can use this code to help in verifying other implementations.
7ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*/
8ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
9ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/*
10ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * ICU note: Mr. Arthur David Olson (olsona@dc37a.nci.nih.gov) stated that
11ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * "zdump.c is indeed in the public domain" in e-mail on Feb 22, 2007.
12ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * This version of zdump.c is modified by ICU team to change output format
13ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * and some additional options.
14ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
15ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
16ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
17ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "stdio.h"	/* for stdout, stderr, perror */
18ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "string.h"	/* for strcpy */
19ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "sys/types.h"	/* for time_t */
20ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "time.h"	/* for struct tm */
21ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "stdlib.h"	/* for exit, malloc, atoi */
22ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "float.h"	/* for FLT_MAX and DBL_MAX */
23ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "ctype.h"	/* for isalpha et al. */
24ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
25ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* Enable extensions and modifications for ICU. */
26ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define ICU
27ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
28ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifdef ICU
29ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "dirent.h"
30ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
31ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
32ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifndef isascii
33ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define isascii(x) 1
34ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif /* !defined isascii */
35ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
36ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifndef ZDUMP_LO_YEAR
37ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define ZDUMP_LO_YEAR	(-500)
38ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif /* !defined ZDUMP_LO_YEAR */
39ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
40ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifndef ZDUMP_HI_YEAR
41ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define ZDUMP_HI_YEAR	2500
42ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif /* !defined ZDUMP_HI_YEAR */
43ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
44ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifndef MAX_STRING_LENGTH
45ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define MAX_STRING_LENGTH	1024
46ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif /* !defined MAX_STRING_LENGTH */
47ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
48ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifndef TRUE
49ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define TRUE		1
50ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif /* !defined TRUE */
51ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
52ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifndef FALSE
53ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define FALSE		0
54ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif /* !defined FALSE */
55ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
56ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifndef EXIT_SUCCESS
57ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define EXIT_SUCCESS	0
58ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif /* !defined EXIT_SUCCESS */
59ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
60ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifndef EXIT_FAILURE
61ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define EXIT_FAILURE	1
62ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif /* !defined EXIT_FAILURE */
63ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
64ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifndef SECSPERMIN
65ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define SECSPERMIN	60
66ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif /* !defined SECSPERMIN */
67ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
68ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifndef MINSPERHOUR
69ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define MINSPERHOUR	60
70ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif /* !defined MINSPERHOUR */
71ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
72ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifndef SECSPERHOUR
73ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define SECSPERHOUR	(SECSPERMIN * MINSPERHOUR)
74ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif /* !defined SECSPERHOUR */
75ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
76ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifndef HOURSPERDAY
77ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define HOURSPERDAY	24
78ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif /* !defined HOURSPERDAY */
79ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
80ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifndef EPOCH_YEAR
81ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define EPOCH_YEAR	1970
82ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif /* !defined EPOCH_YEAR */
83ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
84ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifndef TM_YEAR_BASE
85ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define TM_YEAR_BASE	1900
86ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif /* !defined TM_YEAR_BASE */
87ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
88ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifndef DAYSPERNYEAR
89ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define DAYSPERNYEAR	365
90ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif /* !defined DAYSPERNYEAR */
91ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
92ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifndef isleap
93ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define isleap(y) (((y) % 4) == 0 && (((y) % 100) != 0 || ((y) % 400) == 0))
94ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif /* !defined isleap */
95ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
96ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifndef isleap_sum
97ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/*
98ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru** See tzfile.h for details on isleap_sum.
99ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*/
100ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define isleap_sum(a, b)	isleap((a) % 400 + (b) % 400)
101ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif /* !defined isleap_sum */
102ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
103ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define SECSPERDAY	((long) SECSPERHOUR * HOURSPERDAY)
104ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define SECSPERNYEAR	(SECSPERDAY * DAYSPERNYEAR)
105ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define SECSPERLYEAR	(SECSPERNYEAR + SECSPERDAY)
106ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
107ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if HAVE_GETTEXT
108ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "locale.h"	/* for setlocale */
109ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "libintl.h"
110ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif /* HAVE_GETTEXT */
111ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
112ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifndef GNUC_or_lint
113ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifdef lint
114ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define GNUC_or_lint
115ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#else /* !defined lint */
116ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifdef __GNUC__
117ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define GNUC_or_lint
118ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif /* defined __GNUC__ */
119ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif /* !defined lint */
120ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif /* !defined GNUC_or_lint */
121ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
122ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifndef INITIALIZE
123ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifdef GNUC_or_lint
124ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define INITIALIZE(x)	((x) = 0)
125ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#else /* !defined GNUC_or_lint */
126ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define INITIALIZE(x)
127ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif /* !defined GNUC_or_lint */
128ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif /* !defined INITIALIZE */
129ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
130ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/*
131ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru** For the benefit of GNU folk...
132ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru** `_(MSGID)' uses the current locale's message library string for MSGID.
133ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru** The default is to use gettext if available, and use MSGID otherwise.
134ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*/
135ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
136ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifndef _
137ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if HAVE_GETTEXT
138ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define _(msgid) gettext(msgid)
139ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#else /* !HAVE_GETTEXT */
140ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define _(msgid) msgid
141ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif /* !HAVE_GETTEXT */
142ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif /* !defined _ */
143ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
144ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifndef TZ_DOMAIN
145ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define TZ_DOMAIN "tz"
146ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif /* !defined TZ_DOMAIN */
147ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
148ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifndef P
149ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define P(x)	x
150ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif /* !defined P */
151ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
152ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruextern char **	environ;
153ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruextern int	getopt P((int argc, char * const argv[],
154ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			const char * options));
155ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruextern char *	optarg;
156ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruextern int	optind;
157ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruextern char *	tzname[2];
158ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
159ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic time_t	absolute_min_time;
160ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic time_t	absolute_max_time;
161ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic size_t	longest;
162ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic char *	progname;
163ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic int	warned;
164ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
165ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic char *	abbr P((struct tm * tmp));
166ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void	abbrok P((const char * abbrp, const char * zone));
167ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic long	delta P((struct tm * newp, struct tm * oldp));
168ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void	dumptime P((const struct tm * tmp));
169ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic time_t	hunt P((char * name, time_t lot, time_t	hit));
170ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void	setabsolutes P((void));
171ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void	show P((char * zone, time_t t, int v));
172ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const char *	tformat P((void));
173ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic time_t	yeartot P((long y));
174ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifdef ICU
175ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querutypedef struct listentry {
176ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	char *		name;
177ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	struct listentry *	next;
178ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} listentry;
179ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
180ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic time_t	huntICU P((char * name, time_t lot, time_t	hit, FILE *fp));
181ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void	dumptimeICU P((FILE * fp, time_t t));
182ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void	showICU P((FILE * fp, char * zone, time_t t1, time_t t2));
183ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic int	getall P((struct listentry ** namelist));
184ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void getzones P((char * basedir, char * subdir, struct listentry ** last, int * count));
185ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
186ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
187ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifndef TYPECHECK
188ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define my_localtime	localtime
189ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#else /* !defined TYPECHECK */
190ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic struct tm *
191ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querumy_localtime(tp)
192ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querutime_t *	tp;
193ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
194ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	register struct tm *	tmp;
195ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
196ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	tmp = localtime(tp);
197ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	if (tp != NULL && tmp != NULL) {
198ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		struct tm	tm;
199ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		register time_t	t;
200ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
201ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		tm = *tmp;
202ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		t = mktime(&tm);
203ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		if (t - *tp >= 1 || *tp - t >= 1) {
204ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			(void) fflush(stdout);
205ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			(void) fprintf(stderr, "\n%s: ", progname);
206ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			(void) fprintf(stderr, tformat(), *tp);
207ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			(void) fprintf(stderr, " ->");
208ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			(void) fprintf(stderr, " year=%d", tmp->tm_year);
209ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			(void) fprintf(stderr, " mon=%d", tmp->tm_mon);
210ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			(void) fprintf(stderr, " mday=%d", tmp->tm_mday);
211ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			(void) fprintf(stderr, " hour=%d", tmp->tm_hour);
212ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			(void) fprintf(stderr, " min=%d", tmp->tm_min);
213ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			(void) fprintf(stderr, " sec=%d", tmp->tm_sec);
214ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			(void) fprintf(stderr, " isdst=%d", tmp->tm_isdst);
215ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			(void) fprintf(stderr, " -> ");
216ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			(void) fprintf(stderr, tformat(), t);
217ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			(void) fprintf(stderr, "\n");
218ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		}
219ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	}
220ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	return tmp;
221ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
222ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif /* !defined TYPECHECK */
223ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
224ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void
225ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruabbrok(abbrp, zone)
226ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruconst char * const	abbrp;
227ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruconst char * const	zone;
228ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
229ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	register const char *	cp;
230ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	register char *		wp;
231ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
232ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	if (warned)
233ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		return;
234ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	cp = abbrp;
235ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	wp = NULL;
236ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	while (isascii((unsigned char) *cp) && isalpha((unsigned char) *cp))
237ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		++cp;
238ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	if (cp - abbrp == 0)
239ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		wp = _("lacks alphabetic at start");
240ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	else if (cp - abbrp < 3)
241ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		wp = _("has fewer than 3 alphabetics");
242ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	else if (cp - abbrp > 6)
243ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		wp = _("has more than 6 alphabetics");
244ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	if (wp == NULL && (*cp == '+' || *cp == '-')) {
245ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		++cp;
246ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		if (isascii((unsigned char) *cp) &&
247ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			isdigit((unsigned char) *cp))
248ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				if (*cp++ == '1' && *cp >= '0' && *cp <= '4')
249ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru					++cp;
250ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		if (*cp != '\0')
251ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			wp = _("differs from POSIX standard");
252ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	}
253ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	if (wp == NULL)
254ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		return;
255ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	(void) fflush(stdout);
256ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	(void) fprintf(stderr,
257ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		_("%s: warning: zone \"%s\" abbreviation \"%s\" %s\n"),
258ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		progname, zone, abbrp, wp);
259ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	warned = TRUE;
260ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
261ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
262ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruint
263ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querumain(argc, argv)
264ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruint	argc;
265ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruchar *	argv[];
266ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
267ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	register int		i;
268ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	register int		c;
269ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	register int		vflag;
270ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	register char *		cutarg;
271ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	register long		cutloyear = ZDUMP_LO_YEAR;
272ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	register long		cuthiyear = ZDUMP_HI_YEAR;
273ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	register time_t		cutlotime;
274ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	register time_t		cuthitime;
275ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	register char **	fakeenv;
276ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	time_t			now;
277ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	time_t			t;
278ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	time_t			newt;
279ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	struct tm		tm;
280ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	struct tm		newtm;
281ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	register struct tm *	tmp;
282ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	register struct tm *	newtmp;
283ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifdef ICU
284ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	int		nextopt;
285ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	char *	dirarg;
286ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	int		aflag;
287ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	int		iflag;
288ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	listentry *	namelist = NULL;
289ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	FILE *	fp = stdout;
290ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
291ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
292ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	INITIALIZE(cutlotime);
293ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	INITIALIZE(cuthitime);
294ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if HAVE_GETTEXT
295ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	(void) setlocale(LC_ALL, "");
296ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifdef TZ_DOMAINDIR
297ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	(void) bindtextdomain(TZ_DOMAIN, TZ_DOMAINDIR);
298ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif /* defined TEXTDOMAINDIR */
299ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	(void) textdomain(TZ_DOMAIN);
300ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif /* HAVE_GETTEXT */
301ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	progname = argv[0];
302ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	for (i = 1; i < argc; ++i)
303ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		if (strcmp(argv[i], "--version") == 0) {
304ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			(void) printf("%s\n", elsieid);
305ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			exit(EXIT_SUCCESS);
306ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		}
307ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	vflag = 0;
308ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	cutarg = NULL;
309ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifdef ICU
310ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	aflag = 0;
311ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	iflag = 0;
312ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	dirarg = NULL;
313ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	nextopt = 1;
314ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	while(nextopt) {
315ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		c = getopt(argc, argv, "ac:d:iv");
316ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		switch(c) {
317ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		case 'a':
318ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			aflag = 1;
319ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			break;
320ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		case 'c':
321ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			cutarg = optarg;
322ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			break;
323ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		case 'd':
324ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			dirarg = optarg;
325ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			break;
326ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		case 'i':
327ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			iflag = 1;
328ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			break;
329ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		case 'v':
330ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			vflag = 1;
331ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			break;
332ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		default:
333ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			nextopt = 0;
334ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			break;
335ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		}
336ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	}
337ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	if ((c != EOF && c != -1) ||
338ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		(optind == argc - 1 && strcmp(argv[optind], "=") == 0)) {
339ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			(void) fprintf(stderr,
340ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				_("%s: usage is %s [ --version ] [ -a ] [ -v ] [ -i ] [ -c [loyear,]hiyear ] [ -d dir ] [ zonename ... ]\n"),
341ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				progname, progname);
342ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			exit(EXIT_FAILURE);
343ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	}
344ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
345ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	if (dirarg != NULL) {
346ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		DIR *	dp;
347ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		/* create the output directory */
348ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		mkdir(dirarg, 0777);
349ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		if ((dp = opendir(dirarg)) == NULL) {
350ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			fprintf(stderr, "cannot create the target directory");
351ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			exit(EXIT_FAILURE);
352ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		}
353ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		closedir(dp);
354ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	}
355ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#else
356ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	while ((c = getopt(argc, argv, "c:v")) == 'c' || c == 'v')
357ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		if (c == 'v')
358ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			vflag = 1;
359ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		else	cutarg = optarg;
360ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	if ((c != EOF && c != -1) ||
361ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		(optind == argc - 1 && strcmp(argv[optind], "=") == 0)) {
362ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			(void) fprintf(stderr,
363ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru_("%s: usage is %s [ --version ] [ -v ] [ -c [loyear,]hiyear ] zonename ...\n"),
364ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				progname, progname);
365ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			exit(EXIT_FAILURE);
366ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	}
367ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
368ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	if (vflag) {
369ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		if (cutarg != NULL) {
370ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			long	lo;
371ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			long	hi;
372ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			char	dummy;
373ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
374ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			if (sscanf(cutarg, "%ld%c", &hi, &dummy) == 1) {
375ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				cuthiyear = hi;
376ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			} else if (sscanf(cutarg, "%ld,%ld%c",
377ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				&lo, &hi, &dummy) == 2) {
378ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru					cutloyear = lo;
379ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru					cuthiyear = hi;
380ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			} else {
381ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru(void) fprintf(stderr, _("%s: wild -c argument %s\n"),
382ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru					progname, cutarg);
383ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				exit(EXIT_FAILURE);
384ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			}
385ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		}
386ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		setabsolutes();
387ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		cutlotime = yeartot(cutloyear);
388ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		cuthitime = yeartot(cuthiyear);
389ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	}
390ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
391ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifdef ICU
392ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	if (aflag) {
393ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		/* get all available zones */
394ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		char ** fakeargv;
395ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		int i;
396ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		int count;
397ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
398ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		count = getall(&namelist);
399ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
400ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		fakeargv = (char **) malloc((size_t) (argc + count) * sizeof *argv);
401ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		/*
402ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		if ((fakeargv = (char **) malloc((size_t) (argc + count) * sizeof *argv)) == NULL) {
403ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			exit(EXIT_FAILURE);
404ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		}
405ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		*/
406ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		for (i = 0; i < argc; i++) {
407ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			fakeargv[i] = argv[i];
408ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		}
409ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		for (i = 0; i < count; i++) {
410ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			fakeargv[i + argc] = namelist->name;
411ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			namelist = namelist->next;
412ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		}
413ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		argv = fakeargv;
414ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		argc += count;
415ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	}
416ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
417ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	(void) time(&now);
418ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	longest = 0;
419ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	for (i = optind; i < argc; ++i)
420ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		if (strlen(argv[i]) > longest)
421ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			longest = strlen(argv[i]);
422ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	{
423ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		register int	from;
424ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		register int	to;
425ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
426ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		for (i = 0; environ[i] != NULL; ++i)
427ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			continue;
428ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		fakeenv = (char **) malloc((size_t) ((i + 2) *
429ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			sizeof *fakeenv));
430ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		if (fakeenv == NULL ||
431ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			(fakeenv[0] = (char *) malloc(longest + 4)) == NULL) {
432ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru					(void) perror(progname);
433ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru					exit(EXIT_FAILURE);
434ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		}
435ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		to = 0;
436ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		(void) strcpy(fakeenv[to++], "TZ=");
437ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		for (from = 0; environ[from] != NULL; ++from)
438ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			if (strncmp(environ[from], "TZ=", 3) != 0)
439ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				fakeenv[to++] = environ[from];
440ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		fakeenv[to] = NULL;
441ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		environ = fakeenv;
442ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	}
443ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	for (i = optind; i < argc; ++i) {
444ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		static char	buf[MAX_STRING_LENGTH];
445ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
446ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		(void) strcpy(&fakeenv[0][3], argv[i]);
447ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		if (!vflag) {
448ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			show(argv[i], now, FALSE);
449ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			continue;
450ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		}
451ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifdef ICU
452ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		fp = NULL;
453ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		if (iflag) {
454ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			if (dirarg == NULL) {
455ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				/* we want to display a zone name here */
456ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				if (i != optind) {
457ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru					printf("\n");
458ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				}
459ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				printf("ZONE: %s\n", argv[i]);
460ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			} else {
461ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				int		zstart;
462ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				char	path[FILENAME_MAX + 1];
463ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				strcpy(path, dirarg);
464ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				strcat(path, "/");
465ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				zstart = strlen(path);
466ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				strcat(path, argv[i]);
467ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				/* replace '/' with '-' */
468ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				while(path[++zstart] != 0) {
469ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru					if (path[zstart] == '/') {
470ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru						path[zstart] = '-';
471ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru					}
472ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				}
473ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				if ((fp = fopen(path, "w")) == NULL) {
474ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru					fprintf(stderr, "cannot create output file %s\n", path);
475ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru					exit(EXIT_FAILURE);
476ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				}
477ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			}
478ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		}
479ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
480ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		warned = FALSE;
481ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		t = absolute_min_time;
482ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifdef ICU
483ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		/* skip displaying info for the lowest time, which is actually not
484ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		 * a transition when -i option is set */
485ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		if (!iflag) {
486ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
487ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		show(argv[i], t, TRUE);
488ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		t += SECSPERHOUR * HOURSPERDAY;
489ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		show(argv[i], t, TRUE);
490ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifdef ICU
491ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		}
492ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
493ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		if (t < cutlotime)
494ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			t = cutlotime;
495ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		tmp = my_localtime(&t);
496ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		if (tmp != NULL) {
497ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			tm = *tmp;
498ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			(void) strncpy(buf, abbr(&tm), (sizeof buf) - 1);
499ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		}
500ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		for ( ; ; ) {
501ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			if (t >= cuthitime)
502ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				break;
503ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			newt = t + SECSPERHOUR * 12;
504ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			if (newt >= cuthitime)
505ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				break;
506ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			if (newt <= t)
507ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				break;
508ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			newtmp = localtime(&newt);
509ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			if (newtmp != NULL)
510ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				newtm = *newtmp;
511ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifdef ICU
512ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			if (iflag) {
513ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				/* We  do not want to capture transitions just for
514ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				 * abbreviated zone name changes */
515ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				if ((tmp == NULL || newtmp == NULL) ? (tmp != newtmp) :
516ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru					(delta(&newtm, &tm) != (newt - t) ||
517ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru					newtm.tm_isdst != tm.tm_isdst)) {
518ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru						newt = huntICU(argv[i], t, newt, fp);
519ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru						newtmp = localtime(&newt);
520ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru						if (newtmp != NULL) {
521ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru							newtm = *newtmp;
522ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru							(void) strncpy(buf,
523ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru								abbr(&newtm),
524ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru								(sizeof buf) - 1);
525ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru						}
526ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				}
527ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			} else {
528ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
529ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			if ((tmp == NULL || newtmp == NULL) ? (tmp != newtmp) :
530ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				(delta(&newtm, &tm) != (newt - t) ||
531ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				newtm.tm_isdst != tm.tm_isdst ||
532ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				strcmp(abbr(&newtm), buf) != 0)) {
533ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru					newt = hunt(argv[i], t, newt);
534ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru					newtmp = localtime(&newt);
535ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru					if (newtmp != NULL) {
536ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru						newtm = *newtmp;
537ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru						(void) strncpy(buf,
538ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru							abbr(&newtm),
539ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru							(sizeof buf) - 1);
540ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru					}
541ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			}
542ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifdef ICU
543ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			}
544ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
545ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			t = newt;
546ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			tm = newtm;
547ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			tmp = newtmp;
548ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		}
549ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifdef ICU
550ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		if (!iflag) {
551ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		/* skip displaying info for the highest time, which is actually not
552ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		 * a transition when -i option is used*/
553ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
554ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		t = absolute_max_time;
555ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		t -= SECSPERHOUR * HOURSPERDAY;
556ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		show(argv[i], t, TRUE);
557ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		t += SECSPERHOUR * HOURSPERDAY;
558ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		show(argv[i], t, TRUE);
559ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
560ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifdef ICU
561ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		}
562ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		/* close file */
563ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		if (fp != NULL) {
564ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			fclose(fp);
565ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		}
566ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
567ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	}
568ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	if (fflush(stdout) || ferror(stdout)) {
569ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		(void) fprintf(stderr, "%s: ", progname);
570ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		(void) perror(_("Error writing to standard output"));
571ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		exit(EXIT_FAILURE);
572ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	}
573ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifdef ICU
574ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	if (aflag) {
575ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		struct listentry *	entry = namelist;
576ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		struct listentry *	next;
577ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		while (entry != NULL) {
578ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			free(entry->name);
579ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			next = entry->next;
580ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			free(entry);
581ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			entry = next;
582ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		}
583ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	}
584ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
585ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	exit(EXIT_SUCCESS);
586ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	/* If exit fails to exit... */
587ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	return EXIT_FAILURE;
588ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
589ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
590ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void
591ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querusetabsolutes()
592ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
593ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	if (0.5 == (time_t) 0.5) {
594ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		/*
595ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		** time_t is floating.
596ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		*/
597ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		if (sizeof (time_t) == sizeof (float)) {
598ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			absolute_min_time = (time_t) -FLT_MAX;
599ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			absolute_max_time = (time_t) FLT_MAX;
600ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		} else if (sizeof (time_t) == sizeof (double)) {
601ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			absolute_min_time = (time_t) -DBL_MAX;
602ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			absolute_max_time = (time_t) DBL_MAX;
603ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		} else {
604ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			(void) fprintf(stderr,
605ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru_("%s: use of -v on system with floating time_t other than float or double\n"),
606ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				progname);
607ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			exit(EXIT_FAILURE);
608ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		}
609ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	} else if (0 > (time_t) -1) {
610ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		/*
611ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		** time_t is signed.  Assume overflow wraps around.
612ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		*/
613ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		time_t t = 0;
614ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		time_t t1 = 1;
615ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
616ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		while (t < t1) {
617ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			t = t1;
618ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			t1 = 2 * t1 + 1;
619ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		}
620ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
621ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		absolute_max_time = t;
622ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		t = -t;
623ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		absolute_min_time = t - 1;
624ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		if (t < absolute_min_time)
625ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			absolute_min_time = t;
626ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	} else {
627ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		/*
628ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		** time_t is unsigned.
629ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		*/
630ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		absolute_min_time = 0;
631ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		absolute_max_time = absolute_min_time - 1;
632ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	}
633ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
634ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
635ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic time_t
636ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruyeartot(y)
637ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruconst long	y;
638ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
639ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	register long	myy;
640ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	register long	seconds;
641ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	register time_t	t;
642ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
643ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	myy = EPOCH_YEAR;
644ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	t = 0;
645ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	while (myy != y) {
646ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		if (myy < y) {
647ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			seconds = isleap(myy) ? SECSPERLYEAR : SECSPERNYEAR;
648ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			++myy;
649ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			if (t > absolute_max_time - seconds) {
650ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				t = absolute_max_time;
651ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				break;
652ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			}
653ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			t += seconds;
654ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		} else {
655ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			--myy;
656ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			seconds = isleap(myy) ? SECSPERLYEAR : SECSPERNYEAR;
657ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			if (t < absolute_min_time + seconds) {
658ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				t = absolute_min_time;
659ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				break;
660ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			}
661ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			t -= seconds;
662ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		}
663ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	}
664ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	return t;
665ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
666ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
667ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic time_t
668ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruhunt(char *name, time_t lot, time_t hit)
669ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
670ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	time_t			t;
671ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	long			diff;
672ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	struct tm		lotm;
673ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	register struct tm *	lotmp;
674ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	struct tm		tm;
675ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	register struct tm *	tmp;
676ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	char			loab[MAX_STRING_LENGTH];
677ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
678ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	lotmp = my_localtime(&lot);
679ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	if (lotmp != NULL) {
680ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		lotm = *lotmp;
681ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		(void) strncpy(loab, abbr(&lotm), (sizeof loab) - 1);
682ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	}
683ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	for ( ; ; ) {
684ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		diff = (long) (hit - lot);
685ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		if (diff < 2)
686ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			break;
687ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		t = lot;
688ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		t += diff / 2;
689ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		if (t <= lot)
690ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			++t;
691ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		else if (t >= hit)
692ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			--t;
693ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		tmp = my_localtime(&t);
694ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		if (tmp != NULL)
695ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			tm = *tmp;
696ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		if ((lotmp == NULL || tmp == NULL) ? (lotmp == tmp) :
697ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			(delta(&tm, &lotm) == (t - lot) &&
698ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			tm.tm_isdst == lotm.tm_isdst &&
699ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			strcmp(abbr(&tm), loab) == 0)) {
700ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				lot = t;
701ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				lotm = tm;
702ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				lotmp = tmp;
703ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		} else	hit = t;
704ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	}
705ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	show(name, lot, TRUE);
706ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	show(name, hit, TRUE);
707ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	return hit;
708ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
709ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
710ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/*
711ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru** Thanks to Paul Eggert for logic used in delta.
712ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*/
713ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
714ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic long
715ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querudelta(newp, oldp)
716ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustruct tm *	newp;
717ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustruct tm *	oldp;
718ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
719ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	register long	result;
720ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	register int	tmy;
721ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
722ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	if (newp->tm_year < oldp->tm_year)
723ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		return -delta(oldp, newp);
724ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	result = 0;
725ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	for (tmy = oldp->tm_year; tmy < newp->tm_year; ++tmy)
726ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		result += DAYSPERNYEAR + isleap_sum(tmy, TM_YEAR_BASE);
727ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	result += newp->tm_yday - oldp->tm_yday;
728ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	result *= HOURSPERDAY;
729ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	result += newp->tm_hour - oldp->tm_hour;
730ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	result *= MINSPERHOUR;
731ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	result += newp->tm_min - oldp->tm_min;
732ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	result *= SECSPERMIN;
733ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	result += newp->tm_sec - oldp->tm_sec;
734ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	return result;
735ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
736ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
737ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void
738ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querushow(char *zone, time_t t, int v)
739ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
740ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	register struct tm *	tmp;
741ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
742ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	(void) printf("%-*s  ", (int) longest, zone);
743ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	if (v) {
744ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		tmp = gmtime(&t);
745ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		if (tmp == NULL) {
746ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			(void) printf(tformat(), t);
747ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		} else {
748ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			dumptime(tmp);
749ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			(void) printf(" UTC");
750ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		}
751ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		(void) printf(" = ");
752ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	}
753ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	tmp = my_localtime(&t);
754ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	dumptime(tmp);
755ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	if (tmp != NULL) {
756ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		if (*abbr(tmp) != '\0')
757ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			(void) printf(" %s", abbr(tmp));
758ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		if (v) {
759ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			(void) printf(" isdst=%d", tmp->tm_isdst);
760ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifdef TM_GMTOFF
761ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			(void) printf(" gmtoff=%ld", tmp->TM_GMTOFF);
762ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif /* defined TM_GMTOFF */
763ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		}
764ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	}
765ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	(void) printf("\n");
766ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	if (tmp != NULL && *abbr(tmp) != '\0')
767ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		abbrok(abbr(tmp), zone);
768ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
769ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
770ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic char *
771ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruabbr(tmp)
772ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustruct tm *	tmp;
773ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
774ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	register char *	result;
775ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	static char	nada;
776ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
777ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	if (tmp->tm_isdst != 0 && tmp->tm_isdst != 1)
778ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		return &nada;
779ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	result = tzname[tmp->tm_isdst];
780ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	return (result == NULL) ? &nada : result;
781ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
782ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
783ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/*
784ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru** The code below can fail on certain theoretical systems;
785ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru** it works on all known real-world systems as of 2004-12-30.
786ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*/
787ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
788ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const char *
789ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querutformat()
790ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
791ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	if (0.5 == (time_t) 0.5) {	/* floating */
792ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		if (sizeof (time_t) > sizeof (double))
793ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			return "%Lg";
794ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		return "%g";
795ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	}
796ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	if (0 > (time_t) -1) {		/* signed */
797ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		if (sizeof (time_t) > sizeof (long))
798ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			return "%lld";
799ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		if (sizeof (time_t) > sizeof (int))
800ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			return "%ld";
801ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		return "%d";
802ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	}
803ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	if (sizeof (time_t) > sizeof (unsigned long))
804ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		return "%llu";
805ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	if (sizeof (time_t) > sizeof (unsigned int))
806ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		return "%lu";
807ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	return "%u";
808ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
809ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
810ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void
811ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querudumptime(timeptr)
812ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruregister const struct tm *	timeptr;
813ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
814ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	static const char	wday_name[][3] = {
815ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
816ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	};
817ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	static const char	mon_name[][3] = {
818ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		"Jan", "Feb", "Mar", "Apr", "May", "Jun",
819ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
820ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	};
821ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	register const char *	wn;
822ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	register const char *	mn;
823ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	register int		lead;
824ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	register int		trail;
825ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
826ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	if (timeptr == NULL) {
827ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		(void) printf("NULL");
828ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		return;
829ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	}
830ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	/*
831ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	** The packaged versions of localtime and gmtime never put out-of-range
832ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	** values in tm_wday or tm_mon, but since this code might be compiled
833ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	** with other (perhaps experimental) versions, paranoia is in order.
834ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	*/
835ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	if (timeptr->tm_wday < 0 || timeptr->tm_wday >=
836ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		(int) (sizeof wday_name / sizeof wday_name[0]))
837ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			wn = "???";
838ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	else		wn = wday_name[timeptr->tm_wday];
839ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	if (timeptr->tm_mon < 0 || timeptr->tm_mon >=
840ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		(int) (sizeof mon_name / sizeof mon_name[0]))
841ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			mn = "???";
842ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	else		mn = mon_name[timeptr->tm_mon];
843ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	(void) printf("%.3s %.3s%3d %.2d:%.2d:%.2d ",
844ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		wn, mn,
845ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		timeptr->tm_mday, timeptr->tm_hour,
846ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		timeptr->tm_min, timeptr->tm_sec);
847ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define DIVISOR	10
848ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	trail = timeptr->tm_year % DIVISOR + TM_YEAR_BASE % DIVISOR;
849ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	lead = timeptr->tm_year / DIVISOR + TM_YEAR_BASE / DIVISOR +
850ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		trail / DIVISOR;
851ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	trail %= DIVISOR;
852ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	if (trail < 0 && lead > 0) {
853ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		trail += DIVISOR;
854ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		--lead;
855ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	} else if (lead < 0 && trail > 0) {
856ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		trail -= DIVISOR;
857ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		++lead;
858ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	}
859ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	if (lead == 0)
860ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		(void) printf("%d", trail);
861ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	else	(void) printf("%d%d", lead, ((trail < 0) ? -trail : trail));
862ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
863ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
864ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifdef ICU
865ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic time_t
866ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruhuntICU(char *name, time_t lot, time_t hit, FILE * fp)
867ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
868ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	time_t			t;
869ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	long			diff;
870ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	struct tm		lotm;
871ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	register struct tm *	lotmp;
872ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	struct tm		tm;
873ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	register struct tm *	tmp;
874ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	char			loab[MAX_STRING_LENGTH];
875ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
876ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	lotmp = my_localtime(&lot);
877ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	if (lotmp != NULL) {
878ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		lotm = *lotmp;
879ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		(void) strncpy(loab, abbr(&lotm), (sizeof loab) - 1);
880ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	}
881ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	for ( ; ; ) {
882ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		diff = (long) (hit - lot);
883ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		if (diff < 2)
884ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			break;
885ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		t = lot;
886ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		t += diff / 2;
887ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		if (t <= lot)
888ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			++t;
889ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		else if (t >= hit)
890ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			--t;
891ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		tmp = my_localtime(&t);
892ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		if (tmp != NULL)
893ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			tm = *tmp;
894ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		/* We  do not want to capture transitions just for
895ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		 * abbreviated zone name changes */
896ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		if ((lotmp == NULL || tmp == NULL) ? (lotmp == tmp) :
897ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			(delta(&tm, &lotm) == (t - lot) &&
898ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			tm.tm_isdst == lotm.tm_isdst)) {
899ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				lot = t;
900ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				lotm = tm;
901ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				lotmp = tmp;
902ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		} else	hit = t;
903ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	}
904ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	showICU(fp, name, lot, hit);
905ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	return hit;
906ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
907ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
908ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void showICU(FILE * fp, char *zone, time_t t1, time_t t2)
909ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
910ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	if (fp == NULL) {
911ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		fp = stdout;
912ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	}
913ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	dumptimeICU(fp, t1);
914ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	fprintf(fp, " > ");
915ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	dumptimeICU(fp, t2);
916ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	fprintf(fp, "\n");
917ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
918ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
919ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void dumptimeICU(FILE * fp, time_t t)
920ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
921ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	static const char	wday_name[][3] = {
922ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
923ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	};
924ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	struct tm gmt;
925ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	struct tm loc;
926ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	register int		lead;
927ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	register int		trail;
928ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	long	offset;
929ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	long	hour, min, sec;
930ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
931ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	loc = *my_localtime(&t);
932ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
933ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	trail = loc.tm_year % DIVISOR + TM_YEAR_BASE % DIVISOR;
934ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	lead = loc.tm_year / DIVISOR + TM_YEAR_BASE / DIVISOR + trail / DIVISOR;
935ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	trail %= DIVISOR;
936ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	if (trail < 0 && lead > 0) {
937ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		trail += DIVISOR;
938ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		--lead;
939ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	} else if (lead < 0 && trail > 0) {
940ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		trail -= DIVISOR;
941ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		++lead;
942ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	}
943ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
944ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	fprintf(fp, "%04d-%02d-%02d", lead * DIVISOR + trail, loc.tm_mon + 1, loc.tm_mday);
945ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	fprintf(fp, " %.3s ", wday_name[loc.tm_wday]);
946ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	fprintf(fp, "%02d:%02d:%02d", loc.tm_hour, loc.tm_min, loc.tm_sec);
947ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
948ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	gmt = *gmtime(&t);
949ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	offset = delta(&loc, &gmt);
950ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	if (offset < 0) {
951ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		offset = -offset;
952ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		fprintf(fp, "-");
953ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	} else {
954ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		fprintf(fp, "+");
955ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	}
956ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
957ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	sec = offset % 60;
958ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	offset = (offset - sec) / 60;
959ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	min = offset % 60;
960ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	hour = offset / 60;
961ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
962ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	fprintf(fp, "%02d", hour);
963ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	fprintf(fp, "%02d", min);
964ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	fprintf(fp, "%02d", sec);
965ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	fprintf(fp, "[DST=%d]", loc.tm_isdst);
966ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
967ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
968ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic int getall(struct listentry ** namelist) {
969ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	int count = 0;
970ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	struct listentry dummyentry;
971ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	struct listentry *	last = &dummyentry;
972ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
973ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	getzones(TZDIR, NULL, &last, &count);
974ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	if (count > 0) {
975ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		*namelist = dummyentry.next;
976ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	}
977ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
978ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	return count;
979ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
980ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
981ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void getzones(char * basedir, char * relpath, struct listentry ** last, int * count) {
982ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	char	path[FILENAME_MAX + 1];
983ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	struct	dirent *	dir;
984ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	DIR *	dp;
985ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
986ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	strcpy(path, basedir);
987ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	if (relpath != NULL) {
988ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		strcat(path, "/");
989ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		strcat(path, relpath);
990ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	}
991ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
992ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	if ((dp = opendir(path)) == NULL) {
993ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		/* file */
994ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		if (strstr(relpath, ".tab") == NULL) {
995ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			char *		pzonename;
996ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			listentry *	pentry;
997ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
998ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			if ((pzonename = malloc(strlen(relpath) + 1)) == NULL) {
999ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				exit(EXIT_FAILURE);
1000ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			}
1001ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			strcpy(pzonename, relpath);
1002ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1003ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			if ((pentry = malloc(sizeof(listentry))) == NULL) {
1004ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				exit(EXIT_FAILURE);
1005ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			}
1006ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1007ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			pentry->name = pzonename;
1008ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			pentry->next = NULL;
1009ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			(*last)->next = pentry;
1010ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			*last = pentry;
1011ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			(*count)++;
1012ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		}
1013ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	} else {
1014ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		/* directory */
1015ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		while ((dir = readdir(dp)) != NULL) {
1016ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			char	subpath[FILENAME_MAX + 1];
1017ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1018ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			if (strcmp(dir->d_name, ".") == 0
1019ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				|| strcmp(dir->d_name, "..") == 0) {
1020ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				continue;
1021ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			}
1022ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			if (relpath != NULL) {
1023ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				strcpy(subpath, relpath);
1024ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				strcat(subpath, "/");
1025ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				strcat(subpath, dir->d_name);
1026ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			} else {
1027ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				strcpy(subpath, dir->d_name);
1028ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			}
1029ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			getzones(basedir, subpath, last, count);
1030ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		}
1031ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		closedir(dp);
1032ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	}
1033ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
1034ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
1035