#include "string.h" #include "stdint.h" #include "cmd_parser.h" static const cmd_t **cmd_array; static uint8_t cmd_array_size; void cmd_parser_init(const cmd_t *commands[], uint8_t size) { cmd_array = commands; cmd_array_size = size; } void msg_parse(char *msg) { char *msgptr, *submsgptr; parser_t parser = NULL; result_t result = CMD_OK; char key = 0; char *token = strtok_r(msg, " ", &msgptr); if (token[0] == '?') { // help message } for (uint8_t i = 0; i < cmd_array_size; i++) { if (strcmp(token, cmd_array[i]->name) == 0) { parser = cmd_array[i]->parser; break; } } if (parser == NULL) { return; } for (token = strtok_r(NULL, " ", &msgptr); token != NULL; token = strtok_r(NULL, " ", &msgptr)) { if (token[0] == '-') { key = token[1]; result = parser(key, NULL); if (strlen(token) > 2) { token = token + 2; } } if (token[0] != '-') { switch (result) { case CMD_VALUE_REQ: result = parser(key, token); break; case CMD_MULTIVAL_REQ: for (char *subtoken = strtok_r(token, ", ", &submsgptr); subtoken != NULL; subtoken = strtok_r(NULL, ",", &submsgptr)) { if (parser(key, subtoken) == CMD_UNKNOWN) { result = parser(CMDP_KEY_ARG, subtoken); } } break; default: result = parser(CMDP_KEY_ARG, token); break; } } if (result == CMD_UNKNOWN) { break; } } if (result != CMD_UNKNOWN) { parser(CMDP_KEY_DONE, NULL); } else { parser(CMDP_KEY_STOP, NULL); } }