home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Programmer's Library 1.3 / Microsoft-Programers-Library-v1.3.iso / sampcode / prof_c / 06user / timer.c < prev    next >
Encoding:
C/C++ Source or Header  |  1988-08-11  |  3.3 KB  |  143 lines

  1. /*
  2.  *    timer -- general purpose timer program; uses the
  3.  *    PC's intra-application communication area (ICA) as
  4.  *    a time and date buffer
  5.  */
  6.  
  7. #include <dos.h>
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <string.h>
  11. #include <time.h>
  12. #include <memory.h>
  13. #include <local\std.h>
  14.  
  15. #define NBYTES        16
  16. #define ICA_SEG    0x4F
  17. #define MAXTNUM        3
  18. #define TIMEMASK    0x3FFFFFFF
  19. #define FLAGBIT        0x80000000
  20. #define IDBIT        0x40000000
  21.  
  22. main(argc, argv)
  23. int argc;
  24. char *argv[];
  25. {
  26.     int ch;
  27.     char *cp;    
  28.     int tn;            /* timer number */
  29.     int errflag;        /* error flag */
  30.     int eflag;        /* elapsed time flag */
  31.     int sflag;        /* start timer flag */
  32.     char dest[MAXPATH + 1];    /* destination file name */
  33.     char timestr[MAXLINE];    /* buffer for elapsed time string */
  34.     long now;        /* current time */
  35.     long then;        /* previously recorded time */
  36.     FILE *fout;
  37.     unsigned long tdata[MAXTNUM];
  38.  
  39.     struct SREGS segregs;
  40.  
  41.     static char pgm[MAXNAME + 1] = { "timer" };
  42.  
  43.     static void usage(char *, char *);
  44.     extern char interval(long, char *);
  45.     extern char *getpname(char *, char *);
  46.     extern int getopt(int, char **, char *);
  47.     extern int optind, opterr;
  48.     extern char *optarg;
  49.  
  50.     if (_osmajor >= 3)
  51.         getpname(*argv, pgm);
  52.  
  53.     /* process optional arguments */
  54.     fout = stdout;
  55.     tn = 0;
  56.     errflag = eflag = sflag = 0;
  57.     while ((ch = getopt(argc, argv, "0123ef:s")) != EOF) {
  58.         switch (ch) {
  59.         case 'e':
  60.             /* report elapsed timing */
  61.             ++eflag;
  62.             break;
  63.         case 'f':
  64.             /* use specified log file or stream */
  65.             strcpy(dest, optarg);
  66.             if ((fout = fopen(dest, "a")) == NULL) {
  67.                 fprintf(stderr, "%s: Cannot open %s\n",
  68.                     pgm, dest);
  69.                 exit(1);
  70.             }
  71.             break;
  72.         case 's':
  73.             /* start (or restart) timing an interval */
  74.             ++sflag;
  75.             break;
  76.         case '0':
  77.         case '1':
  78.         case '2':
  79.         case '3':
  80.             /* use specified timer */
  81.             tn = ch - 0x30;
  82.             break;
  83.         case '?':
  84.             /* bad option flag */
  85.             ++errflag;
  86.             break;
  87.         }
  88.     }
  89.     argc -= optind;
  90.     argv += optind;
  91.  
  92.     /* check for errors */
  93.     if (errflag > 0 || argc > 0) 
  94.         usage(pgm, "Bad command line option(s)");
  95.  
  96.     segread(&segregs);
  97.  
  98.     /* report current date and time */
  99.     now = time(NULL);
  100.     fprintf(fout, "%s", ctime(&now));
  101.  
  102.     /* control and report timer data */
  103.     if (eflag) {
  104.         /* report elapsed time for specified timer */
  105.         movedata(ICA_SEG, 0, segregs.ds, tdata, NBYTES);
  106.         then = tdata[tn];
  107.         if ((then & FLAGBIT) != FLAGBIT || (then & IDBIT) != IDBIT) {
  108.             fprintf(stderr, "Timer database corrupted or not set\n");
  109.             exit(1);
  110.         }
  111.         interval(now - (then & TIMEMASK), timestr);
  112.         fprintf(stdout, "Elapsed time = %s\n", timestr);
  113.     }
  114.     if (sflag) {
  115.         /* start (or restart) specified timer */
  116.         movedata(ICA_SEG, 0, segregs.ds, tdata, NBYTES);
  117.         tdata[tn] = (now & TIMEMASK) | FLAGBIT | IDBIT;
  118.         movedata(segregs.ds, tdata, ICA_SEG, 0, NBYTES);
  119.     }
  120.     fputc('\n', fout);
  121.  
  122.     exit(0);
  123. }
  124.  
  125. /*
  126.  *    usage -- display a usage message and exit
  127.  *    with an error indication
  128.  */
  129.  
  130. static void
  131. usage(pname, mesg)
  132. char *pname;
  133. char *mesg;
  134. {
  135.     fprintf(stderr, "%s\n", mesg);
  136.     fprintf(stderr, "Usage: %s [-efs#]\n", pname);
  137.     fprintf(stderr, "\t-e \tshow an elapsed time (must use start first)\n");
  138.     fprintf(stderr, "\t-f file\tappend output to specified file\n");
  139.     fprintf(stderr, "\t-s \tstart (or restart) an interval timer\n");
  140.     fprintf(stderr, "\t-# \tselect a timer (0 to 3; default is 0)\n");
  141.     exit(2);
  142. }
  143.