command: Refactored and cleaned up command_process

This commit is contained in:
dragonmux 2022-07-26 12:15:30 +01:00 committed by Piotr Esden-Tempski
parent 68a6a7b85e
commit 823634e609
2 changed files with 13 additions and 17 deletions

View File

@ -72,7 +72,7 @@ static bool cmd_rtt(target *t, int argc, const char **argv);
static bool cmd_debug_bmp(target *t, int argc, const char **argv); static bool cmd_debug_bmp(target *t, int argc, const char **argv);
#endif #endif
const struct command_s cmd_list[] = { const command_t cmd_list[] = {
{"version", (cmd_handler)cmd_version, "Display firmware version info"}, {"version", (cmd_handler)cmd_version, "Display firmware version info"},
{"help", (cmd_handler)cmd_help, "Display help for monitor commands"}, {"help", (cmd_handler)cmd_help, "Display help for monitor commands"},
{"jtag_scan", (cmd_handler)cmd_jtag_scan, "Scan JTAG chain for devices"}, {"jtag_scan", (cmd_handler)cmd_jtag_scan, "Scan JTAG chain for devices"},
@ -113,38 +113,34 @@ unsigned cortexm_wait_timeout = 2000; /* Timeout to wait for Cortex to react on
int command_process(target *t, char *cmd) int command_process(target *t, char *cmd)
{ {
const struct command_s *c;
int argc = 1;
const char **argv;
const char *part;
/* Initial estimate for argc */ /* Initial estimate for argc */
for (char *s = cmd; *s; s++) size_t argc = 1;
if ((*s == ' ') || (*s == '\t')) for (size_t i = 0; i < strlen(cmd); ++i) {
argc++; if (cmd[i] == ' ' || cmd[i] == '\t')
++argc;
}
/* This needs replacing with something more sensible. /* This needs replacing with something more sensible.
* It should be pinging -Wvla among other things, and it failing is straight-up UB * It should be pinging -Wvla among other things, and it failing is straight-up UB
*/ */
argv = alloca(sizeof(const char *) * argc); const char **const argv = alloca(sizeof(const char *) * argc);
/* Tokenize cmd to find argv */ /* Tokenize cmd to find argv */
argc = 0; argc = 0;
for (part = strtok(cmd, " \t"); part; part = strtok(NULL, " \t")) for (const char *part = strtok(cmd, " \t"); part; part = strtok(NULL, " \t"))
argv[argc++] = part; argv[argc++] = part;
/* Look for match and call handler */ /* Look for match and call handler */
for (c = cmd_list; c->cmd; c++) { for (const command_t *cmd = cmd_list; cmd->cmd; ++cmd) {
/* Accept a partial match as GDB does. /* Accept a partial match as GDB does.
* So 'mon ver' will match 'monitor version' * So 'mon ver' will match 'monitor version'
*/ */
if ((argc == 0) || !strncmp(argv[0], c->cmd, strlen(argv[0]))) if ((argc == 0) || !strncmp(argv[0], cmd->cmd, strlen(argv[0])))
return !c->handler(t, argc, argv); return !cmd->handler(t, argc, argv);
} }
if (!t) if (!t)
return -1; return -1;
return target_command(t, argc, argv); return target_command(t, argc, argv);
} }

View File

@ -54,11 +54,11 @@ struct target_flash {
typedef bool (*cmd_handler)(target *t, int argc, const char **argv); typedef bool (*cmd_handler)(target *t, int argc, const char **argv);
struct command_s { typedef struct command_s {
const char *cmd; const char *cmd;
cmd_handler handler; cmd_handler handler;
const char *help; const char *help;
}; } command_t;
struct target_command_s { struct target_command_s {
const char *specific_name; const char *specific_name;