diff options
Diffstat (limited to 'gdb/command.c')
-rw-r--r-- | gdb/command.c | 96 |
1 files changed, 90 insertions, 6 deletions
diff --git a/gdb/command.c b/gdb/command.c index d9284cd..c7cbbfd 100644 --- a/gdb/command.c +++ b/gdb/command.c @@ -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) { |