From: Erik M. <er...@us...> - 2001-10-07 21:29:02
|
Update of /cvsroot/blob/blob/src/lib In directory usw-pr-cvs1:/tmp/cvs-serv19756/src/lib Modified Files: command.c error.c Log Message: Add command abbreviation. Index: command.c =================================================================== RCS file: /cvsroot/blob/blob/src/lib/command.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- command.c 2001/10/07 20:29:38 1.3 +++ command.c 2001/10/07 21:28:57 1.4 @@ -78,7 +78,7 @@ #define STATE_WHITESPACE (0) #define STATE_WORD (1) -void parse_args(char *cmdline, int *argc, char **argv) +static void parse_args(char *cmdline, int *argc, char **argv) { char *c; int state = STATE_WHITESPACE; @@ -136,10 +136,40 @@ +/* return the number of commands that match */ +static int get_num_command_matches(char *cmdline) +{ + commandlist_t *cmd; + int len; + int num_matches = 0; + + len = strlen(cmdline); + + for(cmd = commands; cmd != NULL; cmd = cmd->next) { + if(cmd->magic != COMMAND_MAGIC) { +#ifdef BLOB_DEBUG + printerrprefix(); + SerialOutputString("Address = 0x"); + SerialOutputHex((u32)cmd); + SerialOutputString("!\n"); +#endif + return -EMAGIC; + } + + if(strncmp(cmd->name, cmdline, len) == 0) + num_matches++; + } + + return num_matches; +} + + + + int parse_command(char *cmdline) { commandlist_t *cmd; - int argc; + int argc, num_commands, len; char *argv[MAX_ARGS]; parse_args(cmdline, &argc, argv); @@ -148,6 +178,23 @@ 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) { #ifdef BLOB_DEBUG @@ -160,7 +207,7 @@ return -EMAGIC; } - if(strcmp(cmd->name, cmdline) == 0) { + if(strncmp(cmd->name, argv[0], len) == 0) { /* call function */ return cmd->callback(argc, argv); } Index: error.c =================================================================== RCS file: /cvsroot/blob/blob/src/lib/error.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- error.c 2001/10/07 19:34:17 1.2 +++ error.c 2001/10/07 21:28:57 1.3 @@ -51,6 +51,7 @@ { ETIMEOUT, "timeout exceeded" }, { ETOOSHORT, "short file" }, { ETOOLONG, "long file" }, + { EAMBIGCMD, "ambiguous command" }, }; |