home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 3 / TheARMClub_PDCD3.iso / hensa / internet / tcpip / src205 / TCPIP_Src / Main / c / ocmdparse < prev    next >
Encoding:
Text File  |  1995-02-28  |  5.5 KB  |  229 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 == '"' && *(line-1)!='\\')
  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.       while (line==strchr(line, '\"'), line!=NULLCHAR && *(line-1)!='/');
  164.       if (line == NULLCHAR)
  165.       {
  166.         return(-1);
  167.       }
  168.       *line++ = '\0';
  169.     }
  170.     else
  171.     {
  172.       /* Find space or tab. If not present,
  173.          then we've already found the last
  174.          token. */
  175.       if (cp = strchr(line,' '), cp == NULLCHAR)
  176.       {
  177.         if (cp = strchr(line,'\t'), cp == NULLCHAR)
  178.         {
  179.           break;
  180.         }
  181.       }
  182.       *cp++ = '\0';
  183.       line = cp;
  184.     }
  185.   }
  186.   if (argc < 1)
  187.   {         /* empty command line */
  188.     argc = 1;
  189.     argv[0] = "";
  190.   }
  191.   /* Lines beginning with "#" are comments */
  192.   if (argv[0] == NULLCHAR || argv[0][0] == '#')
  193.     return 0;
  194.  
  195.   /* Look up command in table; prefix matches are OK */
  196.   for (loop = 0; cmdtable[loop].name != NULLCHAR; loop++)
  197.   {
  198.     if (strncmp(argv[0], cmdtable[loop].name, strlen(argv[0])) == 0)
  199.       break;
  200.   }
  201.   if (cmdtable[loop].name == NULLCHAR)
  202.   {
  203.     if (cmdtable[loop].argc_errmsg != NULLCHAR)
  204.     {
  205.       cwprintf(Window, "%s\r\n", cmdtable[loop].argc_errmsg);
  206.     }
  207.     return -1;
  208.   }
  209.   else
  210.   {
  211.     if (argc < cmdtable[loop].argcmin)
  212.     {
  213.       /* Insufficient arguments */
  214.       if (cmdtable[loop].argc_errmsg != NULLCHAR)
  215.         cwprintf(Window, "Usage: %s\r\n", cmdtable[loop].argc_errmsg);
  216.       return(-1);
  217.     }
  218.     else
  219.     {
  220.       rslt = (cmdtable[loop].func)(argc, argv); /* Shouldn't call (*func) should we? */
  221.       if ((rslt < 0) && (cmdtable[loop].exec_errmsg != NULLCHAR))
  222.       {
  223.         cwprintf(Window, "%s\r\n", cmdtable[loop].exec_errmsg);
  224.       }
  225.       return(rslt);
  226.     }
  227.   }
  228. }
  229.