From: Stefan E. <se...@us...> - 2004-02-04 19:15:45
|
Update of /cvsroot/blob/blob/src/lib In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv17493 Modified Files: command.c Log Message: fixed the annoying "ambiguous command" errors one got even an exact match was possible. Index: command.c =================================================================== RCS file: /cvsroot/blob/blob/src/lib/command.c,v retrieving revision 1.14 retrieving revision 1.15 diff -u -d -r1.14 -r1.15 --- command.c 4 Sep 2003 17:39:01 -0000 1.14 +++ command.c 4 Feb 2004 19:13:19 -0000 1.15 @@ -133,12 +133,24 @@ -/* return the number of commands that match */ -static int get_num_command_matches(char *cmdline) +/* get_command - get command for matching argv[0] + * + * Search through whole list. Only accept exact matches if + * we have more than one match. + */ +static int get_command(char *cmdline, commandlist_t **command ) { + int ret = 0; commandlist_t *cmd; + commandlist_t *match = NULL; + commandlist_t *exact = NULL; + int nr_match = 0; int len; - int num_matches = 0; + + if ( !cmdline || !command ) { + ret = -EINVAL; + goto DONE; + } len = strlen(cmdline); @@ -150,11 +162,33 @@ return -EMAGIC; } - if(strncmp(cmd->name, cmdline, len) == 0) - num_matches++; + if (strncmp(cmd->name, cmdline, len) == 0) { + dprintf( "match for cmd=%p: %s\n", cmd, cmd->name ); + nr_match++; + match = cmd; + if ( strlen( cmd->name ) == len ) + exact = cmd; + } } - return num_matches; + if ( !match ) + ret = -EINVAL; + + dprintf( "%d matches\n", nr_match ); + if ( nr_match > 1 ) { + if ( exact ) { + match = exact; + dprintf( "choosing exact match '%s'\n", exact->name ); + } else { + dprintf( "no exact match, -EAMBIGCMD.\n" ); + match = NULL; + ret = -EAMBIGCMD; + } + } + + *command = match; +DONE: + return ret; } @@ -162,8 +196,10 @@ int parse_command(char *cmdline) { + int ret; commandlist_t *cmd; int argc, num_commands, len; + int exact = 0, found = 0;; char *argv[MAX_ARGS]; parse_args(cmdline, &argc, argv); @@ -172,38 +208,13 @@ if(argc == 0) return 0; - num_commands = get_num_command_matches(argv[0]); - - /* error */ - if(num_commands < 0) - return num_commands; - - /* no command matches */ - if(num_commands == 0) - return -ECOMMAND; - - /* ambiguous command */ - if(num_commands > 1) - return -EAMBIGCMD; - - len = strlen(argv[0]); - - /* single command, go for it */ - for(cmd = commands; cmd != NULL; cmd = cmd->next) { - if(cmd->magic != COMMAND_MAGIC) { - deprintf("command magic failed at 0x%08x\n", - (unsigned int)cmd); - - return -EMAGIC; - } + ret = get_command( argv[0], &cmd ); + if ( ret ) + return ret; - if(strncmp(cmd->name, argv[0], len) == 0) { - /* call function */ - return cmd->callback(argc, argv); - } - } + dprintf( "got cmd=%p: %s\n", cmd, cmd->name ); - return -ECOMMAND; + return cmd->callback( argc, argv ); } |