1 /* Handle set and show GDB commands.
3 Copyright (c) 2000-2003, 2007-2012 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"
27 #include "cli/cli-decode.h"
28 #include "cli/cli-cmds.h"
29 #include "cli/cli-setshow.h"
31 /* Prototypes for local functions. */
33 static int parse_binary_operation (char *);
36 static enum auto_boolean
37 parse_auto_binary_operation (const char *arg)
39 if (arg != NULL && *arg != '\0')
41 int length = strlen (arg);
43 while (isspace (arg[length - 1]) && length > 0)
45 if (strncmp (arg, "on", length) == 0
46 || strncmp (arg, "1", length) == 0
47 || strncmp (arg, "yes", length) == 0
48 || strncmp (arg, "enable", length) == 0)
49 return AUTO_BOOLEAN_TRUE;
50 else if (strncmp (arg, "off", length) == 0
51 || strncmp (arg, "0", length) == 0
52 || strncmp (arg, "no", length) == 0
53 || strncmp (arg, "disable", length) == 0)
54 return AUTO_BOOLEAN_FALSE;
55 else if (strncmp (arg, "auto", length) == 0
56 || (strncmp (arg, "-1", length) == 0 && length > 1))
57 return AUTO_BOOLEAN_AUTO;
59 error (_("\"on\", \"off\" or \"auto\" expected."));
60 return AUTO_BOOLEAN_AUTO; /* Pacify GCC. */
64 parse_binary_operation (char *arg)
71 length = strlen (arg);
73 while (arg[length - 1] == ' ' || arg[length - 1] == '\t')
76 if (strncmp (arg, "on", length) == 0
77 || strncmp (arg, "1", length) == 0
78 || strncmp (arg, "yes", length) == 0
79 || strncmp (arg, "enable", length) == 0)
81 else if (strncmp (arg, "off", length) == 0
82 || strncmp (arg, "0", length) == 0
83 || strncmp (arg, "no", length) == 0
84 || strncmp (arg, "disable", length) == 0)
88 error (_("\"on\" or \"off\" expected."));
94 deprecated_show_value_hack (struct ui_file *ignore_file,
96 struct cmd_list_element *c,
99 /* If there's no command or value, don't try to print it out. */
100 if (c == NULL || value == NULL)
102 /* Print doc minus "show" at start. */
103 print_doc_line (gdb_stdout, c->doc + 5);
107 case var_string_noescape:
108 case var_optional_filename:
111 printf_filtered ((" is \"%s\".\n"), value);
114 printf_filtered ((" is %s.\n"), value);
119 /* Do a "set" or "show" command. ARG is NULL if no argument, or the
120 text of the argument, and FROM_TTY is nonzero if this command is
121 being entered directly by the user (i.e. these are just like any
122 other command). C is the command list element for the command. */
125 do_setshow_command (char *arg, int from_tty, struct cmd_list_element *c)
127 struct ui_out *uiout = current_uiout;
129 if (c->type == set_cmd)
142 new = (char *) xmalloc (strlen (arg) + 2);
145 while ((ch = *p++) != '\000')
149 /* \ at end of argument is used after spaces
150 so they won't be lost. */
151 /* This is obsolete now that we no longer strip
152 trailing whitespace and actually, the backslash
153 didn't get here in my test, readline or
154 something did something funky with a backslash
155 right before a newline. */
158 ch = parse_escape (get_current_arch (), &p);
168 if (*(p - 1) != '\\')
172 new = (char *) xrealloc (new, q - new);
173 xfree (*(char **) c->var);
174 *(char **) c->var = new;
177 case var_string_noescape:
180 xfree (*(char **) c->var);
181 *(char **) c->var = xstrdup (arg);
185 error_no_arg (_("filename to set it to."));
187 case var_optional_filename:
188 xfree (*(char **) c->var);
192 /* Clear trailing whitespace of filename. */
193 char *ptr = arg + strlen (arg) - 1;
195 while (ptr >= arg && (*ptr == ' ' || *ptr == '\t'))
199 *(char **) c->var = tilde_expand (arg);
202 *(char **) c->var = xstrdup ("");
205 *(int *) c->var = parse_binary_operation (arg);
207 case var_auto_boolean:
208 *(enum auto_boolean *) c->var = parse_auto_binary_operation (arg);
212 error_no_arg (_("integer to set it to."));
213 *(unsigned int *) c->var = parse_and_eval_long (arg);
214 if (*(unsigned int *) c->var == 0)
215 *(unsigned int *) c->var = UINT_MAX;
222 error_no_arg (_("integer to set it to."));
223 val = parse_and_eval_long (arg);
225 *(int *) c->var = INT_MAX;
226 else if (val >= INT_MAX)
227 error (_("integer %u out of range"), val);
229 *(int *) c->var = val;
234 error_no_arg (_("integer to set it to."));
235 *(int *) c->var = parse_and_eval_long (arg);
239 error_no_arg (_("integer to set it to."));
240 *(unsigned int *) c->var = parse_and_eval_long (arg);
247 const char *match = NULL;
250 /* If no argument was supplied, print an informative error
257 for (i = 0; c->enums[i]; i++)
258 msg_len += strlen (c->enums[i]) + 2;
260 msg = xmalloc (msg_len);
262 make_cleanup (xfree, msg);
264 for (i = 0; c->enums[i]; i++)
268 strcat (msg, c->enums[i]);
270 error (_("Requires an argument. Valid arguments are %s."),
274 p = strchr (arg, ' ');
282 for (i = 0; c->enums[i]; i++)
283 if (strncmp (arg, c->enums[i], len) == 0)
285 if (c->enums[i][len] == '\0')
289 break; /* Exact match. */
299 error (_("Undefined item: \"%s\"."), arg);
302 error (_("Ambiguous item \"%s\"."), arg);
304 *(const char **) c->var = match;
308 error (_("gdb internal error: bad var_type in do_setshow_command"));
311 else if (c->type == show_cmd)
313 struct cleanup *old_chain;
316 stb = mem_fileopen ();
317 old_chain = make_cleanup_ui_file_delete (stb);
319 /* Possibly call the pre hook. */
320 if (c->pre_show_hook)
321 (c->pre_show_hook) (c);
326 if (*(char **) c->var)
327 fputstr_filtered (*(char **) c->var, '"', stb);
329 case var_string_noescape:
330 case var_optional_filename:
333 if (*(char **) c->var)
334 fputs_filtered (*(char **) c->var, stb);
337 fputs_filtered (*(int *) c->var ? "on" : "off", stb);
339 case var_auto_boolean:
340 switch (*(enum auto_boolean*) c->var)
342 case AUTO_BOOLEAN_TRUE:
343 fputs_filtered ("on", stb);
345 case AUTO_BOOLEAN_FALSE:
346 fputs_filtered ("off", stb);
348 case AUTO_BOOLEAN_AUTO:
349 fputs_filtered ("auto", stb);
352 internal_error (__FILE__, __LINE__,
353 _("do_setshow_command: "
354 "invalid var_auto_boolean"));
360 if (c->var_type == var_uinteger
361 && *(unsigned int *) c->var == UINT_MAX)
362 fputs_filtered ("unlimited", stb);
364 fprintf_filtered (stb, "%u", *(unsigned int *) c->var);
368 if (c->var_type == var_integer
369 && *(int *) c->var == INT_MAX)
370 fputs_filtered ("unlimited", stb);
372 fprintf_filtered (stb, "%d", *(int *) c->var);
376 error (_("gdb internal error: bad var_type in do_setshow_command"));
380 /* FIXME: cagney/2005-02-10: Need to split this in half: code to
381 convert the value into a string (esentially the above); and
382 code to print the value out. For the latter there should be
383 MI and CLI specific versions. */
385 if (ui_out_is_mi_like_p (uiout))
386 ui_out_field_stream (uiout, "value", stb);
389 char *value = ui_file_xstrdup (stb, NULL);
391 make_cleanup (xfree, value);
392 if (c->show_value_func != NULL)
393 c->show_value_func (gdb_stdout, from_tty, c, value);
395 deprecated_show_value_hack (gdb_stdout, from_tty, c, value);
397 do_cleanups (old_chain);
400 error (_("gdb internal error: bad cmd_type in do_setshow_command"));
401 c->func (c, NULL, from_tty);
402 if (c->type == set_cmd && deprecated_set_hook)
403 deprecated_set_hook (c);
406 /* Show all the settings in a list of show commands. */
409 cmd_show_list (struct cmd_list_element *list, int from_tty, char *prefix)
411 struct cleanup *showlist_chain;
412 struct ui_out *uiout = current_uiout;
414 showlist_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "showlist");
415 for (; list != NULL; list = list->next)
417 /* If we find a prefix, run its list, prefixing our output by its
418 prefix (with "show " skipped). */
419 if (list->prefixlist && !list->abbrev_flag)
421 struct cleanup *optionlist_chain
422 = make_cleanup_ui_out_tuple_begin_end (uiout, "optionlist");
423 char *new_prefix = strstr (list->prefixname, "show ") + 5;
425 if (ui_out_is_mi_like_p (uiout))
426 ui_out_field_string (uiout, "prefix", new_prefix);
427 cmd_show_list (*list->prefixlist, from_tty, new_prefix);
428 /* Close the tuple. */
429 do_cleanups (optionlist_chain);
433 if (list->class != no_set_class)
435 struct cleanup *option_chain
436 = make_cleanup_ui_out_tuple_begin_end (uiout, "option");
438 ui_out_text (uiout, prefix);
439 ui_out_field_string (uiout, "name", list->name);
440 ui_out_text (uiout, ": ");
441 if (list->type == show_cmd)
442 do_setshow_command ((char *) NULL, from_tty, list);
444 cmd_func (list, NULL, from_tty);
445 /* Close the tuple. */
446 do_cleanups (option_chain);
450 /* Close the tuple. */
451 do_cleanups (showlist_chain);