home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / mail / mmdf / mmdf-IIb.43 / libz / zdump.c < prev    next >
Encoding:
C/C++ Source or Header  |  1989-06-23  |  4.6 KB  |  218 lines

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