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