char ** parse_command(char *input) { static char com[COM_BUF_SIZE]; memcpy(com, input, COM_BUF_SIZE); static char *starts[128]; memset(starts, 0, sizeof(starts)); int next_start = 0; com[COM_BUF_SIZE - 1] = ' '; for (int i = 0; i < COM_BUF_SIZE; i++) { for (; com[i] == ' ' && i < COM_BUF_SIZE; i++); if (i >= COM_BUF_SIZE) break; starts[next_start] = com + i; for(; i < COM_BUF_SIZE && com[i] != ' '; i++) ; com[i] = '\0'; next_start++; } return &starts[0]; } void run_command(char *c) { char **com = parse_command(c); if(com[0] == NULL) return; if(commands[com[0][0]] != NULL) commands[com[0][0]](c, com); else puts("invalid command"); } int main(int argc, char **argv) { static char buf[COM_BUF_SIZE]; if (argc >= 2) { load_file(argv[1]); } while(1) { memset(buf, 0, sizeof(buf)); printf(" > "); fflush(stdout); char *com = fgets(buf, sizeof(buf), stdin); for (int i = 0; i < sizeof(buf); i++) if (buf[i] == '\n') buf[i] = '\0'; if (com != NULL) { run_command(com); } } return 0; }