in AZ3166/src/cores/arduino/cli/console_cli.cpp [430:537]
static int handle_input(char* inbuf)
{
struct
{
unsigned inArg:1;
unsigned inQuote:1;
unsigned done:1;
} stat;
static char* argv[MAX_CMD_ARG];
int argc = 0;
int i = 0;
memset((void*)&argv, 0, sizeof(argv));
memset(&stat, 0, sizeof(stat));
do
{
switch (inbuf[i])
{
case '\0':
if (stat.inQuote)
{
return 1;
}
stat.done = 1;
break;
case '"':
if (i > 0 && inbuf[i - 1] == '\\' && stat.inArg)
{
memcpy(&inbuf[i - 1], &inbuf[i], strlen(&inbuf[i]) + 1);
--i;
break;
}
if (!stat.inQuote && stat.inArg)
{
break;
}
if (stat.inQuote && !stat.inArg)
{
return 1;
}
if (!stat.inQuote && !stat.inArg)
{
stat.inArg = 1;
stat.inQuote = 1;
argc++;
argv[argc - 1] = &inbuf[i + 1];
}
else if (stat.inQuote && stat.inArg)
{
stat.inArg = 0;
stat.inQuote = 0;
inbuf[i] = '\0';
}
break;
case ' ':
if (i > 0 && inbuf[i - 1] == '\\' && stat.inArg)
{
memcpy(&inbuf[i - 1], &inbuf[i], strlen(&inbuf[i]) + 1);
--i;
break;
}
if (!stat.inQuote && stat.inArg)
{
stat.inArg = 0;
inbuf[i] = '\0';
}
break;
default:
if (!stat.inArg)
{
stat.inArg = 1;
argc++;
argv[argc - 1] = &inbuf[i];
}
break;
}
} while (!stat.done && ++i < INBUF_SIZE && argc <= MAX_CMD_ARG);
if (stat.inQuote)
{
return 1;
}
if (argc < 1)
{
return 0;
}
Serial.printf("\r\n");
for(int i = 0; i < cmd_count; i++)
{
if(strcmp(cmds[i].name, argv[0]) == 0)
{
cmds[i].function(argc, argv);
return 0;
}
}
Serial.printf("Error:Invalid command: %s\r\n", argv[0]);
return 0;
}