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