89 lines
1.9 KiB
C
89 lines
1.9 KiB
C
#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);
|
|
}
|
|
} |