Hi Olivier,
I met a problem thar the parsing result of CLI is wrong.
I checked this function, cmdline_parse. It will check the CLI instances one by
one. Even if an instance is matched, the parsing will not stop for ambiguous
check. Seems the following check may change the parsing result of the previous
one,
/* fully parsed */
tok = match_inst(inst, buf, 0, result.buf,
sizeof(result.buf),
&dyn_tokens);
Is it better to use a temporary validate for match_inst and only store the
result when it matches, so the previous result has no chance to be changed?
Like bellow,
diff --git a/lib/librte_cmdline/cmdline_parse.c
b/lib/librte_cmdline/cmdline_parse.c
index 763c286..663efd1 100644
--- a/lib/librte_cmdline/cmdline_parse.c
+++ b/lib/librte_cmdline/cmdline_parse.c
@@ -259,6 +259,7 @@
char buf[CMDLINE_PARSE_RESULT_BUFSIZE];
long double align; /* strong alignment constraint for buf */
} result;
+ char tmp_buf[CMDLINE_PARSE_RESULT_BUFSIZE];
cmdline_parse_token_hdr_t *dyn_tokens[CMDLINE_PARSE_DYNAMIC_TOKENS];
void (*f)(void *, struct cmdline *, void *) = NULL;
void *data = NULL;
@@ -321,7 +322,7 @@
debug_printf("INST %d\n", inst_num);
/* fully parsed */
- tok = match_inst(inst, buf, 0, result.buf, sizeof(result.buf),
+ tok = match_inst(inst, buf, 0, tmp_buf, sizeof(tmp_buf),
&dyn_tokens);
if (tok > 0) /* we matched at least one token */
@@ -329,6 +330,8 @@
else if (!tok) {
debug_printf("INST fully parsed\n");
+ memcpy(result.buf, tmp_buf,
+ CMDLINE_PARSE_RESULT_BUFSIZE);
/* skip spaces */
while (isblank2(*curbuf)) {
curbuf++;
Best regards
Wenzhuo Lu