uart_cmd: introduce argument array parsing

This commit is contained in:
Harald Welte 2012-02-28 22:21:09 +01:00
parent 5bf0e748d8
commit 5a389db1c1
4 changed files with 38 additions and 24 deletions

View File

@ -53,7 +53,8 @@ int uart_cmd_reset(struct cmd_state *cs);
struct cmd { struct cmd {
const char *cmd; const char *cmd;
uint32_t ops; uint32_t ops;
int (*cb)(struct cmd_state *cs, enum cmd_op op, const char *cmd, const char *arg); int (*cb)(struct cmd_state *cs, enum cmd_op op, const char *cmd,
int argc, char **argv);
const char *help; const char *help;
/* put list at the end for simpler initialization */ /* put list at the end for simpler initialization */
struct llist_head list; struct llist_head list;

View File

@ -201,20 +201,22 @@ static int freq = 800;
static struct cmd_state cmd_state; static struct cmd_state cmd_state;
static int cmd_tuner_init(struct cmd_state *cs, enum cmd_op op, static int cmd_tuner_init(struct cmd_state *cs, enum cmd_op op,
const char *cmd, const char *argv) const char *cmd, int argc, char **argv)
{ {
e4k_init(&e4k); e4k_init(&e4k);
return 0; return 0;
} }
static int cmd_rf_freq(struct cmd_state *cs, enum cmd_op op, static int cmd_rf_freq(struct cmd_state *cs, enum cmd_op op,
const char *cmd, const char *arg) const char *cmd, int argc, char **argv)
{ {
uint32_t freq; uint32_t freq;
switch (op) { switch (op) {
case CMD_OP_SET: case CMD_OP_SET:
freq = strtoul(arg, NULL, 10); if (argc < 1)
return -EINVAL;
freq = strtoul(argv[0], NULL, 10);
e4k_tune_freq(&e4k, freq); e4k_tune_freq(&e4k, freq);
break; break;
case CMD_OP_GET: case CMD_OP_GET:
@ -229,13 +231,15 @@ static int cmd_rf_freq(struct cmd_state *cs, enum cmd_op op,
} }
static int cmd_si570_freq(struct cmd_state *cs, enum cmd_op op, static int cmd_si570_freq(struct cmd_state *cs, enum cmd_op op,
const char *cmd, const char *arg) const char *cmd, int argc, char **argv)
{ {
uint32_t freq; uint32_t freq;
switch (op) { switch (op) {
case CMD_OP_SET: case CMD_OP_SET:
freq = strtoul(arg, NULL, 10); if (argc < 1)
return -EINVAL;
freq = strtoul(argv[0], NULL, 10);
set_si570_freq(freq); set_si570_freq(freq);
break; break;
default: default:
@ -245,14 +249,14 @@ static int cmd_si570_freq(struct cmd_state *cs, enum cmd_op op,
} }
static int cmd_si570_dump(struct cmd_state *cs, enum cmd_op op, static int cmd_si570_dump(struct cmd_state *cs, enum cmd_op op,
const char *cmd, const char *arg) const char *cmd, int argc, char **argv)
{ {
si570_regdump(&si570); si570_regdump(&si570);
return 0; return 0;
} }
static int cmd_fpga_dump(struct cmd_state *cs, enum cmd_op op, static int cmd_fpga_dump(struct cmd_state *cs, enum cmd_op op,
const char *cmd, const char *arg) const char *cmd, int argc, char **argv)
{ {
uart_cmd_out(cs, "FPGA ID REG: 0x%08x\n\r", osdr_fpga_reg_read(OSDR_FPGA_REG_ID)); uart_cmd_out(cs, "FPGA ID REG: 0x%08x\n\r", osdr_fpga_reg_read(OSDR_FPGA_REG_ID));
@ -264,7 +268,7 @@ static int cmd_fpga_dump(struct cmd_state *cs, enum cmd_op op,
} }
static int cmd_ssc_start(struct cmd_state *cs, enum cmd_op op, static int cmd_ssc_start(struct cmd_state *cs, enum cmd_op op,
const char *cmd, const char *arg) const char *cmd, int argc, char **argv)
{ {
switch (op) { switch (op) {
case CMD_OP_EXEC: case CMD_OP_EXEC:
@ -278,7 +282,7 @@ static int cmd_ssc_start(struct cmd_state *cs, enum cmd_op op,
} }
static int cmd_ssc_stats(struct cmd_state *cs, enum cmd_op op, static int cmd_ssc_stats(struct cmd_state *cs, enum cmd_op op,
const char *cmd, const char *arg) const char *cmd, int argc, char **argv)
{ {
ssc_stats(); ssc_stats();
} }

View File

@ -57,15 +57,24 @@ void uart_cmds_register(struct cmd *c, unsigned int num)
uart_cmd_register(&c[i]); uart_cmd_register(&c[i]);
} }
#define CMD_MAX_ARGS 10
static int handle_cb(struct cmd_state *cs, int op, char *cmd, char *arg) static int handle_cb(struct cmd_state *cs, int op, char *cmd, char *arg)
{ {
struct cmd *c; struct cmd *c;
int rc; int rc;
char *argv[CMD_MAX_ARGS];
int argc = 0;
if (!arg) if (arg) {
arg = ""; char *tok;
/* tokenize the argument portion into individual arguments */
//printf("handle_cb(%s, %s)\n", cmd, arg); for (tok = strtok(arg, ","); tok; tok = strtok(NULL, ",")) {
if (argc >= CMD_MAX_ARGS)
break;
argv[argc++] = tok;
}
}
llist_for_each_entry(c, &cmd_list, list) { llist_for_each_entry(c, &cmd_list, list) {
if (!strcmp(c->cmd, cmd)) { if (!strcmp(c->cmd, cmd)) {
@ -75,7 +84,7 @@ static int handle_cb(struct cmd_state *cs, int op, char *cmd, char *arg)
return -EINVAL; return -EINVAL;
} }
rc = c->cb(cs, op, cmd, arg); rc = c->cb(cs, op, cmd, argc, argv);
if (rc < 0) if (rc < 0)
uart_cmd_out(cs, "Error executing command\n\r"); uart_cmd_out(cs, "Error executing command\n\r");
return rc; return rc;
@ -128,10 +137,10 @@ int uart_cmd_char(struct cmd_state *cs, uint8_t ch)
uart_cmd_reset(cs); uart_cmd_reset(cs);
break; break;
case ' ': case ' ':
case '\n':
case '\t': case '\t':
/* ignore any whitespace */ /* ignore any whitespace */
break; break;
case '\n':
case '\r': case '\r':
/* new line always resets buffer */ /* new line always resets buffer */
uart_cmd_reset(cs); uart_cmd_reset(cs);
@ -143,12 +152,12 @@ int uart_cmd_char(struct cmd_state *cs, uint8_t ch)
break; break;
case ST_IN_ARG: case ST_IN_ARG:
switch (ch) { switch (ch) {
case '\n':
case '\r': case '\r':
rc = handle_cb(cs, CMD_OP_SET, cs->cmd.buf, cs->arg.buf); rc = handle_cb(cs, CMD_OP_SET, cs->cmd.buf, cs->arg.buf);
uart_cmd_reset(cs); uart_cmd_reset(cs);
break; break;
case ' ': case ' ':
case '\n':
case '\t': case '\t':
/* ignore any whitespace */ /* ignore any whitespace */
break; break;

View File

@ -12,15 +12,15 @@ static void my_out(const char *format, va_list ap)
vprintf(format, ap); vprintf(format, ap);
} }
static int my_cb(struct cmd_state *cs, enum cmd_op op, const char *cmd, const char *arg) static int my_cb(struct cmd_state *cs, enum cmd_op op, const char *cmd,
int argc, char **argv)
{ {
printf("my_%s `%s', `%s'\n", op == CMD_OP_SET ? "set" : "get", cmd, arg); int i;
if (!strcmp(cmd, "bar") && op == CMD_OP_SET) printf("my_cb(%u,%s,%u,[", op, cmd, argc);
return -EINVAL; for (i = 0; i < argc; i++)
printf("%s,", argv[i]);
else if (!strcmp(cmd, "baz") && op == CMD_OP_GET) printf("])\n");
return -EINVAL;
return 0; return 0;
} }