From ce5f02fc9eedb5848c3b9768101068f5fb92d03c Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Fri, 16 Nov 2007 13:23:59 +0000 Subject: Report available commands on ambiguous commands. Tidy TODO a bit. --- cmd.c | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) (limited to 'cmd.c') diff --git a/cmd.c b/cmd.c index 1396d04c..82c53831 100644 --- a/cmd.c +++ b/cmd.c @@ -1,4 +1,4 @@ -/* $Id: cmd.c,v 1.26 2007-11-12 14:21:40 nicm Exp $ */ +/* $Id: cmd.c,v 1.27 2007-11-16 13:23:59 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -57,6 +57,7 @@ cmd_parse(int argc, char **argv, char **cause) { const struct cmd_entry **entryp, *entry; struct cmd *cmd; + char s[BUFSIZ]; int opt; *cause = NULL; @@ -73,10 +74,8 @@ cmd_parse(int argc, char **argv, char **cause) if (strncmp((*entryp)->name, argv[0], strlen(argv[0])) != 0) continue; - if (entry != NULL) { - xasprintf(cause, "ambiguous command: %s", argv[0]); - return (NULL); - } + if (entry != NULL) + goto ambiguous; entry = *entryp; } if (entry == NULL) { @@ -108,6 +107,20 @@ cmd_parse(int argc, char **argv, char **cause) } return (cmd); +ambiguous: + *s = '\0'; + for (entryp = cmd_table; *entryp != NULL; entryp++) { + if (strncmp((*entryp)->name, argv[0], strlen(argv[0])) != 0) + continue; + if (strlcat(s, (*entryp)->name, sizeof s) >= sizeof s) + break; + if (strlcat(s, ", ", sizeof s) >= sizeof s) + break; + } + s[strlen(s) - 2] = '\0'; + xasprintf(cause, "ambiguous command: %s, could be: %s", argv[0], s); + return (NULL); + usage: usage(cause, "%s %s", entry->name, entry->usage); return (NULL); -- cgit