]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/cli/cli-setshow.c
gdb/
[thirdparty/binutils-gdb.git] / gdb / cli / cli-setshow.c
CommitLineData
d318976c 1/* Handle set and show GDB commands.
8926118c 2
0fb0cc75 3 Copyright (c) 2000, 2001, 2002, 2003, 2007, 2008, 2009
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"
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
31/* Prototypes for local functions */
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);
42 while (isspace (arg[length - 1]) && length > 0)
43 length--;
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)
7f19b9a2 48 return AUTO_BOOLEAN_TRUE;
d318976c
FN
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)
7f19b9a2 53 return AUTO_BOOLEAN_FALSE;
d318976c
FN
54 else if (strncmp (arg, "auto", length) == 0
55 || (strncmp (arg, "-1", length) == 0 && length > 1))
7f19b9a2 56 return AUTO_BOOLEAN_AUTO;
d318976c 57 }
8a3fe4f8 58 error (_("\"on\", \"off\" or \"auto\" expected."));
7f19b9a2 59 return AUTO_BOOLEAN_AUTO; /* pacify GCC */
d318976c
FN
60}
61
62static int
63parse_binary_operation (char *arg)
64{
65 int length;
66
67 if (!arg || !*arg)
68 return 1;
69
70 length = strlen (arg);
71
72 while (arg[length - 1] == ' ' || arg[length - 1] == '\t')
73 length--;
74
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)
79 return 1;
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)
84 return 0;
85 else
86 {
8a3fe4f8 87 error (_("\"on\" or \"off\" expected."));
d318976c
FN
88 return 0;
89 }
90}
91\f
08546159
AC
92void
93deprecated_show_value_hack (struct ui_file *ignore_file,
94 int ignore_from_tty,
95 struct cmd_list_element *c,
96 const char *value)
97{
4d28ad1e
AC
98 /* If there's no command or value, don't try to print it out. */
99 if (c == NULL || value == NULL)
100 return;
08546159
AC
101 /* Print doc minus "show" at start. */
102 print_doc_line (gdb_stdout, c->doc + 5);
103 switch (c->var_type)
104 {
105 case var_string:
106 case var_string_noescape:
b4b4ac0b 107 case var_optional_filename:
08546159
AC
108 case var_filename:
109 case var_enum:
110 printf_filtered ((" is \"%s\".\n"), value);
111 break;
112 default:
113 printf_filtered ((" is %s.\n"), value);
114 break;
115 }
116}
117
d318976c
FN
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. */
122
123void
124do_setshow_command (char *arg, int from_tty, struct cmd_list_element *c)
125{
126 if (c->type == set_cmd)
127 {
128 switch (c->var_type)
129 {
130 case var_string:
131 {
132 char *new;
133 char *p;
134 char *q;
135 int ch;
136
137 if (arg == NULL)
138 arg = "";
139 new = (char *) xmalloc (strlen (arg) + 2);
140 p = arg;
141 q = new;
142 while ((ch = *p++) != '\000')
143 {
144 if (ch == '\\')
145 {
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. */
153 if (*p == 0)
154 break;
155 ch = parse_escape (&p);
156 if (ch == 0)
157 break; /* C loses */
158 else if (ch > 0)
159 *q++ = ch;
160 }
161 else
162 *q++ = ch;
163 }
164#if 0
165 if (*(p - 1) != '\\')
166 *q++ = ' ';
167#endif
168 *q++ = '\0';
169 new = (char *) xrealloc (new, q - new);
170 if (*(char **) c->var != NULL)
b8c9b27d 171 xfree (*(char **) c->var);
d318976c
FN
172 *(char **) c->var = new;
173 }
174 break;
175 case var_string_noescape:
176 if (arg == NULL)
177 arg = "";
178 if (*(char **) c->var != NULL)
b8c9b27d 179 xfree (*(char **) c->var);
d318976c
FN
180 *(char **) c->var = savestring (arg, strlen (arg));
181 break;
b4b4ac0b 182 case var_optional_filename:
d318976c 183 if (arg == NULL)
525226b5
AC
184 arg = "";
185 if (*(char **) c->var != NULL)
186 xfree (*(char **) c->var);
187 *(char **) c->var = savestring (arg, strlen (arg));
188 break;
189 case var_filename:
190 if (arg == NULL)
191 error_no_arg (_("filename to set it to."));
d318976c 192 if (*(char **) c->var != NULL)
b8c9b27d 193 xfree (*(char **) c->var);
1430be3e
MR
194 {
195 /* Clear trailing whitespace of filename. */
196 char *ptr = arg + strlen (arg) - 1;
197 while (ptr >= arg && (*ptr == ' ' || *ptr == '\t'))
198 ptr--;
199 *(ptr + 1) = '\0';
200 }
d318976c
FN
201 *(char **) c->var = tilde_expand (arg);
202 break;
203 case var_boolean:
204 *(int *) c->var = parse_binary_operation (arg);
205 break;
206 case var_auto_boolean:
7f19b9a2 207 *(enum auto_boolean *) c->var = parse_auto_binary_operation (arg);
d318976c
FN
208 break;
209 case var_uinteger:
210 if (arg == NULL)
e2e0b3e5 211 error_no_arg (_("integer to set it to."));
d318976c
FN
212 *(unsigned int *) c->var = parse_and_eval_long (arg);
213 if (*(unsigned int *) c->var == 0)
214 *(unsigned int *) c->var = UINT_MAX;
215 break;
216 case var_integer:
217 {
218 unsigned int val;
219 if (arg == NULL)
e2e0b3e5 220 error_no_arg (_("integer to set it to."));
d318976c
FN
221 val = parse_and_eval_long (arg);
222 if (val == 0)
223 *(int *) c->var = INT_MAX;
224 else if (val >= INT_MAX)
8a3fe4f8 225 error (_("integer %u out of range"), val);
d318976c
FN
226 else
227 *(int *) c->var = val;
228 break;
229 }
230 case var_zinteger:
231 if (arg == NULL)
e2e0b3e5 232 error_no_arg (_("integer to set it to."));
d318976c
FN
233 *(int *) c->var = parse_and_eval_long (arg);
234 break;
1e8fb976
PA
235 case var_zuinteger:
236 if (arg == NULL)
237 error_no_arg (_("integer to set it to."));
238 *(unsigned int *) c->var = parse_and_eval_long (arg);
239 break;
d318976c
FN
240 case var_enum:
241 {
242 int i;
243 int len;
244 int nmatches;
245 const char *match = NULL;
246 char *p;
247
248 /* if no argument was supplied, print an informative error message */
249 if (arg == NULL)
250 {
f0704234
UW
251 char *msg;
252 int msg_len = 0;
253 for (i = 0; c->enums[i]; i++)
254 msg_len += strlen (c->enums[i]) + 2;
255
256 msg = xmalloc (msg_len);
257 *msg = '\0';
258 make_cleanup (xfree, msg);
259
d318976c
FN
260 for (i = 0; c->enums[i]; i++)
261 {
262 if (i != 0)
263 strcat (msg, ", ");
264 strcat (msg, c->enums[i]);
265 }
f0704234 266 error (_("Requires an argument. Valid arguments are %s."), msg);
d318976c
FN
267 }
268
269 p = strchr (arg, ' ');
270
271 if (p)
272 len = p - arg;
273 else
274 len = strlen (arg);
275
276 nmatches = 0;
277 for (i = 0; c->enums[i]; i++)
278 if (strncmp (arg, c->enums[i], len) == 0)
279 {
280 if (c->enums[i][len] == '\0')
281 {
282 match = c->enums[i];
283 nmatches = 1;
284 break; /* exact match. */
285 }
286 else
287 {
288 match = c->enums[i];
289 nmatches++;
290 }
291 }
292
293 if (nmatches <= 0)
8a3fe4f8 294 error (_("Undefined item: \"%s\"."), arg);
d318976c
FN
295
296 if (nmatches > 1)
8a3fe4f8 297 error (_("Ambiguous item \"%s\"."), arg);
d318976c
FN
298
299 *(const char **) c->var = match;
300 }
301 break;
302 default:
8a3fe4f8 303 error (_("gdb internal error: bad var_type in do_setshow_command"));
d318976c
FN
304 }
305 }
306 else if (c->type == show_cmd)
307 {
d318976c
FN
308 struct cleanup *old_chain;
309 struct ui_stream *stb;
d318976c
FN
310
311 stb = ui_out_stream_new (uiout);
312 old_chain = make_cleanup_ui_out_stream_delete (stb);
d318976c 313
552c04a7
TT
314 /* Possibly call the pre hook. */
315 if (c->pre_show_hook)
316 (c->pre_show_hook) (c);
317
d318976c
FN
318 switch (c->var_type)
319 {
320 case var_string:
3b113db7
DJ
321 if (*(char **) c->var)
322 fputstr_filtered (*(char **) c->var, '"', stb->stream);
d318976c
FN
323 break;
324 case var_string_noescape:
b4b4ac0b 325 case var_optional_filename:
d318976c
FN
326 case var_filename:
327 case var_enum:
328 if (*(char **) c->var)
329 fputs_filtered (*(char **) c->var, stb->stream);
d318976c
FN
330 break;
331 case var_boolean:
332 fputs_filtered (*(int *) c->var ? "on" : "off", stb->stream);
333 break;
334 case var_auto_boolean:
7f19b9a2 335 switch (*(enum auto_boolean*) c->var)
d318976c 336 {
7f19b9a2 337 case AUTO_BOOLEAN_TRUE:
d318976c
FN
338 fputs_filtered ("on", stb->stream);
339 break;
7f19b9a2 340 case AUTO_BOOLEAN_FALSE:
d318976c
FN
341 fputs_filtered ("off", stb->stream);
342 break;
7f19b9a2 343 case AUTO_BOOLEAN_AUTO:
d318976c
FN
344 fputs_filtered ("auto", stb->stream);
345 break;
346 default:
8e65ff28 347 internal_error (__FILE__, __LINE__,
e2e0b3e5 348 _("do_setshow_command: invalid var_auto_boolean"));
d318976c
FN
349 break;
350 }
351 break;
352 case var_uinteger:
353 if (*(unsigned int *) c->var == UINT_MAX)
354 {
355 fputs_filtered ("unlimited", stb->stream);
356 break;
357 }
358 /* else fall through */
1e8fb976 359 case var_zuinteger:
d318976c
FN
360 case var_zinteger:
361 fprintf_filtered (stb->stream, "%u", *(unsigned int *) c->var);
362 break;
363 case var_integer:
364 if (*(int *) c->var == INT_MAX)
365 {
366 fputs_filtered ("unlimited", stb->stream);
367 }
368 else
369 fprintf_filtered (stb->stream, "%d", *(int *) c->var);
370 break;
371
372 default:
8a3fe4f8 373 error (_("gdb internal error: bad var_type in do_setshow_command"));
d318976c 374 }
899506a8
AC
375
376
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. */
381
382 if (ui_out_is_mi_like_p (uiout))
383 ui_out_field_stream (uiout, "value", stb);
08546159 384 else
335cca0d
AC
385 {
386 long length;
387 char *value = ui_file_xstrdup (stb->stream, &length);
388 make_cleanup (xfree, value);
08546159
AC
389 if (c->show_value_func != NULL)
390 c->show_value_func (gdb_stdout, from_tty, c, value);
391 else
392 deprecated_show_value_hack (gdb_stdout, from_tty, c, value);
899506a8 393 }
d318976c 394 do_cleanups (old_chain);
d318976c
FN
395 }
396 else
8a3fe4f8 397 error (_("gdb internal error: bad cmd_type in do_setshow_command"));
9f60d481 398 c->func (c, NULL, from_tty);
9a4105ab
AC
399 if (c->type == set_cmd && deprecated_set_hook)
400 deprecated_set_hook (c);
d318976c
FN
401}
402
403/* Show all the settings in a list of show commands. */
404
405void
406cmd_show_list (struct cmd_list_element *list, int from_tty, char *prefix)
407{
3b31d625
EZ
408 struct cleanup *showlist_chain;
409
410 showlist_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "showlist");
d318976c
FN
411 for (; list != NULL; list = list->next)
412 {
413 /* If we find a prefix, run its list, prefixing our output by its
414 prefix (with "show " skipped). */
d318976c
FN
415 if (list->prefixlist && !list->abbrev_flag)
416 {
3b31d625
EZ
417 struct cleanup *optionlist_chain
418 = make_cleanup_ui_out_tuple_begin_end (uiout, "optionlist");
37fc812e
DJ
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);
3b31d625
EZ
423 /* Close the tuple. */
424 do_cleanups (optionlist_chain);
d318976c 425 }
427c3a89 426 else
d318976c 427 {
3b31d625
EZ
428 struct cleanup *option_chain
429 = make_cleanup_ui_out_tuple_begin_end (uiout, "option");
d318976c
FN
430 ui_out_text (uiout, prefix);
431 ui_out_field_string (uiout, "name", list->name);
432 ui_out_text (uiout, ": ");
427c3a89
DJ
433 if (list->type == show_cmd)
434 do_setshow_command ((char *) NULL, from_tty, list);
435 else
436 cmd_func (list, NULL, from_tty);
3b31d625
EZ
437 /* Close the tuple. */
438 do_cleanups (option_chain);
d318976c 439 }
d318976c 440 }
3b31d625
EZ
441 /* Close the tuple. */
442 do_cleanups (showlist_chain);
d318976c
FN
443}
444