1 /* Handle set and show GDB commands.
3 Copyright (C) 2000-2013 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 "gdb_string.h"
23 #include "arch-utils.h"
28 #include "cli/cli-decode.h"
29 #include "cli/cli-cmds.h"
30 #include "cli/cli-setshow.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->class == class_maintenance || c->class == class_deprecated
41 || c->class == 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 (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 /* Do a "set" command. ARG is NULL if no argument, or the
131 text of the argument, and FROM_TTY is nonzero if this command is
132 being entered directly by the user (i.e. these are just like any
133 other command). C is the command list element for the command. */
136 do_set_command (char *arg, int from_tty, struct cmd_list_element *c)
138 /* A flag to indicate the option is changed or not. */
139 int option_changed = 0;
141 gdb_assert (c->type == set_cmd);
154 new = (char *) xmalloc (strlen (arg) + 2);
157 while ((ch = *p++) != '\000')
161 /* \ at end of argument is used after spaces
162 so they won't be lost. */
163 /* This is obsolete now that we no longer strip
164 trailing whitespace and actually, the backslash
165 didn't get here in my test, readline or
166 something did something funky with a backslash
167 right before a newline. */
170 ch = parse_escape (get_current_arch (), &p);
180 if (*(p - 1) != '\\')
184 new = (char *) xrealloc (new, q - new);
186 if (*(char **) c->var == NULL
187 || strcmp (*(char **) c->var, new) != 0)
189 xfree (*(char **) c->var);
190 *(char **) c->var = new;
198 case var_string_noescape:
202 if (*(char **) c->var == NULL || strcmp (*(char **) c->var, arg) != 0)
204 xfree (*(char **) c->var);
205 *(char **) c->var = xstrdup (arg);
212 error_no_arg (_("filename to set it to."));
214 case var_optional_filename:
220 /* Clear trailing whitespace of filename. */
221 char *ptr = arg + strlen (arg) - 1;
223 while (ptr >= arg && (*ptr == ' ' || *ptr == '\t'))
227 val = tilde_expand (arg);
232 if (*(char **) c->var == NULL
233 || strcmp (*(char **) c->var, val) != 0)
235 xfree (*(char **) c->var);
236 *(char **) c->var = val;
246 int val = parse_cli_boolean_value (arg);
249 error (_("\"on\" or \"off\" expected."));
250 if (val != *(int *) c->var)
252 *(int *) c->var = val;
258 case var_auto_boolean:
260 enum auto_boolean val = parse_auto_binary_operation (arg);
262 if (*(enum auto_boolean *) c->var != val)
264 *(enum auto_boolean *) c->var = val;
276 error_no_arg (_("integer to set it to."));
277 val = parse_and_eval_long (arg);
279 if (c->var_type == var_uinteger && val == 0)
281 /* For var_uinteger, don't let the user set the value to
282 UINT_MAX directly, as that exposes an implementation detail
283 to the user interface. */
284 else if ((c->var_type == var_uinteger && val >= UINT_MAX)
285 || (c->var_type == var_zuinteger && val > UINT_MAX))
286 error (_("integer %s out of range"), plongest (val));
288 if (*(unsigned int *) c->var != val)
290 *(unsigned int *) c->var = val;
302 error_no_arg (_("integer to set it to."));
303 val = parse_and_eval_long (arg);
305 if (val == 0 && c->var_type == var_integer)
307 /* For var_integer, don't let the user set the value to
308 INT_MAX directly, as that exposes an implementation detail
309 to the user interface. */
310 else if ((c->var_type == var_integer && val >= INT_MAX)
311 || (c->var_type == var_zinteger && val > INT_MAX)
313 error (_("integer %s out of range"), plongest (val));
315 if (*(int *) c->var != val)
317 *(int *) c->var = val;
328 const char *match = NULL;
331 /* If no argument was supplied, print an informative error
338 for (i = 0; c->enums[i]; i++)
339 msg_len += strlen (c->enums[i]) + 2;
341 msg = xmalloc (msg_len);
343 make_cleanup (xfree, msg);
345 for (i = 0; c->enums[i]; i++)
349 strcat (msg, c->enums[i]);
351 error (_("Requires an argument. Valid arguments are %s."),
355 p = strchr (arg, ' ');
363 for (i = 0; c->enums[i]; i++)
364 if (strncmp (arg, c->enums[i], len) == 0)
366 if (c->enums[i][len] == '\0')
370 break; /* Exact match. */
380 error (_("Undefined item: \"%s\"."), arg);
383 error (_("Ambiguous item \"%s\"."), arg);
385 if (*(const char **) c->var != match)
387 *(const char **) c->var = match;
393 case var_zuinteger_unlimited:
398 error_no_arg (_("integer to set it to."));
399 val = parse_and_eval_long (arg);
402 error (_("integer %s out of range"), plongest (val));
404 error (_("only -1 is allowed to set as unlimited"));
406 if (*(int *) c->var != val)
408 *(int *) c->var = val;
414 error (_("gdb internal error: bad var_type in do_setshow_command"));
416 c->func (c, NULL, from_tty);
417 if (deprecated_set_hook)
418 deprecated_set_hook (c);
420 if (notify_command_param_changed_p (option_changed, c))
423 struct cmd_list_element **cmds;
424 struct cmd_list_element *p;
428 /* Compute the whole multi-word command options. If user types command
429 'set foo bar baz on', c->name is 'baz', and GDB can't pass "bar" to
430 command option change notification, because it is confusing. We can
431 trace back through field 'prefix' to compute the whole options,
432 and pass "foo bar baz" to notification. */
434 for (i = 0, p = c; p != NULL; i++)
436 length += strlen (p->name);
441 cp = name = xmalloc (length);
442 cmds = xmalloc (sizeof (struct cmd_list_element *) * i);
444 /* Track back through filed 'prefix' and cache them in CMDS. */
445 for (i = 0, p = c; p != NULL; i++)
451 /* Don't trigger any observer notification if prefixlist is not
454 if (cmds[i]->prefixlist != &setlist)
461 /* Traverse them in the reversed order, and copy their names into
463 for (i--; i >= 0; i--)
465 memcpy (cp, cmds[i]->name, strlen (cmds[i]->name));
466 cp += strlen (cmds[i]->name);
481 case var_string_noescape:
483 case var_optional_filename:
485 observer_notify_command_param_changed (name, *(char **) c->var);
489 char *opt = *(int *) c->var ? "on" : "off";
491 observer_notify_command_param_changed (name, opt);
494 case var_auto_boolean:
496 const char *s = auto_boolean_enums[*(enum auto_boolean *) c->var];
498 observer_notify_command_param_changed (name, s);
506 xsnprintf (s, sizeof s, "%u", *(unsigned int *) c->var);
507 observer_notify_command_param_changed (name, s);
512 case var_zuinteger_unlimited:
516 xsnprintf (s, sizeof s, "%d", *(int *) c->var);
517 observer_notify_command_param_changed (name, s);
525 /* Do a "show" command. ARG is NULL if no argument, or the
526 text of the argument, and FROM_TTY is nonzero if this command is
527 being entered directly by the user (i.e. these are just like any
528 other command). C is the command list element for the command. */
531 do_show_command (char *arg, int from_tty, struct cmd_list_element *c)
533 struct ui_out *uiout = current_uiout;
534 struct cleanup *old_chain;
537 gdb_assert (c->type == show_cmd);
539 stb = mem_fileopen ();
540 old_chain = make_cleanup_ui_file_delete (stb);
542 /* Possibly call the pre hook. */
543 if (c->pre_show_hook)
544 (c->pre_show_hook) (c);
549 if (*(char **) c->var)
550 fputstr_filtered (*(char **) c->var, '"', stb);
552 case var_string_noescape:
553 case var_optional_filename:
556 if (*(char **) c->var)
557 fputs_filtered (*(char **) c->var, stb);
560 fputs_filtered (*(int *) c->var ? "on" : "off", stb);
562 case var_auto_boolean:
563 switch (*(enum auto_boolean*) c->var)
565 case AUTO_BOOLEAN_TRUE:
566 fputs_filtered ("on", stb);
568 case AUTO_BOOLEAN_FALSE:
569 fputs_filtered ("off", stb);
571 case AUTO_BOOLEAN_AUTO:
572 fputs_filtered ("auto", stb);
575 internal_error (__FILE__, __LINE__,
576 _("do_show_command: "
577 "invalid var_auto_boolean"));
583 if (c->var_type == var_uinteger
584 && *(unsigned int *) c->var == UINT_MAX)
585 fputs_filtered ("unlimited", stb);
587 fprintf_filtered (stb, "%u", *(unsigned int *) c->var);
591 if (c->var_type == var_integer
592 && *(int *) c->var == INT_MAX)
593 fputs_filtered ("unlimited", stb);
595 fprintf_filtered (stb, "%d", *(int *) c->var);
597 case var_zuinteger_unlimited:
599 if (*(int *) c->var == -1)
600 fputs_filtered ("unlimited", stb);
602 fprintf_filtered (stb, "%d", *(int *) c->var);
606 error (_("gdb internal error: bad var_type in do_show_command"));
610 /* FIXME: cagney/2005-02-10: Need to split this in half: code to
611 convert the value into a string (esentially the above); and
612 code to print the value out. For the latter there should be
613 MI and CLI specific versions. */
615 if (ui_out_is_mi_like_p (uiout))
616 ui_out_field_stream (uiout, "value", stb);
619 char *value = ui_file_xstrdup (stb, NULL);
621 make_cleanup (xfree, value);
622 if (c->show_value_func != NULL)
623 c->show_value_func (gdb_stdout, from_tty, c, value);
625 deprecated_show_value_hack (gdb_stdout, from_tty, c, value);
627 do_cleanups (old_chain);
629 c->func (c, NULL, from_tty);
632 /* Show all the settings in a list of show commands. */
635 cmd_show_list (struct cmd_list_element *list, int from_tty, char *prefix)
637 struct cleanup *showlist_chain;
638 struct ui_out *uiout = current_uiout;
640 showlist_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "showlist");
641 for (; list != NULL; list = list->next)
643 /* If we find a prefix, run its list, prefixing our output by its
644 prefix (with "show " skipped). */
645 if (list->prefixlist && !list->abbrev_flag)
647 struct cleanup *optionlist_chain
648 = make_cleanup_ui_out_tuple_begin_end (uiout, "optionlist");
649 char *new_prefix = strstr (list->prefixname, "show ") + 5;
651 if (ui_out_is_mi_like_p (uiout))
652 ui_out_field_string (uiout, "prefix", new_prefix);
653 cmd_show_list (*list->prefixlist, from_tty, new_prefix);
654 /* Close the tuple. */
655 do_cleanups (optionlist_chain);
659 if (list->class != no_set_class)
661 struct cleanup *option_chain
662 = make_cleanup_ui_out_tuple_begin_end (uiout, "option");
664 ui_out_text (uiout, prefix);
665 ui_out_field_string (uiout, "name", list->name);
666 ui_out_text (uiout, ": ");
667 if (list->type == show_cmd)
668 do_show_command ((char *) NULL, from_tty, list);
670 cmd_func (list, NULL, from_tty);
671 /* Close the tuple. */
672 do_cleanups (option_chain);
676 /* Close the tuple. */
677 do_cleanups (showlist_chain);