home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 11 Util / 11-Util.zip / DELAY.LZH / DELAY.C next >
C/C++ Source or Header  |  1991-05-01  |  9KB  |  297 lines

  1. /* DELAY by M. Kimes -- Public Domain -- MSC 6.0a code -- BINDable */
  2. /* Translated from old DOS TC 2.0 code...don't shoot me...         */
  3.  
  4. #define INCL_DOS
  5.  
  6. #include <os2.h>
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <ctype.h>
  10. #include <time.h>
  11. #include <dos.h>
  12. #include <conio.h>
  13. #include <string.h>
  14.  
  15. typedef unsigned bit;
  16. typedef unsigned int word;
  17.  
  18. #define ESC 27
  19.  
  20. int _fastcall my_sleep(int secs);
  21.  
  22.  
  23.  
  24. void cdecl main (int argc,char **argv) {
  25.  
  26.    struct tm my_time,*mt;
  27.    time_t    t;
  28.    char      elevel=254,e[5],*p;
  29.    int       x;
  30.  
  31.  
  32.    if (argc < 2) {
  33.        fputs("\n\x1b[2J\x1b[30;47m\r DELAY.EXE -- Miscellaneous batch time/date routines -- no (c) by M. Kimes \n",stdout);
  34. GiveHelp:
  35.        fputs("\n\x1b[0m\rNo Delay requested...(DELAY #secs <HMSDEOYWIPK> [args])\n"
  36.              "\nLetter                   ERRORLEVEL"
  37.              "\n======                   ========================="
  38.              "\nH                        Hours"
  39.              "\nM                        Minutes"
  40.              "\nS                        Seconds"
  41.              "\nD                        Day-of-month"
  42.              "\nE                        Day-of-year (remember 255 errorlevel limit)"
  43.              "\nO                        Month"
  44.              "\nY                        2-digit Year"
  45.              "\nW                        Day-of-week"
  46.              "\nI <hh:mm:ss> <hh:mm:ss>  0 if in hours, 1 if out"
  47.              "\nP <hh:mm>                0 when time occurs"
  48.              "\nK <keys> <secs>          key position or 0 on timeout\n"
  49.              "\n If ESCape aborts any delays, 255 is returned.\n",stdout);
  50.         exit(0);
  51.    }
  52.    else {
  53.        if(!isdigit(*argv[1])) {
  54.            fputs("\nPossible foul up in first argument ",stdout);
  55.            fputs(argv[1],stdout);
  56.            fputc('\n',stdout);
  57.        }
  58.        if (!atoi(argv[1])) goto ELEVEL;
  59.        fputs("\nPausing ",stdout);
  60.        fputs(argv[1],stdout);
  61.        fputs(" second(s)...",stdout);
  62.        if(my_sleep(atoi(argv[1]))) {
  63.           elevel = 255;
  64.           goto OuttaHere;
  65.        }
  66.    }
  67.  
  68. ELEVEL:
  69.  
  70.    t = time(NULL);
  71.    memcpy(&my_time,localtime(&t),sizeof(struct tm));
  72.    if((argc < 3 ) || (argc > 2 && toupper(*argv[2]) != 'K'))
  73.        fputs("\nDropping ",stdout);
  74.  
  75.    if (argc > 2) {
  76.  
  77. RESWITCH:
  78.  
  79.         *argv[2]=(char)toupper(*argv[2]);
  80.         switch((int)*argv[2]) {
  81.         case '/':   /* ignore switch chars */
  82.         case '-':   memmove(&argv[2][1],argv[2],strlen(argv[2]));
  83.                     goto RESWITCH;
  84.  
  85.         case 'P': {
  86.  
  87.                  struct tm mytime;
  88.  
  89.                  if(argc < 4) {
  90.                     fputs("**Error**\n"
  91.                           "Example:  DELAY 0 P 12:00 (waits until 12:00)\n",stdout);
  92.                     goto GiveHelp;
  93.                  }
  94.                  fputs("(waiting until ",stdout);
  95.                  fputs(argv[3],stdout);
  96.                  fputs(" or ESC...)",stdout);
  97.                  p=strtok(argv[3],":");
  98.                  mytime.tm_hour=(char)atoi(p);
  99.                  mytime.tm_min=(char)atoi(strtok(0,":"));
  100.  
  101.                  for(;;) {
  102.                      t = time(NULL);
  103.                      mt = localtime(&t);
  104.                      if(mytime.tm_hour==mt->tm_hour &&
  105.                         mytime.tm_min==mt->tm_min) {
  106.                            elevel=0;
  107.                            break;
  108.                      }
  109.                      if(my_sleep(1)) {
  110.                          fputs(" [ESC]",stdout);
  111.                          elevel=255;
  112.                          break;
  113.                      }
  114.                  }
  115.                 }
  116.                 break;
  117.  
  118.         case 'K': {
  119.  
  120.                 char spin[] = "\\|/-",*sp = spin;
  121.  
  122.                 if(argc < 4) {
  123.                     fputs("**Error**\n"
  124.                           "Example:  DELAY 0 K ABCD 30 (waits 30 secs for A, B, C or D)\n"
  125.                           "          DELAY 0 K AB 0    (waits forever for A or B)\n",stdout);
  126.                     goto GiveHelp;
  127.                     break;
  128.                 }
  129.                 t = atol(argv[4]) * 10L;
  130.                 elevel = 0;
  131.                 strupr(argv[3]);
  132.                 fputc(*sp,stdout);
  133.                 fputc('\b',stdout);
  134.                 do {
  135.                     if(!kbhit()) {
  136.                         fputc(*sp,stdout);
  137.                         fputc('\b',stdout);
  138.                         sp++;
  139.                         if(!*sp) sp = spin;
  140.                         DosSleep(100L);
  141.                         if(kbhit() && t == 1L) t++;
  142.                     }
  143.                     else {
  144.                         x = getch();
  145.                         if(x == ESC) {
  146.                             elevel = 255;
  147.                             break;
  148.                         }
  149.                         if(strchr(argv[3],toupper(x))) {
  150.                             fputc(toupper(x),stdout);
  151.                             elevel = (char)(((int)strchr(argv[3],toupper(x)) -
  152.                                              (int)argv[2]) + 1);
  153.                             break;
  154.                         }
  155.                         else {
  156.                             fputc(*sp,stdout);
  157.                             fputc('\b',stdout);
  158.                             sp++;
  159.                             if(!*sp) sp = spin;
  160.                             DosSleep(100L);
  161.                         }
  162.                     }
  163.                     if(!t) continue;    /* endless loop if secs = 0 */
  164.                 } while(--t);
  165.                 fputs(" \b",stdout);
  166.                 break;
  167.               }
  168.  
  169.         case 'I': {
  170.  
  171.                 struct ftime {
  172.                   bit sec:  5;
  173.                   bit min:  6;
  174.                   bit hour: 5;
  175.                 };
  176.                 union tf {
  177.                   struct ftime ft;
  178.                   word x;
  179.                 } fdt;
  180.                 word x1;
  181.                 word x2;
  182.  
  183.                 if(argc < 4) {
  184.                     fputs("**Error**\n"
  185.                           "Example:  DELAY 0 I 12:00:00 13:00:00 (returns 0 if between\n"
  186.                           "12:00:00 and 13:00:00, otherwise returns 1\n",stdout);
  187.                     goto GiveHelp;
  188.                     break;
  189.                 }
  190.                 p=strtok(argv[3],":");
  191.                 fdt.ft.hour=(unsigned)atoi(p);
  192.                 fdt.ft.min=(unsigned)atoi(strtok(0,":"));
  193.                 fdt.ft.sec=(unsigned)atoi(strtok(0," "));
  194.                 x1=fdt.x;
  195.                 p=strtok(argv[4],":");
  196.                 fdt.ft.hour=(unsigned)atoi(p);
  197.                 fdt.ft.min=(unsigned)atoi(strtok(0,":"));
  198.                 fdt.ft.sec=(unsigned)atoi(strtok(0," "));
  199.                 x2=fdt.x;
  200.                 fdt.ft.hour=(word)my_time.tm_hour;
  201.                 fdt.ft.min=(word)my_time.tm_min;
  202.                 fdt.ft.sec=(word)my_time.tm_sec;
  203.                 if (fdt.x<x1 || fdt.x>x2) elevel=1;
  204.                 else elevel=0;
  205.                 if(elevel) fputs("Out-of-hours",stdout);
  206.                 else fputs("In-hours",stdout);
  207.             }
  208.             break;
  209.  
  210.         case 'H':
  211.             elevel = (char)my_time.tm_hour;
  212.             fputs("Hours",stdout);
  213.             break;
  214.  
  215.         case 'M':
  216.             elevel = (char)my_time.tm_min;
  217.             fputs("Minutes",stdout);
  218.             break;
  219.  
  220.         case 'S':
  221.             elevel = (char)my_time.tm_sec;
  222.             fputs("Seconds",stdout);
  223.             break;
  224.  
  225.         case 'D':
  226.             elevel = (char)my_time.tm_mday;
  227.             fputs("Day-of-month",stdout);
  228.             break;
  229.  
  230.         case 'E':
  231.             elevel = (char)my_time.tm_yday;
  232.             fputs("Day-of-year",stdout);
  233.             break;
  234.  
  235.         case 'O':
  236.             elevel = (char)my_time.tm_mon;
  237.             fputs("Month",stdout);
  238.             break;
  239.  
  240.         case 'Y':
  241.             elevel=(char)(my_time.tm_year%100);
  242.             fputs("Year",stdout);
  243.             break;
  244.  
  245.         case 'W': {
  246.             t=time(NULL);
  247.             p=(char *)ctime(&t);
  248.             p[3]=0;
  249.             if (!strcmp(p,"Sun")) elevel=1;
  250.             if (!strcmp(p,"Mon")) elevel=2;
  251.             if (!strcmp(p,"Tue")) elevel=3;
  252.             if (!strcmp(p,"Wed")) elevel=4;
  253.             if (!strcmp(p,"Thu")) elevel=5;
  254.             if (!strcmp(p,"Fri")) elevel=6;
  255.             if (!strcmp(p,"Sat")) elevel=7;
  256.             fputs("Day-of-week",stdout);
  257.             break;
  258.         }
  259.  
  260.         default:
  261.             fputs("\rUnrecognized command \'",stdout);
  262.             fputc(*argv[2],stdout);
  263.             fputs("\'\n",stdout);
  264.             goto GiveHelp;
  265.          }
  266.    }
  267.    else {
  268.       elevel = (char)my_time.tm_sec;
  269.       fputs("Seconds",stdout);
  270.    }
  271.  
  272. OuttaHere:
  273.  
  274.    if((argc < 3 ) || (argc > 2 && toupper(*argv[2]) != 'K')) {
  275.        fputs(" ERRORLEVEL: ",stdout);
  276.        fputs(itoa(elevel,e,10),stdout);
  277.        fputs("\n",stdout);
  278.    }
  279.  
  280.    exit (elevel);
  281. }
  282.  
  283.  
  284.  
  285.  
  286. int _fastcall my_sleep (int secs) {
  287.  
  288.     do {
  289.         DosSleep(1000L);
  290.         if(kbhit()) {
  291.             if(getch()==ESC) return ESC;
  292.         }
  293.         if(!secs) break;
  294.     } while(secs--);
  295.     return 0;
  296. }
  297.