* cli/cli-cmds.c (edit_command): Remove unused variables. Delete
[deliverable/binutils-gdb.git] / gdb / cli / cli-setshow.c
1 /* Handle set and show GDB commands.
2
3 Copyright (c) 2000, 2001, 2002, 2003, 2007, 2008
4 Free Software Foundation, Inc.
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
8 the Free Software Foundation; either version 3 of the License, or
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
17 along with this program. If not, see <http://www.gnu.org/licenses/>. */
18
19 #include "defs.h"
20 #include "readline/tilde.h"
21 #include "value.h"
22 #include <ctype.h>
23 #include "gdb_string.h"
24
25 #include "ui-out.h"
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
33 static int parse_binary_operation (char *);
34
35 \f
36 static enum auto_boolean
37 parse_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)
48 return AUTO_BOOLEAN_TRUE;
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)
53 return AUTO_BOOLEAN_FALSE;
54 else if (strncmp (arg, "auto", length) == 0
55 || (strncmp (arg, "-1", length) == 0 && length > 1))
56 return AUTO_BOOLEAN_AUTO;
57 }
58 error (_("\"on\", \"off\" or \"auto\" expected."));
59 return AUTO_BOOLEAN_AUTO; /* pacify GCC */
60 }
61
62 static int
63 parse_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 {
87 error (_("\"on\" or \"off\" expected."));
88 return 0;
89 }
90 }
91 \f
92 void
93 deprecated_show_value_hack (struct ui_file *ignore_file,
94 int ignore_from_tty,
95 struct cmd_list_element *c,
96 const char *value)
97 {
98 /* If there's no command or value, don't try to print it out. */
99 if (c == NULL || value == NULL)
100 return;
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:
107 case var_optional_filename:
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
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
123 void
124 do_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)
171 xfree (*(char **) c->var);
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)
179 xfree (*(char **) c->var);
180 *(char **) c->var = savestring (arg, strlen (arg));
181 break;
182 case var_optional_filename:
183 if (arg == NULL)
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."));
192 if (*(char **) c->var != NULL)
193 xfree (*(char **) c->var);
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 }
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:
207 *(enum auto_boolean *) c->var = parse_auto_binary_operation (arg);
208 break;
209 case var_uinteger:
210 if (arg == NULL)
211 error_no_arg (_("integer to set it to."));
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)
220 error_no_arg (_("integer to set it to."));
221 val = parse_and_eval_long (arg);
222 if (val == 0)
223 *(int *) c->var = INT_MAX;
224 else if (val >= INT_MAX)
225 error (_("integer %u out of range"), val);
226 else
227 *(int *) c->var = val;
228 break;
229 }
230 case var_zinteger:
231 if (arg == NULL)
232 error_no_arg (_("integer to set it to."));
233 *(int *) c->var = parse_and_eval_long (arg);
234 break;
235 case var_enum:
236 {
237 int i;
238 int len;
239 int nmatches;
240 const char *match = NULL;
241 char *p;
242
243 /* if no argument was supplied, print an informative error message */
244 if (arg == NULL)
245 {
246 char *msg;
247 int msg_len = 0;
248 for (i = 0; c->enums[i]; i++)
249 msg_len += strlen (c->enums[i]) + 2;
250
251 msg = xmalloc (msg_len);
252 *msg = '\0';
253 make_cleanup (xfree, msg);
254
255 for (i = 0; c->enums[i]; i++)
256 {
257 if (i != 0)
258 strcat (msg, ", ");
259 strcat (msg, c->enums[i]);
260 }
261 error (_("Requires an argument. Valid arguments are %s."), msg);
262 }
263
264 p = strchr (arg, ' ');
265
266 if (p)
267 len = p - arg;
268 else
269 len = strlen (arg);
270
271 nmatches = 0;
272 for (i = 0; c->enums[i]; i++)
273 if (strncmp (arg, c->enums[i], len) == 0)
274 {
275 if (c->enums[i][len] == '\0')
276 {
277 match = c->enums[i];
278 nmatches = 1;
279 break; /* exact match. */
280 }
281 else
282 {
283 match = c->enums[i];
284 nmatches++;
285 }
286 }
287
288 if (nmatches <= 0)
289 error (_("Undefined item: \"%s\"."), arg);
290
291 if (nmatches > 1)
292 error (_("Ambiguous item \"%s\"."), arg);
293
294 *(const char **) c->var = match;
295 }
296 break;
297 default:
298 error (_("gdb internal error: bad var_type in do_setshow_command"));
299 }
300 }
301 else if (c->type == show_cmd)
302 {
303 struct cleanup *old_chain;
304 struct ui_stream *stb;
305
306 stb = ui_out_stream_new (uiout);
307 old_chain = make_cleanup_ui_out_stream_delete (stb);
308
309 /* Possibly call the pre hook. */
310 if (c->pre_show_hook)
311 (c->pre_show_hook) (c);
312
313 switch (c->var_type)
314 {
315 case var_string:
316 if (*(char **) c->var)
317 fputstr_filtered (*(char **) c->var, '"', stb->stream);
318 break;
319 case var_string_noescape:
320 case var_optional_filename:
321 case var_filename:
322 case var_enum:
323 if (*(char **) c->var)
324 fputs_filtered (*(char **) c->var, stb->stream);
325 break;
326 case var_boolean:
327 fputs_filtered (*(int *) c->var ? "on" : "off", stb->stream);
328 break;
329 case var_auto_boolean:
330 switch (*(enum auto_boolean*) c->var)
331 {
332 case AUTO_BOOLEAN_TRUE:
333 fputs_filtered ("on", stb->stream);
334 break;
335 case AUTO_BOOLEAN_FALSE:
336 fputs_filtered ("off", stb->stream);
337 break;
338 case AUTO_BOOLEAN_AUTO:
339 fputs_filtered ("auto", stb->stream);
340 break;
341 default:
342 internal_error (__FILE__, __LINE__,
343 _("do_setshow_command: invalid var_auto_boolean"));
344 break;
345 }
346 break;
347 case var_uinteger:
348 if (*(unsigned int *) c->var == UINT_MAX)
349 {
350 fputs_filtered ("unlimited", stb->stream);
351 break;
352 }
353 /* else fall through */
354 case var_zinteger:
355 fprintf_filtered (stb->stream, "%u", *(unsigned int *) c->var);
356 break;
357 case var_integer:
358 if (*(int *) c->var == INT_MAX)
359 {
360 fputs_filtered ("unlimited", stb->stream);
361 }
362 else
363 fprintf_filtered (stb->stream, "%d", *(int *) c->var);
364 break;
365
366 default:
367 error (_("gdb internal error: bad var_type in do_setshow_command"));
368 }
369
370
371 /* FIXME: cagney/2005-02-10: Need to split this in half: code to
372 convert the value into a string (esentially the above); and
373 code to print the value out. For the latter there should be
374 MI and CLI specific versions. */
375
376 if (ui_out_is_mi_like_p (uiout))
377 ui_out_field_stream (uiout, "value", stb);
378 else
379 {
380 long length;
381 char *value = ui_file_xstrdup (stb->stream, &length);
382 make_cleanup (xfree, value);
383 if (c->show_value_func != NULL)
384 c->show_value_func (gdb_stdout, from_tty, c, value);
385 else
386 deprecated_show_value_hack (gdb_stdout, from_tty, c, value);
387 }
388 do_cleanups (old_chain);
389 }
390 else
391 error (_("gdb internal error: bad cmd_type in do_setshow_command"));
392 c->func (c, NULL, from_tty);
393 if (c->type == set_cmd && deprecated_set_hook)
394 deprecated_set_hook (c);
395 }
396
397 /* Show all the settings in a list of show commands. */
398
399 void
400 cmd_show_list (struct cmd_list_element *list, int from_tty, char *prefix)
401 {
402 struct cleanup *showlist_chain;
403
404 showlist_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "showlist");
405 for (; list != NULL; list = list->next)
406 {
407 /* If we find a prefix, run its list, prefixing our output by its
408 prefix (with "show " skipped). */
409 if (list->prefixlist && !list->abbrev_flag)
410 {
411 struct cleanup *optionlist_chain
412 = make_cleanup_ui_out_tuple_begin_end (uiout, "optionlist");
413 char *new_prefix = strstr (list->prefixname, "show ") + 5;
414 if (ui_out_is_mi_like_p (uiout))
415 ui_out_field_string (uiout, "prefix", new_prefix);
416 cmd_show_list (*list->prefixlist, from_tty, new_prefix);
417 /* Close the tuple. */
418 do_cleanups (optionlist_chain);
419 }
420 else
421 {
422 struct cleanup *option_chain
423 = make_cleanup_ui_out_tuple_begin_end (uiout, "option");
424 ui_out_text (uiout, prefix);
425 ui_out_field_string (uiout, "name", list->name);
426 ui_out_text (uiout, ": ");
427 if (list->type == show_cmd)
428 do_setshow_command ((char *) NULL, from_tty, list);
429 else
430 cmd_func (list, NULL, from_tty);
431 /* Close the tuple. */
432 do_cleanups (option_chain);
433 }
434 }
435 /* Close the tuple. */
436 do_cleanups (showlist_chain);
437 }
438
This page took 0.087494 seconds and 4 git commands to generate.