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" },
};
|