setlevel.c

来自「国外网站上的一些精典的C程序」· C语言 代码 · 共 270 行

C
270
字号
/******************************************************************** *                         SETLEVEL                                 * *                                                                  * * Written by: Lynn R. Lively                                       * * Date:       05/15/90                                             * * Version:    1.0                                                  * * Written in TurboC V2.00                                          * *                                                                  * * Allows user input in a MSDOS .BAT file. This program asks a      * * specified question and sets the errorlevel according to valid    * * answer list. Since MSDOS provides no facility for getting user   * * input into a .BAT file, and manipulation of enviorinment strings * * seems to be unreliable and nonportable, I have written this      * * facility as a possible alternative.                              * *                                                                  * * I hereby place this program into the public domain.              * * Users of this utility do so at their own risk. I accept no       * * responsibility for the accuracy or useability of this software.  * * However, should you have any questions, suggestions, or problems * * I would be happy to talk with you (and help if I can).           * * My current work number is 713-591-6111                           * *  Your Servant,                                                   * *       Lynn R. Lively                                             * *                                                                  * ********************************************************************/#include <stdio.h>#include <stdlib.h>#include <string.h>#include <conio.h>/* * The following are bit mask values for the option_flg. */#define CASE_SENSE       1#define SINGLE_KEY_ENTRY 2/* * The following is the structure deffinition for the valid answer * linked list. */typedef struct v_ans {      char *         ans_key;      int            rtn_err_lev;      struct v_ans * next_ans;} VALID_ANS;/* * Prototypes of functions defined in this module. */void usage (char * progname);int main (int argc, char * argv[]){      register int i = 0;      register int j;      int option_flg = 0;      VALID_ANS * answer_tab = NULL;      VALID_ANS * wk_ans;      char * wk_ptr;      char * ques_ptr = "?";      char   wk_str[256];      if (argc > 1)      {        /*         * Step through and parse the argument list.         */            for (i = 1; i < argc; i++)            {                  j = 0;                  switch (argv[i][j])                  {                  case '/':            /* Options are flagged by '/' */                        j++;                        switch (argv[i][j])                        {                        case 'c':                        case 'C':                              option_flg |= CASE_SENSE;                              break;                        case '1':                              option_flg |= SINGLE_KEY_ENTRY;                              break;                        case 'q':                        case 'Q':                        /*                         * The question is assumed to be the argument                         * after the 'q'.                         */                              ques_ptr = strdup (argv[++i]);                              break;                        default:                        /*                         * Oops! Something wrong. Tell them how its                         * supposed to work.                         */                              usage (argv[0]);                              return (-1);                        }                        break;                  case '-':         /* Answers are flagged by '-' */                        /*                         * The answer is assumed to be everything from the                         * '-' to the '=' characters. This allows for                         * single letter and word answers.                         */                        j++;                        if ((wk_ptr = strtok (argv[i]+j, "=")) != NULL)                        {                              /*                               * Allocate space for the new answer entry and                               * link in into the list. Answers are linked                               * into the list in reverse order from their                               * command line specification since the logic                               * is considerably simpler and it shouldn't                               * matter much anyway.                               */                              if (answer_tab == NULL)                              {                                    answer_tab = wk_ans = (VALID_ANS *)                                          calloc (1, sizeof(VALID_ANS));                              }                              else                              {                                    wk_ans = (VALID_ANS *)                                             calloc (1, sizeof(VALID_ANS));                                    wk_ans->next_ans = answer_tab;                                    answer_tab = wk_ans;                              }                              /*                               * Store the answer string and errorlevel value                               * into the answer element.                               */                              wk_ans->ans_key = strdup (wk_ptr);                              wk_ptr          = strtok (NULL, "=");                              if (wk_ptr != NULL)                              {                                    /*                                     * Allow only positive returns since -1 is                                     * and error return from the program.                                     */                                                                        wk_ans->rtn_err_lev =                                          abs (atoi (wk_ptr));                              }                              else  wk_ans->rtn_err_lev = 0;                        }                        }                        break;                  default:                  /*                   * Oops! Something wrong. Tell them how its                   * supposed to work.                   */                        usage (argv[0]);                        return (-1);            }      }      else      {            /*             * Oops! Something wrong. Tell them how its             * supposed to work.             */            usage (argv[0]);            return (-1);      }      /*       * Ask the question and get their answer.       */      printf ("%s", ques_ptr);      if ((option_flg & SINGLE_KEY_ENTRY) != 0)      {            wk_str[0] = getche ();            wk_str[1] = '\0';      }      else  fgets (wk_str, sizeof (wk_str), stdin);      /*       * See if we can find their answer in our valid answer list.       */      wk_ans = answer_tab;      while (wk_ans != (VALID_ANS *) NULL)      {            if ((option_flg & CASE_SENSE) != 0)            {                  if ((strncmp (wk_str, wk_ans->ans_key,                        (strlen (wk_ans->ans_key)))) == 0)                  {                  /*                   * If we found the answer return the associated                   * errorlevel return number.                   */                        return (wk_ans->rtn_err_lev);                  }            }            else            {                  if ((strnicmp (wk_str, wk_ans->ans_key,                        (strlen (wk_ans->ans_key)))) == 0)                  {                  /*                   * If we found the answer return the associated                   * errorlevel return number.                   */                        return (wk_ans->rtn_err_lev);                  }            }            wk_ans = wk_ans->next_ans;      }      /*       * If the answer wasn't in our table return a -1.       */      return (-1);}void usage (char * progname){      printf ("%s usage:\n", progname);      printf ("%s /[options] -<valid answer>=<errorlevel>\n\n", progname);      printf ("Where:\n");      printf ("  options      = c    (Answers are case sensitive)\n");      printf ("                 1    (Single key entry)\n");      printf ("                 q\"Question Text\"\n\n");      printf ("  valid answer = (Single letter or word response)\n");      printf ("  errorlevel   = (errorlevel to return when answer seen)\n\n");      printf ("Example:\n%s /q\"Answer Y or N: \" /1 -y=1 -n=2\n\n",            progname);      printf ("Note: -1 is returned if answer is not valid or syntax\n");      printf ("      is incorrect.\n");}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?