]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/cli/cli-setshow.c
2012-07-18 Cary Coutant <ccoutant@google.com>
[thirdparty/binutils-gdb.git] / gdb / cli / cli-setshow.c
CommitLineData
d318976c 1/* Handle set and show GDB commands.
8926118c 2
0b302171 3 Copyright (c) 2000-2003, 2007-2012 Free Software Foundation, Inc.
d318976c
FN
4
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
a9762ec7 7 the Free Software Foundation; either version 3 of the License, or
d318976c
FN
8 (at your option) any later version.
9
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.
14
15 You should have received a copy of the GNU General Public License
a9762ec7 16 along with this program. If not, see <http://www.gnu.org/licenses/>. */
d318976c
FN
17
18#include "defs.h"
dbda9972 19#include "readline/tilde.h"
d318976c
FN
20#include "value.h"
21#include <ctype.h>
d318976c 22#include "gdb_string.h"
f870a310 23#include "arch-utils.h"
d318976c 24
d318976c 25#include "ui-out.h"
d318976c
FN
26
27#include "cli/cli-decode.h"
28#include "cli/cli-cmds.h"
29#include "cli/cli-setshow.h"
30
ebcd3b23 31/* Prototypes for local functions. */
d318976c
FN
32
33static int parse_binary_operation (char *);
34
d318976c 35\f
7f19b9a2 36static enum auto_boolean
d318976c
FN
37parse_auto_binary_operation (const char *arg)
38{
39 if (arg != NULL && *arg != '\0')
40 {
41 int length = strlen (arg);
cdb27c12 42
d318976c
FN
43 while (isspace (arg[length - 1]) && length > 0)
44 length--;
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)
7f19b9a2 49 return AUTO_BOOLEAN_TRUE;
d318976c
FN
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)
7f19b9a2 54 return AUTO_BOOLEAN_FALSE;
d318976c
FN
55 else if (strncmp (arg, "auto", length) == 0
56 || (strncmp (arg, "-1", length) == 0 && length > 1))
7f19b9a2 57 return AUTO_BOOLEAN_AUTO;
d318976c 58 }
8a3fe4f8 59 error (_("\"on\", \"off\" or \"auto\" expected."));
ebcd3b23 60 return AUTO_BOOLEAN_AUTO; /* Pacify GCC. */
d318976c
FN
61}
62
63static int
64parse_binary_operation (char *arg)
65{
66 int length;
67
68 if (!arg || !*arg)
69 return 1;
70
71 length = strlen (arg);
72
73 while (arg[length - 1] == ' ' || arg[length - 1] == '\t')
74 length--;
75
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)
80 return 1;
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)
85 return 0;
86 else
87 {
8a3fe4f8 88 error (_("\"on\" or \"off\" expected."));
d318976c
FN
89 return 0;
90 }
91}
92\f
08546159
AC
93void
94deprecated_show_value_hack (struct ui_file *ignore_file,
95 int ignore_from_tty,
96 struct cmd_list_element *c,
97 const char *value)
98{
4d28ad1e
AC
99 /* If there's no command or value, don't try to print it out. */
100 if (c == NULL || value == NULL)
101 return;
08546159
AC
102 /* Print doc minus "show" at start. */
103 print_doc_line (gdb_stdout, c->doc + 5);
104 switch (c->var_type)
105 {
106 case var_string:
107 case var_string_noescape:
b4b4ac0b 108 case var_optional_filename:
08546159
AC
109 case var_filename:
110 case var_enum:
111 printf_filtered ((" is \"%s\".\n"), value);
112 break;
113 default:
114 printf_filtered ((" is %s.\n"), value);
115 break;
116 }
117}
118
ebcd3b23
MS
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. */
d318976c
FN
123
124void
125do_setshow_command (char *arg, int from_tty, struct cmd_list_element *c)
126{
79a45e25
PA
127 struct ui_out *uiout = current_uiout;
128
d318976c
FN
129 if (c->type == set_cmd)
130 {
131 switch (c->var_type)
132 {
133 case var_string:
134 {
135 char *new;
136 char *p;
137 char *q;
138 int ch;
139
140 if (arg == NULL)
141 arg = "";
142 new = (char *) xmalloc (strlen (arg) + 2);
143 p = arg;
144 q = new;
145 while ((ch = *p++) != '\000')
146 {
147 if (ch == '\\')
148 {
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. */
156 if (*p == 0)
157 break;
f870a310 158 ch = parse_escape (get_current_arch (), &p);
d318976c
FN
159 if (ch == 0)
160 break; /* C loses */
161 else if (ch > 0)
162 *q++ = ch;
163 }
164 else
165 *q++ = ch;
166 }
167#if 0
168 if (*(p - 1) != '\\')
169 *q++ = ' ';
170#endif
171 *q++ = '\0';
172 new = (char *) xrealloc (new, q - new);
173 if (*(char **) c->var != NULL)
b8c9b27d 174 xfree (*(char **) c->var);
d318976c
FN
175 *(char **) c->var = new;
176 }
177 break;
178 case var_string_noescape:
179 if (arg == NULL)
180 arg = "";
181 if (*(char **) c->var != NULL)
b8c9b27d 182 xfree (*(char **) c->var);
1b36a34b 183 *(char **) c->var = xstrdup (arg);
d318976c 184 break;
b4b4ac0b 185 case var_optional_filename:
d318976c 186 if (arg == NULL)
525226b5
AC
187 arg = "";
188 if (*(char **) c->var != NULL)
189 xfree (*(char **) c->var);
1b36a34b 190 *(char **) c->var = xstrdup (arg);
525226b5
AC
191 break;
192 case var_filename:
193 if (arg == NULL)
194 error_no_arg (_("filename to set it to."));
d318976c 195 if (*(char **) c->var != NULL)
b8c9b27d 196 xfree (*(char **) c->var);
1430be3e
MR
197 {
198 /* Clear trailing whitespace of filename. */
199 char *ptr = arg + strlen (arg) - 1;
cdb27c12 200
1430be3e
MR
201 while (ptr >= arg && (*ptr == ' ' || *ptr == '\t'))
202 ptr--;
203 *(ptr + 1) = '\0';
204 }
d318976c
FN
205 *(char **) c->var = tilde_expand (arg);
206 break;
207 case var_boolean:
208 *(int *) c->var = parse_binary_operation (arg);
209 break;
210 case var_auto_boolean:
7f19b9a2 211 *(enum auto_boolean *) c->var = parse_auto_binary_operation (arg);
d318976c
FN
212 break;
213 case var_uinteger:
214 if (arg == NULL)
e2e0b3e5 215 error_no_arg (_("integer to set it to."));
d318976c
FN
216 *(unsigned int *) c->var = parse_and_eval_long (arg);
217 if (*(unsigned int *) c->var == 0)
218 *(unsigned int *) c->var = UINT_MAX;
219 break;
220 case var_integer:
221 {
222 unsigned int val;
cdb27c12 223
d318976c 224 if (arg == NULL)
e2e0b3e5 225 error_no_arg (_("integer to set it to."));
d318976c
FN
226 val = parse_and_eval_long (arg);
227 if (val == 0)
228 *(int *) c->var = INT_MAX;
229 else if (val >= INT_MAX)
8a3fe4f8 230 error (_("integer %u out of range"), val);
d318976c
FN
231 else
232 *(int *) c->var = val;
233 break;
234 }
235 case var_zinteger:
236 if (arg == NULL)
e2e0b3e5 237 error_no_arg (_("integer to set it to."));
d318976c
FN
238 *(int *) c->var = parse_and_eval_long (arg);
239 break;
1e8fb976
PA
240 case var_zuinteger:
241 if (arg == NULL)
242 error_no_arg (_("integer to set it to."));
243 *(unsigned int *) c->var = parse_and_eval_long (arg);
244 break;
d318976c
FN
245 case var_enum:
246 {
247 int i;
248 int len;
249 int nmatches;
250 const char *match = NULL;
251 char *p;
252
ebcd3b23
MS
253 /* If no argument was supplied, print an informative error
254 message. */
d318976c
FN
255 if (arg == NULL)
256 {
f0704234
UW
257 char *msg;
258 int msg_len = 0;
cdb27c12 259
f0704234
UW
260 for (i = 0; c->enums[i]; i++)
261 msg_len += strlen (c->enums[i]) + 2;
262
263 msg = xmalloc (msg_len);
264 *msg = '\0';
265 make_cleanup (xfree, msg);
266
d318976c
FN
267 for (i = 0; c->enums[i]; i++)
268 {
269 if (i != 0)
270 strcat (msg, ", ");
271 strcat (msg, c->enums[i]);
272 }
ebcd3b23
MS
273 error (_("Requires an argument. Valid arguments are %s."),
274 msg);
d318976c
FN
275 }
276
277 p = strchr (arg, ' ');
278
279 if (p)
280 len = p - arg;
281 else
282 len = strlen (arg);
283
284 nmatches = 0;
285 for (i = 0; c->enums[i]; i++)
286 if (strncmp (arg, c->enums[i], len) == 0)
287 {
288 if (c->enums[i][len] == '\0')
289 {
290 match = c->enums[i];
291 nmatches = 1;
ebcd3b23 292 break; /* Exact match. */
d318976c
FN
293 }
294 else
295 {
296 match = c->enums[i];
297 nmatches++;
298 }
299 }
300
301 if (nmatches <= 0)
8a3fe4f8 302 error (_("Undefined item: \"%s\"."), arg);
d318976c
FN
303
304 if (nmatches > 1)
8a3fe4f8 305 error (_("Ambiguous item \"%s\"."), arg);
d318976c
FN
306
307 *(const char **) c->var = match;
308 }
309 break;
310 default:
8a3fe4f8 311 error (_("gdb internal error: bad var_type in do_setshow_command"));
d318976c
FN
312 }
313 }
314 else if (c->type == show_cmd)
315 {
d318976c 316 struct cleanup *old_chain;
f99d8bf4 317 struct ui_file *stb;
d318976c 318
f99d8bf4
PA
319 stb = mem_fileopen ();
320 old_chain = make_cleanup_ui_file_delete (stb);
d318976c 321
552c04a7
TT
322 /* Possibly call the pre hook. */
323 if (c->pre_show_hook)
324 (c->pre_show_hook) (c);
325
d318976c
FN
326 switch (c->var_type)
327 {
328 case var_string:
3b113db7 329 if (*(char **) c->var)
f99d8bf4 330 fputstr_filtered (*(char **) c->var, '"', stb);
d318976c
FN
331 break;
332 case var_string_noescape:
b4b4ac0b 333 case var_optional_filename:
d318976c
FN
334 case var_filename:
335 case var_enum:
336 if (*(char **) c->var)
f99d8bf4 337 fputs_filtered (*(char **) c->var, stb);
d318976c
FN
338 break;
339 case var_boolean:
f99d8bf4 340 fputs_filtered (*(int *) c->var ? "on" : "off", stb);
d318976c
FN
341 break;
342 case var_auto_boolean:
7f19b9a2 343 switch (*(enum auto_boolean*) c->var)
d318976c 344 {
7f19b9a2 345 case AUTO_BOOLEAN_TRUE:
f99d8bf4 346 fputs_filtered ("on", stb);
d318976c 347 break;
7f19b9a2 348 case AUTO_BOOLEAN_FALSE:
f99d8bf4 349 fputs_filtered ("off", stb);
d318976c 350 break;
7f19b9a2 351 case AUTO_BOOLEAN_AUTO:
f99d8bf4 352 fputs_filtered ("auto", stb);
d318976c
FN
353 break;
354 default:
8e65ff28 355 internal_error (__FILE__, __LINE__,
9a2b4c1b
MS
356 _("do_setshow_command: "
357 "invalid var_auto_boolean"));
d318976c
FN
358 break;
359 }
360 break;
361 case var_uinteger:
1e8fb976 362 case var_zuinteger:
a40a111f
AB
363 if (c->var_type == var_uinteger
364 && *(unsigned int *) c->var == UINT_MAX)
f99d8bf4 365 fputs_filtered ("unlimited", stb);
a40a111f 366 else
f99d8bf4 367 fprintf_filtered (stb, "%u", *(unsigned int *) c->var);
d318976c
FN
368 break;
369 case var_integer:
a40a111f
AB
370 case var_zinteger:
371 if (c->var_type == var_integer
372 && *(int *) c->var == INT_MAX)
f99d8bf4 373 fputs_filtered ("unlimited", stb);
d318976c 374 else
f99d8bf4 375 fprintf_filtered (stb, "%d", *(int *) c->var);
d318976c
FN
376 break;
377
378 default:
8a3fe4f8 379 error (_("gdb internal error: bad var_type in do_setshow_command"));
d318976c 380 }
899506a8
AC
381
382
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. */
387
388 if (ui_out_is_mi_like_p (uiout))
389 ui_out_field_stream (uiout, "value", stb);
08546159 390 else
335cca0d 391 {
f99d8bf4 392 char *value = ui_file_xstrdup (stb, NULL);
cdb27c12 393
335cca0d 394 make_cleanup (xfree, value);
08546159
AC
395 if (c->show_value_func != NULL)
396 c->show_value_func (gdb_stdout, from_tty, c, value);
397 else
398 deprecated_show_value_hack (gdb_stdout, from_tty, c, value);
899506a8 399 }
d318976c 400 do_cleanups (old_chain);
d318976c
FN
401 }
402 else
8a3fe4f8 403 error (_("gdb internal error: bad cmd_type in do_setshow_command"));
9f60d481 404 c->func (c, NULL, from_tty);
9a4105ab
AC
405 if (c->type == set_cmd && deprecated_set_hook)
406 deprecated_set_hook (c);
d318976c
FN
407}
408
409/* Show all the settings in a list of show commands. */
410
411void
412cmd_show_list (struct cmd_list_element *list, int from_tty, char *prefix)
413{
3b31d625 414 struct cleanup *showlist_chain;
79a45e25 415 struct ui_out *uiout = current_uiout;
3b31d625
EZ
416
417 showlist_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "showlist");
d318976c
FN
418 for (; list != NULL; list = list->next)
419 {
420 /* If we find a prefix, run its list, prefixing our output by its
421 prefix (with "show " skipped). */
d318976c
FN
422 if (list->prefixlist && !list->abbrev_flag)
423 {
3b31d625
EZ
424 struct cleanup *optionlist_chain
425 = make_cleanup_ui_out_tuple_begin_end (uiout, "optionlist");
37fc812e 426 char *new_prefix = strstr (list->prefixname, "show ") + 5;
cdb27c12 427
37fc812e
DJ
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);
3b31d625
EZ
431 /* Close the tuple. */
432 do_cleanups (optionlist_chain);
d318976c 433 }
427c3a89 434 else
d318976c 435 {
db5f229b
MS
436 if (list->class != no_set_class)
437 {
438 struct cleanup *option_chain
439 = make_cleanup_ui_out_tuple_begin_end (uiout, "option");
440
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);
446 else
447 cmd_func (list, NULL, from_tty);
448 /* Close the tuple. */
449 do_cleanups (option_chain);
450 }
d318976c 451 }
d318976c 452 }
3b31d625
EZ
453 /* Close the tuple. */
454 do_cleanups (showlist_chain);
d318976c
FN
455}
456