d8ec10025c1814250fbc517fa8ce9a5b7b9d3faa
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"
24 #include "arch-utils.h"
28 #include "cli/cli-decode.h"
29 #include "cli/cli-cmds.h"
30 #include "cli/cli-setshow.h"
32 /* Prototypes for local functions */
34 static int parse_binary_operation (char *);
37 static enum auto_boolean
38 parse_auto_binary_operation (const char *arg
)
40 if (arg
!= NULL
&& *arg
!= '\0')
42 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 text
120 of the argument, and FROM_TTY is nonzero if this command is being entered
121 directly by the user (i.e. these are just like any other
122 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 if (c
->type
== set_cmd
)
140 new = (char *) xmalloc (strlen (arg
) + 2);
143 while ((ch
= *p
++) != '\000')
147 /* \ at end of argument is used after spaces
148 so they won't be lost. */
149 /* This is obsolete now that we no longer strip
150 trailing whitespace and actually, the backslash
151 didn't get here in my test, readline or
152 something did something funky with a backslash
153 right before a newline. */
156 ch
= parse_escape (get_current_arch (), &p
);
166 if (*(p
- 1) != '\\')
170 new = (char *) xrealloc (new, q
- new);
171 if (*(char **) c
->var
!= NULL
)
172 xfree (*(char **) c
->var
);
173 *(char **) c
->var
= new;
176 case var_string_noescape
:
179 if (*(char **) c
->var
!= NULL
)
180 xfree (*(char **) c
->var
);
181 *(char **) c
->var
= xstrdup (arg
);
183 case var_optional_filename
:
186 if (*(char **) c
->var
!= NULL
)
187 xfree (*(char **) c
->var
);
188 *(char **) c
->var
= xstrdup (arg
);
192 error_no_arg (_("filename to set it to."));
193 if (*(char **) c
->var
!= NULL
)
194 xfree (*(char **) c
->var
);
196 /* Clear trailing whitespace of filename. */
197 char *ptr
= arg
+ strlen (arg
) - 1;
198 while (ptr
>= arg
&& (*ptr
== ' ' || *ptr
== '\t'))
202 *(char **) c
->var
= tilde_expand (arg
);
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
;
221 error_no_arg (_("integer to set it to."));
222 val
= parse_and_eval_long (arg
);
224 *(int *) c
->var
= INT_MAX
;
225 else if (val
>= INT_MAX
)
226 error (_("integer %u out of range"), val
);
228 *(int *) c
->var
= val
;
233 error_no_arg (_("integer to set it to."));
234 *(int *) c
->var
= parse_and_eval_long (arg
);
238 error_no_arg (_("integer to set it to."));
239 *(unsigned int *) c
->var
= parse_and_eval_long (arg
);
246 const char *match
= NULL
;
249 /* if no argument was supplied, print an informative error message */
254 for (i
= 0; c
->enums
[i
]; i
++)
255 msg_len
+= strlen (c
->enums
[i
]) + 2;
257 msg
= xmalloc (msg_len
);
259 make_cleanup (xfree
, msg
);
261 for (i
= 0; c
->enums
[i
]; i
++)
265 strcat (msg
, c
->enums
[i
]);
267 error (_("Requires an argument. Valid arguments are %s."), msg
);
270 p
= strchr (arg
, ' ');
278 for (i
= 0; c
->enums
[i
]; i
++)
279 if (strncmp (arg
, c
->enums
[i
], len
) == 0)
281 if (c
->enums
[i
][len
] == '\0')
285 break; /* exact match. */
295 error (_("Undefined item: \"%s\"."), arg
);
298 error (_("Ambiguous item \"%s\"."), arg
);
300 *(const char **) c
->var
= match
;
304 error (_("gdb internal error: bad var_type in do_setshow_command"));
307 else if (c
->type
== show_cmd
)
309 struct cleanup
*old_chain
;
310 struct ui_stream
*stb
;
312 stb
= ui_out_stream_new (uiout
);
313 old_chain
= make_cleanup_ui_out_stream_delete (stb
);
315 /* Possibly call the pre hook. */
316 if (c
->pre_show_hook
)
317 (c
->pre_show_hook
) (c
);
322 if (*(char **) c
->var
)
323 fputstr_filtered (*(char **) c
->var
, '"', stb
->stream
);
325 case var_string_noescape
:
326 case var_optional_filename
:
329 if (*(char **) c
->var
)
330 fputs_filtered (*(char **) c
->var
, stb
->stream
);
333 fputs_filtered (*(int *) c
->var
? "on" : "off", stb
->stream
);
335 case var_auto_boolean
:
336 switch (*(enum auto_boolean
*) c
->var
)
338 case AUTO_BOOLEAN_TRUE
:
339 fputs_filtered ("on", stb
->stream
);
341 case AUTO_BOOLEAN_FALSE
:
342 fputs_filtered ("off", stb
->stream
);
344 case AUTO_BOOLEAN_AUTO
:
345 fputs_filtered ("auto", stb
->stream
);
348 internal_error (__FILE__
, __LINE__
,
349 _("do_setshow_command: invalid var_auto_boolean"));
354 if (*(unsigned int *) c
->var
== UINT_MAX
)
356 fputs_filtered ("unlimited", stb
->stream
);
359 /* else fall through */
362 fprintf_filtered (stb
->stream
, "%u", *(unsigned int *) c
->var
);
365 if (*(int *) c
->var
== INT_MAX
)
367 fputs_filtered ("unlimited", stb
->stream
);
370 fprintf_filtered (stb
->stream
, "%d", *(int *) c
->var
);
374 error (_("gdb internal error: bad var_type in do_setshow_command"));
378 /* FIXME: cagney/2005-02-10: Need to split this in half: code to
379 convert the value into a string (esentially the above); and
380 code to print the value out. For the latter there should be
381 MI and CLI specific versions. */
383 if (ui_out_is_mi_like_p (uiout
))
384 ui_out_field_stream (uiout
, "value", stb
);
387 char *value
= ui_file_xstrdup (stb
->stream
, NULL
);
388 make_cleanup (xfree
, value
);
389 if (c
->show_value_func
!= NULL
)
390 c
->show_value_func (gdb_stdout
, from_tty
, c
, value
);
392 deprecated_show_value_hack (gdb_stdout
, from_tty
, c
, value
);
394 do_cleanups (old_chain
);
397 error (_("gdb internal error: bad cmd_type in do_setshow_command"));
398 c
->func (c
, NULL
, from_tty
);
399 if (c
->type
== set_cmd
&& deprecated_set_hook
)
400 deprecated_set_hook (c
);
403 /* Show all the settings in a list of show commands. */
406 cmd_show_list (struct cmd_list_element
*list
, int from_tty
, char *prefix
)
408 struct cleanup
*showlist_chain
;
410 showlist_chain
= make_cleanup_ui_out_tuple_begin_end (uiout
, "showlist");
411 for (; list
!= NULL
; list
= list
->next
)
413 /* If we find a prefix, run its list, prefixing our output by its
414 prefix (with "show " skipped). */
415 if (list
->prefixlist
&& !list
->abbrev_flag
)
417 struct cleanup
*optionlist_chain
418 = make_cleanup_ui_out_tuple_begin_end (uiout
, "optionlist");
419 char *new_prefix
= strstr (list
->prefixname
, "show ") + 5;
420 if (ui_out_is_mi_like_p (uiout
))
421 ui_out_field_string (uiout
, "prefix", new_prefix
);
422 cmd_show_list (*list
->prefixlist
, from_tty
, new_prefix
);
423 /* Close the tuple. */
424 do_cleanups (optionlist_chain
);
428 struct cleanup
*option_chain
429 = make_cleanup_ui_out_tuple_begin_end (uiout
, "option");
430 ui_out_text (uiout
, prefix
);
431 ui_out_field_string (uiout
, "name", list
->name
);
432 ui_out_text (uiout
, ": ");
433 if (list
->type
== show_cmd
)
434 do_setshow_command ((char *) NULL
, from_tty
, list
);
436 cmd_func (list
, NULL
, from_tty
);
437 /* Close the tuple. */
438 do_cleanups (option_chain
);
441 /* Close the tuple. */
442 do_cleanups (showlist_chain
);
This page took 0.039689 seconds and 4 git commands to generate.