Annotation of 43BSDTahoe/etc/tzone/zdump.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char sccsid[] = "@(#)zdump.c    1.2 (Berkeley) 10/22/87";
                      3: #endif
                      4: 
                      5: #include "stdio.h"
                      6: 
                      7: #include "sys/types.h"
                      8: #include "tzfile.h"
                      9: #include "time.h"
                     10: 
                     11: #ifndef TRUE
                     12: #define TRUE           1
                     13: #define FALSE          0
                     14: #endif
                     15: 
                     16: extern char *          asctime();
                     17: extern char **         environ;
                     18: extern struct tm *     gmtime();
                     19: extern char *          imalloc();
                     20: extern char *          optarg;
                     21: extern int             optind;
                     22: extern long            time();
                     23: extern char *          tzname[2];
                     24: extern void            tzset();
                     25: 
                     26: /*
                     27: ** For the benefit of cyntax...
                     28: */
                     29: 
                     30: static long            tzdecode();
                     31: static                 readerr();
                     32: static                 show();
                     33: 
                     34: static int             longest;
                     35: 
                     36: static long
                     37: tzdecode(codep)
                     38: char * codep;
                     39: {
                     40:        register int    i;
                     41:        register long   result;
                     42: 
                     43:        result = 0;
                     44:        for (i = 0; i < 4; ++i)
                     45:                result = (result << 8) | (codep[i] & 0xff);
                     46:        return result;
                     47: }
                     48: 
                     49: main(argc, argv)
                     50: int    argc;
                     51: char * argv[];
                     52: {
                     53:        register FILE * fp;
                     54:        register int    i, j, c;
                     55:        register int    vflag;
                     56:        register char * cutoff;
                     57:        register int    cutyear;
                     58:        register long   cuttime;
                     59:        time_t          now;
                     60:        time_t          t;
                     61:        long            timecnt;
                     62:        char            buf[BUFSIZ];
                     63: 
                     64:        vflag = 0;
                     65:        cutoff = NULL;
                     66:        while ((c = getopt(argc, argv, "c:v")) == 'c' || c == 'v')
                     67:                if (c == 'v')
                     68:                        vflag = 1;
                     69:                else    cutoff = optarg;
                     70:        if (c != EOF || optind == argc - 1 && strcmp(argv[optind], "=") == 0) {
                     71:                (void) fprintf(stderr, "%s: usage is %s [ -v ] zonename ...\n",
                     72:                        argv[0], argv[0]);
                     73:                exit(1);
                     74:        }
                     75:        if (cutoff != NULL)
                     76:                cutyear = atoi(cutoff);
                     77:        /*
                     78:        ** VERY approximate.
                     79:        */
                     80:        cuttime = (long) (cutyear - EPOCH_YEAR) *
                     81:                SECS_PER_HOUR * HOURS_PER_DAY * DAYS_PER_NYEAR;
                     82:        (void) time(&now);
                     83:        longest = 0;
                     84:        for (i = optind; i < argc; ++i)
                     85:                if (strlen(argv[i]) > longest)
                     86:                        longest = strlen(argv[i]);
                     87:        for (i = optind; i < argc; ++i) {
                     88:                register char **        saveenv;
                     89:                char *                  tzequals;
                     90:                char *                  fakeenv[2];
                     91: 
                     92:                tzequals = imalloc(strlen(argv[i]) + 4);
                     93:                if (tzequals == NULL) {
                     94:                        (void) fprintf(stderr, "%s: can't allocate memory\n",
                     95:                                argv[0]);
                     96:                        exit(1);
                     97:                }
                     98:                (void) sprintf(tzequals, "TZ=%s", argv[i]);
                     99:                fakeenv[0] = tzequals;
                    100:                fakeenv[1] = NULL;
                    101:                saveenv = environ;
                    102:                environ = fakeenv;
                    103:                (void) tzset();
                    104:                environ = saveenv;
                    105:                show(argv[i], now, FALSE);
                    106:                if (!vflag)
                    107:                        continue;
                    108:                if (argv[i][0] == '/')
                    109:                        fp = fopen(argv[i], "r");
                    110:                else {
                    111:                        j = strlen(TZDIR) + 1 + strlen(argv[i]) + 1;
                    112:                        if (j > sizeof buf) {
                    113:                                (void) fprintf(stderr,
                    114:                                        "%s: timezone name %s/%s is too long\n",
                    115:                                        argv[0], TZDIR, argv[i]);
                    116:                                exit(1);
                    117:                        }
                    118:                        (void) sprintf(buf, "%s/%s", TZDIR, argv[i]);
                    119:                        fp = fopen(buf, "r");
                    120:                }
                    121:                if (fp == NULL) {
                    122:                        (void) fprintf(stderr, "%s: Can't open ", argv[0]);
                    123:                        perror(argv[i]);
                    124:                        exit(1);
                    125:                }
                    126:                {
                    127:                        char            code[4];
                    128: 
                    129: (void) fseek(fp, (long) sizeof ((struct tzhead *) 0)->tzh_reserved, 0);
                    130:                        if (fread((char *) code, sizeof code, 1, fp) != 1)
                    131:                                readerr(fp, argv[0], argv[i]);
                    132:                        timecnt = tzdecode(code);
                    133:                        (void) fseek(fp, (long) (2 * sizeof code), 1);
                    134:                }
                    135:                t = 0x80000000;
                    136:                if (t > 0)              /* time_t is unsigned */
                    137:                        t = 0;
                    138:                show(argv[i], t, TRUE);
                    139:                t += SECS_PER_HOUR * HOURS_PER_DAY;
                    140:                show(argv[i], t, TRUE);
                    141:                while (timecnt-- > 0) {
                    142:                        char    code[4];
                    143: 
                    144:                        if (fread((char *) code, sizeof code, 1, fp) != 1)
                    145:                                readerr(fp, argv[0], argv[i]);
                    146:                        t = tzdecode(code);
                    147:                        if (cutoff != NULL && t > cuttime)
                    148:                                break;
                    149:                        show(argv[i], t - 1, TRUE);
                    150:                        show(argv[i], t, TRUE);
                    151:                }
                    152:                if (fclose(fp)) {
                    153:                        (void) fprintf(stderr, "%s: Error closing ", argv[0]);
                    154:                        perror(argv[i]);
                    155:                        exit(1);
                    156:                }
                    157:                t = 0xffffffff;
                    158:                if (t < 0)              /* time_t is signed */
                    159:                        t = 0x7fffffff ;
                    160:                t -= SECS_PER_HOUR * HOURS_PER_DAY;
                    161:                show(argv[i], t, TRUE);
                    162:                t += SECS_PER_HOUR * HOURS_PER_DAY;
                    163:                show(argv[i], t, TRUE);
                    164:                free(tzequals);
                    165:        }
                    166:        if (fflush(stdout) || ferror(stdout)) {
                    167:                (void) fprintf(stderr, "%s: Error writing standard output ",
                    168:                        argv[0]);
                    169:                perror("standard output");
                    170:                exit(1);
                    171:        }
                    172:        return 0;
                    173: }
                    174: 
                    175: static
                    176: show(zone, t, v)
                    177: char * zone;
                    178: time_t t;
                    179: {
                    180:        struct tm *             tmp;
                    181:        extern struct tm *      localtime();
                    182: 
                    183:        (void) printf("%-*s  ", longest, zone);
                    184:        if (v)
                    185:                (void) printf("%.24s GMT = ", asctime(gmtime(&t)));
                    186:        tmp = localtime(&t);
                    187:        (void) printf("%.24s", asctime(tmp));
                    188:        if (*tzname[tmp->tm_isdst] != '\0')
                    189:                (void) printf(" %s", tzname[tmp->tm_isdst]);
                    190:        if (v) {
                    191:                (void) printf(" isdst=%d", tmp->tm_isdst);
                    192:                (void) printf(" gmtoff=%ld", tmp->tm_gmtoff);
                    193:        }
                    194:        (void) printf("\n");
                    195: }
                    196: 
                    197: static
                    198: readerr(fp, progname, filename)
                    199: FILE * fp;
                    200: char * progname;
                    201: char * filename;
                    202: {
                    203:        (void) fprintf(stderr, "%s: Error reading ", progname);
                    204:        if (ferror(fp))
                    205:                perror(filename);
                    206:        else    (void) fprintf(stderr, "%s: Premature EOF\n", filename);
                    207:        exit(1);
                    208: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.