329 lines
7.8 KiB
C
329 lines
7.8 KiB
C
/******************************************************************************
|
|
*
|
|
* @brief provide an interactive user interface.
|
|
*
|
|
* The commands, set/show parameters, and prompt are configured at the project level.
|
|
*******************************************************************************/
|
|
|
|
#include "common.h"
|
|
#include "uif.h"
|
|
|
|
/********************************************************************/
|
|
/*
|
|
* Global messages -- constant strings
|
|
*/
|
|
const char HELPMSG[] =
|
|
"Enter 'help' for help.\n";
|
|
|
|
const char INVARG[] =
|
|
"Error: Invalid argument: %s\n";
|
|
|
|
const char INVALUE[] =
|
|
"Error: Invalid value: %s\n";
|
|
|
|
/*
|
|
* Strings used by this file only
|
|
*/
|
|
static const char INVCMD[] =
|
|
"Error: No such command: %s\n";
|
|
|
|
static const char HELPFORMAT[] =
|
|
"%8s %-25s %s %s\n";
|
|
|
|
static const char SYNTAX[] =
|
|
"Error: Invalid syntax for: %s\n";
|
|
|
|
static const char INVOPT[] =
|
|
"Error: Invalid set/show option: %s\n";
|
|
|
|
static const char OPTFMT[] =
|
|
"%12s: ";
|
|
|
|
static char cmdline1 [UIF_MAX_LINE];
|
|
static char cmdline2 [UIF_MAX_LINE];
|
|
|
|
/********************************************************************/
|
|
char *
|
|
get_line (char *line)
|
|
{
|
|
int pos;
|
|
int ch;
|
|
|
|
pos = 0;
|
|
ch = (int)in_char();
|
|
while ( (ch != 0x0D /* CR */) &&
|
|
(ch != 0x0A /* LF/NL */) &&
|
|
(pos < UIF_MAX_LINE))
|
|
{
|
|
switch (ch)
|
|
{
|
|
case 0x08: /* Backspace */
|
|
case 0x7F: /* Delete */
|
|
if (pos > 0)
|
|
{
|
|
pos -= 1;
|
|
out_char(0x08); /* backspace */
|
|
out_char(' ');
|
|
out_char(0x08); /* backspace */
|
|
}
|
|
break;
|
|
default:
|
|
if ((pos+1) < UIF_MAX_LINE)
|
|
{
|
|
if ((ch > 0x1f) && (ch < 0x80))
|
|
{
|
|
line[pos++] = (char)ch;
|
|
out_char((char)ch);
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
ch = (int)in_char();
|
|
}
|
|
line[pos] = '\0';
|
|
out_char(0x0D); /* CR */
|
|
out_char(0x0A); /* LF */
|
|
|
|
return line;
|
|
}
|
|
|
|
/********************************************************************/
|
|
int
|
|
make_argv (char *cmdline, char *argv[])
|
|
{
|
|
int argc, i, in_text;
|
|
|
|
/*
|
|
* Break cmdline into strings and argv
|
|
* It is permissible for argv to be NULL, in which case
|
|
* the purpose of this routine becomes to count args
|
|
*/
|
|
argc = 0;
|
|
i = 0;
|
|
in_text = FALSE;
|
|
while (cmdline[i] != '\0') /* getline() must place 0x00 on end */
|
|
{
|
|
if (((cmdline[i] == ' ') ||
|
|
(cmdline[i] == '\t')) )
|
|
{
|
|
if (in_text)
|
|
{
|
|
/* end of command line argument */
|
|
cmdline[i] = '\0';
|
|
in_text = FALSE;
|
|
}
|
|
else
|
|
{
|
|
/* still looking for next argument */
|
|
|
|
}
|
|
}
|
|
else
|
|
{
|
|
/* got non-whitespace character */
|
|
if (in_text)
|
|
{
|
|
}
|
|
else
|
|
{
|
|
/* start of an argument */
|
|
in_text = TRUE;
|
|
if (argc < UIF_MAX_ARGS)
|
|
{
|
|
if (argv != NULL)
|
|
argv[argc] = &cmdline[i];
|
|
argc++;
|
|
}
|
|
else
|
|
/*return argc;*/
|
|
break;
|
|
}
|
|
|
|
}
|
|
i++; /* proceed to next character */
|
|
}
|
|
if (argv != NULL)
|
|
argv[argc] = NULL;
|
|
return argc;
|
|
}
|
|
|
|
/********************************************************************/
|
|
void
|
|
run_cmd (void)
|
|
{
|
|
/*
|
|
* Global array of pointers to emulate C argc,argv interface
|
|
*/
|
|
int argc;
|
|
char *argv[UIF_MAX_ARGS + 1]; /* one extra for null terminator */
|
|
|
|
get_line(cmdline1);
|
|
|
|
if (!(argc = make_argv(cmdline1,argv)))
|
|
{
|
|
/* no command entered, just a blank line */
|
|
strcpy(cmdline1,cmdline2);
|
|
argc = make_argv(cmdline1,argv);
|
|
}
|
|
cmdline2[0] = '\0';
|
|
|
|
if (argc)
|
|
{
|
|
int i;
|
|
for (i = 0; i < UIF_NUM_CMD; i++)
|
|
{
|
|
if (strcasecmp(UIF_CMDTAB[i].cmd,argv[0]) == 0)
|
|
{
|
|
if (((argc-1) >= UIF_CMDTAB[i].min_args) &&
|
|
((argc-1) <= UIF_CMDTAB[i].max_args))
|
|
{
|
|
if (UIF_CMDTAB[i].flags & UIF_CMD_FLAG_REPEAT)
|
|
{
|
|
strcpy(cmdline2,argv[0]);
|
|
}
|
|
UIF_CMDTAB[i].func(argc,argv);
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
printf(SYNTAX,argv[0]);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
printf(INVCMD,argv[0]);
|
|
printf(HELPMSG);
|
|
}
|
|
}
|
|
/********************************************************************/
|
|
uint32
|
|
get_value (char *s, int *success, int base)
|
|
{
|
|
uint32 value;
|
|
char *p;
|
|
|
|
value = strtoul(s,&p,base);
|
|
if ((value == 0) && (p == s))
|
|
{
|
|
*success = FALSE;
|
|
return 0;
|
|
}
|
|
else
|
|
{
|
|
*success = TRUE;
|
|
return value;
|
|
}
|
|
}
|
|
/********************************************************************/
|
|
void
|
|
uif_cmd_help (int argc, char **argv)
|
|
{
|
|
int index;
|
|
|
|
(void)argc;
|
|
(void)argv;
|
|
|
|
printf("\n");
|
|
for (index = 0; index < UIF_NUM_CMD; index++)
|
|
{
|
|
printf(HELPFORMAT,
|
|
UIF_CMDTAB[index].cmd,
|
|
UIF_CMDTAB[index].description,
|
|
UIF_CMDTAB[index].cmd,
|
|
UIF_CMDTAB[index].syntax);
|
|
}
|
|
printf("\n");
|
|
}
|
|
/********************************************************************/
|
|
void
|
|
uif_cmd_set (int argc, char **argv)
|
|
{
|
|
int index;
|
|
|
|
printf("\n");
|
|
if (argc == 1)
|
|
{
|
|
printf("Valid 'set' options:\n");
|
|
for (index = 0; index < UIF_NUM_SETCMD; ++index)
|
|
{
|
|
printf(OPTFMT,UIF_SETCMDTAB[index].option);
|
|
printf("%s\n",UIF_SETCMDTAB[index].syntax);
|
|
}
|
|
printf("\n");
|
|
return;
|
|
}
|
|
|
|
if (argc != 3)
|
|
{
|
|
printf("Error: Invalid argument list\n");
|
|
return;
|
|
}
|
|
|
|
for (index = 0; index < UIF_NUM_SETCMD; index++)
|
|
{
|
|
if (strcasecmp(UIF_SETCMDTAB[index].option,argv[1]) == 0)
|
|
{
|
|
if (((argc-1-1) >= UIF_SETCMDTAB[index].min_args) &&
|
|
((argc-1-1) <= UIF_SETCMDTAB[index].max_args))
|
|
{
|
|
UIF_SETCMDTAB[index].func(argc,argv);
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
printf(INVARG,argv[1]);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
printf(INVOPT,argv[1]);
|
|
}
|
|
|
|
/********************************************************************/
|
|
void
|
|
uif_cmd_show (int argc, char **argv)
|
|
{
|
|
int index;
|
|
|
|
printf("\n");
|
|
if (argc == 1)
|
|
{
|
|
/*
|
|
* Show all Option settings
|
|
*/
|
|
argc = 2;
|
|
argv[2] = NULL;
|
|
for (index = 0; index < UIF_NUM_SETCMD; index++)
|
|
{
|
|
printf(OPTFMT,UIF_SETCMDTAB[index].option);
|
|
UIF_SETCMDTAB[index].func(argc,argv);
|
|
printf("\n");
|
|
}
|
|
printf("\n");
|
|
return;
|
|
}
|
|
|
|
for (index = 0; index < UIF_NUM_SETCMD; index++)
|
|
{
|
|
if (strcasecmp(UIF_SETCMDTAB[index].option,argv[1]) == 0)
|
|
{
|
|
if (((argc-1-1) >= UIF_SETCMDTAB[index].min_args) &&
|
|
((argc-1-1) <= UIF_SETCMDTAB[index].max_args))
|
|
{
|
|
printf(OPTFMT,UIF_SETCMDTAB[index].option);
|
|
UIF_SETCMDTAB[index].func(argc,argv);
|
|
printf("\n\n");
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
printf(INVARG,argv[1]);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
printf(INVOPT,argv[1]);
|
|
}
|
|
|
|
/********************************************************************/
|