home *** CD-ROM | disk | FTP | other *** search
/ Frostbyte's 1980s DOS Shareware Collection / floppyshareware.zip / floppyshareware / GLEN / ASK-YN3.ZIP / ASK-YN3.C next >
Text File  |  1988-01-01  |  5KB  |  223 lines

  1. /*
  2.  Small Lattice-C pgm to echo command line args, prompt for single-char
  3.  response,  & set ERRORLEVEL accordingly.  -n on the command line switches
  4.  default  response to [N] from [Y].  ERRORLEVEL set to 0 for [Y], 1 for [N].
  5.  Skip Gilbrech - CompuServe 71445,534
  6.  
  7.  Added -w switch to use default after s seconds. good for batch file that
  8.  might be unattended.
  9.  James Rich 12/17/87
  10.  
  11.  Added countdown effect and -v switch to display it. Usage will now ALWAYS
  12.  reflect current file name.
  13.  James Rich 1/1/88
  14. */
  15.  
  16. #include <ctype.h>
  17.  
  18. #define NO    1
  19. #define YES    0
  20. #define MAXLINE 132
  21. #define SECMSGV1  "(Y/N) ["                /* (verbose) goes before number of seconds */
  22. #define SECMSGV2  " seconds before "    /* verbose after  number of seconds */
  23. #define SECMSGT1  "(Y/N) "                /* (terse) goes before number of seconds */
  24. #define SECMSGT2 " ["                    /* terse after  number of seconds */
  25. #define NOSECMSG "(Y/N) ["                /* goes instead of number of seconds */
  26. void puts(char *);
  27. void putchar(char);
  28. char sleepkb(int);
  29.  
  30. main(argc,argv)
  31. int argc;
  32. char *argv[];
  33. {
  34.     int i, retcode;
  35.     int wait_secs = 0;
  36.     char askstr[MAXLINE],
  37.         secs_str[8],
  38.         drive[3],
  39.         path[64],
  40.         node[9],
  41.         ext[4],
  42.          dflt = YES,
  43.          wait = NO,
  44.          visual = NO,
  45.          terse = NO,
  46.          *s,
  47.          c,
  48.          ctr;
  49.  
  50.     if (argc < 2)
  51.     {
  52.     puts("Asks a yes/no question from within a batch file. Used with the IF ERRORLEVEL\n");
  53.     puts(" batch file command.\n");
  54.     puts("Usage: ");            /* DOS 3.0 and up supply the actual file name */
  55.     if (strlen(argv[0]) > 1)    /* earlier DOSs use "C" for argv[0]                 */
  56.         strsfn(argv[0], drive, path, node, ext);
  57.     puts(strlen(argv[0]) > 1 ? node : "ASK-YN");
  58.     puts(" [-n] [-ws] [-t | -v] <prompt string>\n");
  59.     puts(" -n switches default response to [N]\n");
  60.     puts(" -w waits s second(s) before using the default response\n");
  61.     puts(" -t displays a terse countdown of seconds (used with -w)\n");
  62.     puts(" -v displays a verbose   \"     \"     \"      \"    \"    \"\n");
  63.     puts("    (-t and -v are mutually exclusive)\n");
  64.     puts(" ERRORLEVEL is set to 0 for [Y], 1 for [N]\n");
  65.     _exit(NO);
  66.     }
  67.  
  68.     askstr[0] = '\0';
  69.  
  70.     for (ctr = 1; ctr < argc; ctr++)
  71.     {
  72.     s = argv[ctr];
  73.  
  74.     if (*s == '-' || *s == '/')
  75.         {
  76.         ++s;
  77.         if (toupper(*s) == 'N')
  78.             dflt = NO;
  79.         else if (toupper(*s) == 'W')
  80.             {
  81.             ++s;
  82.             wait_secs = atoi(s);
  83.             wait = YES;
  84.             }
  85.         else if (toupper(*s) == 'V')
  86.             visual = YES;
  87.         else if (toupper(*s) == 'T')
  88.             {
  89.             visual = YES;
  90.             terse = YES;
  91.             }
  92.         }
  93.     else
  94.         {
  95.         strcat(askstr, s);
  96.         strcat(askstr, " ");
  97.         }
  98.     }
  99.     
  100.     retcode = dflt;
  101.     if (wait == YES && visual == YES)
  102.         {
  103.         puts(askstr);
  104.         stci_d(secs_str, wait_secs);
  105.         if (terse == YES)
  106.             puts(SECMSGT1);
  107.         else
  108.             puts(SECMSGV1);
  109.         puts(secs_str);
  110.         if (terse == YES)
  111.             puts(SECMSGT2);
  112.         else
  113.             puts(SECMSGV2);
  114.         puts(dflt == YES ? "Y]\b\b" : "N]\b\b");
  115.         }
  116.     else
  117.         {
  118.         puts(askstr);
  119.         puts(NOSECMSG);
  120.         puts(dflt == YES ? "Y]\b\b" : "N]\b\b");
  121.         }
  122.     
  123.     if (wait == YES && visual == YES)
  124.         {
  125.         while(wait_secs--)
  126.             {
  127.             if ((c = sleepkb(1)) != NO)
  128.                 break;
  129.             puts("  ");
  130.             for (i = 0; i < (strlen(terse == YES ? SECMSGT2 : SECMSGV2) + num_digits(wait_secs + 1) + 2); i++)
  131.                 putchar('\b');
  132.             stci_d(secs_str, wait_secs);
  133.             puts(secs_str);
  134.             if (terse == YES)
  135.                 puts(SECMSGT2);
  136.             else
  137.                 puts(SECMSGV2);
  138.             puts(dflt == YES ? "Y]\b\b" : "N]\b\b");
  139.             }
  140.         }
  141.     else if (wait == YES && visual == NO)
  142.         c = sleepkb(wait_secs);
  143.     else
  144.         c = getch();
  145.         
  146.     c = toupper(c);
  147.  
  148.     if (c == NO)    /* a little sign that the default was used automatically */
  149.         {
  150.         if (terse == YES || visual == NO)
  151.             puts(dflt == YES ? "Yes]" : "No]");
  152.         else    /* a bigger sign */
  153.             {
  154.             puts("Default \"");
  155.             puts(dflt == YES ? "YES" : "NO");
  156.             puts("\" used]");
  157.             }
  158.         }
  159.  
  160.     if (dflt == YES)
  161.         {
  162.         if (c == 'N')
  163.             {
  164.             putchar('N');
  165.             retcode = NO;
  166.             }
  167.         }
  168.     else if (c == 'Y')
  169.         {
  170.         putchar('Y');
  171.         retcode = YES;
  172.         }
  173.     putchar('\n');
  174.  
  175.     _exit(retcode);
  176. }
  177.  
  178. void puts(s)
  179. char *s;
  180. {
  181.     while(*s)
  182.         putchar(*s++);
  183. }
  184.  
  185. void putchar(c)
  186. char c;
  187. {
  188.     if (c == '\n')
  189.         putchar('\r');
  190.  
  191.     bdos(2, c);
  192. }
  193.  
  194. char sleepkb(n)        /* waits approx n secs or for key press */
  195. int n;
  196. {
  197.     long t1, t2, s1;
  198.     
  199.     s1 = (long) n;
  200.     
  201.     for (time(&t1), time(&t2); (t1 + s1) > t2; time(&t2))
  202.         if (kbhit())
  203.             {
  204.             return((char) getch());
  205.             }
  206.     return((char) NO);
  207. }
  208.  
  209. num_digits(n)
  210. int n;
  211. {
  212.     int digits = 0;
  213.     
  214.     while (n)
  215.         {
  216.         n /= 10;
  217.         digits++;
  218.         }
  219.         
  220.     return (digits);
  221. }
  222. /* EOF */
  223.