aboutsummaryrefslogtreecommitdiff
path: root/gdb/cli/cli-setshow.c
diff options
context:
space:
mode:
Diffstat (limited to 'gdb/cli/cli-setshow.c')
-rw-r--r--gdb/cli/cli-setshow.c247
1 files changed, 117 insertions, 130 deletions
diff --git a/gdb/cli/cli-setshow.c b/gdb/cli/cli-setshow.c
index dccf04e..dad3e60 100644
--- a/gdb/cli/cli-setshow.c
+++ b/gdb/cli/cli-setshow.c
@@ -149,10 +149,11 @@ deprecated_show_value_hack (struct ui_file *ignore_file,
}
}
-/* Returns true if ARG is "unlimited". */
+/* Returns true and the value in VAL if ARG is an accepted literal. */
static bool
-is_unlimited_literal (const char **arg, bool expression)
+get_literal_val (LONGEST &val, const literal_def *extra_literals,
+ const char **arg, bool expression)
{
*arg = skip_spaces (*arg);
@@ -162,85 +163,104 @@ is_unlimited_literal (const char **arg, bool expression)
size_t len = p - *arg;
- if (len > 0 && strncmp ("unlimited", *arg, len) == 0)
- {
- *arg += len;
-
- /* If parsing an expression (i.e., parsing for a "set" command),
- anything after "unlimited" is junk. For options, anything
- after "unlimited" might be a command argument or another
- option. */
- if (expression)
+ if (len > 0 && extra_literals != nullptr)
+ for (const literal_def *l = extra_literals;
+ l->literal != nullptr;
+ l++)
+ if (strncmp (l->literal, *arg, len) == 0)
{
- const char *after = skip_spaces (*arg);
- if (*after != '\0')
- error (_("Junk after \"%.*s\": %s"),
- (int) len, unl_start, after);
- }
+ *arg += len;
- return true;
- }
+ /* If parsing an expression (i.e., parsing for a "set" command),
+ anything after the literal is junk. For options, anything
+ after the literal might be a command argument or another
+ option. */
+ if (expression)
+ {
+ const char *after = skip_spaces (*arg);
+ if (*after != '\0')
+ error (_("Junk after \"%.*s\": %s"),
+ (int) len, unl_start, after);
+ }
+
+ val = l->use;
+ return true;
+ }
return false;
}
/* See cli-setshow.h. */
-unsigned int
-parse_cli_var_uinteger (var_types var_type, const char **arg,
- bool expression)
+LONGEST
+parse_cli_var_integer (var_types var_type, const literal_def *extra_literals,
+ const char **arg, bool expression)
{
LONGEST val;
if (*arg == nullptr || **arg == '\0')
{
- if (var_type == var_uinteger)
- error_no_arg (_("integer to set it to, or \"unlimited\""));
- else
+ if (extra_literals == nullptr)
error_no_arg (_("integer to set it to"));
- }
-
- if (var_type == var_uinteger && is_unlimited_literal (arg, expression))
- val = 0;
- else if (expression)
- val = parse_and_eval_long (*arg);
- else
- val = get_ulongest (arg);
-
- if (var_type == var_uinteger && val == 0)
- val = UINT_MAX;
- else if (val < 0
- /* For var_uinteger, don't let the user set the value
- to UINT_MAX directly, as that exposes an
- implementation detail to the user interface. */
- || (var_type == var_uinteger && val >= UINT_MAX)
- || (var_type == var_zuinteger && val > UINT_MAX))
- error (_("integer %s out of range"), plongest (val));
-
- return val;
-}
-
-/* See cli-setshow.h. */
+ else
+ {
+ std::string buffer = "";
+ size_t count = 0;
-int
-parse_cli_var_zuinteger_unlimited (const char **arg, bool expression)
-{
- LONGEST val;
+ for (const literal_def *l = extra_literals;
+ l->literal != nullptr;
+ l++, count++)
+ {
+ if (count != 0)
+ buffer += ", ";
+ buffer = buffer + '"' + l->literal + '"';
+ }
+ if (count > 1)
+ error_no_arg
+ (string_printf (_("integer to set it to, or one of: %s"),
+ buffer.c_str ()).c_str ());
+ else
+ error_no_arg
+ (string_printf (_("integer to set it to, or %s"),
+ buffer.c_str ()).c_str ());
+ }
+ }
- if (*arg == nullptr || **arg == '\0')
- error_no_arg (_("integer to set it to, or \"unlimited\""));
+ if (!get_literal_val (val, extra_literals, arg, expression))
+ {
+ if (expression)
+ val = parse_and_eval_long (*arg);
+ else
+ val = get_ulongest (arg);
- if (is_unlimited_literal (arg, expression))
- val = -1;
- else if (expression)
- val = parse_and_eval_long (*arg);
- else
- val = get_ulongest (arg);
+ enum tribool allowed = TRIBOOL_UNKNOWN;
+ if (extra_literals != nullptr)
+ {
+ for (const literal_def *l = extra_literals;
+ l->literal != nullptr;
+ l++)
+ if (l->val.has_value () && val == *l->val)
+ {
+ allowed = TRIBOOL_TRUE;
+ val = l->use;
+ break;
+ }
+ else if (val == l->use)
+ allowed = TRIBOOL_FALSE;
+ }
- if (val > INT_MAX)
- error (_("integer %s out of range"), plongest (val));
- else if (val < -1)
- error (_("only -1 is allowed to set as unlimited"));
+ if (allowed == TRIBOOL_UNKNOWN)
+ {
+ if (val > UINT_MAX || val < INT_MIN
+ || (var_type == var_uinteger && val < 0)
+ || (var_type == var_integer && val > INT_MAX)
+ || (var_type == var_pinteger && val < 0)
+ || (var_type == var_pinteger && val > INT_MAX))
+ allowed = TRIBOOL_FALSE;
+ }
+ if (allowed == TRIBOOL_FALSE)
+ error (_("integer %s out of range"), plongest (val));
+ }
return val;
}
@@ -405,41 +425,18 @@ do_set_command (const char *arg, int from_tty, struct cmd_list_element *c)
option_changed = c->var->set<enum auto_boolean> (parse_auto_binary_operation (arg));
break;
case var_uinteger:
- case var_zuinteger:
option_changed
- = c->var->set<unsigned int> (parse_cli_var_uinteger (c->var->type (),
- &arg, true));
+ = c->var->set<unsigned int> (parse_cli_var_integer (c->var->type (),
+ c->var->
+ extra_literals (),
+ &arg, true));
break;
case var_integer:
- case var_zinteger:
- {
- LONGEST val;
-
- if (*arg == '\0')
- {
- if (c->var->type () == var_integer)
- error_no_arg (_("integer to set it to, or \"unlimited\""));
- else
- error_no_arg (_("integer to set it to"));
- }
-
- if (c->var->type () == var_integer && is_unlimited_literal (&arg, true))
- val = 0;
- else
- val = parse_and_eval_long (arg);
-
- if (val == 0 && c->var->type () == var_integer)
- val = INT_MAX;
- else if (val < INT_MIN
- /* For var_integer, don't let the user set the value
- to INT_MAX directly, as that exposes an
- implementation detail to the user interface. */
- || (c->var->type () == var_integer && val >= INT_MAX)
- || (c->var->type () == var_zinteger && val > INT_MAX))
- error (_("integer %s out of range"), plongest (val));
-
- option_changed = c->var->set<int> (val);
- }
+ case var_pinteger:
+ option_changed
+ = c->var->set<int> (parse_cli_var_integer (c->var->type (),
+ c->var->extra_literals (),
+ &arg, true));
break;
case var_enum:
{
@@ -454,10 +451,6 @@ do_set_command (const char *arg, int from_tty, struct cmd_list_element *c)
option_changed = c->var->set<const char *> (match);
}
break;
- case var_zuinteger_unlimited:
- option_changed = c->var->set<int>
- (parse_cli_var_zuinteger_unlimited (&arg, true));
- break;
default:
error (_("gdb internal error: bad var_type in do_setshow_command"));
}
@@ -551,7 +544,6 @@ do_set_command (const char *arg, int from_tty, struct cmd_list_element *c)
}
break;
case var_uinteger:
- case var_zuinteger:
{
char s[64];
@@ -560,8 +552,7 @@ do_set_command (const char *arg, int from_tty, struct cmd_list_element *c)
}
break;
case var_integer:
- case var_zinteger:
- case var_zuinteger_unlimited:
+ case var_pinteger:
{
char s[64];
@@ -623,36 +614,32 @@ get_setshow_command_value_string (const setting &var)
}
break;
case var_uinteger:
- case var_zuinteger:
- {
- const unsigned int value = var.get<unsigned int> ();
-
- if (var.type () == var_uinteger
- && value == UINT_MAX)
- stb.puts ("unlimited");
- else
- stb.printf ("%u", value);
- }
- break;
case var_integer:
- case var_zinteger:
- {
- const int value = var.get<int> ();
-
- if (var.type () == var_integer
- && value == INT_MAX)
- stb.puts ("unlimited");
- else
- stb.printf ("%d", value);
- }
- break;
- case var_zuinteger_unlimited:
+ case var_pinteger:
{
- const int value = var.get<int> ();
- if (value == -1)
- stb.puts ("unlimited");
- else
- stb.printf ("%d", value);
+ bool printed = false;
+ const LONGEST value
+ = (var.type () == var_uinteger
+ ? static_cast<LONGEST> (var.get<unsigned int> ())
+ : static_cast<LONGEST> (var.get<int> ()));
+
+ if (var.extra_literals () != nullptr)
+ for (const literal_def *l = var.extra_literals ();
+ l->literal != nullptr;
+ l++)
+ if (value == l->use)
+ {
+ stb.puts (l->literal);
+ printed = true;
+ break;
+ }
+ if (!printed)
+ {
+ if (var.type () == var_uinteger)
+ stb.printf ("%u", static_cast<unsigned int> (value));
+ else
+ stb.printf ("%d", static_cast<int> (value));
+ }
}
break;
default: