Automatic date update in version.in
[deliverable/binutils-gdb.git] / gdb / cli / cli-setshow.c
CommitLineData
d318976c 1/* Handle set and show GDB commands.
8926118c 2
42a4f53d 3 Copyright (C) 2000-2019 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>
f870a310 22#include "arch-utils.h"
76727919 23#include "observable.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"
f81d1120 30#include "cli/cli-utils.h"
d318976c 31
5b9afe8a
YQ
32/* Return true if the change of command parameter should be notified. */
33
34static int
35notify_command_param_changed_p (int param_changed, struct cmd_list_element *c)
36{
37 if (param_changed == 0)
38 return 0;
39
fe978cb0
PA
40 if (c->theclass == class_maintenance || c->theclass == class_deprecated
41 || c->theclass == class_obscure)
5b9afe8a
YQ
42 return 0;
43
44 return 1;
45}
46
d318976c 47\f
7f19b9a2 48static enum auto_boolean
d318976c
FN
49parse_auto_binary_operation (const char *arg)
50{
51 if (arg != NULL && *arg != '\0')
52 {
53 int length = strlen (arg);
cdb27c12 54
d318976c
FN
55 while (isspace (arg[length - 1]) && length > 0)
56 length--;
dee7b4c8
PA
57
58 /* Note that "o" is ambiguous. */
59
60 if ((length == 2 && strncmp (arg, "on", length) == 0)
d318976c
FN
61 || strncmp (arg, "1", length) == 0
62 || strncmp (arg, "yes", length) == 0
63 || strncmp (arg, "enable", length) == 0)
7f19b9a2 64 return AUTO_BOOLEAN_TRUE;
dee7b4c8 65 else if ((length >= 2 && strncmp (arg, "off", length) == 0)
d318976c
FN
66 || strncmp (arg, "0", length) == 0
67 || strncmp (arg, "no", length) == 0
68 || strncmp (arg, "disable", length) == 0)
7f19b9a2 69 return AUTO_BOOLEAN_FALSE;
d318976c 70 else if (strncmp (arg, "auto", length) == 0
dee7b4c8 71 || (length > 1 && strncmp (arg, "-1", length) == 0))
7f19b9a2 72 return AUTO_BOOLEAN_AUTO;
d318976c 73 }
8a3fe4f8 74 error (_("\"on\", \"off\" or \"auto\" expected."));
ebcd3b23 75 return AUTO_BOOLEAN_AUTO; /* Pacify GCC. */
d318976c
FN
76}
77
bd712aed
DE
78/* See cli-setshow.h. */
79
80int
9d0faba9 81parse_cli_boolean_value (const char **arg)
d318976c 82{
9d0faba9
PA
83 const char *p = skip_to_space (*arg);
84 size_t length = p - *arg;
d318976c 85
9d0faba9 86 /* Note that "o" is ambiguous. */
d318976c 87
9d0faba9
PA
88 if ((length == 2 && strncmp (*arg, "on", length) == 0)
89 || strncmp (*arg, "1", length) == 0
90 || strncmp (*arg, "yes", length) == 0
91 || strncmp (*arg, "enable", length) == 0)
92 {
93 *arg = skip_spaces (*arg + length);
94 return 1;
95 }
96 else if ((length >= 2 && strncmp (*arg, "off", length) == 0)
97 || strncmp (*arg, "0", length) == 0
98 || strncmp (*arg, "no", length) == 0
99 || strncmp (*arg, "disable", length) == 0)
100 {
101 *arg = skip_spaces (*arg + length);
102 return 0;
103 }
104 else
105 return -1;
106}
d318976c 107
9d0faba9 108/* See cli-setshow.h. */
dee7b4c8 109
9d0faba9
PA
110int
111parse_cli_boolean_value (const char *arg)
112{
113 if (!arg || !*arg)
d318976c 114 return 1;
9d0faba9
PA
115
116 int b = parse_cli_boolean_value (&arg);
117 if (b >= 0 && *arg != '\0')
bd712aed 118 return -1;
9d0faba9
PA
119
120 return b;
d318976c 121}
9d0faba9 122
d318976c 123\f
08546159
AC
124void
125deprecated_show_value_hack (struct ui_file *ignore_file,
126 int ignore_from_tty,
127 struct cmd_list_element *c,
128 const char *value)
129{
4d28ad1e
AC
130 /* If there's no command or value, don't try to print it out. */
131 if (c == NULL || value == NULL)
132 return;
08546159
AC
133 /* Print doc minus "show" at start. */
134 print_doc_line (gdb_stdout, c->doc + 5);
135 switch (c->var_type)
136 {
137 case var_string:
138 case var_string_noescape:
b4b4ac0b 139 case var_optional_filename:
08546159
AC
140 case var_filename:
141 case var_enum:
142 printf_filtered ((" is \"%s\".\n"), value);
143 break;
144 default:
145 printf_filtered ((" is %s.\n"), value);
146 break;
147 }
148}
149
f81d1120
PA
150/* Returns true if ARG is "unlimited". */
151
9d0faba9 152static bool
4c048731 153is_unlimited_literal (const char **arg, bool expression)
f81d1120 154{
9d0faba9 155 *arg = skip_spaces (*arg);
f81d1120 156
4c048731
PA
157 const char *unl_start = *arg;
158
9d0faba9 159 const char *p = skip_to_space (*arg);
93bcb043 160
9d0faba9 161 size_t len = p - *arg;
93bcb043 162
9d0faba9
PA
163 if (len > 0 && strncmp ("unlimited", *arg, len) == 0)
164 {
165 *arg += len;
4c048731
PA
166
167 /* If parsing an expression (i.e., parsing for a "set" command),
168 anything after "unlimited" is junk. For options, anything
169 after "unlimited" might be a command argument or another
170 option. */
171 if (expression)
172 {
173 const char *after = skip_spaces (*arg);
174 if (*after != '\0')
175 error (_("Junk after \"%.*s\": %s"),
176 (int) len, unl_start, after);
177 }
178
9d0faba9
PA
179 return true;
180 }
93bcb043
PA
181
182 return false;
f81d1120
PA
183}
184
9d0faba9
PA
185/* See cli-setshow.h. */
186
187unsigned int
188parse_cli_var_uinteger (var_types var_type, const char **arg,
189 bool expression)
190{
191 LONGEST val;
192
fdbc9870 193 if (*arg == nullptr || **arg == '\0')
9d0faba9
PA
194 {
195 if (var_type == var_uinteger)
196 error_no_arg (_("integer to set it to, or \"unlimited\"."));
197 else
198 error_no_arg (_("integer to set it to."));
199 }
200
4c048731 201 if (var_type == var_uinteger && is_unlimited_literal (arg, expression))
9d0faba9
PA
202 val = 0;
203 else if (expression)
204 val = parse_and_eval_long (*arg);
205 else
206 val = get_ulongest (arg);
207
208 if (var_type == var_uinteger && val == 0)
209 val = UINT_MAX;
210 else if (val < 0
211 /* For var_uinteger, don't let the user set the value
212 to UINT_MAX directly, as that exposes an
213 implementation detail to the user interface. */
214 || (var_type == var_uinteger && val >= UINT_MAX)
215 || (var_type == var_zuinteger && val > UINT_MAX))
216 error (_("integer %s out of range"), plongest (val));
217
218 return val;
219}
220
221/* See cli-setshow.h. */
222
223int
224parse_cli_var_zuinteger_unlimited (const char **arg, bool expression)
225{
226 LONGEST val;
227
fdbc9870 228 if (*arg == nullptr || **arg == '\0')
9d0faba9
PA
229 error_no_arg (_("integer to set it to, or \"unlimited\"."));
230
4c048731 231 if (is_unlimited_literal (arg, expression))
9d0faba9
PA
232 val = -1;
233 else if (expression)
234 val = parse_and_eval_long (*arg);
235 else
236 val = get_ulongest (arg);
237
238 if (val > INT_MAX)
239 error (_("integer %s out of range"), plongest (val));
240 else if (val < -1)
241 error (_("only -1 is allowed to set as unlimited"));
242
243 return val;
244}
245
246/* See cli-setshow.h. */
247
248const char *
249parse_cli_var_enum (const char **args, const char *const *enums)
250{
251 /* If no argument was supplied, print an informative error
252 message. */
253 if (args == NULL || *args == NULL || **args == '\0')
254 {
255 std::string msg;
256
257 for (size_t i = 0; enums[i]; i++)
258 {
259 if (i != 0)
260 msg += ", ";
261 msg += enums[i];
262 }
263 error (_("Requires an argument. Valid arguments are %s."),
264 msg.c_str ());
265 }
266
267 const char *p = skip_to_space (*args);
268 size_t len = p - *args;
269
270 int nmatches = 0;
271 const char *match = NULL;
272 for (size_t i = 0; enums[i]; i++)
273 if (strncmp (*args, enums[i], len) == 0)
274 {
275 if (enums[i][len] == '\0')
276 {
277 match = enums[i];
278 nmatches = 1;
279 break; /* Exact match. */
280 }
281 else
282 {
283 match = enums[i];
284 nmatches++;
285 }
286 }
287
288 if (nmatches == 0)
289 error (_("Undefined item: \"%.*s\"."), (int) len, *args);
290
291 if (nmatches > 1)
292 error (_("Ambiguous item \"%.*s\"."), (int) len, *args);
293
294 *args += len;
295 return match;
296}
f81d1120 297
5b9afe8a 298/* Do a "set" command. ARG is NULL if no argument, or the
ebcd3b23
MS
299 text of the argument, and FROM_TTY is nonzero if this command is
300 being entered directly by the user (i.e. these are just like any
301 other command). C is the command list element for the command. */
d318976c
FN
302
303void
06900326 304do_set_command (const char *arg, int from_tty, struct cmd_list_element *c)
d318976c 305{
5b9afe8a
YQ
306 /* A flag to indicate the option is changed or not. */
307 int option_changed = 0;
308
309 gdb_assert (c->type == set_cmd);
79a45e25 310
fdbc9870
PA
311 if (arg == NULL)
312 arg = "";
313
5b9afe8a 314 switch (c->var_type)
d318976c 315 {
5b9afe8a
YQ
316 case var_string:
317 {
fe978cb0 318 char *newobj;
d7561cbb 319 const char *p;
5b9afe8a
YQ
320 char *q;
321 int ch;
322
fe978cb0 323 newobj = (char *) xmalloc (strlen (arg) + 2);
5b9afe8a 324 p = arg;
fe978cb0 325 q = newobj;
5b9afe8a 326 while ((ch = *p++) != '\000')
d318976c 327 {
5b9afe8a 328 if (ch == '\\')
d318976c 329 {
5b9afe8a
YQ
330 /* \ at end of argument is used after spaces
331 so they won't be lost. */
332 /* This is obsolete now that we no longer strip
333 trailing whitespace and actually, the backslash
334 didn't get here in my test, readline or
335 something did something funky with a backslash
336 right before a newline. */
337 if (*p == 0)
338 break;
339 ch = parse_escape (get_current_arch (), &p);
340 if (ch == 0)
341 break; /* C loses */
342 else if (ch > 0)
d318976c
FN
343 *q++ = ch;
344 }
5b9afe8a
YQ
345 else
346 *q++ = ch;
347 }
d318976c 348#if 0
5b9afe8a
YQ
349 if (*(p - 1) != '\\')
350 *q++ = ' ';
d318976c 351#endif
5b9afe8a 352 *q++ = '\0';
fe978cb0 353 newobj = (char *) xrealloc (newobj, q - newobj);
5b9afe8a
YQ
354
355 if (*(char **) c->var == NULL
fe978cb0 356 || strcmp (*(char **) c->var, newobj) != 0)
5b9afe8a 357 {
c24343e2 358 xfree (*(char **) c->var);
fe978cb0 359 *(char **) c->var = newobj;
5b9afe8a
YQ
360
361 option_changed = 1;
d318976c 362 }
5b9afe8a 363 else
fe978cb0 364 xfree (newobj);
5b9afe8a
YQ
365 }
366 break;
367 case var_string_noescape:
5b9afe8a
YQ
368 if (*(char **) c->var == NULL || strcmp (*(char **) c->var, arg) != 0)
369 {
c24343e2 370 xfree (*(char **) c->var);
1b36a34b 371 *(char **) c->var = xstrdup (arg);
cdb27c12 372
5b9afe8a
YQ
373 option_changed = 1;
374 }
375 break;
376 case var_filename:
fdbc9870 377 if (*arg == '\0')
5b9afe8a
YQ
378 error_no_arg (_("filename to set it to."));
379 /* FALLTHROUGH */
380 case var_optional_filename:
381 {
382 char *val = NULL;
6ace3df1 383
fdbc9870 384 if (*arg != '\0')
5b9afe8a
YQ
385 {
386 /* Clear trailing whitespace of filename. */
06900326
TT
387 const char *ptr = arg + strlen (arg) - 1;
388 char *copy;
6ace3df1 389
5b9afe8a
YQ
390 while (ptr >= arg && (*ptr == ' ' || *ptr == '\t'))
391 ptr--;
06900326 392 copy = xstrndup (arg, ptr + 1 - arg);
5b9afe8a 393
06900326
TT
394 val = tilde_expand (copy);
395 xfree (copy);
5b9afe8a
YQ
396 }
397 else
398 val = xstrdup ("");
399
400 if (*(char **) c->var == NULL
401 || strcmp (*(char **) c->var, val) != 0)
d318976c 402 {
5b9afe8a
YQ
403 xfree (*(char **) c->var);
404 *(char **) c->var = val;
405
406 option_changed = 1;
d318976c 407 }
5b9afe8a
YQ
408 else
409 xfree (val);
410 }
411 break;
412 case var_boolean:
413 {
bd712aed 414 int val = parse_cli_boolean_value (arg);
5b9afe8a 415
bd712aed
DE
416 if (val < 0)
417 error (_("\"on\" or \"off\" expected."));
5b9afe8a
YQ
418 if (val != *(int *) c->var)
419 {
420 *(int *) c->var = val;
421
422 option_changed = 1;
423 }
424 }
425 break;
426 case var_auto_boolean:
427 {
428 enum auto_boolean val = parse_auto_binary_operation (arg);
429
430 if (*(enum auto_boolean *) c->var != val)
431 {
432 *(enum auto_boolean *) c->var = val;
433
434 option_changed = 1;
435 }
436 }
437 break;
438 case var_uinteger:
439 case var_zuinteger:
5b9afe8a 440 {
9d0faba9 441 unsigned int val = parse_cli_var_uinteger (c->var_type, &arg, true);
5b9afe8a
YQ
442
443 if (*(unsigned int *) c->var != val)
444 {
445 *(unsigned int *) c->var = val;
446
447 option_changed = 1;
448 }
449 }
450 break;
451 case var_integer:
452 case var_zinteger:
453 {
ef0026f0 454 LONGEST val;
5b9afe8a 455
fdbc9870 456 if (*arg == '\0')
f81d1120
PA
457 {
458 if (c->var_type == var_integer)
459 error_no_arg (_("integer to set it to, or \"unlimited\"."));
460 else
461 error_no_arg (_("integer to set it to."));
462 }
463
4c048731 464 if (c->var_type == var_integer && is_unlimited_literal (&arg, true))
f81d1120
PA
465 val = 0;
466 else
467 val = parse_and_eval_long (arg);
ef0026f0 468
5b9afe8a
YQ
469 if (val == 0 && c->var_type == var_integer)
470 val = INT_MAX;
82b821e9
PA
471 else if (val < INT_MIN
472 /* For var_integer, don't let the user set the value
473 to INT_MAX directly, as that exposes an
474 implementation detail to the user interface. */
475 || (c->var_type == var_integer && val >= INT_MAX)
476 || (c->var_type == var_zinteger && val > INT_MAX))
ef0026f0 477 error (_("integer %s out of range"), plongest (val));
5b9afe8a
YQ
478
479 if (*(int *) c->var != val)
d318976c 480 {
5b9afe8a
YQ
481 *(int *) c->var = val;
482
483 option_changed = 1;
484 }
485 break;
486 }
487 case var_enum:
488 {
9d0faba9
PA
489 const char *end_arg = arg;
490 const char *match = parse_cli_var_enum (&end_arg, c->enums);
5b9afe8a 491
9d0faba9
PA
492 int len = end_arg - arg;
493 const char *after = skip_spaces (end_arg);
48c410fb
PA
494 if (*after != '\0')
495 error (_("Junk after item \"%.*s\": %s"), len, arg, after);
496
5b9afe8a
YQ
497 if (*(const char **) c->var != match)
498 {
d318976c 499 *(const char **) c->var = match;
5b9afe8a
YQ
500
501 option_changed = 1;
d318976c 502 }
5b9afe8a
YQ
503 }
504 break;
6fc1c773
YQ
505 case var_zuinteger_unlimited:
506 {
9d0faba9 507 int val = parse_cli_var_zuinteger_unlimited (&arg, true);
6fc1c773
YQ
508
509 if (*(int *) c->var != val)
510 {
511 *(int *) c->var = val;
512 option_changed = 1;
513 }
514 }
515 break;
5b9afe8a
YQ
516 default:
517 error (_("gdb internal error: bad var_type in do_setshow_command"));
d318976c 518 }
5b9afe8a 519 c->func (c, NULL, from_tty);
5b9afe8a
YQ
520
521 if (notify_command_param_changed_p (option_changed, c))
d318976c 522 {
5b9afe8a
YQ
523 char *name, *cp;
524 struct cmd_list_element **cmds;
525 struct cmd_list_element *p;
526 int i;
527 int length = 0;
528
529 /* Compute the whole multi-word command options. If user types command
530 'set foo bar baz on', c->name is 'baz', and GDB can't pass "bar" to
531 command option change notification, because it is confusing. We can
532 trace back through field 'prefix' to compute the whole options,
533 and pass "foo bar baz" to notification. */
534
535 for (i = 0, p = c; p != NULL; i++)
536 {
537 length += strlen (p->name);
538 length++;
539
540 p = p->prefix;
541 }
8d749320
SM
542 cp = name = (char *) xmalloc (length);
543 cmds = XNEWVEC (struct cmd_list_element *, i);
5b9afe8a
YQ
544
545 /* Track back through filed 'prefix' and cache them in CMDS. */
546 for (i = 0, p = c; p != NULL; i++)
547 {
548 cmds[i] = p;
549 p = p->prefix;
550 }
551
552 /* Don't trigger any observer notification if prefixlist is not
553 setlist. */
554 i--;
555 if (cmds[i]->prefixlist != &setlist)
556 {
557 xfree (cmds);
558 xfree (name);
559
560 return;
561 }
562 /* Traverse them in the reversed order, and copy their names into
563 NAME. */
564 for (i--; i >= 0; i--)
565 {
566 memcpy (cp, cmds[i]->name, strlen (cmds[i]->name));
567 cp += strlen (cmds[i]->name);
d318976c 568
5b9afe8a
YQ
569 if (i != 0)
570 {
571 cp[0] = ' ';
572 cp++;
573 }
574 }
575 cp[0] = 0;
d318976c 576
5b9afe8a 577 xfree (cmds);
552c04a7 578
d318976c
FN
579 switch (c->var_type)
580 {
581 case var_string:
d318976c
FN
582 case var_string_noescape:
583 case var_filename:
5b9afe8a 584 case var_optional_filename:
d318976c 585 case var_enum:
76727919 586 gdb::observers::command_param_changed.notify (name, *(char **) c->var);
d318976c
FN
587 break;
588 case var_boolean:
5b9afe8a 589 {
e6a959d6 590 const char *opt = *(int *) c->var ? "on" : "off";
5b9afe8a 591
76727919 592 gdb::observers::command_param_changed.notify (name, opt);
5b9afe8a 593 }
d318976c
FN
594 break;
595 case var_auto_boolean:
5b9afe8a
YQ
596 {
597 const char *s = auto_boolean_enums[*(enum auto_boolean *) c->var];
598
76727919 599 gdb::observers::command_param_changed.notify (name, s);
5b9afe8a 600 }
d318976c
FN
601 break;
602 case var_uinteger:
1e8fb976 603 case var_zuinteger:
5b9afe8a
YQ
604 {
605 char s[64];
606
607 xsnprintf (s, sizeof s, "%u", *(unsigned int *) c->var);
76727919 608 gdb::observers::command_param_changed.notify (name, s);
5b9afe8a 609 }
d318976c
FN
610 break;
611 case var_integer:
a40a111f 612 case var_zinteger:
6fc1c773 613 case var_zuinteger_unlimited:
5b9afe8a
YQ
614 {
615 char s[64];
d318976c 616
5b9afe8a 617 xsnprintf (s, sizeof s, "%d", *(int *) c->var);
76727919 618 gdb::observers::command_param_changed.notify (name, s);
5b9afe8a
YQ
619 }
620 break;
d318976c 621 }
5b9afe8a
YQ
622 xfree (name);
623 }
624}
899506a8 625
fdbc9870 626/* See cli/cli-setshow.h. */
899506a8 627
fdbc9870
PA
628std::string
629get_setshow_command_value_string (cmd_list_element *c)
5b9afe8a 630{
d7e74731 631 string_file stb;
cdb27c12 632
5b9afe8a
YQ
633 switch (c->var_type)
634 {
635 case var_string:
636 if (*(char **) c->var)
d7e74731 637 stb.putstr (*(char **) c->var, '"');
5b9afe8a
YQ
638 break;
639 case var_string_noescape:
640 case var_optional_filename:
641 case var_filename:
642 case var_enum:
643 if (*(char **) c->var)
d7e74731 644 stb.puts (*(char **) c->var);
5b9afe8a
YQ
645 break;
646 case var_boolean:
d7e74731 647 stb.puts (*(int *) c->var ? "on" : "off");
5b9afe8a
YQ
648 break;
649 case var_auto_boolean:
650 switch (*(enum auto_boolean*) c->var)
651 {
652 case AUTO_BOOLEAN_TRUE:
d7e74731 653 stb.puts ("on");
5b9afe8a
YQ
654 break;
655 case AUTO_BOOLEAN_FALSE:
d7e74731 656 stb.puts ("off");
5b9afe8a
YQ
657 break;
658 case AUTO_BOOLEAN_AUTO:
d7e74731 659 stb.puts ("auto");
5b9afe8a
YQ
660 break;
661 default:
fdbc9870 662 gdb_assert_not_reached ("invalid var_auto_boolean");
5b9afe8a 663 break;
899506a8 664 }
5b9afe8a
YQ
665 break;
666 case var_uinteger:
667 case var_zuinteger:
668 if (c->var_type == var_uinteger
669 && *(unsigned int *) c->var == UINT_MAX)
d7e74731 670 stb.puts ("unlimited");
5b9afe8a 671 else
d7e74731 672 stb.printf ("%u", *(unsigned int *) c->var);
5b9afe8a
YQ
673 break;
674 case var_integer:
675 case var_zinteger:
676 if (c->var_type == var_integer
677 && *(int *) c->var == INT_MAX)
d7e74731 678 stb.puts ("unlimited");
5b9afe8a 679 else
d7e74731 680 stb.printf ("%d", *(int *) c->var);
5b9afe8a 681 break;
6fc1c773
YQ
682 case var_zuinteger_unlimited:
683 {
684 if (*(int *) c->var == -1)
d7e74731 685 stb.puts ("unlimited");
6fc1c773 686 else
d7e74731 687 stb.printf ("%d", *(int *) c->var);
6fc1c773
YQ
688 }
689 break;
5b9afe8a 690 default:
fdbc9870 691 gdb_assert_not_reached ("bad var_type");
d318976c 692 }
5b9afe8a 693
fdbc9870
PA
694 return std::move (stb.string ());
695}
696
697
698/* Do a "show" command. ARG is NULL if no argument, or the
699 text of the argument, and FROM_TTY is nonzero if this command is
700 being entered directly by the user (i.e. these are just like any
701 other command). C is the command list element for the command. */
702
703void
704do_show_command (const char *arg, int from_tty, struct cmd_list_element *c)
705{
706 struct ui_out *uiout = current_uiout;
707
708 gdb_assert (c->type == show_cmd);
709
710 /* Possibly call the pre hook. */
711 if (c->pre_show_hook)
712 (c->pre_show_hook) (c);
713
714 std::string val = get_setshow_command_value_string (c);
5b9afe8a 715
fdbc9870
PA
716 /* FIXME: cagney/2005-02-10: There should be MI and CLI specific
717 versions of code to print the value out. */
5b9afe8a 718
112e8700 719 if (uiout->is_mi_like_p ())
fdbc9870 720 uiout->field_string ("value", val.c_str ());
d318976c 721 else
5b9afe8a 722 {
5b9afe8a 723 if (c->show_value_func != NULL)
fdbc9870 724 c->show_value_func (gdb_stdout, from_tty, c, val.c_str ());
5b9afe8a 725 else
fdbc9870 726 deprecated_show_value_hack (gdb_stdout, from_tty, c, val.c_str ());
5b9afe8a 727 }
5b9afe8a 728
9f60d481 729 c->func (c, NULL, from_tty);
d318976c
FN
730}
731
732/* Show all the settings in a list of show commands. */
733
734void
64e61d29 735cmd_show_list (struct cmd_list_element *list, int from_tty, const char *prefix)
d318976c 736{
79a45e25 737 struct ui_out *uiout = current_uiout;
3b31d625 738
2e783024 739 ui_out_emit_tuple tuple_emitter (uiout, "showlist");
d318976c
FN
740 for (; list != NULL; list = list->next)
741 {
742 /* If we find a prefix, run its list, prefixing our output by its
743 prefix (with "show " skipped). */
d318976c
FN
744 if (list->prefixlist && !list->abbrev_flag)
745 {
2e783024 746 ui_out_emit_tuple optionlist_emitter (uiout, "optionlist");
acaa662f 747 const char *new_prefix = strstr (list->prefixname, "show ") + 5;
cdb27c12 748
112e8700
SM
749 if (uiout->is_mi_like_p ())
750 uiout->field_string ("prefix", new_prefix);
37fc812e 751 cmd_show_list (*list->prefixlist, from_tty, new_prefix);
d318976c 752 }
427c3a89 753 else
d318976c 754 {
fe978cb0 755 if (list->theclass != no_set_class)
db5f229b 756 {
2e783024 757 ui_out_emit_tuple option_emitter (uiout, "option");
db5f229b 758
112e8700
SM
759 uiout->text (prefix);
760 uiout->field_string ("name", list->name);
761 uiout->text (": ");
db5f229b 762 if (list->type == show_cmd)
cafb3438 763 do_show_command (NULL, from_tty, list);
db5f229b
MS
764 else
765 cmd_func (list, NULL, from_tty);
db5f229b 766 }
d318976c 767 }
d318976c 768 }
d318976c
FN
769}
770
This page took 1.213487 seconds and 4 git commands to generate.