1 /* Handle set and show GDB commands.
3 Copyright (C) 2000-2015 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"
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)
57 if (strncmp (arg
, "on", length
) == 0
58 || strncmp (arg
, "1", length
) == 0
59 || strncmp (arg
, "yes", length
) == 0
60 || strncmp (arg
, "enable", length
) == 0)
61 return AUTO_BOOLEAN_TRUE
;
62 else if (strncmp (arg
, "off", length
) == 0
63 || strncmp (arg
, "0", length
) == 0
64 || strncmp (arg
, "no", length
) == 0
65 || strncmp (arg
, "disable", length
) == 0)
66 return AUTO_BOOLEAN_FALSE
;
67 else if (strncmp (arg
, "auto", length
) == 0
68 || (strncmp (arg
, "-1", length
) == 0 && length
> 1))
69 return AUTO_BOOLEAN_AUTO
;
71 error (_("\"on\", \"off\" or \"auto\" expected."));
72 return AUTO_BOOLEAN_AUTO
; /* Pacify GCC. */
75 /* See cli-setshow.h. */
78 parse_cli_boolean_value (const char *arg
)
85 length
= strlen (arg
);
87 while (arg
[length
- 1] == ' ' || arg
[length
- 1] == '\t')
90 if (strncmp (arg
, "on", length
) == 0
91 || strncmp (arg
, "1", length
) == 0
92 || strncmp (arg
, "yes", length
) == 0
93 || strncmp (arg
, "enable", length
) == 0)
95 else if (strncmp (arg
, "off", length
) == 0
96 || strncmp (arg
, "0", length
) == 0
97 || strncmp (arg
, "no", length
) == 0
98 || strncmp (arg
, "disable", length
) == 0)
105 deprecated_show_value_hack (struct ui_file
*ignore_file
,
107 struct cmd_list_element
*c
,
110 /* If there's no command or value, don't try to print it out. */
111 if (c
== NULL
|| value
== NULL
)
113 /* Print doc minus "show" at start. */
114 print_doc_line (gdb_stdout
, c
->doc
+ 5);
118 case var_string_noescape
:
119 case var_optional_filename
:
122 printf_filtered ((" is \"%s\".\n"), value
);
125 printf_filtered ((" is %s.\n"), value
);
130 /* Returns true if ARG is "unlimited". */
133 is_unlimited_literal (const char *arg
)
135 size_t len
= sizeof ("unlimited") - 1;
137 arg
= skip_spaces_const (arg
);
139 return (strncmp (arg
, "unlimited", len
) == 0
140 && (isspace (arg
[len
]) || arg
[len
] == '\0'));
144 /* Do a "set" command. ARG is NULL if no argument, or the
145 text of the argument, and FROM_TTY is nonzero if this command is
146 being entered directly by the user (i.e. these are just like any
147 other command). C is the command list element for the command. */
150 do_set_command (const char *arg
, int from_tty
, struct cmd_list_element
*c
)
152 /* A flag to indicate the option is changed or not. */
153 int option_changed
= 0;
155 gdb_assert (c
->type
== set_cmd
);
168 newobj
= (char *) xmalloc (strlen (arg
) + 2);
171 while ((ch
= *p
++) != '\000')
175 /* \ at end of argument is used after spaces
176 so they won't be lost. */
177 /* This is obsolete now that we no longer strip
178 trailing whitespace and actually, the backslash
179 didn't get here in my test, readline or
180 something did something funky with a backslash
181 right before a newline. */
184 ch
= parse_escape (get_current_arch (), &p
);
194 if (*(p
- 1) != '\\')
198 newobj
= (char *) xrealloc (newobj
, q
- newobj
);
200 if (*(char **) c
->var
== NULL
201 || strcmp (*(char **) c
->var
, newobj
) != 0)
203 xfree (*(char **) c
->var
);
204 *(char **) c
->var
= newobj
;
212 case var_string_noescape
:
216 if (*(char **) c
->var
== NULL
|| strcmp (*(char **) c
->var
, arg
) != 0)
218 xfree (*(char **) c
->var
);
219 *(char **) c
->var
= xstrdup (arg
);
226 error_no_arg (_("filename to set it to."));
228 case var_optional_filename
:
234 /* Clear trailing whitespace of filename. */
235 const char *ptr
= arg
+ strlen (arg
) - 1;
238 while (ptr
>= arg
&& (*ptr
== ' ' || *ptr
== '\t'))
240 copy
= xstrndup (arg
, ptr
+ 1 - arg
);
242 val
= tilde_expand (copy
);
248 if (*(char **) c
->var
== NULL
249 || strcmp (*(char **) c
->var
, val
) != 0)
251 xfree (*(char **) c
->var
);
252 *(char **) c
->var
= val
;
262 int val
= parse_cli_boolean_value (arg
);
265 error (_("\"on\" or \"off\" expected."));
266 if (val
!= *(int *) c
->var
)
268 *(int *) c
->var
= val
;
274 case var_auto_boolean
:
276 enum auto_boolean val
= parse_auto_binary_operation (arg
);
278 if (*(enum auto_boolean
*) c
->var
!= val
)
280 *(enum auto_boolean
*) c
->var
= val
;
293 if (c
->var_type
== var_uinteger
)
294 error_no_arg (_("integer to set it to, or \"unlimited\"."));
296 error_no_arg (_("integer to set it to."));
299 if (c
->var_type
== var_uinteger
&& is_unlimited_literal (arg
))
302 val
= parse_and_eval_long (arg
);
304 if (c
->var_type
== var_uinteger
&& val
== 0)
307 /* For var_uinteger, don't let the user set the value
308 to UINT_MAX directly, as that exposes an
309 implementation detail to the user interface. */
310 || (c
->var_type
== var_uinteger
&& val
>= UINT_MAX
)
311 || (c
->var_type
== var_zuinteger
&& val
> UINT_MAX
))
312 error (_("integer %s out of range"), plongest (val
));
314 if (*(unsigned int *) c
->var
!= val
)
316 *(unsigned int *) c
->var
= val
;
329 if (c
->var_type
== var_integer
)
330 error_no_arg (_("integer to set it to, or \"unlimited\"."));
332 error_no_arg (_("integer to set it to."));
335 if (c
->var_type
== var_integer
&& is_unlimited_literal (arg
))
338 val
= parse_and_eval_long (arg
);
340 if (val
== 0 && c
->var_type
== var_integer
)
342 else if (val
< INT_MIN
343 /* For var_integer, don't let the user set the value
344 to INT_MAX directly, as that exposes an
345 implementation detail to the user interface. */
346 || (c
->var_type
== var_integer
&& val
>= INT_MAX
)
347 || (c
->var_type
== var_zinteger
&& val
> INT_MAX
))
348 error (_("integer %s out of range"), plongest (val
));
350 if (*(int *) c
->var
!= val
)
352 *(int *) c
->var
= val
;
363 const char *match
= NULL
;
366 /* If no argument was supplied, print an informative error
373 for (i
= 0; c
->enums
[i
]; i
++)
374 msg_len
+= strlen (c
->enums
[i
]) + 2;
376 msg
= xmalloc (msg_len
);
378 make_cleanup (xfree
, msg
);
380 for (i
= 0; c
->enums
[i
]; i
++)
384 strcat (msg
, c
->enums
[i
]);
386 error (_("Requires an argument. Valid arguments are %s."),
390 p
= strchr (arg
, ' ');
398 for (i
= 0; c
->enums
[i
]; i
++)
399 if (strncmp (arg
, c
->enums
[i
], len
) == 0)
401 if (c
->enums
[i
][len
] == '\0')
405 break; /* Exact match. */
415 error (_("Undefined item: \"%s\"."), arg
);
418 error (_("Ambiguous item \"%s\"."), arg
);
420 if (*(const char **) c
->var
!= match
)
422 *(const char **) c
->var
= match
;
428 case var_zuinteger_unlimited
:
433 error_no_arg (_("integer to set it to, or \"unlimited\"."));
435 if (is_unlimited_literal (arg
))
438 val
= parse_and_eval_long (arg
);
441 error (_("integer %s out of range"), plongest (val
));
443 error (_("only -1 is allowed to set as unlimited"));
445 if (*(int *) c
->var
!= val
)
447 *(int *) c
->var
= val
;
453 error (_("gdb internal error: bad var_type in do_setshow_command"));
455 c
->func (c
, NULL
, from_tty
);
457 if (notify_command_param_changed_p (option_changed
, c
))
460 struct cmd_list_element
**cmds
;
461 struct cmd_list_element
*p
;
465 /* Compute the whole multi-word command options. If user types command
466 'set foo bar baz on', c->name is 'baz', and GDB can't pass "bar" to
467 command option change notification, because it is confusing. We can
468 trace back through field 'prefix' to compute the whole options,
469 and pass "foo bar baz" to notification. */
471 for (i
= 0, p
= c
; p
!= NULL
; i
++)
473 length
+= strlen (p
->name
);
478 cp
= name
= xmalloc (length
);
479 cmds
= xmalloc (sizeof (struct cmd_list_element
*) * i
);
481 /* Track back through filed 'prefix' and cache them in CMDS. */
482 for (i
= 0, p
= c
; p
!= NULL
; i
++)
488 /* Don't trigger any observer notification if prefixlist is not
491 if (cmds
[i
]->prefixlist
!= &setlist
)
498 /* Traverse them in the reversed order, and copy their names into
500 for (i
--; i
>= 0; i
--)
502 memcpy (cp
, cmds
[i
]->name
, strlen (cmds
[i
]->name
));
503 cp
+= strlen (cmds
[i
]->name
);
518 case var_string_noescape
:
520 case var_optional_filename
:
522 observer_notify_command_param_changed (name
, *(char **) c
->var
);
526 char *opt
= *(int *) c
->var
? "on" : "off";
528 observer_notify_command_param_changed (name
, opt
);
531 case var_auto_boolean
:
533 const char *s
= auto_boolean_enums
[*(enum auto_boolean
*) c
->var
];
535 observer_notify_command_param_changed (name
, s
);
543 xsnprintf (s
, sizeof s
, "%u", *(unsigned int *) c
->var
);
544 observer_notify_command_param_changed (name
, s
);
549 case var_zuinteger_unlimited
:
553 xsnprintf (s
, sizeof s
, "%d", *(int *) c
->var
);
554 observer_notify_command_param_changed (name
, s
);
562 /* Do a "show" command. ARG is NULL if no argument, or the
563 text of the argument, and FROM_TTY is nonzero if this command is
564 being entered directly by the user (i.e. these are just like any
565 other command). C is the command list element for the command. */
568 do_show_command (const char *arg
, int from_tty
, struct cmd_list_element
*c
)
570 struct ui_out
*uiout
= current_uiout
;
571 struct cleanup
*old_chain
;
574 gdb_assert (c
->type
== show_cmd
);
576 stb
= mem_fileopen ();
577 old_chain
= make_cleanup_ui_file_delete (stb
);
579 /* Possibly call the pre hook. */
580 if (c
->pre_show_hook
)
581 (c
->pre_show_hook
) (c
);
586 if (*(char **) c
->var
)
587 fputstr_filtered (*(char **) c
->var
, '"', stb
);
589 case var_string_noescape
:
590 case var_optional_filename
:
593 if (*(char **) c
->var
)
594 fputs_filtered (*(char **) c
->var
, stb
);
597 fputs_filtered (*(int *) c
->var
? "on" : "off", stb
);
599 case var_auto_boolean
:
600 switch (*(enum auto_boolean
*) c
->var
)
602 case AUTO_BOOLEAN_TRUE
:
603 fputs_filtered ("on", stb
);
605 case AUTO_BOOLEAN_FALSE
:
606 fputs_filtered ("off", stb
);
608 case AUTO_BOOLEAN_AUTO
:
609 fputs_filtered ("auto", stb
);
612 internal_error (__FILE__
, __LINE__
,
613 _("do_show_command: "
614 "invalid var_auto_boolean"));
620 if (c
->var_type
== var_uinteger
621 && *(unsigned int *) c
->var
== UINT_MAX
)
622 fputs_filtered ("unlimited", stb
);
624 fprintf_filtered (stb
, "%u", *(unsigned int *) c
->var
);
628 if (c
->var_type
== var_integer
629 && *(int *) c
->var
== INT_MAX
)
630 fputs_filtered ("unlimited", stb
);
632 fprintf_filtered (stb
, "%d", *(int *) c
->var
);
634 case var_zuinteger_unlimited
:
636 if (*(int *) c
->var
== -1)
637 fputs_filtered ("unlimited", stb
);
639 fprintf_filtered (stb
, "%d", *(int *) c
->var
);
643 error (_("gdb internal error: bad var_type in do_show_command"));
647 /* FIXME: cagney/2005-02-10: Need to split this in half: code to
648 convert the value into a string (esentially the above); and
649 code to print the value out. For the latter there should be
650 MI and CLI specific versions. */
652 if (ui_out_is_mi_like_p (uiout
))
653 ui_out_field_stream (uiout
, "value", stb
);
656 char *value
= ui_file_xstrdup (stb
, NULL
);
658 make_cleanup (xfree
, value
);
659 if (c
->show_value_func
!= NULL
)
660 c
->show_value_func (gdb_stdout
, from_tty
, c
, value
);
662 deprecated_show_value_hack (gdb_stdout
, from_tty
, c
, value
);
664 do_cleanups (old_chain
);
666 c
->func (c
, NULL
, from_tty
);
669 /* Show all the settings in a list of show commands. */
672 cmd_show_list (struct cmd_list_element
*list
, int from_tty
, const char *prefix
)
674 struct cleanup
*showlist_chain
;
675 struct ui_out
*uiout
= current_uiout
;
677 showlist_chain
= make_cleanup_ui_out_tuple_begin_end (uiout
, "showlist");
678 for (; list
!= NULL
; list
= list
->next
)
680 /* If we find a prefix, run its list, prefixing our output by its
681 prefix (with "show " skipped). */
682 if (list
->prefixlist
&& !list
->abbrev_flag
)
684 struct cleanup
*optionlist_chain
685 = make_cleanup_ui_out_tuple_begin_end (uiout
, "optionlist");
686 char *new_prefix
= strstr (list
->prefixname
, "show ") + 5;
688 if (ui_out_is_mi_like_p (uiout
))
689 ui_out_field_string (uiout
, "prefix", new_prefix
);
690 cmd_show_list (*list
->prefixlist
, from_tty
, new_prefix
);
691 /* Close the tuple. */
692 do_cleanups (optionlist_chain
);
696 if (list
->theclass
!= no_set_class
)
698 struct cleanup
*option_chain
699 = make_cleanup_ui_out_tuple_begin_end (uiout
, "option");
701 ui_out_text (uiout
, prefix
);
702 ui_out_field_string (uiout
, "name", list
->name
);
703 ui_out_text (uiout
, ": ");
704 if (list
->type
== show_cmd
)
705 do_show_command ((char *) NULL
, from_tty
, list
);
707 cmd_func (list
, NULL
, from_tty
);
708 /* Close the tuple. */
709 do_cleanups (option_chain
);
713 /* Close the tuple. */
714 do_cleanups (showlist_chain
);
This page took 0.044855 seconds and 4 git commands to generate.