parser.c (1265B)
1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 #include "core/command.h" 5 #include "core/parser.h" 6 #include "commands/_registry.h" 7 8 static void arg_cleanup(int argc, char **argv) { 9 for (int i=0;i<argc;++i) { 10 free(argv[i]); 11 } 12 free(argv); 13 } 14 15 bool try_parse_call(World *w, char *line) { 16 char *saveptr = NULL; 17 char cmd[MAX_CMD_NAME_LEN] = {0}; 18 int argc = -1; 19 char **argv = NULL; 20 for (char *src=line;;src=NULL) { 21 char *token=strtok_r(src, " \r\n", &saveptr); 22 if (token==NULL) break; 23 //printf(" -> %s", token); 24 int token_len = strlen(token); 25 if (argc==-1) { 26 strncpy(cmd, token, MAX_CMD_NAME_LEN-1); 27 argc++; 28 } else { 29 argc++; 30 argv = realloc(argv, argc*sizeof(char *)); 31 if (argv==NULL) puts("!!! realloc error"); 32 argv[argc-1] = strndup(token, MAX_CMD_ARG_LEN-1); 33 } 34 } 35 //printf("\n argc: %d\n---------\n", argc); 36 bool success = false; 37 for (int i=0;i<COMMANDS_COUNT;++i) { 38 if (strncmp(COMMANDS[i].name, cmd, MAX_CMD_NAME_LEN)==0) { 39 success = COMMANDS[i].func(w, argc, argv); 40 break; 41 } 42 } 43 44 arg_cleanup(argc, argv); 45 return success; 46 }