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