1 /* Handle set and show GDB commands.
3 Copyright (c) 2000, 2001, 2002, 2003, 2007, 2008, 2009, 2010
4 Free Software Foundation, Inc.
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program. If not, see <http://www.gnu.org/licenses/>. */
20 #include "readline/tilde.h"
23 #include "gdb_string.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
);
42 while (isspace (arg
[length
- 1]) && length
> 0)
44 if (strncmp (arg
, "on", length
) == 0
45 || strncmp (arg
, "1", length
) == 0
46 || strncmp (arg
, "yes", length
) == 0
47 || strncmp (arg
, "enable", length
) == 0)
48 return AUTO_BOOLEAN_TRUE
;
49 else if (strncmp (arg
, "off", length
) == 0
50 || strncmp (arg
, "0", length
) == 0
51 || strncmp (arg
, "no", length
) == 0
52 || strncmp (arg
, "disable", length
) == 0)
53 return AUTO_BOOLEAN_FALSE
;
54 else if (strncmp (arg
, "auto", length
) == 0
55 || (strncmp (arg
, "-1", length
) == 0 && length
> 1))
56 return AUTO_BOOLEAN_AUTO
;
58 error (_("\"on\", \"off\" or \"auto\" expected."));
59 return AUTO_BOOLEAN_AUTO
; /* pacify GCC */
63 parse_binary_operation (char *arg
)
70 length
= strlen (arg
);
72 while (arg
[length
- 1] == ' ' || arg
[length
- 1] == '\t')
75 if (strncmp (arg
, "on", length
) == 0
76 || strncmp (arg
, "1", length
) == 0
77 || strncmp (arg
, "yes", length
) == 0
78 || strncmp (arg
, "enable", length
) == 0)
80 else if (strncmp (arg
, "off", length
) == 0
81 || strncmp (arg
, "0", length
) == 0
82 || strncmp (arg
, "no", length
) == 0
83 || strncmp (arg
, "disable", length
) == 0)
87 error (_("\"on\" or \"off\" expected."));
93 deprecated_show_value_hack (struct ui_file
*ignore_file
,
95 struct cmd_list_element
*c
,
98 /* If there's no command or value, don't try to print it out. */
99 if (c
== NULL
|| value
== NULL
)
101 /* Print doc minus "show" at start. */
102 print_doc_line (gdb_stdout
, c
->doc
+ 5);
106 case var_string_noescape
:
107 case var_optional_filename
:
110 printf_filtered ((" is \"%s\".\n"), value
);
113 printf_filtered ((" is %s.\n"), value
);
118 /* Do a "set" or "show" command. ARG is NULL if no argument, or the text
119 of the argument, and FROM_TTY is nonzero if this command is being entered
120 directly by the user (i.e. these are just like any other
121 command). C is the command list element for the command. */
124 do_setshow_command (char *arg
, int from_tty
, struct cmd_list_element
*c
)
126 if (c
->type
== set_cmd
)
139 new = (char *) xmalloc (strlen (arg
) + 2);
142 while ((ch
= *p
++) != '\000')
146 /* \ at end of argument is used after spaces
147 so they won't be lost. */
148 /* This is obsolete now that we no longer strip
149 trailing whitespace and actually, the backslash
150 didn't get here in my test, readline or
151 something did something funky with a backslash
152 right before a newline. */
155 ch
= parse_escape (&p
);
165 if (*(p
- 1) != '\\')
169 new = (char *) xrealloc (new, q
- new);
170 if (*(char **) c
->var
!= NULL
)
171 xfree (*(char **) c
->var
);
172 *(char **) c
->var
= new;
175 case var_string_noescape
:
178 if (*(char **) c
->var
!= NULL
)
179 xfree (*(char **) c
->var
);
180 *(char **) c
->var
= xstrdup (arg
);
182 case var_optional_filename
:
185 if (*(char **) c
->var
!= NULL
)
186 xfree (*(char **) c
->var
);
187 *(char **) c
->var
= xstrdup (arg
);
191 error_no_arg (_("filename to set it to."));
192 if (*(char **) c
->var
!= NULL
)
193 xfree (*(char **) c
->var
);
195 /* Clear trailing whitespace of filename. */
196 char *ptr
= arg
+ strlen (arg
) - 1;
197 while (ptr
>= arg
&& (*ptr
== ' ' || *ptr
== '\t'))
201 *(char **) c
->var
= tilde_expand (arg
);
204 *(int *) c
->var
= parse_binary_operation (arg
);
206 case var_auto_boolean
:
207 *(enum auto_boolean
*) c
->var
= parse_auto_binary_operation (arg
);
211 error_no_arg (_("integer to set it to."));
212 *(unsigned int *) c
->var
= parse_and_eval_long (arg
);
213 if (*(unsigned int *) c
->var
== 0)
214 *(unsigned int *) c
->var
= UINT_MAX
;
220 error_no_arg (_("integer to set it to."));
221 val
= parse_and_eval_long (arg
);
223 *(int *) c
->var
= INT_MAX
;
224 else if (val
>= INT_MAX
)
225 error (_("integer %u out of range"), val
);
227 *(int *) c
->var
= val
;
232 error_no_arg (_("integer to set it to."));
233 *(int *) c
->var
= parse_and_eval_long (arg
);
237 error_no_arg (_("integer to set it to."));
238 *(unsigned int *) c
->var
= parse_and_eval_long (arg
);
245 const char *match
= NULL
;
248 /* if no argument was supplied, print an informative error message */
253 for (i
= 0; c
->enums
[i
]; i
++)
254 msg_len
+= strlen (c
->enums
[i
]) + 2;
256 msg
= xmalloc (msg_len
);
258 make_cleanup (xfree
, msg
);
260 for (i
= 0; c
->enums
[i
]; i
++)
264 strcat (msg
, c
->enums
[i
]);
266 error (_("Requires an argument. Valid arguments are %s."), msg
);
269 p
= strchr (arg
, ' ');
277 for (i
= 0; c
->enums
[i
]; i
++)
278 if (strncmp (arg
, c
->enums
[i
], len
) == 0)
280 if (c
->enums
[i
][len
] == '\0')
284 break; /* exact match. */
294 error (_("Undefined item: \"%s\"."), arg
);
297 error (_("Ambiguous item \"%s\"."), arg
);
299 *(const char **) c
->var
= match
;
303 error (_("gdb internal error: bad var_type in do_setshow_command"));
306 else if (c
->type
== show_cmd
)
308 struct cleanup
*old_chain
;
309 struct ui_stream
*stb
;
311 stb
= ui_out_stream_new (uiout
);
312 old_chain
= make_cleanup_ui_out_stream_delete (stb
);
314 /* Possibly call the pre hook. */
315 if (c
->pre_show_hook
)
316 (c
->pre_show_hook
) (c
);
321 if (*(char **) c
->var
)
322 fputstr_filtered (*(char **) c
->var
, '"', stb
->stream
);
324 case var_string_noescape
:
325 case var_optional_filename
:
328 if (*(char **) c
->var
)
329 fputs_filtered (*(char **) c
->var
, stb
->stream
);
332 fputs_filtered (*(int *) c
->var
? "on" : "off", stb
->stream
);
334 case var_auto_boolean
:
335 switch (*(enum auto_boolean
*) c
->var
)
337 case AUTO_BOOLEAN_TRUE
:
338 fputs_filtered ("on", stb
->stream
);
340 case AUTO_BOOLEAN_FALSE
:
341 fputs_filtered ("off", stb
->stream
);
343 case AUTO_BOOLEAN_AUTO
:
344 fputs_filtered ("auto", stb
->stream
);
347 internal_error (__FILE__
, __LINE__
,
348 _("do_setshow_command: invalid var_auto_boolean"));
353 if (*(unsigned int *) c
->var
== UINT_MAX
)
355 fputs_filtered ("unlimited", stb
->stream
);
358 /* else fall through */
361 fprintf_filtered (stb
->stream
, "%u", *(unsigned int *) c
->var
);
364 if (*(int *) c
->var
== INT_MAX
)
366 fputs_filtered ("unlimited", stb
->stream
);
369 fprintf_filtered (stb
->stream
, "%d", *(int *) c
->var
);
373 error (_("gdb internal error: bad var_type in do_setshow_command"));
377 /* FIXME: cagney/2005-02-10: Need to split this in half: code to
378 convert the value into a string (esentially the above); and
379 code to print the value out. For the latter there should be
380 MI and CLI specific versions. */
382 if (ui_out_is_mi_like_p (uiout
))
383 ui_out_field_stream (uiout
, "value", stb
);
386 char *value
= ui_file_xstrdup (stb
->stream
, NULL
);
387 make_cleanup (xfree
, value
);
388 if (c
->show_value_func
!= NULL
)
389 c
->show_value_func (gdb_stdout
, from_tty
, c
, value
);
391 deprecated_show_value_hack (gdb_stdout
, from_tty
, c
, value
);
393 do_cleanups (old_chain
);
396 error (_("gdb internal error: bad cmd_type in do_setshow_command"));
397 c
->func (c
, NULL
, from_tty
);
398 if (c
->type
== set_cmd
&& deprecated_set_hook
)
399 deprecated_set_hook (c
);
402 /* Show all the settings in a list of show commands. */
405 cmd_show_list (struct cmd_list_element
*list
, int from_tty
, char *prefix
)
407 struct cleanup
*showlist_chain
;
409 showlist_chain
= make_cleanup_ui_out_tuple_begin_end (uiout
, "showlist");
410 for (; list
!= NULL
; list
= list
->next
)
412 /* If we find a prefix, run its list, prefixing our output by its
413 prefix (with "show " skipped). */
414 if (list
->prefixlist
&& !list
->abbrev_flag
)
416 struct cleanup
*optionlist_chain
417 = make_cleanup_ui_out_tuple_begin_end (uiout
, "optionlist");
418 char *new_prefix
= strstr (list
->prefixname
, "show ") + 5;
419 if (ui_out_is_mi_like_p (uiout
))
420 ui_out_field_string (uiout
, "prefix", new_prefix
);
421 cmd_show_list (*list
->prefixlist
, from_tty
, new_prefix
);
422 /* Close the tuple. */
423 do_cleanups (optionlist_chain
);
427 struct cleanup
*option_chain
428 = make_cleanup_ui_out_tuple_begin_end (uiout
, "option");
429 ui_out_text (uiout
, prefix
);
430 ui_out_field_string (uiout
, "name", list
->name
);
431 ui_out_text (uiout
, ": ");
432 if (list
->type
== show_cmd
)
433 do_setshow_command ((char *) NULL
, from_tty
, list
);
435 cmd_func (list
, NULL
, from_tty
);
436 /* Close the tuple. */
437 do_cleanups (option_chain
);
440 /* Close the tuple. */
441 do_cleanups (showlist_chain
);