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 if (*(char **) c
->var
!= NULL
)
174 xfree (*(char **) c
->var
);
175 *(char **) c
->var
= new;
178 case var_string_noescape
:
181 if (*(char **) c
->var
!= NULL
)
182 xfree (*(char **) c
->var
);
183 *(char **) c
->var
= xstrdup (arg
);
185 case var_optional_filename
:
188 if (*(char **) c
->var
!= NULL
)
189 xfree (*(char **) c
->var
);
190 *(char **) c
->var
= xstrdup (arg
);
194 error_no_arg (_("filename to set it to."));
195 if (*(char **) c
->var
!= NULL
)
196 xfree (*(char **) c
->var
);
198 /* Clear trailing whitespace of filename. */
199 char *ptr
= arg
+ strlen (arg
) - 1;
201 while (ptr
>= arg
&& (*ptr
== ' ' || *ptr
== '\t'))
205 *(char **) c
->var
= tilde_expand (arg
);
208 *(int *) c
->var
= parse_binary_operation (arg
);
210 case var_auto_boolean
:
211 *(enum auto_boolean
*) c
->var
= parse_auto_binary_operation (arg
);
215 error_no_arg (_("integer to set it to."));
216 *(unsigned int *) c
->var
= parse_and_eval_long (arg
);
217 if (*(unsigned int *) c
->var
== 0)
218 *(unsigned int *) c
->var
= UINT_MAX
;
225 error_no_arg (_("integer to set it to."));
226 val
= parse_and_eval_long (arg
);
228 *(int *) c
->var
= INT_MAX
;
229 else if (val
>= INT_MAX
)
230 error (_("integer %u out of range"), val
);
232 *(int *) c
->var
= val
;
237 error_no_arg (_("integer to set it to."));
238 *(int *) c
->var
= parse_and_eval_long (arg
);
242 error_no_arg (_("integer to set it to."));
243 *(unsigned int *) c
->var
= parse_and_eval_long (arg
);
250 const char *match
= NULL
;
253 /* If no argument was supplied, print an informative error
260 for (i
= 0; c
->enums
[i
]; i
++)
261 msg_len
+= strlen (c
->enums
[i
]) + 2;
263 msg
= xmalloc (msg_len
);
265 make_cleanup (xfree
, msg
);
267 for (i
= 0; c
->enums
[i
]; i
++)
271 strcat (msg
, c
->enums
[i
]);
273 error (_("Requires an argument. Valid arguments are %s."),
277 p
= strchr (arg
, ' ');
285 for (i
= 0; c
->enums
[i
]; i
++)
286 if (strncmp (arg
, c
->enums
[i
], len
) == 0)
288 if (c
->enums
[i
][len
] == '\0')
292 break; /* Exact match. */
302 error (_("Undefined item: \"%s\"."), arg
);
305 error (_("Ambiguous item \"%s\"."), arg
);
307 *(const char **) c
->var
= match
;
311 error (_("gdb internal error: bad var_type in do_setshow_command"));
314 else if (c
->type
== show_cmd
)
316 struct cleanup
*old_chain
;
319 stb
= mem_fileopen ();
320 old_chain
= make_cleanup_ui_file_delete (stb
);
322 /* Possibly call the pre hook. */
323 if (c
->pre_show_hook
)
324 (c
->pre_show_hook
) (c
);
329 if (*(char **) c
->var
)
330 fputstr_filtered (*(char **) c
->var
, '"', stb
);
332 case var_string_noescape
:
333 case var_optional_filename
:
336 if (*(char **) c
->var
)
337 fputs_filtered (*(char **) c
->var
, stb
);
340 fputs_filtered (*(int *) c
->var
? "on" : "off", stb
);
342 case var_auto_boolean
:
343 switch (*(enum auto_boolean
*) c
->var
)
345 case AUTO_BOOLEAN_TRUE
:
346 fputs_filtered ("on", stb
);
348 case AUTO_BOOLEAN_FALSE
:
349 fputs_filtered ("off", stb
);
351 case AUTO_BOOLEAN_AUTO
:
352 fputs_filtered ("auto", stb
);
355 internal_error (__FILE__
, __LINE__
,
356 _("do_setshow_command: "
357 "invalid var_auto_boolean"));
363 if (c
->var_type
== var_uinteger
364 && *(unsigned int *) c
->var
== UINT_MAX
)
365 fputs_filtered ("unlimited", stb
);
367 fprintf_filtered (stb
, "%u", *(unsigned int *) c
->var
);
371 if (c
->var_type
== var_integer
372 && *(int *) c
->var
== INT_MAX
)
373 fputs_filtered ("unlimited", stb
);
375 fprintf_filtered (stb
, "%d", *(int *) c
->var
);
379 error (_("gdb internal error: bad var_type in do_setshow_command"));
383 /* FIXME: cagney/2005-02-10: Need to split this in half: code to
384 convert the value into a string (esentially the above); and
385 code to print the value out. For the latter there should be
386 MI and CLI specific versions. */
388 if (ui_out_is_mi_like_p (uiout
))
389 ui_out_field_stream (uiout
, "value", stb
);
392 char *value
= ui_file_xstrdup (stb
, NULL
);
394 make_cleanup (xfree
, value
);
395 if (c
->show_value_func
!= NULL
)
396 c
->show_value_func (gdb_stdout
, from_tty
, c
, value
);
398 deprecated_show_value_hack (gdb_stdout
, from_tty
, c
, value
);
400 do_cleanups (old_chain
);
403 error (_("gdb internal error: bad cmd_type in do_setshow_command"));
404 c
->func (c
, NULL
, from_tty
);
405 if (c
->type
== set_cmd
&& deprecated_set_hook
)
406 deprecated_set_hook (c
);
409 /* Show all the settings in a list of show commands. */
412 cmd_show_list (struct cmd_list_element
*list
, int from_tty
, char *prefix
)
414 struct cleanup
*showlist_chain
;
415 struct ui_out
*uiout
= current_uiout
;
417 showlist_chain
= make_cleanup_ui_out_tuple_begin_end (uiout
, "showlist");
418 for (; list
!= NULL
; list
= list
->next
)
420 /* If we find a prefix, run its list, prefixing our output by its
421 prefix (with "show " skipped). */
422 if (list
->prefixlist
&& !list
->abbrev_flag
)
424 struct cleanup
*optionlist_chain
425 = make_cleanup_ui_out_tuple_begin_end (uiout
, "optionlist");
426 char *new_prefix
= strstr (list
->prefixname
, "show ") + 5;
428 if (ui_out_is_mi_like_p (uiout
))
429 ui_out_field_string (uiout
, "prefix", new_prefix
);
430 cmd_show_list (*list
->prefixlist
, from_tty
, new_prefix
);
431 /* Close the tuple. */
432 do_cleanups (optionlist_chain
);
436 if (list
->class != no_set_class
)
438 struct cleanup
*option_chain
439 = make_cleanup_ui_out_tuple_begin_end (uiout
, "option");
441 ui_out_text (uiout
, prefix
);
442 ui_out_field_string (uiout
, "name", list
->name
);
443 ui_out_text (uiout
, ": ");
444 if (list
->type
== show_cmd
)
445 do_setshow_command ((char *) NULL
, from_tty
, list
);
447 cmd_func (list
, NULL
, from_tty
);
448 /* Close the tuple. */
449 do_cleanups (option_chain
);
453 /* Close the tuple. */
454 do_cleanups (showlist_chain
);
This page took 0.044328 seconds and 4 git commands to generate.