1 /* Handle set and show GDB commands.
3 Copyright (C) 2000-2020 Free Software Foundation, Inc.
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 3 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>. */
19 #include "readline/tilde.h"
22 #include "arch-utils.h"
23 #include "observable.h"
27 #include "cli/cli-decode.h"
28 #include "cli/cli-cmds.h"
29 #include "cli/cli-setshow.h"
30 #include "cli/cli-utils.h"
32 /* Return true if the change of command parameter should be notified. */
35 notify_command_param_changed_p (int param_changed
, struct cmd_list_element
*c
)
37 if (param_changed
== 0)
40 if (c
->theclass
== class_maintenance
|| c
->theclass
== class_deprecated
41 || c
->theclass
== class_obscure
)
48 static enum auto_boolean
49 parse_auto_binary_operation (const char *arg
)
51 if (arg
!= NULL
&& *arg
!= '\0')
53 int length
= strlen (arg
);
55 while (isspace (arg
[length
- 1]) && length
> 0)
58 /* Note that "o" is ambiguous. */
60 if ((length
== 2 && strncmp (arg
, "on", length
) == 0)
61 || strncmp (arg
, "1", length
) == 0
62 || strncmp (arg
, "yes", length
) == 0
63 || strncmp (arg
, "enable", length
) == 0)
64 return AUTO_BOOLEAN_TRUE
;
65 else if ((length
>= 2 && strncmp (arg
, "off", length
) == 0)
66 || strncmp (arg
, "0", length
) == 0
67 || strncmp (arg
, "no", length
) == 0
68 || strncmp (arg
, "disable", length
) == 0)
69 return AUTO_BOOLEAN_FALSE
;
70 else if (strncmp (arg
, "auto", length
) == 0
71 || (length
> 1 && strncmp (arg
, "-1", length
) == 0))
72 return AUTO_BOOLEAN_AUTO
;
74 error (_("\"on\", \"off\" or \"auto\" expected."));
75 return AUTO_BOOLEAN_AUTO
; /* Pacify GCC. */
78 /* See cli-setshow.h. */
81 parse_cli_boolean_value (const char **arg
)
83 const char *p
= skip_to_space (*arg
);
84 size_t length
= p
- *arg
;
86 /* Note that "o" is ambiguous. */
88 if ((length
== 2 && strncmp (*arg
, "on", length
) == 0)
89 || strncmp (*arg
, "1", length
) == 0
90 || strncmp (*arg
, "yes", length
) == 0
91 || strncmp (*arg
, "enable", length
) == 0)
93 *arg
= skip_spaces (*arg
+ length
);
96 else if ((length
>= 2 && strncmp (*arg
, "off", length
) == 0)
97 || strncmp (*arg
, "0", length
) == 0
98 || strncmp (*arg
, "no", length
) == 0
99 || strncmp (*arg
, "disable", length
) == 0)
101 *arg
= skip_spaces (*arg
+ length
);
108 /* See cli-setshow.h. */
111 parse_cli_boolean_value (const char *arg
)
116 int b
= parse_cli_boolean_value (&arg
);
117 if (b
>= 0 && *arg
!= '\0')
125 deprecated_show_value_hack (struct ui_file
*ignore_file
,
127 struct cmd_list_element
*c
,
130 /* If there's no command or value, don't try to print it out. */
131 if (c
== NULL
|| value
== NULL
)
133 /* Print doc minus "Show " at start. Tell print_doc_line that
134 this is for a 'show value' prefix. */
135 print_doc_line (gdb_stdout
, c
->doc
+ 5, true);
139 case var_string_noescape
:
140 case var_optional_filename
:
143 printf_filtered ((" is \"%s\".\n"), value
);
146 printf_filtered ((" is %s.\n"), value
);
151 /* Returns true if ARG is "unlimited". */
154 is_unlimited_literal (const char **arg
, bool expression
)
156 *arg
= skip_spaces (*arg
);
158 const char *unl_start
= *arg
;
160 const char *p
= skip_to_space (*arg
);
162 size_t len
= p
- *arg
;
164 if (len
> 0 && strncmp ("unlimited", *arg
, len
) == 0)
168 /* If parsing an expression (i.e., parsing for a "set" command),
169 anything after "unlimited" is junk. For options, anything
170 after "unlimited" might be a command argument or another
174 const char *after
= skip_spaces (*arg
);
176 error (_("Junk after \"%.*s\": %s"),
177 (int) len
, unl_start
, after
);
186 /* See cli-setshow.h. */
189 parse_cli_var_uinteger (var_types var_type
, const char **arg
,
194 if (*arg
== nullptr || **arg
== '\0')
196 if (var_type
== var_uinteger
)
197 error_no_arg (_("integer to set it to, or \"unlimited\"."));
199 error_no_arg (_("integer to set it to."));
202 if (var_type
== var_uinteger
&& is_unlimited_literal (arg
, expression
))
205 val
= parse_and_eval_long (*arg
);
207 val
= get_ulongest (arg
);
209 if (var_type
== var_uinteger
&& val
== 0)
212 /* For var_uinteger, don't let the user set the value
213 to UINT_MAX directly, as that exposes an
214 implementation detail to the user interface. */
215 || (var_type
== var_uinteger
&& val
>= UINT_MAX
)
216 || (var_type
== var_zuinteger
&& val
> UINT_MAX
))
217 error (_("integer %s out of range"), plongest (val
));
222 /* See cli-setshow.h. */
225 parse_cli_var_zuinteger_unlimited (const char **arg
, bool expression
)
229 if (*arg
== nullptr || **arg
== '\0')
230 error_no_arg (_("integer to set it to, or \"unlimited\"."));
232 if (is_unlimited_literal (arg
, expression
))
235 val
= parse_and_eval_long (*arg
);
237 val
= get_ulongest (arg
);
240 error (_("integer %s out of range"), plongest (val
));
242 error (_("only -1 is allowed to set as unlimited"));
247 /* See cli-setshow.h. */
250 parse_cli_var_enum (const char **args
, const char *const *enums
)
252 /* If no argument was supplied, print an informative error
254 if (args
== NULL
|| *args
== NULL
|| **args
== '\0')
258 for (size_t i
= 0; enums
[i
]; i
++)
264 error (_("Requires an argument. Valid arguments are %s."),
268 const char *p
= skip_to_space (*args
);
269 size_t len
= p
- *args
;
272 const char *match
= NULL
;
273 for (size_t i
= 0; enums
[i
]; i
++)
274 if (strncmp (*args
, enums
[i
], len
) == 0)
276 if (enums
[i
][len
] == '\0')
280 break; /* Exact match. */
290 error (_("Undefined item: \"%.*s\"."), (int) len
, *args
);
293 error (_("Ambiguous item \"%.*s\"."), (int) len
, *args
);
299 /* Do a "set" command. ARG is NULL if no argument, or the
300 text of the argument, and FROM_TTY is nonzero if this command is
301 being entered directly by the user (i.e. these are just like any
302 other command). C is the command list element for the command. */
305 do_set_command (const char *arg
, int from_tty
, struct cmd_list_element
*c
)
307 /* A flag to indicate the option is changed or not. */
308 int option_changed
= 0;
310 gdb_assert (c
->type
== set_cmd
);
324 newobj
= (char *) xmalloc (strlen (arg
) + 2);
327 while ((ch
= *p
++) != '\000')
331 /* \ at end of argument is used after spaces
332 so they won't be lost. */
333 /* This is obsolete now that we no longer strip
334 trailing whitespace and actually, the backslash
335 didn't get here in my test, readline or
336 something did something funky with a backslash
337 right before a newline. */
340 ch
= parse_escape (get_current_arch (), &p
);
350 if (*(p
- 1) != '\\')
354 newobj
= (char *) xrealloc (newobj
, q
- newobj
);
356 if (*(char **) c
->var
== NULL
357 || strcmp (*(char **) c
->var
, newobj
) != 0)
359 xfree (*(char **) c
->var
);
360 *(char **) c
->var
= newobj
;
368 case var_string_noescape
:
369 if (*(char **) c
->var
== NULL
|| strcmp (*(char **) c
->var
, arg
) != 0)
371 xfree (*(char **) c
->var
);
372 *(char **) c
->var
= xstrdup (arg
);
379 error_no_arg (_("filename to set it to."));
381 case var_optional_filename
:
387 /* Clear trailing whitespace of filename. */
388 const char *ptr
= arg
+ strlen (arg
) - 1;
391 while (ptr
>= arg
&& (*ptr
== ' ' || *ptr
== '\t'))
393 copy
= xstrndup (arg
, ptr
+ 1 - arg
);
395 val
= tilde_expand (copy
);
401 if (*(char **) c
->var
== NULL
402 || strcmp (*(char **) c
->var
, val
) != 0)
404 xfree (*(char **) c
->var
);
405 *(char **) c
->var
= val
;
415 int val
= parse_cli_boolean_value (arg
);
418 error (_("\"on\" or \"off\" expected."));
419 if (val
!= *(bool *) c
->var
)
421 *(bool *) c
->var
= val
;
427 case var_auto_boolean
:
429 enum auto_boolean val
= parse_auto_binary_operation (arg
);
431 if (*(enum auto_boolean
*) c
->var
!= val
)
433 *(enum auto_boolean
*) c
->var
= val
;
442 unsigned int val
= parse_cli_var_uinteger (c
->var_type
, &arg
, true);
444 if (*(unsigned int *) c
->var
!= val
)
446 *(unsigned int *) c
->var
= val
;
459 if (c
->var_type
== var_integer
)
460 error_no_arg (_("integer to set it to, or \"unlimited\"."));
462 error_no_arg (_("integer to set it to."));
465 if (c
->var_type
== var_integer
&& is_unlimited_literal (&arg
, true))
468 val
= parse_and_eval_long (arg
);
470 if (val
== 0 && c
->var_type
== var_integer
)
472 else if (val
< INT_MIN
473 /* For var_integer, don't let the user set the value
474 to INT_MAX directly, as that exposes an
475 implementation detail to the user interface. */
476 || (c
->var_type
== var_integer
&& val
>= INT_MAX
)
477 || (c
->var_type
== var_zinteger
&& val
> INT_MAX
))
478 error (_("integer %s out of range"), plongest (val
));
480 if (*(int *) c
->var
!= val
)
482 *(int *) c
->var
= val
;
490 const char *end_arg
= arg
;
491 const char *match
= parse_cli_var_enum (&end_arg
, c
->enums
);
493 int len
= end_arg
- arg
;
494 const char *after
= skip_spaces (end_arg
);
496 error (_("Junk after item \"%.*s\": %s"), len
, arg
, after
);
498 if (*(const char **) c
->var
!= match
)
500 *(const char **) c
->var
= match
;
506 case var_zuinteger_unlimited
:
508 int val
= parse_cli_var_zuinteger_unlimited (&arg
, true);
510 if (*(int *) c
->var
!= val
)
512 *(int *) c
->var
= val
;
518 error (_("gdb internal error: bad var_type in do_setshow_command"));
520 c
->func (c
, NULL
, from_tty
);
522 if (notify_command_param_changed_p (option_changed
, c
))
525 struct cmd_list_element
**cmds
;
526 struct cmd_list_element
*p
;
530 /* Compute the whole multi-word command options. If user types command
531 'set foo bar baz on', c->name is 'baz', and GDB can't pass "bar" to
532 command option change notification, because it is confusing. We can
533 trace back through field 'prefix' to compute the whole options,
534 and pass "foo bar baz" to notification. */
536 for (i
= 0, p
= c
; p
!= NULL
; i
++)
538 length
+= strlen (p
->name
);
543 cp
= name
= (char *) xmalloc (length
);
544 cmds
= XNEWVEC (struct cmd_list_element
*, i
);
546 /* Track back through filed 'prefix' and cache them in CMDS. */
547 for (i
= 0, p
= c
; p
!= NULL
; i
++)
553 /* Don't trigger any observer notification if prefixlist is not
556 if (cmds
[i
]->prefixlist
!= &setlist
)
563 /* Traverse them in the reversed order, and copy their names into
565 for (i
--; i
>= 0; i
--)
567 memcpy (cp
, cmds
[i
]->name
, strlen (cmds
[i
]->name
));
568 cp
+= strlen (cmds
[i
]->name
);
583 case var_string_noescape
:
585 case var_optional_filename
:
587 gdb::observers::command_param_changed
.notify (name
, *(char **) c
->var
);
591 const char *opt
= *(bool *) c
->var
? "on" : "off";
593 gdb::observers::command_param_changed
.notify (name
, opt
);
596 case var_auto_boolean
:
598 const char *s
= auto_boolean_enums
[*(enum auto_boolean
*) c
->var
];
600 gdb::observers::command_param_changed
.notify (name
, s
);
608 xsnprintf (s
, sizeof s
, "%u", *(unsigned int *) c
->var
);
609 gdb::observers::command_param_changed
.notify (name
, s
);
614 case var_zuinteger_unlimited
:
618 xsnprintf (s
, sizeof s
, "%d", *(int *) c
->var
);
619 gdb::observers::command_param_changed
.notify (name
, s
);
627 /* See cli/cli-setshow.h. */
630 get_setshow_command_value_string (const cmd_list_element
*c
)
637 if (*(char **) c
->var
)
638 stb
.putstr (*(char **) c
->var
, '"');
640 case var_string_noescape
:
641 case var_optional_filename
:
644 if (*(char **) c
->var
)
645 stb
.puts (*(char **) c
->var
);
648 stb
.puts (*(bool *) c
->var
? "on" : "off");
650 case var_auto_boolean
:
651 switch (*(enum auto_boolean
*) c
->var
)
653 case AUTO_BOOLEAN_TRUE
:
656 case AUTO_BOOLEAN_FALSE
:
659 case AUTO_BOOLEAN_AUTO
:
663 gdb_assert_not_reached ("invalid var_auto_boolean");
669 if (c
->var_type
== var_uinteger
670 && *(unsigned int *) c
->var
== UINT_MAX
)
671 stb
.puts ("unlimited");
673 stb
.printf ("%u", *(unsigned int *) c
->var
);
677 if (c
->var_type
== var_integer
678 && *(int *) c
->var
== INT_MAX
)
679 stb
.puts ("unlimited");
681 stb
.printf ("%d", *(int *) c
->var
);
683 case var_zuinteger_unlimited
:
685 if (*(int *) c
->var
== -1)
686 stb
.puts ("unlimited");
688 stb
.printf ("%d", *(int *) c
->var
);
692 gdb_assert_not_reached ("bad var_type");
695 return std::move (stb
.string ());
699 /* Do a "show" command. ARG is NULL if no argument, or the
700 text of the argument, and FROM_TTY is nonzero if this command is
701 being entered directly by the user (i.e. these are just like any
702 other command). C is the command list element for the command. */
705 do_show_command (const char *arg
, int from_tty
, struct cmd_list_element
*c
)
707 struct ui_out
*uiout
= current_uiout
;
709 gdb_assert (c
->type
== show_cmd
);
711 /* Possibly call the pre hook. */
712 if (c
->pre_show_hook
)
713 (c
->pre_show_hook
) (c
);
715 std::string val
= get_setshow_command_value_string (c
);
717 /* FIXME: cagney/2005-02-10: There should be MI and CLI specific
718 versions of code to print the value out. */
720 if (uiout
->is_mi_like_p ())
721 uiout
->field_string ("value", val
.c_str ());
724 if (c
->show_value_func
!= NULL
)
725 c
->show_value_func (gdb_stdout
, from_tty
, c
, val
.c_str ());
727 deprecated_show_value_hack (gdb_stdout
, from_tty
, c
, val
.c_str ());
730 c
->func (c
, NULL
, from_tty
);
733 /* Show all the settings in a list of show commands. */
736 cmd_show_list (struct cmd_list_element
*list
, int from_tty
, const char *prefix
)
738 struct ui_out
*uiout
= current_uiout
;
740 ui_out_emit_tuple
tuple_emitter (uiout
, "showlist");
741 for (; list
!= NULL
; list
= list
->next
)
743 /* If we find a prefix, run its list, prefixing our output by its
744 prefix (with "show " skipped). */
745 if (list
->prefixlist
&& !list
->abbrev_flag
)
747 ui_out_emit_tuple
optionlist_emitter (uiout
, "optionlist");
748 const char *new_prefix
= strstr (list
->prefixname
, "show ") + 5;
750 if (uiout
->is_mi_like_p ())
751 uiout
->field_string ("prefix", new_prefix
);
752 cmd_show_list (*list
->prefixlist
, from_tty
, new_prefix
);
756 if (list
->theclass
!= no_set_class
)
758 ui_out_emit_tuple
option_emitter (uiout
, "option");
760 uiout
->text (prefix
);
761 uiout
->field_string ("name", list
->name
);
763 if (list
->type
== show_cmd
)
764 do_show_command (NULL
, from_tty
, list
);
766 cmd_func (list
, NULL
, from_tty
);