sw-battle-test-c

Interesting test task in C instead of C++
git clone git://bsandro.tech/sw-battle-test-c
Log | Files | Refs | README

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 }