first working version
This commit is contained in:
@@ -1,6 +1,89 @@
|
||||
#include "string.h"
|
||||
#include "stdint.h"
|
||||
|
||||
#include "cmd_parser.h"
|
||||
|
||||
void cmd_parse(char* msg)
|
||||
{
|
||||
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);
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,24 @@
|
||||
#pragma once
|
||||
|
||||
typedef void(*help_filter)(char key, const char *text);
|
||||
// void parser (int key, char *arg, struct argp_state *state);
|
||||
#define CMDP_KEY_DONE 1
|
||||
#define CMDP_KEY_ARG 2
|
||||
#define CMDP_KEY_STOP 3
|
||||
|
||||
void cmd_parse(char* msg);
|
||||
typedef enum
|
||||
{
|
||||
CMD_OK,
|
||||
CMD_VALUE_REQ,
|
||||
CMD_MULTIVAL_REQ,
|
||||
CMD_UNKNOWN,
|
||||
} result_t;
|
||||
|
||||
typedef result_t (*parser_t)(char key, char *arg);
|
||||
|
||||
typedef struct
|
||||
{
|
||||
char *name;
|
||||
parser_t parser;
|
||||
} cmd_t;
|
||||
|
||||
void cmd_parser_init(const cmd_t *commands[], uint8_t size);
|
||||
void msg_parse(char *msg);
|
||||
59
cmd_parser/cmd_parser2.h
Normal file
59
cmd_parser/cmd_parser2.h
Normal file
@@ -0,0 +1,59 @@
|
||||
#pragma once
|
||||
#include "main.h"
|
||||
|
||||
#define CMDP_KEY_ARG 1
|
||||
|
||||
typedef void (*help_filter)(char key, const char *text);
|
||||
// key = opt_id, arg = value or NULL
|
||||
// key = CMDP_KEY_ARG, arg = id_arg or token
|
||||
typedef enum
|
||||
{
|
||||
CMD_NULL,
|
||||
CMD_OK,
|
||||
CMD_VALUE_REQ,
|
||||
CMD_MULTIVAL_REQ,
|
||||
CMD_UNKNOWN,
|
||||
} result_t;
|
||||
|
||||
typedef result_t (*parser)(char key, char *arg);
|
||||
|
||||
typedef enum
|
||||
{
|
||||
NO_VALUE = 0,
|
||||
SINGLE_VALE = 1,
|
||||
MULTI_VALUE = 2,
|
||||
NOT_OPTIONAL = 4,
|
||||
} option_flags_t;
|
||||
|
||||
typedef const struct
|
||||
{
|
||||
uint8_t opt_id;
|
||||
char *name;
|
||||
char *description;
|
||||
option_flags_t flags;
|
||||
} option_t;
|
||||
|
||||
typedef const struct
|
||||
{
|
||||
char *name;
|
||||
uint8_t arg_id;
|
||||
char *description;
|
||||
option_t *options;
|
||||
uint8_t opt_num;
|
||||
// parser arg_parser;
|
||||
} argument_t;
|
||||
|
||||
typedef const struct
|
||||
{
|
||||
char *name;
|
||||
char *description;
|
||||
argument_t *arguments;
|
||||
uint8_t arg_num;
|
||||
option_t *options;
|
||||
uint8_t opt_num;
|
||||
parser cmd_parser;
|
||||
} cmd_parser_t;
|
||||
|
||||
void cmd_parser_init(cmd_parser_t* commands[], uint8_t size);
|
||||
// void cmd_parse(char *msg, parser parser);
|
||||
void cmd_parse(char *msg);
|
||||
Reference in New Issue
Block a user