home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 11 Util / 11-Util.zip / delay2.zip / DELAY.C next >
C/C++ Source or Header  |  1992-02-27  |  11KB  |  364 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. #define INCL_KBD
  6.  
  7. #include <os2.h>
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <ctype.h>
  11. #include <time.h>
  12. #include <dos.h>
  13. #include <conio.h>
  14. #include <string.h>
  15.  
  16. typedef unsigned bit;
  17. typedef unsigned int word;
  18.  
  19. #define ESC 27
  20.  
  21. int    _fastcall my_sleep(time_t secs);
  22. void   FAR       key_thread(void);
  23. time_t _fastcall sec_diff (struct tm *t1,struct tm *t2);
  24.  
  25. unsigned long timeSEM = 0L;
  26. char          isos2;
  27.  
  28.  
  29.  
  30.  
  31. void cdecl main (int argc,char **argv) {
  32.  
  33.    struct tm my_time,*mt;
  34.    time_t    t;
  35.    char      elevel=254,e[34],*p;
  36.    int       x,dummyID;
  37.    static    char keystk[2048];
  38.  
  39.  
  40.    DosGetMachineMode(&isos2);
  41.  
  42.    if (argc < 2) {
  43.        fputs("\n\x1b[2J\x1b[30;47m\r DELAY.EXE -- Miscellaneous batch time/date routines -- no (c) by M. Kimes \n",stdout);
  44. GiveHelp:
  45.        fputs("\n\x1b[0m\rNo Delay requested...(DELAY #secs <HMSDEOYWIPK> [args])\n"
  46.              "\nLetter                   ERRORLEVEL"
  47.              "\n======                   ========================="
  48.              "\nH                        Hours"
  49.              "\nM                        Minutes"
  50.              "\nS                        Seconds"
  51.              "\nD                        Day-of-month"
  52.              "\nE                        Day-of-year (remember 255 errorlevel limit)"
  53.              "\nO                        Month"
  54.              "\nY                        2-digit Year"
  55.              "\nW                        Day-of-week"
  56.              "\nI <hh:mm:ss> <hh:mm:ss>  0 if in hours, 1 if out"
  57.              "\nP <hh:mm>                0 when time occurs"
  58.              "\nK <keys> <secs>          key position or 0 on timeout\n"
  59.              "\n If ESCape aborts any delays, 255 is returned.\n",stdout);
  60.         exit(0);
  61.    }
  62.    else {
  63.        if(!isdigit(*argv[1])) {
  64.            fputs("\nPossible foul up in first argument ",stdout);
  65.            fputs(argv[1],stdout);
  66.            fputc('\n',stdout);
  67.        }
  68.        if (!atoi(argv[1])) goto ELEVEL;
  69.        if(isos2) {
  70.          DosCreateThread(key_thread,&dummyID,keystk + 2048);
  71.        }
  72.        fputs("\nPausing ",stdout);
  73.        fputs(argv[1],stdout);
  74.        fputs(" second(s)...",stdout);
  75.        if(my_sleep((time_t)atol(argv[1]))) {
  76.           elevel = 255;
  77.           goto OuttaHere;
  78.        }
  79.    }
  80.  
  81. ELEVEL:
  82.  
  83.    t = time(NULL);
  84.    memcpy(&my_time,localtime(&t),sizeof(struct tm));
  85.    if((argc < 3 ) || (argc > 2 && toupper(*argv[2]) != 'K'))
  86.      fputs("\nDropping ",stdout);
  87.  
  88.    if (argc > 2) {
  89.         if(*argv[2] == '/' || *argv[2] == '-')
  90.           memmove(&argv[2][1],argv[2],strlen(argv[2]));
  91.  
  92. RESWITCH:
  93.  
  94.         *argv[2] = (char)toupper(*argv[2]);
  95.         switch((int)*argv[2]) {
  96.         case 'P': {
  97.  
  98.                  struct tm mytime;
  99.                  time_t    totaltime;
  100.  
  101.                  if(argc < 4) {
  102.                     fputs("**Error**\n"
  103.                           "Example:  DELAY 0 P 12:00 (waits until 12:00)\n",stdout);
  104.                     goto GiveHelp;
  105.                  }
  106.                  if(isos2) {
  107.                     DosCreateThread(key_thread,&dummyID,keystk + 2048);
  108.                  }
  109.                  fputs("(waiting until ",stdout);
  110.                  fputs(argv[3],stdout);
  111.                  fputs(" [",stdout);
  112.                  p = strtok(argv[3],":");
  113.                  mytime.tm_hour = (char)atoi(p);
  114.                  mytime.tm_min = (char)atoi(strtok(0,":"));
  115.                  t = time(NULL);
  116.                  mt = localtime(&t);
  117.                  totaltime = sec_diff(mt,&mytime);
  118.                  fputs(ltoa(totaltime,e,10),stdout);
  119.                  fputs(" secs] or ESC...",stdout);
  120.                  if(my_sleep(totaltime)) {
  121.                     fputs(" [ESC]",stdout);
  122.                     elevel = 255;
  123.                  }
  124.                  else elevel = 0;
  125.                 }
  126.                 break;
  127.  
  128.         case 'K': {
  129.  
  130.                 char spin[] = "\\|/-",*sp = spin;
  131.  
  132.                 if(argc < 4) {
  133.                     fputs("**Error**\n"
  134.                           "Example:  DELAY 0 K ABCD 30 (waits 30 secs for A, B, C or D)\n"
  135.                           "          DELAY 0 K AB 0    (waits forever for A or B)\n",stdout);
  136.                     goto GiveHelp;
  137.                     break;
  138.                 }
  139.                 t = atol(argv[4]) * 10L;
  140.                 elevel = 0;
  141.                 strupr(argv[3]);
  142.                 fputc(*sp,stdout);
  143.                 fputc('\b',stdout);
  144.                 do {
  145.                     if(!kbhit()) {
  146.                         fputc(*sp,stdout);
  147.                         fputc('\b',stdout);
  148.                         sp++;
  149.                         if(!*sp) sp = spin;
  150.                         DosSleep(100L);
  151.                         if(kbhit() && t == 1L) t++;
  152.                     }
  153.                     else {
  154.                         x = getch();
  155.                         if(x == ESC) {
  156.                             elevel = 255;
  157.                             break;
  158.                         }
  159.                         if(strchr(argv[3],toupper(x))) {
  160.                             fputc(toupper(x),stdout);
  161.                             elevel = (char)(((int)strchr(argv[3],toupper(x)) -
  162.                                              (int)argv[2]) + 1);
  163.                             break;
  164.                         }
  165.                         else {
  166.                             fputc(*sp,stdout);
  167.                             fputc('\b',stdout);
  168.                             sp++;
  169.                             if(!*sp) sp = spin;
  170.                             DosSleep(100L);
  171.                         }
  172.                     }
  173.                     if(!t) continue;    /* endless loop if secs = 0 */
  174.                 } while(--t);
  175.                 fputs(" \b",stdout);
  176.                 break;
  177.               }
  178.  
  179.     case 'I': {
  180.  
  181.                 struct ftime {
  182.                   bit sec:  5;
  183.                   bit min:  6;
  184.                   bit hour: 5;
  185.                 };
  186.                 union tf {
  187.                   struct ftime ft;
  188.                   word x;
  189.                 } fdt;
  190.                 word x1;
  191.                 word x2;
  192.  
  193.                 if(argc < 4) {
  194.                   fputs("**Error**\n"
  195.                         "Example:  DELAY 0 I 12:00:00 13:00:00 (returns 0 if between\n"
  196.                         "12:00:00 and 13:00:00, otherwise returns 1\n",stdout);
  197.                   goto GiveHelp;
  198.                   break;
  199.                 }
  200.                 p=strtok(argv[3],":");
  201.                 fdt.ft.hour=(unsigned)atoi(p);
  202.                 fdt.ft.min=(unsigned)atoi(strtok(0,":"));
  203.                 fdt.ft.sec=(unsigned)atoi(strtok(0," "));
  204.                 x1=fdt.x;
  205.                 p=strtok(argv[4],":");
  206.                 fdt.ft.hour=(unsigned)atoi(p);
  207.                 fdt.ft.min=(unsigned)atoi(strtok(0,":"));
  208.                 fdt.ft.sec=(unsigned)atoi(strtok(0," "));
  209.                 x2=fdt.x;
  210.                 fdt.ft.hour=(word)my_time.tm_hour;
  211.                 fdt.ft.min=(word)my_time.tm_min;
  212.                 fdt.ft.sec=(word)my_time.tm_sec;
  213.                 if (fdt.x<x1 || fdt.x>x2) elevel=1;
  214.                 else elevel=0;
  215.                 if(elevel) fputs("Out-of-hours",stdout);
  216.                 else fputs("In-hours",stdout);
  217.       }
  218.       break;
  219.  
  220.     case 'H':
  221.       elevel = (char)my_time.tm_hour;
  222.       fputs("Hours",stdout);
  223.       break;
  224.  
  225.     case 'M':
  226.       elevel = (char)my_time.tm_min;
  227.       fputs("Minutes",stdout);
  228.       break;
  229.  
  230.     case 'S':
  231.       elevel = (char)my_time.tm_sec;
  232.       fputs("Seconds",stdout);
  233.       break;
  234.  
  235.     case 'D':
  236.       elevel = (char)my_time.tm_mday;
  237.       fputs("Day-of-month",stdout);
  238.       break;
  239.  
  240.     case 'E':
  241.       elevel = (char)my_time.tm_yday;
  242.       fputs("Day-of-year",stdout);
  243.       break;
  244.  
  245.     case 'O':
  246.       elevel = (char)my_time.tm_mon;
  247.       fputs("Month",stdout);
  248.       break;
  249.  
  250.     case 'Y':
  251.       elevel=(char)(my_time.tm_year%100);
  252.       fputs("Year",stdout);
  253.       break;
  254.  
  255.     case 'W': {
  256.       t=time(NULL);
  257.       p=(char *)ctime(&t);
  258.       p[3]=0;
  259.       if (!strcmp(p,"Sun")) elevel=1;
  260.       if (!strcmp(p,"Mon")) elevel=2;
  261.       if (!strcmp(p,"Tue")) elevel=3;
  262.       if (!strcmp(p,"Wed")) elevel=4;
  263.       if (!strcmp(p,"Thu")) elevel=5;
  264.       if (!strcmp(p,"Fri")) elevel=6;
  265.       if (!strcmp(p,"Sat")) elevel=7;
  266.           fputs("Day-of-week",stdout);
  267.           break;
  268.       }
  269.  
  270.     default:
  271.         fputs("\rUnrecognized command \'",stdout);
  272.         fputc(*argv[2],stdout);
  273.         fputs("\'\n",stdout);
  274.         goto GiveHelp;
  275.   }
  276.  }
  277.  else {
  278.     elevel = (char)my_time.tm_sec;
  279.     fputs("Seconds",stdout);
  280.  }
  281.  
  282. OuttaHere:
  283.  
  284.    if((argc < 3 ) || (argc > 2 && toupper(*argv[2]) != 'K')) {
  285.        fputs(" ERRORLEVEL: ",stdout);
  286.        fputs(itoa(elevel,e,10),stdout);
  287.        fputs("\n",stdout);
  288.    }
  289.  
  290.    exit (elevel);
  291. }
  292.  
  293.  
  294.  
  295.  
  296. int _fastcall my_sleep (time_t secs) {
  297.  
  298.     if(!isos2) {
  299.       do {
  300.           DosSleep(1000L);
  301.           if(kbhit()) {
  302.               if(getch() == ESC) return ESC;
  303.           }
  304.           if(!secs) break;
  305.       } while(secs--);
  306.       return 0;
  307.     }
  308.     else {
  309.       if(!DosSemSetWait(&timeSEM,(long)secs * 1000L)) return ESC;
  310.       return 0;
  311.     }
  312. }
  313.  
  314.  
  315.  
  316. void FAR key_thread (void) {
  317.  
  318.     KBDKEYINFO      kbi;
  319.     KBDINFO         ki;
  320.  
  321.  
  322.     ki.cb = sizeof(KBDINFO);
  323.     KbdGetStatus(&ki,0);
  324.     ki.fsMask |= KEYBOARD_BINARY_MODE;
  325.     ki.fsMask &= (~KEYBOARD_ASCII_MODE);
  326.     KbdSetStatus(&ki,0);
  327.     for(;;) {
  328.       if (KbdCharIn (&kbi, 0, 0))
  329.         continue;
  330.       if(kbi.chChar == ESC) DosSemClear(&timeSEM);
  331.     }
  332. }
  333.  
  334.  
  335.  
  336. time_t _fastcall sec_diff (struct tm *t1,struct tm *t2) {
  337.  
  338.     time_t diff;
  339.  
  340.  
  341.     if(t2->tm_hour < t1->tm_hour ||
  342.        (t2->tm_hour == t1->tm_hour && t2->tm_min < t1->tm_min)) {
  343.       diff = (time_t)(23 - t1->tm_hour);
  344.       diff += (time_t)t2->tm_hour;
  345.     }
  346.     else {
  347.       diff = (time_t)(t2->tm_hour - t1->tm_hour);
  348.     }
  349.  
  350.     diff *= (time_t)60L;
  351.  
  352.     if(t2->tm_min < t1->tm_min) {
  353.       diff += (time_t)(60 - t1->tm_min);
  354.       diff += (time_t)t2->tm_min;
  355.     }
  356.     else {
  357.       diff += (time_t)(t2->tm_min - t1->tm_min);
  358.     }
  359.  
  360.     diff *= (time_t)60L;
  361.  
  362.     return diff;
  363. }
  364.