arduino_midi_player/Midi/music-box-nv32-master/nv32lib/common/uif.c
2025-03-24 14:30:56 +08:00

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]);
}
/********************************************************************/