95ebbe7b65d860108703285ea957a9207cdf6844
[external/binutils.git] / gdb / cli / cli-setshow.c
1 /* Handle set and show GDB commands.
2
3    Copyright (C) 2000-2013 Free Software Foundation, Inc.
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
7    the Free Software Foundation; either version 3 of the License, or
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
16    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
17
18 #include "defs.h"
19 #include "readline/tilde.h"
20 #include "value.h"
21 #include <ctype.h>
22 #include "gdb_string.h"
23 #include "arch-utils.h"
24 #include "observer.h"
25
26 #include "ui-out.h"
27
28 #include "cli/cli-decode.h"
29 #include "cli/cli-cmds.h"
30 #include "cli/cli-setshow.h"
31
32 /* Return true if the change of command parameter should be notified.  */
33
34 static int
35 notify_command_param_changed_p (int param_changed, struct cmd_list_element *c)
36 {
37   if (param_changed == 0)
38     return 0;
39
40   if (c->class == class_maintenance || c->class == class_deprecated
41       || c->class == class_obscure)
42     return 0;
43
44   return 1;
45 }
46
47 \f
48 static enum auto_boolean
49 parse_auto_binary_operation (const char *arg)
50 {
51   if (arg != NULL && *arg != '\0')
52     {
53       int length = strlen (arg);
54
55       while (isspace (arg[length - 1]) && length > 0)
56         length--;
57       if (strncmp (arg, "on", length) == 0
58           || strncmp (arg, "1", length) == 0
59           || strncmp (arg, "yes", length) == 0
60           || strncmp (arg, "enable", length) == 0)
61         return AUTO_BOOLEAN_TRUE;
62       else if (strncmp (arg, "off", length) == 0
63                || strncmp (arg, "0", length) == 0
64                || strncmp (arg, "no", length) == 0
65                || strncmp (arg, "disable", length) == 0)
66         return AUTO_BOOLEAN_FALSE;
67       else if (strncmp (arg, "auto", length) == 0
68                || (strncmp (arg, "-1", length) == 0 && length > 1))
69         return AUTO_BOOLEAN_AUTO;
70     }
71   error (_("\"on\", \"off\" or \"auto\" expected."));
72   return AUTO_BOOLEAN_AUTO; /* Pacify GCC.  */
73 }
74
75 /* See cli-setshow.h.  */
76
77 int
78 parse_cli_boolean_value (char *arg)
79 {
80   int length;
81
82   if (!arg || !*arg)
83     return 1;
84
85   length = strlen (arg);
86
87   while (arg[length - 1] == ' ' || arg[length - 1] == '\t')
88     length--;
89
90   if (strncmp (arg, "on", length) == 0
91       || strncmp (arg, "1", length) == 0
92       || strncmp (arg, "yes", length) == 0
93       || strncmp (arg, "enable", length) == 0)
94     return 1;
95   else if (strncmp (arg, "off", length) == 0
96            || strncmp (arg, "0", length) == 0
97            || strncmp (arg, "no", length) == 0
98            || strncmp (arg, "disable", length) == 0)
99     return 0;
100   else
101     return -1;
102 }
103 \f
104 void
105 deprecated_show_value_hack (struct ui_file *ignore_file,
106                             int ignore_from_tty,
107                             struct cmd_list_element *c,
108                             const char *value)
109 {
110   /* If there's no command or value, don't try to print it out.  */
111   if (c == NULL || value == NULL)
112     return;
113   /* Print doc minus "show" at start.  */
114   print_doc_line (gdb_stdout, c->doc + 5);
115   switch (c->var_type)
116     {
117     case var_string:
118     case var_string_noescape:
119     case var_optional_filename:
120     case var_filename:
121     case var_enum:
122       printf_filtered ((" is \"%s\".\n"), value);
123       break;
124     default:
125       printf_filtered ((" is %s.\n"), value);
126       break;
127     }
128 }
129
130 /* Do a "set" command.  ARG is NULL if no argument, or the
131    text of the argument, and FROM_TTY is nonzero if this command is
132    being entered directly by the user (i.e. these are just like any
133    other command).  C is the command list element for the command.  */
134
135 void
136 do_set_command (char *arg, int from_tty, struct cmd_list_element *c)
137 {
138   /* A flag to indicate the option is changed or not.  */
139   int option_changed = 0;
140
141   gdb_assert (c->type == set_cmd);
142
143   switch (c->var_type)
144     {
145     case var_string:
146       {
147         char *new;
148         char *p;
149         char *q;
150         int ch;
151
152         if (arg == NULL)
153           arg = "";
154         new = (char *) xmalloc (strlen (arg) + 2);
155         p = arg;
156         q = new;
157         while ((ch = *p++) != '\000')
158           {
159             if (ch == '\\')
160               {
161                 /* \ at end of argument is used after spaces
162                    so they won't be lost.  */
163                 /* This is obsolete now that we no longer strip
164                    trailing whitespace and actually, the backslash
165                    didn't get here in my test, readline or
166                    something did something funky with a backslash
167                    right before a newline.  */
168                 if (*p == 0)
169                   break;
170                 ch = parse_escape (get_current_arch (), &p);
171                 if (ch == 0)
172                   break;        /* C loses */
173                 else if (ch > 0)
174                   *q++ = ch;
175               }
176             else
177               *q++ = ch;
178           }
179 #if 0
180         if (*(p - 1) != '\\')
181           *q++ = ' ';
182 #endif
183         *q++ = '\0';
184         new = (char *) xrealloc (new, q - new);
185
186         if (*(char **) c->var == NULL
187             || strcmp (*(char **) c->var, new) != 0)
188           {
189             xfree (*(char **) c->var);
190             *(char **) c->var = new;
191
192             option_changed = 1;
193           }
194         else
195           xfree (new);
196       }
197       break;
198     case var_string_noescape:
199       if (arg == NULL)
200         arg = "";
201
202       if (*(char **) c->var == NULL || strcmp (*(char **) c->var, arg) != 0)
203         {
204           xfree (*(char **) c->var);
205           *(char **) c->var = xstrdup (arg);
206
207           option_changed = 1;
208         }
209       break;
210     case var_filename:
211       if (arg == NULL)
212         error_no_arg (_("filename to set it to."));
213       /* FALLTHROUGH */
214     case var_optional_filename:
215       {
216         char *val = NULL;
217
218         if (arg != NULL)
219           {
220             /* Clear trailing whitespace of filename.  */
221             char *ptr = arg + strlen (arg) - 1;
222
223             while (ptr >= arg && (*ptr == ' ' || *ptr == '\t'))
224               ptr--;
225             *(ptr + 1) = '\0';
226
227             val = tilde_expand (arg);
228           }
229         else
230           val = xstrdup ("");
231
232         if (*(char **) c->var == NULL
233             || strcmp (*(char **) c->var, val) != 0)
234           {
235             xfree (*(char **) c->var);
236             *(char **) c->var = val;
237
238             option_changed = 1;
239           }
240         else
241           xfree (val);
242       }
243       break;
244     case var_boolean:
245       {
246         int val = parse_cli_boolean_value (arg);
247
248         if (val < 0)
249           error (_("\"on\" or \"off\" expected."));
250         if (val != *(int *) c->var)
251           {
252             *(int *) c->var = val;
253
254             option_changed = 1;
255           }
256       }
257       break;
258     case var_auto_boolean:
259       {
260         enum auto_boolean val = parse_auto_binary_operation (arg);
261
262         if (*(enum auto_boolean *) c->var != val)
263           {
264             *(enum auto_boolean *) c->var = val;
265
266             option_changed = 1;
267           }
268       }
269       break;
270     case var_uinteger:
271     case var_zuinteger:
272       {
273         LONGEST val;
274
275         if (arg == NULL)
276           error_no_arg (_("integer to set it to."));
277         val = parse_and_eval_long (arg);
278
279         if (c->var_type == var_uinteger && val == 0)
280           val = UINT_MAX;
281         else if (val > UINT_MAX)
282           error (_("integer %s out of range"), plongest (val));
283
284         if (*(unsigned int *) c->var != val)
285           {
286             *(unsigned int *) c->var = val;
287
288             option_changed = 1;
289           }
290       }
291       break;
292     case var_integer:
293     case var_zinteger:
294       {
295         LONGEST val;
296
297         if (arg == NULL)
298           error_no_arg (_("integer to set it to."));
299         val = parse_and_eval_long (arg);
300
301         if (val == 0 && c->var_type == var_integer)
302           val = INT_MAX;
303         else if (val > INT_MAX || val < INT_MIN)
304           error (_("integer %s out of range"), plongest (val));
305
306         if (*(int *) c->var != val)
307           {
308             *(int *) c->var = val;
309
310             option_changed = 1;
311           }
312         break;
313       }
314     case var_enum:
315       {
316         int i;
317         int len;
318         int nmatches;
319         const char *match = NULL;
320         char *p;
321
322         /* If no argument was supplied, print an informative error
323            message.  */
324         if (arg == NULL)
325           {
326             char *msg;
327             int msg_len = 0;
328
329             for (i = 0; c->enums[i]; i++)
330               msg_len += strlen (c->enums[i]) + 2;
331
332             msg = xmalloc (msg_len);
333             *msg = '\0';
334             make_cleanup (xfree, msg);
335
336             for (i = 0; c->enums[i]; i++)
337               {
338                 if (i != 0)
339                   strcat (msg, ", ");
340                 strcat (msg, c->enums[i]);
341               }
342             error (_("Requires an argument. Valid arguments are %s."), 
343                    msg);
344           }
345
346         p = strchr (arg, ' ');
347
348         if (p)
349           len = p - arg;
350         else
351           len = strlen (arg);
352
353         nmatches = 0;
354         for (i = 0; c->enums[i]; i++)
355           if (strncmp (arg, c->enums[i], len) == 0)
356             {
357               if (c->enums[i][len] == '\0')
358                 {
359                   match = c->enums[i];
360                   nmatches = 1;
361                   break; /* Exact match.  */
362                 }
363               else
364                 {
365                   match = c->enums[i];
366                   nmatches++;
367                 }
368             }
369
370         if (nmatches <= 0)
371           error (_("Undefined item: \"%s\"."), arg);
372
373         if (nmatches > 1)
374           error (_("Ambiguous item \"%s\"."), arg);
375
376         if (*(const char **) c->var != match)
377           {
378             *(const char **) c->var = match;
379
380             option_changed = 1;
381           }
382       }
383       break;
384     case var_zuinteger_unlimited:
385       {
386         LONGEST val;
387
388         if (arg == NULL)
389           error_no_arg (_("integer to set it to."));
390         val = parse_and_eval_long (arg);
391
392         if (val > INT_MAX)
393           error (_("integer %s out of range"), plongest (val));
394         else if (val < -1)
395           error (_("only -1 is allowed to set as unlimited"));
396
397         if (*(int *) c->var != val)
398           {
399             *(int *) c->var = val;
400             option_changed = 1;
401           }
402       }
403       break;
404     default:
405       error (_("gdb internal error: bad var_type in do_setshow_command"));
406     }
407   c->func (c, NULL, from_tty);
408   if (deprecated_set_hook)
409     deprecated_set_hook (c);
410
411   if (notify_command_param_changed_p (option_changed, c))
412     {
413       char *name, *cp;
414       struct cmd_list_element **cmds;
415       struct cmd_list_element *p;
416       int i;
417       int length = 0;
418
419       /* Compute the whole multi-word command options.  If user types command
420          'set foo bar baz on', c->name is 'baz', and GDB can't pass "bar" to
421          command option change notification, because it is confusing.  We can
422          trace back through field 'prefix' to compute the whole options,
423          and pass "foo bar baz" to notification.  */
424
425       for (i = 0, p = c; p != NULL; i++)
426         {
427           length += strlen (p->name);
428           length++;
429
430           p = p->prefix;
431         }
432       cp = name = xmalloc (length);
433       cmds = xmalloc (sizeof (struct cmd_list_element *) * i);
434
435       /* Track back through filed 'prefix' and cache them in CMDS.  */
436       for (i = 0, p = c; p != NULL; i++)
437         {
438           cmds[i] = p;
439           p = p->prefix;
440         }
441
442       /* Don't trigger any observer notification if prefixlist is not
443          setlist.  */
444       i--;
445       if (cmds[i]->prefixlist != &setlist)
446         {
447           xfree (cmds);
448           xfree (name);
449
450           return;
451         }
452       /* Traverse them in the reversed order, and copy their names into
453          NAME.  */
454       for (i--; i >= 0; i--)
455         {
456           memcpy (cp, cmds[i]->name, strlen (cmds[i]->name));
457           cp += strlen (cmds[i]->name);
458
459           if (i != 0)
460             {
461               cp[0] = ' ';
462               cp++;
463             }
464         }
465       cp[0] = 0;
466
467       xfree (cmds);
468
469       switch (c->var_type)
470         {
471         case var_string:
472         case var_string_noescape:
473         case var_filename:
474         case var_optional_filename:
475         case var_enum:
476           observer_notify_command_param_changed (name, *(char **) c->var);
477           break;
478         case var_boolean:
479           {
480             char *opt = *(int *) c->var ? "on" : "off";
481
482             observer_notify_command_param_changed (name, opt);
483           }
484           break;
485         case var_auto_boolean:
486           {
487             const char *s = auto_boolean_enums[*(enum auto_boolean *) c->var];
488
489             observer_notify_command_param_changed (name, s);
490           }
491           break;
492         case var_uinteger:
493         case var_zuinteger:
494           {
495             char s[64];
496
497             xsnprintf (s, sizeof s, "%u", *(unsigned int *) c->var);
498             observer_notify_command_param_changed (name, s);
499           }
500           break;
501         case var_integer:
502         case var_zinteger:
503         case var_zuinteger_unlimited:
504           {
505             char s[64];
506
507             xsnprintf (s, sizeof s, "%d", *(int *) c->var);
508             observer_notify_command_param_changed (name, s);
509           }
510           break;
511         }
512       xfree (name);
513     }
514 }
515
516 /* Do a "show" command.  ARG is NULL if no argument, or the
517    text of the argument, and FROM_TTY is nonzero if this command is
518    being entered directly by the user (i.e. these are just like any
519    other command).  C is the command list element for the command.  */
520
521 void
522 do_show_command (char *arg, int from_tty, struct cmd_list_element *c)
523 {
524   struct ui_out *uiout = current_uiout;
525   struct cleanup *old_chain;
526   struct ui_file *stb;
527
528   gdb_assert (c->type == show_cmd);
529
530   stb = mem_fileopen ();
531   old_chain = make_cleanup_ui_file_delete (stb);
532
533   /* Possibly call the pre hook.  */
534   if (c->pre_show_hook)
535     (c->pre_show_hook) (c);
536
537   switch (c->var_type)
538     {
539     case var_string:
540       if (*(char **) c->var)
541         fputstr_filtered (*(char **) c->var, '"', stb);
542       break;
543     case var_string_noescape:
544     case var_optional_filename:
545     case var_filename:
546     case var_enum:
547       if (*(char **) c->var)
548         fputs_filtered (*(char **) c->var, stb);
549       break;
550     case var_boolean:
551       fputs_filtered (*(int *) c->var ? "on" : "off", stb);
552       break;
553     case var_auto_boolean:
554       switch (*(enum auto_boolean*) c->var)
555         {
556         case AUTO_BOOLEAN_TRUE:
557           fputs_filtered ("on", stb);
558           break;
559         case AUTO_BOOLEAN_FALSE:
560           fputs_filtered ("off", stb);
561           break;
562         case AUTO_BOOLEAN_AUTO:
563           fputs_filtered ("auto", stb);
564           break;
565         default:
566           internal_error (__FILE__, __LINE__,
567                           _("do_show_command: "
568                             "invalid var_auto_boolean"));
569           break;
570         }
571       break;
572     case var_uinteger:
573     case var_zuinteger:
574       if (c->var_type == var_uinteger
575           && *(unsigned int *) c->var == UINT_MAX)
576         fputs_filtered ("unlimited", stb);
577       else
578         fprintf_filtered (stb, "%u", *(unsigned int *) c->var);
579       break;
580     case var_integer:
581     case var_zinteger:
582       if (c->var_type == var_integer
583           && *(int *) c->var == INT_MAX)
584         fputs_filtered ("unlimited", stb);
585       else
586         fprintf_filtered (stb, "%d", *(int *) c->var);
587       break;
588     case var_zuinteger_unlimited:
589       {
590         if (*(int *) c->var == -1)
591           fputs_filtered ("unlimited", stb);
592         else
593           fprintf_filtered (stb, "%d", *(int *) c->var);
594       }
595       break;
596     default:
597       error (_("gdb internal error: bad var_type in do_show_command"));
598     }
599
600
601   /* FIXME: cagney/2005-02-10: Need to split this in half: code to
602      convert the value into a string (esentially the above); and
603      code to print the value out.  For the latter there should be
604      MI and CLI specific versions.  */
605
606   if (ui_out_is_mi_like_p (uiout))
607     ui_out_field_stream (uiout, "value", stb);
608   else
609     {
610       char *value = ui_file_xstrdup (stb, NULL);
611
612       make_cleanup (xfree, value);
613       if (c->show_value_func != NULL)
614         c->show_value_func (gdb_stdout, from_tty, c, value);
615       else
616         deprecated_show_value_hack (gdb_stdout, from_tty, c, value);
617     }
618   do_cleanups (old_chain);
619
620   c->func (c, NULL, from_tty);
621 }
622
623 /* Show all the settings in a list of show commands.  */
624
625 void
626 cmd_show_list (struct cmd_list_element *list, int from_tty, char *prefix)
627 {
628   struct cleanup *showlist_chain;
629   struct ui_out *uiout = current_uiout;
630
631   showlist_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "showlist");
632   for (; list != NULL; list = list->next)
633     {
634       /* If we find a prefix, run its list, prefixing our output by its
635          prefix (with "show " skipped).  */
636       if (list->prefixlist && !list->abbrev_flag)
637         {
638           struct cleanup *optionlist_chain
639             = make_cleanup_ui_out_tuple_begin_end (uiout, "optionlist");
640           char *new_prefix = strstr (list->prefixname, "show ") + 5;
641
642           if (ui_out_is_mi_like_p (uiout))
643             ui_out_field_string (uiout, "prefix", new_prefix);
644           cmd_show_list (*list->prefixlist, from_tty, new_prefix);
645           /* Close the tuple.  */
646           do_cleanups (optionlist_chain);
647         }
648       else
649         {
650           if (list->class != no_set_class)
651             {
652               struct cleanup *option_chain
653                 = make_cleanup_ui_out_tuple_begin_end (uiout, "option");
654
655               ui_out_text (uiout, prefix);
656               ui_out_field_string (uiout, "name", list->name);
657               ui_out_text (uiout, ":  ");
658               if (list->type == show_cmd)
659                 do_show_command ((char *) NULL, from_tty, list);
660               else
661                 cmd_func (list, NULL, from_tty);
662               /* Close the tuple.  */
663               do_cleanups (option_chain);
664             }
665         }
666     }
667   /* Close the tuple.  */
668   do_cleanups (showlist_chain);
669 }
670