Add support for auto_boolean (true, false or auto).
This commit is contained in:
parent
f09ded2422
commit
97c3646ff2
4 changed files with 154 additions and 6 deletions
|
@ -327,6 +327,25 @@ add_set_enum_cmd (char *name,
|
|||
return c;
|
||||
}
|
||||
|
||||
/* Add element named NAME to command list LIST (the list for set
|
||||
or some sublist thereof).
|
||||
CLASS is as in add_cmd.
|
||||
VAR is address of the variable which will contain the value.
|
||||
DOC is the documentation string. */
|
||||
struct cmd_list_element *
|
||||
add_set_auto_boolean_cmd (char *name,
|
||||
enum command_class class,
|
||||
enum cmd_auto_boolean *var,
|
||||
char *doc,
|
||||
struct cmd_list_element **list)
|
||||
{
|
||||
static const char *auto_boolean_enums[] = { "on", "off", "auto", NULL };
|
||||
struct cmd_list_element *c;
|
||||
c = add_set_cmd (name, class, var_auto_boolean, var, doc, list);
|
||||
c->enums = auto_boolean_enums;
|
||||
return c;
|
||||
}
|
||||
|
||||
/* Where SETCMD has already been added, add the corresponding show
|
||||
command to LIST and return a pointer to the added command (not
|
||||
necessarily the head of LIST). */
|
||||
|
@ -1530,6 +1549,32 @@ complete_on_enum (const char *enumlist[],
|
|||
return matchlist;
|
||||
}
|
||||
|
||||
static enum cmd_auto_boolean
|
||||
parse_auto_binary_operation (const char *arg)
|
||||
{
|
||||
if (arg != NULL && *arg != '\0')
|
||||
{
|
||||
int length = strlen (arg);
|
||||
while (isspace (arg[length - 1]) && length > 0)
|
||||
length--;
|
||||
if (strncmp (arg, "on", length) == 0
|
||||
|| strncmp (arg, "1", length) == 0
|
||||
|| strncmp (arg, "yes", length) == 0
|
||||
|| strncmp (arg, "enable", length) == 0)
|
||||
return CMD_AUTO_BOOLEAN_TRUE;
|
||||
else if (strncmp (arg, "off", length) == 0
|
||||
|| strncmp (arg, "0", length) == 0
|
||||
|| strncmp (arg, "no", length) == 0
|
||||
|| strncmp (arg, "disable", length) == 0)
|
||||
return CMD_AUTO_BOOLEAN_FALSE;
|
||||
else if (strncmp (arg, "auto", length) == 0
|
||||
|| (strncmp (arg, "-1", length) == 0 && length > 1))
|
||||
return CMD_AUTO_BOOLEAN_AUTO;
|
||||
}
|
||||
error ("\"on\", \"off\" or \"auto\" expected.");
|
||||
return CMD_AUTO_BOOLEAN_AUTO; /* pacify GCC */
|
||||
}
|
||||
|
||||
static int
|
||||
parse_binary_operation (arg)
|
||||
char *arg;
|
||||
|
@ -1544,13 +1589,15 @@ parse_binary_operation (arg)
|
|||
while (arg[length - 1] == ' ' || arg[length - 1] == '\t')
|
||||
length--;
|
||||
|
||||
if (!strncmp (arg, "on", length)
|
||||
|| !strncmp (arg, "1", length)
|
||||
|| !strncmp (arg, "yes", length))
|
||||
if (strncmp (arg, "on", length) == 0
|
||||
|| strncmp (arg, "1", length) == 0
|
||||
|| strncmp (arg, "yes", length) == 0
|
||||
|| strncmp (arg, "enable", length) == 0)
|
||||
return 1;
|
||||
else if (!strncmp (arg, "off", length)
|
||||
|| !strncmp (arg, "0", length)
|
||||
|| !strncmp (arg, "no", length))
|
||||
else if (strncmp (arg, "off", length) == 0
|
||||
|| strncmp (arg, "0", length) == 0
|
||||
|| strncmp (arg, "no", length) == 0
|
||||
|| strncmp (arg, "disable", length) == 0)
|
||||
return 0;
|
||||
else
|
||||
{
|
||||
|
@ -1635,6 +1682,9 @@ do_setshow_command (arg, from_tty, c)
|
|||
case var_boolean:
|
||||
*(int *) c->var = parse_binary_operation (arg);
|
||||
break;
|
||||
case var_auto_boolean:
|
||||
*(enum cmd_auto_boolean *) c->var = parse_auto_binary_operation (arg);
|
||||
break;
|
||||
case var_uinteger:
|
||||
if (arg == NULL)
|
||||
error_no_arg ("integer to set it to.");
|
||||
|
@ -1760,6 +1810,23 @@ do_setshow_command (arg, from_tty, c)
|
|||
case var_boolean:
|
||||
fputs_filtered (*(int *) c->var ? "on" : "off", stb->stream);
|
||||
break;
|
||||
case var_auto_boolean:
|
||||
switch (*(enum auto_boolean*) c->var)
|
||||
{
|
||||
case CMD_AUTO_BOOLEAN_TRUE:
|
||||
fputs_filtered ("on", stb->stream);
|
||||
break;
|
||||
case CMD_AUTO_BOOLEAN_FALSE:
|
||||
fputs_filtered ("off", stb->stream);
|
||||
break;
|
||||
case CMD_AUTO_BOOLEAN_AUTO:
|
||||
fputs_filtered ("auto", stb->stream);
|
||||
break;
|
||||
default:
|
||||
internal_error ("do_setshow_command: invalid var_auto_boolean");
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case var_uinteger:
|
||||
if (*(unsigned int *) c->var == UINT_MAX)
|
||||
{
|
||||
|
@ -1813,6 +1880,23 @@ do_setshow_command (arg, from_tty, c)
|
|||
case var_boolean:
|
||||
fputs_filtered (*(int *) c->var ? "on" : "off", gdb_stdout);
|
||||
break;
|
||||
case var_auto_boolean:
|
||||
switch (*(enum cmd_auto_boolean*) c->var)
|
||||
{
|
||||
case CMD_AUTO_BOOLEAN_TRUE:
|
||||
fputs_filtered ("on", gdb_stdout);
|
||||
break;
|
||||
case CMD_AUTO_BOOLEAN_FALSE:
|
||||
fputs_filtered ("off", gdb_stdout);
|
||||
break;
|
||||
case CMD_AUTO_BOOLEAN_AUTO:
|
||||
fputs_filtered ("auto", gdb_stdout);
|
||||
break;
|
||||
default:
|
||||
internal_error ("do_setshow_command: invalid var_auto_boolean");
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case var_uinteger:
|
||||
if (*(unsigned int *) c->var == UINT_MAX)
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue