1 /* Handle set and show GDB commands.
3 Copyright (C) 2000-2019 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. */
134 print_doc_line (gdb_stdout
, c
->doc
+ 5);
138 case var_string_noescape
:
139 case var_optional_filename
:
142 printf_filtered ((" is \"%s\".\n"), value
);
145 printf_filtered ((" is %s.\n"), value
);
150 /* Returns true if ARG is "unlimited". */
153 is_unlimited_literal (const char **arg
, bool expression
)
155 *arg
= skip_spaces (*arg
);
157 const char *unl_start
= *arg
;
159 const char *p
= skip_to_space (*arg
);
161 size_t len
= p
- *arg
;
163 if (len
> 0 && strncmp ("unlimited", *arg
, len
) == 0)
167 /* If parsing an expression (i.e., parsing for a "set" command),
168 anything after "unlimited" is junk. For options, anything
169 after "unlimited" might be a command argument or another
173 const char *after
= skip_spaces (*arg
);
175 error (_("Junk after \"%.*s\": %s"),
176 (int) len
, unl_start
, after
);
185 /* See cli-setshow.h. */
188 parse_cli_var_uinteger (var_types var_type
, const char **arg
,
193 if (*arg
== nullptr || **arg
== '\0')
195 if (var_type
== var_uinteger
)
196 error_no_arg (_("integer to set it to, or \"unlimited\"."));
198 error_no_arg (_("integer to set it to."));
201 if (var_type
== var_uinteger
&& is_unlimited_literal (arg
, expression
))
204 val
= parse_and_eval_long (*arg
);
206 val
= get_ulongest (arg
);
208 if (var_type
== var_uinteger
&& val
== 0)
211 /* For var_uinteger, don't let the user set the value
212 to UINT_MAX directly, as that exposes an
213 implementation detail to the user interface. */
214 || (var_type
== var_uinteger
&& val
>= UINT_MAX
)
215 || (var_type
== var_zuinteger
&& val
> UINT_MAX
))
216 error (_("integer %s out of range"), plongest (val
));
221 /* See cli-setshow.h. */
224 parse_cli_var_zuinteger_unlimited (const char **arg
, bool expression
)
228 if (*arg
== nullptr || **arg
== '\0')
229 error_no_arg (_("integer to set it to, or \"unlimited\"."));
231 if (is_unlimited_literal (arg
, expression
))
234 val
= parse_and_eval_long (*arg
);
236 val
= get_ulongest (arg
);
239 error (_("integer %s out of range"), plongest (val
));
241 error (_("only -1 is allowed to set as unlimited"));
246 /* See cli-setshow.h. */
249 parse_cli_var_enum (const char **args
, const char *const *enums
)
251 /* If no argument was supplied, print an informative error
253 if (args
== NULL
|| *args
== NULL
|| **args
== '\0')
257 for (size_t i
= 0; enums
[i
]; i
++)
263 error (_("Requires an argument. Valid arguments are %s."),
267 const char *p
= skip_to_space (*args
);
268 size_t len
= p
- *args
;
271 const char *match
= NULL
;
272 for (size_t i
= 0; enums
[i
]; i
++)
273 if (strncmp (*args
, enums
[i
], len
) == 0)
275 if (enums
[i
][len
] == '\0')
279 break; /* Exact match. */
289 error (_("Undefined item: \"%.*s\"."), (int) len
, *args
);
292 error (_("Ambiguous item \"%.*s\"."), (int) len
, *args
);
298 /* Do a "set" command. ARG is NULL if no argument, or the
299 text of the argument, and FROM_TTY is nonzero if this command is
300 being entered directly by the user (i.e. these are just like any
301 other command). C is the command list element for the command. */
304 do_set_command (const char *arg
, int from_tty
, struct cmd_list_element
*c
)
306 /* A flag to indicate the option is changed or not. */
307 int option_changed
= 0;
309 gdb_assert (c
->type
== set_cmd
);
323 newobj
= (char *) xmalloc (strlen (arg
) + 2);
326 while ((ch
= *p
++) != '\000')
330 /* \ at end of argument is used after spaces
331 so they won't be lost. */
332 /* This is obsolete now that we no longer strip
333 trailing whitespace and actually, the backslash
334 didn't get here in my test, readline or
335 something did something funky with a backslash
336 right before a newline. */
339 ch
= parse_escape (get_current_arch (), &p
);
349 if (*(p
- 1) != '\\')
353 newobj
= (char *) xrealloc (newobj
, q
- newobj
);
355 if (*(char **) c
->var
== NULL
356 || strcmp (*(char **) c
->var
, newobj
) != 0)
358 xfree (*(char **) c
->var
);
359 *(char **) c
->var
= newobj
;
367 case var_string_noescape
:
368 if (*(char **) c
->var
== NULL
|| strcmp (*(char **) c
->var
, arg
) != 0)
370 xfree (*(char **) c
->var
);
371 *(char **) c
->var
= xstrdup (arg
);
378 error_no_arg (_("filename to set it to."));
380 case var_optional_filename
:
386 /* Clear trailing whitespace of filename. */
387 const char *ptr
= arg
+ strlen (arg
) - 1;
390 while (ptr
>= arg
&& (*ptr
== ' ' || *ptr
== '\t'))
392 copy
= xstrndup (arg
, ptr
+ 1 - arg
);
394 val
= tilde_expand (copy
);
400 if (*(char **) c
->var
== NULL
401 || strcmp (*(char **) c
->var
, val
) != 0)
403 xfree (*(char **) c
->var
);
404 *(char **) c
->var
= val
;
414 int val
= parse_cli_boolean_value (arg
);
417 error (_("\"on\" or \"off\" expected."));
418 if (val
!= *(int *) c
->var
)
420 *(int *) c
->var
= val
;
426 case var_auto_boolean
:
428 enum auto_boolean val
= parse_auto_binary_operation (arg
);
430 if (*(enum auto_boolean
*) c
->var
!= val
)
432 *(enum auto_boolean
*) c
->var
= val
;
441 unsigned int val
= parse_cli_var_uinteger (c
->var_type
, &arg
, true);
443 if (*(unsigned int *) c
->var
!= val
)
445 *(unsigned int *) c
->var
= val
;
458 if (c
->var_type
== var_integer
)
459 error_no_arg (_("integer to set it to, or \"unlimited\"."));
461 error_no_arg (_("integer to set it to."));
464 if (c
->var_type
== var_integer
&& is_unlimited_literal (&arg
, true))
467 val
= parse_and_eval_long (arg
);
469 if (val
== 0 && c
->var_type
== var_integer
)
471 else if (val
< INT_MIN
472 /* For var_integer, don't let the user set the value
473 to INT_MAX directly, as that exposes an
474 implementation detail to the user interface. */
475 || (c
->var_type
== var_integer
&& val
>= INT_MAX
)
476 || (c
->var_type
== var_zinteger
&& val
> INT_MAX
))
477 error (_("integer %s out of range"), plongest (val
));
479 if (*(int *) c
->var
!= val
)
481 *(int *) c
->var
= val
;
489 const char *end_arg
= arg
;
490 const char *match
= parse_cli_var_enum (&end_arg
, c
->enums
);
492 int len
= end_arg
- arg
;
493 const char *after
= skip_spaces (end_arg
);
495 error (_("Junk after item \"%.*s\": %s"), len
, arg
, after
);
497 if (*(const char **) c
->var
!= match
)
499 *(const char **) c
->var
= match
;
505 case var_zuinteger_unlimited
:
507 int val
= parse_cli_var_zuinteger_unlimited (&arg
, true);
509 if (*(int *) c
->var
!= val
)
511 *(int *) c
->var
= val
;
517 error (_("gdb internal error: bad var_type in do_setshow_command"));
519 c
->func (c
, NULL
, from_tty
);
521 if (notify_command_param_changed_p (option_changed
, c
))
524 struct cmd_list_element
**cmds
;
525 struct cmd_list_element
*p
;
529 /* Compute the whole multi-word command options. If user types command
530 'set foo bar baz on', c->name is 'baz', and GDB can't pass "bar" to
531 command option change notification, because it is confusing. We can
532 trace back through field 'prefix' to compute the whole options,
533 and pass "foo bar baz" to notification. */
535 for (i
= 0, p
= c
; p
!= NULL
; i
++)
537 length
+= strlen (p
->name
);
542 cp
= name
= (char *) xmalloc (length
);
543 cmds
= XNEWVEC (struct cmd_list_element
*, i
);
545 /* Track back through filed 'prefix' and cache them in CMDS. */
546 for (i
= 0, p
= c
; p
!= NULL
; i
++)
552 /* Don't trigger any observer notification if prefixlist is not
555 if (cmds
[i
]->prefixlist
!= &setlist
)
562 /* Traverse them in the reversed order, and copy their names into
564 for (i
--; i
>= 0; i
--)
566 memcpy (cp
, cmds
[i
]->name
, strlen (cmds
[i
]->name
));
567 cp
+= strlen (cmds
[i
]->name
);
582 case var_string_noescape
:
584 case var_optional_filename
:
586 gdb::observers::command_param_changed
.notify (name
, *(char **) c
->var
);
590 const char *opt
= *(int *) c
->var
? "on" : "off";
592 gdb::observers::command_param_changed
.notify (name
, opt
);
595 case var_auto_boolean
:
597 const char *s
= auto_boolean_enums
[*(enum auto_boolean
*) c
->var
];
599 gdb::observers::command_param_changed
.notify (name
, s
);
607 xsnprintf (s
, sizeof s
, "%u", *(unsigned int *) c
->var
);
608 gdb::observers::command_param_changed
.notify (name
, s
);
613 case var_zuinteger_unlimited
:
617 xsnprintf (s
, sizeof s
, "%d", *(int *) c
->var
);
618 gdb::observers::command_param_changed
.notify (name
, s
);
626 /* See cli/cli-setshow.h. */
629 get_setshow_command_value_string (cmd_list_element
*c
)
636 if (*(char **) c
->var
)
637 stb
.putstr (*(char **) c
->var
, '"');
639 case var_string_noescape
:
640 case var_optional_filename
:
643 if (*(char **) c
->var
)
644 stb
.puts (*(char **) c
->var
);
647 stb
.puts (*(int *) c
->var
? "on" : "off");
649 case var_auto_boolean
:
650 switch (*(enum auto_boolean
*) c
->var
)
652 case AUTO_BOOLEAN_TRUE
:
655 case AUTO_BOOLEAN_FALSE
:
658 case AUTO_BOOLEAN_AUTO
:
662 gdb_assert_not_reached ("invalid var_auto_boolean");
668 if (c
->var_type
== var_uinteger
669 && *(unsigned int *) c
->var
== UINT_MAX
)
670 stb
.puts ("unlimited");
672 stb
.printf ("%u", *(unsigned int *) c
->var
);
676 if (c
->var_type
== var_integer
677 && *(int *) c
->var
== INT_MAX
)
678 stb
.puts ("unlimited");
680 stb
.printf ("%d", *(int *) c
->var
);
682 case var_zuinteger_unlimited
:
684 if (*(int *) c
->var
== -1)
685 stb
.puts ("unlimited");
687 stb
.printf ("%d", *(int *) c
->var
);
691 gdb_assert_not_reached ("bad var_type");
694 return std::move (stb
.string ());
698 /* Do a "show" command. ARG is NULL if no argument, or the
699 text of the argument, and FROM_TTY is nonzero if this command is
700 being entered directly by the user (i.e. these are just like any
701 other command). C is the command list element for the command. */
704 do_show_command (const char *arg
, int from_tty
, struct cmd_list_element
*c
)
706 struct ui_out
*uiout
= current_uiout
;
708 gdb_assert (c
->type
== show_cmd
);
710 /* Possibly call the pre hook. */
711 if (c
->pre_show_hook
)
712 (c
->pre_show_hook
) (c
);
714 std::string val
= get_setshow_command_value_string (c
);
716 /* FIXME: cagney/2005-02-10: There should be MI and CLI specific
717 versions of code to print the value out. */
719 if (uiout
->is_mi_like_p ())
720 uiout
->field_string ("value", val
.c_str ());
723 if (c
->show_value_func
!= NULL
)
724 c
->show_value_func (gdb_stdout
, from_tty
, c
, val
.c_str ());
726 deprecated_show_value_hack (gdb_stdout
, from_tty
, c
, val
.c_str ());
729 c
->func (c
, NULL
, from_tty
);
732 /* Show all the settings in a list of show commands. */
735 cmd_show_list (struct cmd_list_element
*list
, int from_tty
, const char *prefix
)
737 struct ui_out
*uiout
= current_uiout
;
739 ui_out_emit_tuple
tuple_emitter (uiout
, "showlist");
740 for (; list
!= NULL
; list
= list
->next
)
742 /* If we find a prefix, run its list, prefixing our output by its
743 prefix (with "show " skipped). */
744 if (list
->prefixlist
&& !list
->abbrev_flag
)
746 ui_out_emit_tuple
optionlist_emitter (uiout
, "optionlist");
747 const char *new_prefix
= strstr (list
->prefixname
, "show ") + 5;
749 if (uiout
->is_mi_like_p ())
750 uiout
->field_string ("prefix", new_prefix
);
751 cmd_show_list (*list
->prefixlist
, from_tty
, new_prefix
);
755 if (list
->theclass
!= no_set_class
)
757 ui_out_emit_tuple
option_emitter (uiout
, "option");
759 uiout
->text (prefix
);
760 uiout
->field_string ("name", list
->name
);
762 if (list
->type
== show_cmd
)
763 do_show_command (NULL
, from_tty
, list
);
765 cmd_func (list
, NULL
, from_tty
);
This page took 0.056647 seconds and 4 git commands to generate.