int docmd(void) { char *p = NULL; const struct cmd_table *ct = cmd_table, *cs; cmd.argc = 1; if (cmd.cmd == NULL) { /* command */ for (p = cmd_buf; *p == ' ' || *p == '\t'; p++) ; if (*p == '#' || *p == '\0') { /* comment or empty string */ #ifdef DEBUG printf("rem\n"); #endif return 0; } ct = cmd_table; cs = NULL; cmd.argv[cmd.argc] = p; /* in case it's shortcut boot */ p = whatcmd(&ct, p); if (ct == NULL) { cmd.argc++; ct = cmd_table; } else if (ct->cmd_type == CMDT_SET && p != NULL) { cs = cmd_set; #ifdef MACHINE_CMD } else if (ct->cmd_type == CMDT_MDC && p != NULL) { cs = MACHINE_CMD; #endif } if (cs != NULL) { p = whatcmd(&cs, p); if (cs == NULL) { printf("%s: syntax error\n", ct->cmd_name); return 0; } ct = cs; } cmd.cmd = ct; } cmd.argv[0] = ct->cmd_name; while (p && cmd.argc+1 < sizeof(cmd.argv) / sizeof(cmd.argv[0])) { cmd.argv[cmd.argc++] = p; p = nextword(p); } cmd.argv[cmd.argc] = NULL; #ifdef REGRESS printf("%s %s\n", cmd.argv[0], (cmd.argv[1] == NULL) ? "(null)" : cmd.argv[1]); #else return (*cmd.cmd->cmd_exec)(); #endif }
int handlecommand(int c, char *buf) { char *msg = "unknown command\n"; switch(whatcmd(buf)) { case CMD_LIST: dolist(c); break; case CMD_VIEW: doview(c, buf); break; case CMD_HELP: dohelp(c, buf); break; case CMD_NONE: send(c, msg, strlen(msg), 0); break; } }