До сих пор пользовался таким парсером
Код
void PARSER_ParseUart(char *str)
{
str = ToLower(str);
if(strlen(str) == 0)
goto exit;
char *command;
char *argument1="";
char *argument2="";
char *argument3="";
command = strtok(str," ");
argument1 = strtok (NULL, " ");
argument2 = strtok (NULL, " ");
argument3 = strtok (NULL, " ");
if(strcmp(command,"command1")==0)
{
if(argument1 == NULL)
{
UART_SendInt(UART0,FunctionReadsValue());
}
else
{
int val1 = atoi(argument1);
FunctionWritesValue(val1);
}
}
else if(strcmp(command,"command2")==0)
{
if(argument1 == NULL)
{
UART_SendInt(UART0,FunctionReadsValue());
}
else if (argument2 == NULL || argument3 == NULL)
{
FunctionDoSmething();
}
else
{
FunctionDoAnotherThing();
}
}
//and so on………………
}
В принципе я этим способом доволен, работает четко. Но сейчас количество команд перевалило за 100. Функция стала монструозной к тому же жрет много флэша.
Поэтому я решил замутить что то вроде этого
Код
struct command
{
char *name; //command name
char mode; //0-read, 1- read/write
int minval;
int maxval;
char val_changed;
void (*fp) (void); //function pointer
};
struct command commands[10];
struct command commands[] = {
{"imax", 1, 1000, 10000, 0, get_imax},
{"inow", 0, 1000, 10000, 0, get_inow},
{"top", 1, 100, 2500, 0, get_top},
{"pos", 0, 100000, 100000, 0, get_pos},
};
void get_command(char *com)
{
int I;
for (i = 0; i < sizeof(commands); i++)
{
if(strcmp(commands[i].name, com) == 0)
{
//do something
}
}
}
Вопрос как сделать универсальный указатель на функцию чтоб могла возвращать значение и содержать любое количество аргументов.
А может у кого нибудь есть более интересное решение?