}
/**
+ * Process a command line
+ *
+ * @param cmd_io I/O stack
+ * @param des_arr Pointer to the command descriptors.
+ * @param line Command line to process.
*
* @return Zero if no command was given in line, -CMDERR_BADCMD if
* command is not known or has no function assigned to it. If a
var=NULL;
while(*r){
while((*p==*r)&&i){i--;r++;p++;};
- if((i==0)&&!*r) break; /* We've found the command */
- if((*r=='?')&&i){
+ if((i==0)&&!*r) break; /* We've found the command (full match) */
+ if((*r=='?')&&i){ /* '?' stands for an arbitrary character */
if(!var) var=p;
p++; r++; i--;
continue;
}
- if((*r=='#')&&i&&isdigit((uint8_t)*p)){
+ if((*r=='#')&&i&&isdigit((uint8_t)*p)){ /* '#' stands for a digit */
if(!var) var=p;
p++; r++; i--;
continue;
}
- if(*r=='*'){
+ if(*r=='*'){ /* '*' stands for any number of any characters */
if(!var) var=p;
i=0;
break;
}
- i=1;
+ i=1; /* Signal no match */
break;
}
if(i!=0) continue; /* Try next command */
+ /* Setup parameters */
if(des->mode&CDESM_OPCHR){
if(!param[2])continue;
if(!*param[2])continue;
#define CDESM_WR 0x02 /* Value write is possible */
#define CDESM_RW (CDESM_RD|CDESM_WR) /* Both */
+/**
+ * Command descriptor.
+ *
+ * Command name may contain the following wildcards:
+ * - '?' stands for one arbitrary character
+ * - '#' stands for one digit
+ * - '*' stands for any number of arbitrary characters at the end of the command
+ *
+ * The fnc() function is passed the following information as the param array:
+ * - param[0] points to the command (the longest sequence of alphanumeric characters)
+ * If CDESM_OPCHR is specified in the command descriptor then
+ * - param[1] points to the first wildcard in the command or is NULL for commands without wildcard in the name
+ * - param[2] points to the operation character (':' or '?') and
+ * - param[3] points to the string after the operation character (after skipping whitespace)
+ * If CDESM_OPCHR is not specified then
+ * If the command name contains a wildcard,
+ * - param[1] points to the first wildcard in the command and
+ * If the command has any parameters
+ * - param[1] or param[2] (depending on the presence of a wildcard)
+ * points to the beginning of those parameters (after skipping
+ * whitespace)
+ *
+ * The param elements are always terminated by NULL element.
+ */
typedef struct cmd_des{
- int code;
- int mode;
- char *name;
+ int code; /* Application specific code */
+ int mode; /* CDESM_* constants */
+ char *name; /* Name of the command with possible wildcards */
char *help;
int (*fnc)(cmd_io_t *cmd_io, const struct cmd_des *des, char *param[]);
char *info[];