home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 3 / PDCD_3.iso / internet / tcpipsrc / h / if / Main / c / cmdparse next >
Text File  |  1995-01-29  |  6KB  |  228 lines

  1. /* Parse command line, set up command arguments Unix-style, and call function.
  2.  * Note: argument is modified (delimiters are overwritten with nulls)
  3.  * Improved error handling by Brian Boesch of Stanford University
  4.  */
  5. #include <stdio.h>
  6. #include <string.h>
  7. #include "global.h"
  8. #include "cmdparse.h"
  9. #include "misc.h"
  10. #include "var.h"
  11.  
  12. varlist global_vars = NULL;
  13.  
  14. void cmdparse_init(void)
  15. {
  16.   global_vars = varlist_create(NULL);
  17.   var_init_osvars(global_vars, vart_string, "TCPIP$String$*" );
  18.   var_init_osvars(global_vars, vart_osvar, "TCPIP$OSVar$*" );
  19. }
  20.  
  21. int dosetvar(int argc, char **argv)
  22. {
  23.   var_create_string(global_vars, argv[1], 0, argv[2]);
  24.   return 0;
  25. }
  26.  
  27. int dosetosvar(int argc, char **argv)
  28. {
  29.   var_create_osvar(global_vars, argv[1], 0, argv[2]);
  30.   return 0;
  31. }
  32.  
  33. int doshowvar(int argc, char **argv)
  34. {
  35.   char buf[256];
  36.   var vp;
  37.  
  38.   if (argc<2)
  39.   {
  40.     for (vp = global_vars->head; vp!=NULL; vp = vp->link)
  41.     {
  42.       var_output(vp, buf, 256);
  43.       if (vp->type==vart_osvar)
  44.         cwprintf(NULL, "  %-16s: <%s> = \"%s\"\r\n", vp->name+1, vp->value.string, buf);
  45.       else
  46.         cwprintf(NULL, "  %-16s: \"%s\"\r\n", vp->name+1, buf);
  47.     }
  48.   }
  49.   else
  50.   {
  51.     if (vp = var_lookup(global_vars, argv[1], 0), vp!=NULL)
  52.     {
  53.       var_output(vp, buf, 256);
  54.       if (vp->type==vart_osvar)
  55.         cwprintf(NULL, "  %-16s: <%s> = \"%s\"\r\n", vp->name+1, vp->value.string, buf);
  56.       else
  57.         cwprintf(NULL, "  %-16s: \"%s\"\r\n", vp->name+1, buf);
  58.     }
  59.     else
  60.     {
  61.       cwprintf(NULL, "Variable not known\r\n");
  62.       return 1;
  63.     }
  64.   }
  65.   return 0;
  66. }
  67.  
  68. /* Call a subcommand based on the first token in an already-parsed line */
  69. int subcmd(struct cmds *cmdtable, int argc, char **argv)
  70. {
  71.   int loop, rslt;
  72.  
  73.   /* Strip off first token and pass rest of line to subcommand */
  74.   if (argc < 2 || argv[1][0] == '?' || strnicmp(argv[1], "help", strlen(argv[1])) == NULL)
  75.   {
  76.     if (argc < 1)
  77.     {
  78.       cwprintf(NULL, "SUBCMD - Don't know what to do?\r\n");
  79.     }
  80.     else
  81.     {
  82.       cwprintf(NULL, "\"%s\" - takes at least one argument\r\n",argv[0]);
  83.       for (loop = 0; cmdtable[loop].name != NULLCHAR; loop++)
  84.       {
  85.         cwprintf(NULL, "%20s", cmdtable[loop].name);
  86.         if (cmdtable[loop].argc_errmsg != NULLCHAR)
  87.           cwprintf(NULL, " - %s\r\n", cmdtable[loop].argc_errmsg);
  88.         else
  89.           cwprintf(NULL, "\r\n");
  90.       }
  91.     }
  92.     return -1;
  93.   }
  94.   argc--;
  95.   argv++;
  96.   for (loop = 0; cmdtable[loop].name != NULLCHAR; loop++)
  97.   {
  98.     if (strnicmp(argv[0], cmdtable[loop].name, strlen(argv[0])) == 0)
  99.     {
  100.       if (argc < cmdtable[loop].argcmin)
  101.       {
  102.         if (cmdtable[loop].argc_errmsg != NULLCHAR)
  103.           cwprintf(NULL, "Usage: %s\r\n", cmdtable[loop].argc_errmsg);
  104.         return -1;
  105.       }
  106.       else
  107.       {
  108.         rslt = (cmdtable[loop].func)(argc, argv); /* Shouldn't call (*func) should we? */
  109.         if ((rslt < 0) && (cmdtable[loop].exec_errmsg != NULLCHAR))
  110.           cwprintf(NULL, "%s\r\n", cmdtable[loop].exec_errmsg);
  111.         return(rslt);
  112.       }
  113.     }
  114.   }
  115.   if (cmdtable[loop].argc_errmsg != NULLCHAR)
  116.     cwprintf(NULL, "%s\r\n", cmdtable[loop].argc_errmsg);
  117.  
  118.   return -1;
  119. }
  120.  
  121. extern Terminal *MWin;
  122.  
  123. int cmdparse(struct cmds *cmdtable, register char *line, Terminal *Window)
  124. {
  125.   BOOL qflag;
  126.   char *argv[NARG], *cp;
  127.   int argc, loop, rslt;
  128.   char xcmd[1024];
  129.   Terminal *temp;
  130.  
  131.   /* Remove cr/lf */
  132.   rip(line);
  133.  
  134.   var_translate(global_vars, line, 0, xcmd, 1024);
  135.   line = xcmd;
  136.  
  137.   for (argc = 0; argc < NARG; argc++)
  138.     argv[argc] = NULLCHAR;
  139.  
  140.   temp = Window;
  141. /*  if (Window == NULL) */
  142.     Window = MWin;
  143.  
  144.   for (argc = 0; argc < NARG; )
  145.   {
  146.     qflag = FALSE;
  147.     /* Skip leading white space */
  148.     while (*line == ' ' || *line == '\t')
  149.       line++;
  150.     if (*line == '\0')
  151.       break;
  152.     /* Check for quoted token */
  153.     if (*line == '"')
  154.     {
  155.       line++; /* Suppress quote */
  156.       qflag = TRUE;
  157.     }
  158.     argv[argc++] = line;    /* Beginning of token */
  159.     /* Find terminating delimiter */
  160.     if (qflag)
  161.     {
  162.       /* Find quote, it must be present */
  163.       if (line = strchr(line,'"'), line == NULLCHAR)
  164.       {
  165.         return(-1);
  166.       }
  167.       *line++ = '\0';
  168.     }
  169.     else
  170.     {
  171.       /* Find space or tab. If not present,
  172.          then we've already found the last
  173.          token. */
  174.       if (cp = strchr(line,' '), cp == NULLCHAR)
  175.       {
  176.         if (cp = strchr(line,'\t'), cp == NULLCHAR)
  177.         {
  178.           break;
  179.         }
  180.       }
  181.       *cp++ = '\0';
  182.       line = cp;
  183.     }
  184.   }
  185.   if (argc < 1)
  186.   {         /* empty command line */
  187.     argc = 1;
  188.     argv[0] = "";
  189.   }
  190.   /* Lines beginning with "#" are comments */
  191.   if (argv[0] == NULLCHAR || argv[0][0] == '#')
  192.     return 0;
  193.  
  194.   /* Look up command in table; prefix matches are OK */
  195.   for (loop = 0; cmdtable[loop].name != NULLCHAR; loop++)
  196.   {
  197.     if (strncmp(argv[0], cmdtable[loop].name, strlen(argv[0])) == 0)
  198.       break;
  199.   }
  200.   if (cmdtable[loop].name == NULLCHAR)
  201.   {
  202.     if (cmdtable[loop].argc_errmsg != NULLCHAR)
  203.     {
  204.       cwprintf(Window, "%s\r\n", cmdtable[loop].argc_errmsg);
  205.     }
  206.     return -1;
  207.   }
  208.   else
  209.   {
  210.     if (argc < cmdtable[loop].argcmin)
  211.     {
  212.       /* Insufficient arguments */
  213.       if (cmdtable[loop].argc_errmsg != NULLCHAR)
  214.         cwprintf(Window, "Usage: %s\r\n", cmdtable[loop].argc_errmsg);
  215.       return(-1);
  216.     }
  217.     else
  218.     {
  219.       rslt = (cmdtable[loop].func)(argc, argv); /* Shouldn't call (*func) should we? */
  220.       if ((rslt < 0) && (cmdtable[loop].exec_errmsg != NULLCHAR))
  221.       {
  222.         cwprintf(Window, "%s\r\n", cmdtable[loop].exec_errmsg);
  223.       }
  224.       return(rslt);
  225.     }
  226.   }
  227. }
  228.