home *** CD-ROM | disk | FTP | other *** search
- /* Parse command line, set up command arguments Unix-style, and call function.
- * Note: argument is modified (delimiters are overwritten with nulls)
- * Improved error handling by Brian Boesch of Stanford University
- */
- #include <stdio.h>
- #include <string.h>
- #include "global.h"
- #include "cmdparse.h"
- #include "misc.h"
- #include "var.h"
-
- varlist global_vars = NULL;
-
- void cmdparse_init(void)
- {
- global_vars = varlist_create(NULL);
- var_init_osvars(global_vars, vart_string, "TCPIP$String$*" );
- var_init_osvars(global_vars, vart_osvar, "TCPIP$OSVar$*" );
- }
-
- int dosetvar(int argc, char **argv)
- {
- var_create_string(global_vars, argv[1], 0, argv[2]);
- return 0;
- }
-
- int dosetosvar(int argc, char **argv)
- {
- var_create_osvar(global_vars, argv[1], 0, argv[2]);
- return 0;
- }
-
- int doshowvar(int argc, char **argv)
- {
- char buf[256];
- var vp;
-
- if (argc<2)
- {
- for (vp = global_vars->head; vp!=NULL; vp = vp->link)
- {
- var_output(vp, buf, 256);
- if (vp->type==vart_osvar)
- cwprintf(NULL, " %-16s: <%s> = \"%s\"\r\n", vp->name+1, vp->value.string, buf);
- else
- cwprintf(NULL, " %-16s: \"%s\"\r\n", vp->name+1, buf);
- }
- }
- else
- {
- if (vp = var_lookup(global_vars, argv[1], 0), vp!=NULL)
- {
- var_output(vp, buf, 256);
- if (vp->type==vart_osvar)
- cwprintf(NULL, " %-16s: <%s> = \"%s\"\r\n", vp->name+1, vp->value.string, buf);
- else
- cwprintf(NULL, " %-16s: \"%s\"\r\n", vp->name+1, buf);
- }
- else
- {
- cwprintf(NULL, "Variable not known\r\n");
- return 1;
- }
- }
- return 0;
- }
-
- /* Call a subcommand based on the first token in an already-parsed line */
- int subcmd(struct cmds *cmdtable, int argc, char **argv)
- {
- int loop, rslt;
-
- /* Strip off first token and pass rest of line to subcommand */
- if (argc < 2 || argv[1][0] == '?' || strnicmp(argv[1], "help", strlen(argv[1])) == NULL)
- {
- if (argc < 1)
- {
- cwprintf(NULL, "SUBCMD - Don't know what to do?\r\n");
- }
- else
- {
- cwprintf(NULL, "\"%s\" - takes at least one argument\r\n",argv[0]);
- for (loop = 0; cmdtable[loop].name != NULLCHAR; loop++)
- {
- cwprintf(NULL, "%20s", cmdtable[loop].name);
- if (cmdtable[loop].argc_errmsg != NULLCHAR)
- cwprintf(NULL, " - %s\r\n", cmdtable[loop].argc_errmsg);
- else
- cwprintf(NULL, "\r\n");
- }
- }
- return -1;
- }
- argc--;
- argv++;
- for (loop = 0; cmdtable[loop].name != NULLCHAR; loop++)
- {
- if (strnicmp(argv[0], cmdtable[loop].name, strlen(argv[0])) == 0)
- {
- if (argc < cmdtable[loop].argcmin)
- {
- if (cmdtable[loop].argc_errmsg != NULLCHAR)
- cwprintf(NULL, "Usage: %s\r\n", cmdtable[loop].argc_errmsg);
- return -1;
- }
- else
- {
- rslt = (cmdtable[loop].func)(argc, argv); /* Shouldn't call (*func) should we? */
- if ((rslt < 0) && (cmdtable[loop].exec_errmsg != NULLCHAR))
- cwprintf(NULL, "%s\r\n", cmdtable[loop].exec_errmsg);
- return(rslt);
- }
- }
- }
- if (cmdtable[loop].argc_errmsg != NULLCHAR)
- cwprintf(NULL, "%s\r\n", cmdtable[loop].argc_errmsg);
-
- return -1;
- }
-
- extern Terminal *MWin;
-
- int cmdparse(struct cmds *cmdtable, register char *line, Terminal *Window)
- {
- BOOL qflag;
- char *argv[NARG], *cp;
- int argc, loop, rslt;
- char xcmd[1024];
- Terminal *temp;
-
- /* Remove cr/lf */
- rip(line);
-
- var_translate(global_vars, line, 0, xcmd, 1024);
- line = xcmd;
-
- for (argc = 0; argc < NARG; argc++)
- argv[argc] = NULLCHAR;
-
- temp = Window;
- /* if (Window == NULL) */
- Window = MWin;
-
- for (argc = 0; argc < NARG; )
- {
- qflag = FALSE;
- /* Skip leading white space */
- while (*line == ' ' || *line == '\t')
- line++;
- if (*line == '\0')
- break;
- /* Check for quoted token */
- if (*line == '"')
- {
- line++; /* Suppress quote */
- qflag = TRUE;
- }
- argv[argc++] = line; /* Beginning of token */
- /* Find terminating delimiter */
- if (qflag)
- {
- /* Find quote, it must be present */
- if (line = strchr(line,'"'), line == NULLCHAR)
- {
- return(-1);
- }
- *line++ = '\0';
- }
- else
- {
- /* Find space or tab. If not present,
- then we've already found the last
- token. */
- if (cp = strchr(line,' '), cp == NULLCHAR)
- {
- if (cp = strchr(line,'\t'), cp == NULLCHAR)
- {
- break;
- }
- }
- *cp++ = '\0';
- line = cp;
- }
- }
- if (argc < 1)
- { /* empty command line */
- argc = 1;
- argv[0] = "";
- }
- /* Lines beginning with "#" are comments */
- if (argv[0] == NULLCHAR || argv[0][0] == '#')
- return 0;
-
- /* Look up command in table; prefix matches are OK */
- for (loop = 0; cmdtable[loop].name != NULLCHAR; loop++)
- {
- if (strncmp(argv[0], cmdtable[loop].name, strlen(argv[0])) == 0)
- break;
- }
- if (cmdtable[loop].name == NULLCHAR)
- {
- if (cmdtable[loop].argc_errmsg != NULLCHAR)
- {
- cwprintf(Window, "%s\r\n", cmdtable[loop].argc_errmsg);
- }
- return -1;
- }
- else
- {
- if (argc < cmdtable[loop].argcmin)
- {
- /* Insufficient arguments */
- if (cmdtable[loop].argc_errmsg != NULLCHAR)
- cwprintf(Window, "Usage: %s\r\n", cmdtable[loop].argc_errmsg);
- return(-1);
- }
- else
- {
- rslt = (cmdtable[loop].func)(argc, argv); /* Shouldn't call (*func) should we? */
- if ((rslt < 0) && (cmdtable[loop].exec_errmsg != NULLCHAR))
- {
- cwprintf(Window, "%s\r\n", cmdtable[loop].exec_errmsg);
- }
- return(rslt);
- }
- }
- }
-