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
)
155 *arg
= skip_spaces (*arg
);
157 const char *p
= skip_to_space (*arg
);
159 size_t len
= p
- *arg
;
161 if (len
> 0 && strncmp ("unlimited", *arg
, len
) == 0)
170 /* See cli-setshow.h. */
173 parse_cli_var_uinteger (var_types var_type
, const char **arg
,
180 if (var_type
== var_uinteger
)
181 error_no_arg (_("integer to set it to, or \"unlimited\"."));
183 error_no_arg (_("integer to set it to."));
186 if (var_type
== var_uinteger
&& is_unlimited_literal (arg
))
189 val
= parse_and_eval_long (*arg
);
191 val
= get_ulongest (arg
);
193 if (var_type
== var_uinteger
&& val
== 0)
196 /* For var_uinteger, don't let the user set the value
197 to UINT_MAX directly, as that exposes an
198 implementation detail to the user interface. */
199 || (var_type
== var_uinteger
&& val
>= UINT_MAX
)
200 || (var_type
== var_zuinteger
&& val
> UINT_MAX
))
201 error (_("integer %s out of range"), plongest (val
));
206 /* See cli-setshow.h. */
209 parse_cli_var_zuinteger_unlimited (const char **arg
, bool expression
)
214 error_no_arg (_("integer to set it to, or \"unlimited\"."));
216 if (is_unlimited_literal (arg
))
219 val
= parse_and_eval_long (*arg
);
221 val
= get_ulongest (arg
);
224 error (_("integer %s out of range"), plongest (val
));
226 error (_("only -1 is allowed to set as unlimited"));
231 /* See cli-setshow.h. */
234 parse_cli_var_enum (const char **args
, const char *const *enums
)
236 /* If no argument was supplied, print an informative error
238 if (args
== NULL
|| *args
== NULL
|| **args
== '\0')
242 for (size_t i
= 0; enums
[i
]; i
++)
248 error (_("Requires an argument. Valid arguments are %s."),
252 const char *p
= skip_to_space (*args
);
253 size_t len
= p
- *args
;
256 const char *match
= NULL
;
257 for (size_t i
= 0; enums
[i
]; i
++)
258 if (strncmp (*args
, enums
[i
], len
) == 0)
260 if (enums
[i
][len
] == '\0')
264 break; /* Exact match. */
274 error (_("Undefined item: \"%.*s\"."), (int) len
, *args
);
277 error (_("Ambiguous item \"%.*s\"."), (int) len
, *args
);
283 /* Do a "set" command. ARG is NULL if no argument, or the
284 text of the argument, and FROM_TTY is nonzero if this command is
285 being entered directly by the user (i.e. these are just like any
286 other command). C is the command list element for the command. */
289 do_set_command (const char *arg
, int from_tty
, struct cmd_list_element
*c
)
291 /* A flag to indicate the option is changed or not. */
292 int option_changed
= 0;
294 gdb_assert (c
->type
== set_cmd
);
307 newobj
= (char *) xmalloc (strlen (arg
) + 2);
310 while ((ch
= *p
++) != '\000')
314 /* \ at end of argument is used after spaces
315 so they won't be lost. */
316 /* This is obsolete now that we no longer strip
317 trailing whitespace and actually, the backslash
318 didn't get here in my test, readline or
319 something did something funky with a backslash
320 right before a newline. */
323 ch
= parse_escape (get_current_arch (), &p
);
333 if (*(p
- 1) != '\\')
337 newobj
= (char *) xrealloc (newobj
, q
- newobj
);
339 if (*(char **) c
->var
== NULL
340 || strcmp (*(char **) c
->var
, newobj
) != 0)
342 xfree (*(char **) c
->var
);
343 *(char **) c
->var
= newobj
;
351 case var_string_noescape
:
355 if (*(char **) c
->var
== NULL
|| strcmp (*(char **) c
->var
, arg
) != 0)
357 xfree (*(char **) c
->var
);
358 *(char **) c
->var
= xstrdup (arg
);
365 error_no_arg (_("filename to set it to."));
367 case var_optional_filename
:
373 /* Clear trailing whitespace of filename. */
374 const char *ptr
= arg
+ strlen (arg
) - 1;
377 while (ptr
>= arg
&& (*ptr
== ' ' || *ptr
== '\t'))
379 copy
= xstrndup (arg
, ptr
+ 1 - arg
);
381 val
= tilde_expand (copy
);
387 if (*(char **) c
->var
== NULL
388 || strcmp (*(char **) c
->var
, val
) != 0)
390 xfree (*(char **) c
->var
);
391 *(char **) c
->var
= val
;
401 int val
= parse_cli_boolean_value (arg
);
404 error (_("\"on\" or \"off\" expected."));
405 if (val
!= *(int *) c
->var
)
407 *(int *) c
->var
= val
;
413 case var_auto_boolean
:
415 enum auto_boolean val
= parse_auto_binary_operation (arg
);
417 if (*(enum auto_boolean
*) c
->var
!= val
)
419 *(enum auto_boolean
*) c
->var
= val
;
428 unsigned int val
= parse_cli_var_uinteger (c
->var_type
, &arg
, true);
430 if (*(unsigned int *) c
->var
!= val
)
432 *(unsigned int *) c
->var
= val
;
445 if (c
->var_type
== var_integer
)
446 error_no_arg (_("integer to set it to, or \"unlimited\"."));
448 error_no_arg (_("integer to set it to."));
451 if (c
->var_type
== var_integer
&& is_unlimited_literal (&arg
))
454 val
= parse_and_eval_long (arg
);
456 if (val
== 0 && c
->var_type
== var_integer
)
458 else if (val
< INT_MIN
459 /* For var_integer, don't let the user set the value
460 to INT_MAX directly, as that exposes an
461 implementation detail to the user interface. */
462 || (c
->var_type
== var_integer
&& val
>= INT_MAX
)
463 || (c
->var_type
== var_zinteger
&& val
> INT_MAX
))
464 error (_("integer %s out of range"), plongest (val
));
466 if (*(int *) c
->var
!= val
)
468 *(int *) c
->var
= val
;
476 const char *end_arg
= arg
;
477 const char *match
= parse_cli_var_enum (&end_arg
, c
->enums
);
479 int len
= end_arg
- arg
;
480 const char *after
= skip_spaces (end_arg
);
482 error (_("Junk after item \"%.*s\": %s"), len
, arg
, after
);
484 if (*(const char **) c
->var
!= match
)
486 *(const char **) c
->var
= match
;
492 case var_zuinteger_unlimited
:
494 int val
= parse_cli_var_zuinteger_unlimited (&arg
, true);
496 if (*(int *) c
->var
!= val
)
498 *(int *) c
->var
= val
;
504 error (_("gdb internal error: bad var_type in do_setshow_command"));
506 c
->func (c
, NULL
, from_tty
);
508 if (notify_command_param_changed_p (option_changed
, c
))
511 struct cmd_list_element
**cmds
;
512 struct cmd_list_element
*p
;
516 /* Compute the whole multi-word command options. If user types command
517 'set foo bar baz on', c->name is 'baz', and GDB can't pass "bar" to
518 command option change notification, because it is confusing. We can
519 trace back through field 'prefix' to compute the whole options,
520 and pass "foo bar baz" to notification. */
522 for (i
= 0, p
= c
; p
!= NULL
; i
++)
524 length
+= strlen (p
->name
);
529 cp
= name
= (char *) xmalloc (length
);
530 cmds
= XNEWVEC (struct cmd_list_element
*, i
);
532 /* Track back through filed 'prefix' and cache them in CMDS. */
533 for (i
= 0, p
= c
; p
!= NULL
; i
++)
539 /* Don't trigger any observer notification if prefixlist is not
542 if (cmds
[i
]->prefixlist
!= &setlist
)
549 /* Traverse them in the reversed order, and copy their names into
551 for (i
--; i
>= 0; i
--)
553 memcpy (cp
, cmds
[i
]->name
, strlen (cmds
[i
]->name
));
554 cp
+= strlen (cmds
[i
]->name
);
569 case var_string_noescape
:
571 case var_optional_filename
:
573 gdb::observers::command_param_changed
.notify (name
, *(char **) c
->var
);
577 const char *opt
= *(int *) c
->var
? "on" : "off";
579 gdb::observers::command_param_changed
.notify (name
, opt
);
582 case var_auto_boolean
:
584 const char *s
= auto_boolean_enums
[*(enum auto_boolean
*) c
->var
];
586 gdb::observers::command_param_changed
.notify (name
, s
);
594 xsnprintf (s
, sizeof s
, "%u", *(unsigned int *) c
->var
);
595 gdb::observers::command_param_changed
.notify (name
, s
);
600 case var_zuinteger_unlimited
:
604 xsnprintf (s
, sizeof s
, "%d", *(int *) c
->var
);
605 gdb::observers::command_param_changed
.notify (name
, s
);
613 /* Do a "show" command. ARG is NULL if no argument, or the
614 text of the argument, and FROM_TTY is nonzero if this command is
615 being entered directly by the user (i.e. these are just like any
616 other command). C is the command list element for the command. */
619 do_show_command (const char *arg
, int from_tty
, struct cmd_list_element
*c
)
621 struct ui_out
*uiout
= current_uiout
;
623 gdb_assert (c
->type
== show_cmd
);
627 /* Possibly call the pre hook. */
628 if (c
->pre_show_hook
)
629 (c
->pre_show_hook
) (c
);
634 if (*(char **) c
->var
)
635 stb
.putstr (*(char **) c
->var
, '"');
637 case var_string_noescape
:
638 case var_optional_filename
:
641 if (*(char **) c
->var
)
642 stb
.puts (*(char **) c
->var
);
645 stb
.puts (*(int *) c
->var
? "on" : "off");
647 case var_auto_boolean
:
648 switch (*(enum auto_boolean
*) c
->var
)
650 case AUTO_BOOLEAN_TRUE
:
653 case AUTO_BOOLEAN_FALSE
:
656 case AUTO_BOOLEAN_AUTO
:
660 internal_error (__FILE__
, __LINE__
,
661 _("do_show_command: "
662 "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 error (_("gdb internal error: bad var_type in do_show_command"));
695 /* FIXME: cagney/2005-02-10: Need to split this in half: code to
696 convert the value into a string (esentially the above); and
697 code to print the value out. For the latter there should be
698 MI and CLI specific versions. */
700 if (uiout
->is_mi_like_p ())
701 uiout
->field_stream ("value", stb
);
704 if (c
->show_value_func
!= NULL
)
705 c
->show_value_func (gdb_stdout
, from_tty
, c
, stb
.c_str ());
707 deprecated_show_value_hack (gdb_stdout
, from_tty
, c
, stb
.c_str ());
710 c
->func (c
, NULL
, from_tty
);
713 /* Show all the settings in a list of show commands. */
716 cmd_show_list (struct cmd_list_element
*list
, int from_tty
, const char *prefix
)
718 struct ui_out
*uiout
= current_uiout
;
720 ui_out_emit_tuple
tuple_emitter (uiout
, "showlist");
721 for (; list
!= NULL
; list
= list
->next
)
723 /* If we find a prefix, run its list, prefixing our output by its
724 prefix (with "show " skipped). */
725 if (list
->prefixlist
&& !list
->abbrev_flag
)
727 ui_out_emit_tuple
optionlist_emitter (uiout
, "optionlist");
728 const char *new_prefix
= strstr (list
->prefixname
, "show ") + 5;
730 if (uiout
->is_mi_like_p ())
731 uiout
->field_string ("prefix", new_prefix
);
732 cmd_show_list (*list
->prefixlist
, from_tty
, new_prefix
);
736 if (list
->theclass
!= no_set_class
)
738 ui_out_emit_tuple
option_emitter (uiout
, "option");
740 uiout
->text (prefix
);
741 uiout
->field_string ("name", list
->name
);
743 if (list
->type
== show_cmd
)
744 do_show_command ((char *) NULL
, from_tty
, list
);
746 cmd_func (list
, NULL
, from_tty
);
This page took 0.044324 seconds and 5 git commands to generate.