]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/cli/cli-setshow.c
2010-12-28 Michael Snyder <msnyder@vmware.com>
[thirdparty/binutils-gdb.git] / gdb / cli / cli-setshow.c
CommitLineData
d318976c 1/* Handle set and show GDB commands.
8926118c 2
4c38e0a4 3 Copyright (c) 2000, 2001, 2002, 2003, 2007, 2008, 2009, 2010
9b254dd1 4 Free Software Foundation, Inc.
d318976c
FN
5
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
a9762ec7 8 the Free Software Foundation; either version 3 of the License, or
d318976c
FN
9 (at your option) any later version.
10
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.
15
16 You should have received a copy of the GNU General Public License
a9762ec7 17 along with this program. If not, see <http://www.gnu.org/licenses/>. */
d318976c
FN
18
19#include "defs.h"
dbda9972 20#include "readline/tilde.h"
d318976c
FN
21#include "value.h"
22#include <ctype.h>
d318976c 23#include "gdb_string.h"
f870a310 24#include "arch-utils.h"
d318976c 25
d318976c 26#include "ui-out.h"
d318976c
FN
27
28#include "cli/cli-decode.h"
29#include "cli/cli-cmds.h"
30#include "cli/cli-setshow.h"
31
ebcd3b23 32/* Prototypes for local functions. */
d318976c
FN
33
34static int parse_binary_operation (char *);
35
d318976c 36\f
7f19b9a2 37static enum auto_boolean
d318976c
FN
38parse_auto_binary_operation (const char *arg)
39{
40 if (arg != NULL && *arg != '\0')
41 {
42 int length = strlen (arg);
cdb27c12 43
d318976c
FN
44 while (isspace (arg[length - 1]) && length > 0)
45 length--;
46 if (strncmp (arg, "on", length) == 0
47 || strncmp (arg, "1", length) == 0
48 || strncmp (arg, "yes", length) == 0
49 || strncmp (arg, "enable", length) == 0)
7f19b9a2 50 return AUTO_BOOLEAN_TRUE;
d318976c
FN
51 else if (strncmp (arg, "off", length) == 0
52 || strncmp (arg, "0", length) == 0
53 || strncmp (arg, "no", length) == 0
54 || strncmp (arg, "disable", length) == 0)
7f19b9a2 55 return AUTO_BOOLEAN_FALSE;
d318976c
FN
56 else if (strncmp (arg, "auto", length) == 0
57 || (strncmp (arg, "-1", length) == 0 && length > 1))
7f19b9a2 58 return AUTO_BOOLEAN_AUTO;
d318976c 59 }
8a3fe4f8 60 error (_("\"on\", \"off\" or \"auto\" expected."));
ebcd3b23 61 return AUTO_BOOLEAN_AUTO; /* Pacify GCC. */
d318976c
FN
62}
63
64static int
65parse_binary_operation (char *arg)
66{
67 int length;
68
69 if (!arg || !*arg)
70 return 1;
71
72 length = strlen (arg);
73
74 while (arg[length - 1] == ' ' || arg[length - 1] == '\t')
75 length--;
76
77 if (strncmp (arg, "on", length) == 0
78 || strncmp (arg, "1", length) == 0
79 || strncmp (arg, "yes", length) == 0
80 || strncmp (arg, "enable", length) == 0)
81 return 1;
82 else if (strncmp (arg, "off", length) == 0
83 || strncmp (arg, "0", length) == 0
84 || strncmp (arg, "no", length) == 0
85 || strncmp (arg, "disable", length) == 0)
86 return 0;
87 else
88 {
8a3fe4f8 89 error (_("\"on\" or \"off\" expected."));
d318976c
FN
90 return 0;
91 }
92}
93\f
08546159
AC
94void
95deprecated_show_value_hack (struct ui_file *ignore_file,
96 int ignore_from_tty,
97 struct cmd_list_element *c,
98 const char *value)
99{
4d28ad1e
AC
100 /* If there's no command or value, don't try to print it out. */
101 if (c == NULL || value == NULL)
102 return;
08546159
AC
103 /* Print doc minus "show" at start. */
104 print_doc_line (gdb_stdout, c->doc + 5);
105 switch (c->var_type)
106 {
107 case var_string:
108 case var_string_noescape:
b4b4ac0b 109 case var_optional_filename:
08546159
AC
110 case var_filename:
111 case var_enum:
112 printf_filtered ((" is \"%s\".\n"), value);
113 break;
114 default:
115 printf_filtered ((" is %s.\n"), value);
116 break;
117 }
118}
119
ebcd3b23
MS
120/* Do a "set" or "show" command. ARG is NULL if no argument, or the
121 text of the argument, and FROM_TTY is nonzero if this command is
122 being entered directly by the user (i.e. these are just like any
123 other command). C is the command list element for the command. */
d318976c
FN
124
125void
126do_setshow_command (char *arg, int from_tty, struct cmd_list_element *c)
127{
128 if (c->type == set_cmd)
129 {
130 switch (c->var_type)
131 {
132 case var_string:
133 {
134 char *new;
135 char *p;
136 char *q;
137 int ch;
138
139 if (arg == NULL)
140 arg = "";
141 new = (char *) xmalloc (strlen (arg) + 2);
142 p = arg;
143 q = new;
144 while ((ch = *p++) != '\000')
145 {
146 if (ch == '\\')
147 {
148 /* \ at end of argument is used after spaces
149 so they won't be lost. */
150 /* This is obsolete now that we no longer strip
151 trailing whitespace and actually, the backslash
152 didn't get here in my test, readline or
153 something did something funky with a backslash
154 right before a newline. */
155 if (*p == 0)
156 break;
f870a310 157 ch = parse_escape (get_current_arch (), &p);
d318976c
FN
158 if (ch == 0)
159 break; /* C loses */
160 else if (ch > 0)
161 *q++ = ch;
162 }
163 else
164 *q++ = ch;
165 }
166#if 0
167 if (*(p - 1) != '\\')
168 *q++ = ' ';
169#endif
170 *q++ = '\0';
171 new = (char *) xrealloc (new, q - new);
172 if (*(char **) c->var != NULL)
b8c9b27d 173 xfree (*(char **) c->var);
d318976c
FN
174 *(char **) c->var = new;
175 }
176 break;
177 case var_string_noescape:
178 if (arg == NULL)
179 arg = "";
180 if (*(char **) c->var != NULL)
b8c9b27d 181 xfree (*(char **) c->var);
1b36a34b 182 *(char **) c->var = xstrdup (arg);
d318976c 183 break;
b4b4ac0b 184 case var_optional_filename:
d318976c 185 if (arg == NULL)
525226b5
AC
186 arg = "";
187 if (*(char **) c->var != NULL)
188 xfree (*(char **) c->var);
1b36a34b 189 *(char **) c->var = xstrdup (arg);
525226b5
AC
190 break;
191 case var_filename:
192 if (arg == NULL)
193 error_no_arg (_("filename to set it to."));
d318976c 194 if (*(char **) c->var != NULL)
b8c9b27d 195 xfree (*(char **) c->var);
1430be3e
MR
196 {
197 /* Clear trailing whitespace of filename. */
198 char *ptr = arg + strlen (arg) - 1;
cdb27c12 199
1430be3e
MR
200 while (ptr >= arg && (*ptr == ' ' || *ptr == '\t'))
201 ptr--;
202 *(ptr + 1) = '\0';
203 }
d318976c
FN
204 *(char **) c->var = tilde_expand (arg);
205 break;
206 case var_boolean:
207 *(int *) c->var = parse_binary_operation (arg);
208 break;
209 case var_auto_boolean:
7f19b9a2 210 *(enum auto_boolean *) c->var = parse_auto_binary_operation (arg);
d318976c
FN
211 break;
212 case var_uinteger:
213 if (arg == NULL)
e2e0b3e5 214 error_no_arg (_("integer to set it to."));
d318976c
FN
215 *(unsigned int *) c->var = parse_and_eval_long (arg);
216 if (*(unsigned int *) c->var == 0)
217 *(unsigned int *) c->var = UINT_MAX;
218 break;
219 case var_integer:
220 {
221 unsigned int val;
cdb27c12 222
d318976c 223 if (arg == NULL)
e2e0b3e5 224 error_no_arg (_("integer to set it to."));
d318976c
FN
225 val = parse_and_eval_long (arg);
226 if (val == 0)
227 *(int *) c->var = INT_MAX;
228 else if (val >= INT_MAX)
8a3fe4f8 229 error (_("integer %u out of range"), val);
d318976c
FN
230 else
231 *(int *) c->var = val;
232 break;
233 }
234 case var_zinteger:
235 if (arg == NULL)
e2e0b3e5 236 error_no_arg (_("integer to set it to."));
d318976c
FN
237 *(int *) c->var = parse_and_eval_long (arg);
238 break;
1e8fb976
PA
239 case var_zuinteger:
240 if (arg == NULL)
241 error_no_arg (_("integer to set it to."));
242 *(unsigned int *) c->var = parse_and_eval_long (arg);
243 break;
d318976c
FN
244 case var_enum:
245 {
246 int i;
247 int len;
248 int nmatches;
249 const char *match = NULL;
250 char *p;
251
ebcd3b23
MS
252 /* If no argument was supplied, print an informative error
253 message. */
d318976c
FN
254 if (arg == NULL)
255 {
f0704234
UW
256 char *msg;
257 int msg_len = 0;
cdb27c12 258
f0704234
UW
259 for (i = 0; c->enums[i]; i++)
260 msg_len += strlen (c->enums[i]) + 2;
261
262 msg = xmalloc (msg_len);
263 *msg = '\0';
264 make_cleanup (xfree, msg);
265
d318976c
FN
266 for (i = 0; c->enums[i]; i++)
267 {
268 if (i != 0)
269 strcat (msg, ", ");
270 strcat (msg, c->enums[i]);
271 }
ebcd3b23
MS
272 error (_("Requires an argument. Valid arguments are %s."),
273 msg);
d318976c
FN
274 }
275
276 p = strchr (arg, ' ');
277
278 if (p)
279 len = p - arg;
280 else
281 len = strlen (arg);
282
283 nmatches = 0;
284 for (i = 0; c->enums[i]; i++)
285 if (strncmp (arg, c->enums[i], len) == 0)
286 {
287 if (c->enums[i][len] == '\0')
288 {
289 match = c->enums[i];
290 nmatches = 1;
ebcd3b23 291 break; /* Exact match. */
d318976c
FN
292 }
293 else
294 {
295 match = c->enums[i];
296 nmatches++;
297 }
298 }
299
300 if (nmatches <= 0)
8a3fe4f8 301 error (_("Undefined item: \"%s\"."), arg);
d318976c
FN
302
303 if (nmatches > 1)
8a3fe4f8 304 error (_("Ambiguous item \"%s\"."), arg);
d318976c
FN
305
306 *(const char **) c->var = match;
307 }
308 break;
309 default:
8a3fe4f8 310 error (_("gdb internal error: bad var_type in do_setshow_command"));
d318976c
FN
311 }
312 }
313 else if (c->type == show_cmd)
314 {
d318976c
FN
315 struct cleanup *old_chain;
316 struct ui_stream *stb;
d318976c
FN
317
318 stb = ui_out_stream_new (uiout);
319 old_chain = make_cleanup_ui_out_stream_delete (stb);
d318976c 320
552c04a7
TT
321 /* Possibly call the pre hook. */
322 if (c->pre_show_hook)
323 (c->pre_show_hook) (c);
324
d318976c
FN
325 switch (c->var_type)
326 {
327 case var_string:
3b113db7
DJ
328 if (*(char **) c->var)
329 fputstr_filtered (*(char **) c->var, '"', stb->stream);
d318976c
FN
330 break;
331 case var_string_noescape:
b4b4ac0b 332 case var_optional_filename:
d318976c
FN
333 case var_filename:
334 case var_enum:
335 if (*(char **) c->var)
336 fputs_filtered (*(char **) c->var, stb->stream);
d318976c
FN
337 break;
338 case var_boolean:
339 fputs_filtered (*(int *) c->var ? "on" : "off", stb->stream);
340 break;
341 case var_auto_boolean:
7f19b9a2 342 switch (*(enum auto_boolean*) c->var)
d318976c 343 {
7f19b9a2 344 case AUTO_BOOLEAN_TRUE:
d318976c
FN
345 fputs_filtered ("on", stb->stream);
346 break;
7f19b9a2 347 case AUTO_BOOLEAN_FALSE:
d318976c
FN
348 fputs_filtered ("off", stb->stream);
349 break;
7f19b9a2 350 case AUTO_BOOLEAN_AUTO:
d318976c
FN
351 fputs_filtered ("auto", stb->stream);
352 break;
353 default:
8e65ff28 354 internal_error (__FILE__, __LINE__,
e2e0b3e5 355 _("do_setshow_command: invalid var_auto_boolean"));
d318976c
FN
356 break;
357 }
358 break;
359 case var_uinteger:
360 if (*(unsigned int *) c->var == UINT_MAX)
361 {
362 fputs_filtered ("unlimited", stb->stream);
363 break;
364 }
365 /* else fall through */
1e8fb976 366 case var_zuinteger:
d318976c
FN
367 case var_zinteger:
368 fprintf_filtered (stb->stream, "%u", *(unsigned int *) c->var);
369 break;
370 case var_integer:
371 if (*(int *) c->var == INT_MAX)
372 {
373 fputs_filtered ("unlimited", stb->stream);
374 }
375 else
376 fprintf_filtered (stb->stream, "%d", *(int *) c->var);
377 break;
378
379 default:
8a3fe4f8 380 error (_("gdb internal error: bad var_type in do_setshow_command"));
d318976c 381 }
899506a8
AC
382
383
384 /* FIXME: cagney/2005-02-10: Need to split this in half: code to
385 convert the value into a string (esentially the above); and
386 code to print the value out. For the latter there should be
387 MI and CLI specific versions. */
388
389 if (ui_out_is_mi_like_p (uiout))
390 ui_out_field_stream (uiout, "value", stb);
08546159 391 else
335cca0d 392 {
759ef836 393 char *value = ui_file_xstrdup (stb->stream, NULL);
cdb27c12 394
335cca0d 395 make_cleanup (xfree, value);
08546159
AC
396 if (c->show_value_func != NULL)
397 c->show_value_func (gdb_stdout, from_tty, c, value);
398 else
399 deprecated_show_value_hack (gdb_stdout, from_tty, c, value);
899506a8 400 }
d318976c 401 do_cleanups (old_chain);
d318976c
FN
402 }
403 else
8a3fe4f8 404 error (_("gdb internal error: bad cmd_type in do_setshow_command"));
9f60d481 405 c->func (c, NULL, from_tty);
9a4105ab
AC
406 if (c->type == set_cmd && deprecated_set_hook)
407 deprecated_set_hook (c);
d318976c
FN
408}
409
410/* Show all the settings in a list of show commands. */
411
412void
413cmd_show_list (struct cmd_list_element *list, int from_tty, char *prefix)
414{
3b31d625
EZ
415 struct cleanup *showlist_chain;
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 {
3b31d625
EZ
436 struct cleanup *option_chain
437 = make_cleanup_ui_out_tuple_begin_end (uiout, "option");
cdb27c12 438
d318976c
FN
439 ui_out_text (uiout, prefix);
440 ui_out_field_string (uiout, "name", list->name);
441 ui_out_text (uiout, ": ");
427c3a89
DJ
442 if (list->type == show_cmd)
443 do_setshow_command ((char *) NULL, from_tty, list);
444 else
445 cmd_func (list, NULL, from_tty);
3b31d625
EZ
446 /* Close the tuple. */
447 do_cleanups (option_chain);
d318976c 448 }
d318976c 449 }
3b31d625
EZ
450 /* Close the tuple. */
451 do_cleanups (showlist_chain);
d318976c
FN
452}
453