gdb/cli/cli-setshow.c - gdb

Functions defined

Source code

  1. /* Handle set and show GDB commands.

  2.    Copyright (C) 2000-2015 Free Software Foundation, Inc.

  3.    This program is free software; you can redistribute it and/or modify
  4.    it under the terms of the GNU General Public License as published by
  5.    the Free Software Foundation; either version 3 of the License, or
  6.    (at your option) any later version.

  7.    This program is distributed in the hope that it will be useful,
  8.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  9.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  10.    GNU General Public License for more details.

  11.    You should have received a copy of the GNU General Public License
  12.    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */

  13. #include "defs.h"
  14. #include "readline/tilde.h"
  15. #include "value.h"
  16. #include <ctype.h>
  17. #include "arch-utils.h"
  18. #include "observer.h"

  19. #include "ui-out.h"

  20. #include "cli/cli-decode.h"
  21. #include "cli/cli-cmds.h"
  22. #include "cli/cli-setshow.h"
  23. #include "cli/cli-utils.h"

  24. /* Return true if the change of command parameter should be notified.  */

  25. static int
  26. notify_command_param_changed_p (int param_changed, struct cmd_list_element *c)
  27. {
  28.   if (param_changed == 0)
  29.     return 0;

  30.   if (c->class == class_maintenance || c->class == class_deprecated
  31.       || c->class == class_obscure)
  32.     return 0;

  33.   return 1;
  34. }


  35. static enum auto_boolean
  36. parse_auto_binary_operation (const char *arg)
  37. {
  38.   if (arg != NULL && *arg != '\0')
  39.     {
  40.       int length = strlen (arg);

  41.       while (isspace (arg[length - 1]) && length > 0)
  42.         length--;
  43.       if (strncmp (arg, "on", length) == 0
  44.           || strncmp (arg, "1", length) == 0
  45.           || strncmp (arg, "yes", length) == 0
  46.           || strncmp (arg, "enable", length) == 0)
  47.         return AUTO_BOOLEAN_TRUE;
  48.       else if (strncmp (arg, "off", length) == 0
  49.                || strncmp (arg, "0", length) == 0
  50.                || strncmp (arg, "no", length) == 0
  51.                || strncmp (arg, "disable", length) == 0)
  52.         return AUTO_BOOLEAN_FALSE;
  53.       else if (strncmp (arg, "auto", length) == 0
  54.                || (strncmp (arg, "-1", length) == 0 && length > 1))
  55.         return AUTO_BOOLEAN_AUTO;
  56.     }
  57.   error (_("\"on\", \"off\" or \"auto\" expected."));
  58.   return AUTO_BOOLEAN_AUTO; /* Pacify GCC.  */
  59. }

  60. /* See cli-setshow.h.  */

  61. int
  62. parse_cli_boolean_value (const char *arg)
  63. {
  64.   int length;

  65.   if (!arg || !*arg)
  66.     return 1;

  67.   length = strlen (arg);

  68.   while (arg[length - 1] == ' ' || arg[length - 1] == '\t')
  69.     length--;

  70.   if (strncmp (arg, "on", length) == 0
  71.       || strncmp (arg, "1", length) == 0
  72.       || strncmp (arg, "yes", length) == 0
  73.       || strncmp (arg, "enable", length) == 0)
  74.     return 1;
  75.   else if (strncmp (arg, "off", length) == 0
  76.            || strncmp (arg, "0", length) == 0
  77.            || strncmp (arg, "no", length) == 0
  78.            || strncmp (arg, "disable", length) == 0)
  79.     return 0;
  80.   else
  81.     return -1;
  82. }

  83. void
  84. deprecated_show_value_hack (struct ui_file *ignore_file,
  85.                             int ignore_from_tty,
  86.                             struct cmd_list_element *c,
  87.                             const char *value)
  88. {
  89.   /* If there's no command or value, don't try to print it out.  */
  90.   if (c == NULL || value == NULL)
  91.     return;
  92.   /* Print doc minus "show" at start.  */
  93.   print_doc_line (gdb_stdout, c->doc + 5);
  94.   switch (c->var_type)
  95.     {
  96.     case var_string:
  97.     case var_string_noescape:
  98.     case var_optional_filename:
  99.     case var_filename:
  100.     case var_enum:
  101.       printf_filtered ((" is \"%s\".\n"), value);
  102.       break;
  103.     default:
  104.       printf_filtered ((" is %s.\n"), value);
  105.       break;
  106.     }
  107. }

  108. /* Returns true if ARG is "unlimited".  */

  109. static int
  110. is_unlimited_literal (const char *arg)
  111. {
  112.   size_t len = sizeof ("unlimited") - 1;

  113.   arg = skip_spaces_const (arg);

  114.   return (strncmp (arg, "unlimited", len) == 0
  115.           && (isspace (arg[len]) || arg[len] == '\0'));
  116. }


  117. /* Do a "set" command.  ARG is NULL if no argument, or the
  118.    text of the argument, and FROM_TTY is nonzero if this command is
  119.    being entered directly by the user (i.e. these are just like any
  120.    other command).  C is the command list element for the command.  */

  121. void
  122. do_set_command (const char *arg, int from_tty, struct cmd_list_element *c)
  123. {
  124.   /* A flag to indicate the option is changed or not.  */
  125.   int option_changed = 0;

  126.   gdb_assert (c->type == set_cmd);

  127.   switch (c->var_type)
  128.     {
  129.     case var_string:
  130.       {
  131.         char *new;
  132.         const char *p;
  133.         char *q;
  134.         int ch;

  135.         if (arg == NULL)
  136.           arg = "";
  137.         new = (char *) xmalloc (strlen (arg) + 2);
  138.         p = arg;
  139.         q = new;
  140.         while ((ch = *p++) != '\000')
  141.           {
  142.             if (ch == '\\')
  143.               {
  144.                 /* \ at end of argument is used after spaces
  145.                    so they won't be lost.  */
  146.                 /* This is obsolete now that we no longer strip
  147.                    trailing whitespace and actually, the backslash
  148.                    didn't get here in my test, readline or
  149.                    something did something funky with a backslash
  150.                    right before a newline.  */
  151.                 if (*p == 0)
  152.                   break;
  153.                 ch = parse_escape (get_current_arch (), &p);
  154.                 if (ch == 0)
  155.                   break;        /* C loses */
  156.                 else if (ch > 0)
  157.                   *q++ = ch;
  158.               }
  159.             else
  160.               *q++ = ch;
  161.           }
  162. #if 0
  163.         if (*(p - 1) != '\\')
  164.           *q++ = ' ';
  165. #endif
  166.         *q++ = '\0';
  167.         new = (char *) xrealloc (new, q - new);

  168.         if (*(char **) c->var == NULL
  169.             || strcmp (*(char **) c->var, new) != 0)
  170.           {
  171.             xfree (*(char **) c->var);
  172.             *(char **) c->var = new;

  173.             option_changed = 1;
  174.           }
  175.         else
  176.           xfree (new);
  177.       }
  178.       break;
  179.     case var_string_noescape:
  180.       if (arg == NULL)
  181.         arg = "";

  182.       if (*(char **) c->var == NULL || strcmp (*(char **) c->var, arg) != 0)
  183.         {
  184.           xfree (*(char **) c->var);
  185.           *(char **) c->var = xstrdup (arg);

  186.           option_changed = 1;
  187.         }
  188.       break;
  189.     case var_filename:
  190.       if (arg == NULL)
  191.         error_no_arg (_("filename to set it to."));
  192.       /* FALLTHROUGH */
  193.     case var_optional_filename:
  194.       {
  195.         char *val = NULL;

  196.         if (arg != NULL)
  197.           {
  198.             /* Clear trailing whitespace of filename.  */
  199.             const char *ptr = arg + strlen (arg) - 1;
  200.             char *copy;

  201.             while (ptr >= arg && (*ptr == ' ' || *ptr == '\t'))
  202.               ptr--;
  203.             copy = xstrndup (arg, ptr + 1 - arg);

  204.             val = tilde_expand (copy);
  205.             xfree (copy);
  206.           }
  207.         else
  208.           val = xstrdup ("");

  209.         if (*(char **) c->var == NULL
  210.             || strcmp (*(char **) c->var, val) != 0)
  211.           {
  212.             xfree (*(char **) c->var);
  213.             *(char **) c->var = val;

  214.             option_changed = 1;
  215.           }
  216.         else
  217.           xfree (val);
  218.       }
  219.       break;
  220.     case var_boolean:
  221.       {
  222.         int val = parse_cli_boolean_value (arg);

  223.         if (val < 0)
  224.           error (_("\"on\" or \"off\" expected."));
  225.         if (val != *(int *) c->var)
  226.           {
  227.             *(int *) c->var = val;

  228.             option_changed = 1;
  229.           }
  230.       }
  231.       break;
  232.     case var_auto_boolean:
  233.       {
  234.         enum auto_boolean val = parse_auto_binary_operation (arg);

  235.         if (*(enum auto_boolean *) c->var != val)
  236.           {
  237.             *(enum auto_boolean *) c->var = val;

  238.             option_changed = 1;
  239.           }
  240.       }
  241.       break;
  242.     case var_uinteger:
  243.     case var_zuinteger:
  244.       {
  245.         LONGEST val;

  246.         if (arg == NULL)
  247.           {
  248.             if (c->var_type == var_uinteger)
  249.               error_no_arg (_("integer to set it to, or \"unlimited\"."));
  250.             else
  251.               error_no_arg (_("integer to set it to."));
  252.           }

  253.         if (c->var_type == var_uinteger && is_unlimited_literal (arg))
  254.           val = 0;
  255.         else
  256.           val = parse_and_eval_long (arg);

  257.         if (c->var_type == var_uinteger && val == 0)
  258.           val = UINT_MAX;
  259.         else if (val < 0
  260.                  /* For var_uinteger, don't let the user set the value
  261.                     to UINT_MAX directly, as that exposes an
  262.                     implementation detail to the user interface.  */
  263.                  || (c->var_type == var_uinteger && val >= UINT_MAX)
  264.                  || (c->var_type == var_zuinteger && val > UINT_MAX))
  265.           error (_("integer %s out of range"), plongest (val));

  266.         if (*(unsigned int *) c->var != val)
  267.           {
  268.             *(unsigned int *) c->var = val;

  269.             option_changed = 1;
  270.           }
  271.       }
  272.       break;
  273.     case var_integer:
  274.     case var_zinteger:
  275.       {
  276.         LONGEST val;

  277.         if (arg == NULL)
  278.           {
  279.             if (c->var_type == var_integer)
  280.               error_no_arg (_("integer to set it to, or \"unlimited\"."));
  281.             else
  282.               error_no_arg (_("integer to set it to."));
  283.           }

  284.         if (c->var_type == var_integer && is_unlimited_literal (arg))
  285.           val = 0;
  286.         else
  287.           val = parse_and_eval_long (arg);

  288.         if (val == 0 && c->var_type == var_integer)
  289.           val = INT_MAX;
  290.         else if (val < INT_MIN
  291.                  /* For var_integer, don't let the user set the value
  292.                     to INT_MAX directly, as that exposes an
  293.                     implementation detail to the user interface.  */
  294.                  || (c->var_type == var_integer && val >= INT_MAX)
  295.                  || (c->var_type == var_zinteger && val > INT_MAX))
  296.           error (_("integer %s out of range"), plongest (val));

  297.         if (*(int *) c->var != val)
  298.           {
  299.             *(int *) c->var = val;

  300.             option_changed = 1;
  301.           }
  302.         break;
  303.       }
  304.     case var_enum:
  305.       {
  306.         int i;
  307.         int len;
  308.         int nmatches;
  309.         const char *match = NULL;
  310.         char *p;

  311.         /* If no argument was supplied, print an informative error
  312.            message.  */
  313.         if (arg == NULL)
  314.           {
  315.             char *msg;
  316.             int msg_len = 0;

  317.             for (i = 0; c->enums[i]; i++)
  318.               msg_len += strlen (c->enums[i]) + 2;

  319.             msg = xmalloc (msg_len);
  320.             *msg = '\0';
  321.             make_cleanup (xfree, msg);

  322.             for (i = 0; c->enums[i]; i++)
  323.               {
  324.                 if (i != 0)
  325.                   strcat (msg, ", ");
  326.                 strcat (msg, c->enums[i]);
  327.               }
  328.             error (_("Requires an argument. Valid arguments are %s."),
  329.                    msg);
  330.           }

  331.         p = strchr (arg, ' ');

  332.         if (p)
  333.           len = p - arg;
  334.         else
  335.           len = strlen (arg);

  336.         nmatches = 0;
  337.         for (i = 0; c->enums[i]; i++)
  338.           if (strncmp (arg, c->enums[i], len) == 0)
  339.             {
  340.               if (c->enums[i][len] == '\0')
  341.                 {
  342.                   match = c->enums[i];
  343.                   nmatches = 1;
  344.                   break; /* Exact match.  */
  345.                 }
  346.               else
  347.                 {
  348.                   match = c->enums[i];
  349.                   nmatches++;
  350.                 }
  351.             }

  352.         if (nmatches <= 0)
  353.           error (_("Undefined item: \"%s\"."), arg);

  354.         if (nmatches > 1)
  355.           error (_("Ambiguous item \"%s\"."), arg);

  356.         if (*(const char **) c->var != match)
  357.           {
  358.             *(const char **) c->var = match;

  359.             option_changed = 1;
  360.           }
  361.       }
  362.       break;
  363.     case var_zuinteger_unlimited:
  364.       {
  365.         LONGEST val;

  366.         if (arg == NULL)
  367.           error_no_arg (_("integer to set it to, or \"unlimited\"."));

  368.         if (is_unlimited_literal (arg))
  369.           val = -1;
  370.         else
  371.           val = parse_and_eval_long (arg);

  372.         if (val > INT_MAX)
  373.           error (_("integer %s out of range"), plongest (val));
  374.         else if (val < -1)
  375.           error (_("only -1 is allowed to set as unlimited"));

  376.         if (*(int *) c->var != val)
  377.           {
  378.             *(int *) c->var = val;
  379.             option_changed = 1;
  380.           }
  381.       }
  382.       break;
  383.     default:
  384.       error (_("gdb internal error: bad var_type in do_setshow_command"));
  385.     }
  386.   c->func (c, NULL, from_tty);

  387.   if (notify_command_param_changed_p (option_changed, c))
  388.     {
  389.       char *name, *cp;
  390.       struct cmd_list_element **cmds;
  391.       struct cmd_list_element *p;
  392.       int i;
  393.       int length = 0;

  394.       /* Compute the whole multi-word command options.  If user types command
  395.          'set foo bar baz on', c->name is 'baz', and GDB can't pass "bar" to
  396.          command option change notification, because it is confusing.  We can
  397.          trace back through field 'prefix' to compute the whole options,
  398.          and pass "foo bar baz" to notification.  */

  399.       for (i = 0, p = c; p != NULL; i++)
  400.         {
  401.           length += strlen (p->name);
  402.           length++;

  403.           p = p->prefix;
  404.         }
  405.       cp = name = xmalloc (length);
  406.       cmds = xmalloc (sizeof (struct cmd_list_element *) * i);

  407.       /* Track back through filed 'prefix' and cache them in CMDS.  */
  408.       for (i = 0, p = c; p != NULL; i++)
  409.         {
  410.           cmds[i] = p;
  411.           p = p->prefix;
  412.         }

  413.       /* Don't trigger any observer notification if prefixlist is not
  414.          setlist.  */
  415.       i--;
  416.       if (cmds[i]->prefixlist != &setlist)
  417.         {
  418.           xfree (cmds);
  419.           xfree (name);

  420.           return;
  421.         }
  422.       /* Traverse them in the reversed order, and copy their names into
  423.          NAME.  */
  424.       for (i--; i >= 0; i--)
  425.         {
  426.           memcpy (cp, cmds[i]->name, strlen (cmds[i]->name));
  427.           cp += strlen (cmds[i]->name);

  428.           if (i != 0)
  429.             {
  430.               cp[0] = ' ';
  431.               cp++;
  432.             }
  433.         }
  434.       cp[0] = 0;

  435.       xfree (cmds);

  436.       switch (c->var_type)
  437.         {
  438.         case var_string:
  439.         case var_string_noescape:
  440.         case var_filename:
  441.         case var_optional_filename:
  442.         case var_enum:
  443.           observer_notify_command_param_changed (name, *(char **) c->var);
  444.           break;
  445.         case var_boolean:
  446.           {
  447.             char *opt = *(int *) c->var ? "on" : "off";

  448.             observer_notify_command_param_changed (name, opt);
  449.           }
  450.           break;
  451.         case var_auto_boolean:
  452.           {
  453.             const char *s = auto_boolean_enums[*(enum auto_boolean *) c->var];

  454.             observer_notify_command_param_changed (name, s);
  455.           }
  456.           break;
  457.         case var_uinteger:
  458.         case var_zuinteger:
  459.           {
  460.             char s[64];

  461.             xsnprintf (s, sizeof s, "%u", *(unsigned int *) c->var);
  462.             observer_notify_command_param_changed (name, s);
  463.           }
  464.           break;
  465.         case var_integer:
  466.         case var_zinteger:
  467.         case var_zuinteger_unlimited:
  468.           {
  469.             char s[64];

  470.             xsnprintf (s, sizeof s, "%d", *(int *) c->var);
  471.             observer_notify_command_param_changed (name, s);
  472.           }
  473.           break;
  474.         }
  475.       xfree (name);
  476.     }
  477. }

  478. /* Do a "show" command.  ARG is NULL if no argument, or the
  479.    text of the argument, and FROM_TTY is nonzero if this command is
  480.    being entered directly by the user (i.e. these are just like any
  481.    other command).  C is the command list element for the command.  */

  482. void
  483. do_show_command (const char *arg, int from_tty, struct cmd_list_element *c)
  484. {
  485.   struct ui_out *uiout = current_uiout;
  486.   struct cleanup *old_chain;
  487.   struct ui_file *stb;

  488.   gdb_assert (c->type == show_cmd);

  489.   stb = mem_fileopen ();
  490.   old_chain = make_cleanup_ui_file_delete (stb);

  491.   /* Possibly call the pre hook.  */
  492.   if (c->pre_show_hook)
  493.     (c->pre_show_hook) (c);

  494.   switch (c->var_type)
  495.     {
  496.     case var_string:
  497.       if (*(char **) c->var)
  498.         fputstr_filtered (*(char **) c->var, '"', stb);
  499.       break;
  500.     case var_string_noescape:
  501.     case var_optional_filename:
  502.     case var_filename:
  503.     case var_enum:
  504.       if (*(char **) c->var)
  505.         fputs_filtered (*(char **) c->var, stb);
  506.       break;
  507.     case var_boolean:
  508.       fputs_filtered (*(int *) c->var ? "on" : "off", stb);
  509.       break;
  510.     case var_auto_boolean:
  511.       switch (*(enum auto_boolean*) c->var)
  512.         {
  513.         case AUTO_BOOLEAN_TRUE:
  514.           fputs_filtered ("on", stb);
  515.           break;
  516.         case AUTO_BOOLEAN_FALSE:
  517.           fputs_filtered ("off", stb);
  518.           break;
  519.         case AUTO_BOOLEAN_AUTO:
  520.           fputs_filtered ("auto", stb);
  521.           break;
  522.         default:
  523.           internal_error (__FILE__, __LINE__,
  524.                           _("do_show_command: "
  525.                             "invalid var_auto_boolean"));
  526.           break;
  527.         }
  528.       break;
  529.     case var_uinteger:
  530.     case var_zuinteger:
  531.       if (c->var_type == var_uinteger
  532.           && *(unsigned int *) c->var == UINT_MAX)
  533.         fputs_filtered ("unlimited", stb);
  534.       else
  535.         fprintf_filtered (stb, "%u", *(unsigned int *) c->var);
  536.       break;
  537.     case var_integer:
  538.     case var_zinteger:
  539.       if (c->var_type == var_integer
  540.           && *(int *) c->var == INT_MAX)
  541.         fputs_filtered ("unlimited", stb);
  542.       else
  543.         fprintf_filtered (stb, "%d", *(int *) c->var);
  544.       break;
  545.     case var_zuinteger_unlimited:
  546.       {
  547.         if (*(int *) c->var == -1)
  548.           fputs_filtered ("unlimited", stb);
  549.         else
  550.           fprintf_filtered (stb, "%d", *(int *) c->var);
  551.       }
  552.       break;
  553.     default:
  554.       error (_("gdb internal error: bad var_type in do_show_command"));
  555.     }


  556.   /* FIXME: cagney/2005-02-10: Need to split this in half: code to
  557.      convert the value into a string (esentially the above); and
  558.      code to print the value out.  For the latter there should be
  559.      MI and CLI specific versions.  */

  560.   if (ui_out_is_mi_like_p (uiout))
  561.     ui_out_field_stream (uiout, "value", stb);
  562.   else
  563.     {
  564.       char *value = ui_file_xstrdup (stb, NULL);

  565.       make_cleanup (xfree, value);
  566.       if (c->show_value_func != NULL)
  567.         c->show_value_func (gdb_stdout, from_tty, c, value);
  568.       else
  569.         deprecated_show_value_hack (gdb_stdout, from_tty, c, value);
  570.     }
  571.   do_cleanups (old_chain);

  572.   c->func (c, NULL, from_tty);
  573. }

  574. /* Show all the settings in a list of show commands.  */

  575. void
  576. cmd_show_list (struct cmd_list_element *list, int from_tty, const char *prefix)
  577. {
  578.   struct cleanup *showlist_chain;
  579.   struct ui_out *uiout = current_uiout;

  580.   showlist_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "showlist");
  581.   for (; list != NULL; list = list->next)
  582.     {
  583.       /* If we find a prefix, run its list, prefixing our output by its
  584.          prefix (with "show " skipped).  */
  585.       if (list->prefixlist && !list->abbrev_flag)
  586.         {
  587.           struct cleanup *optionlist_chain
  588.             = make_cleanup_ui_out_tuple_begin_end (uiout, "optionlist");
  589.           char *new_prefix = strstr (list->prefixname, "show ") + 5;

  590.           if (ui_out_is_mi_like_p (uiout))
  591.             ui_out_field_string (uiout, "prefix", new_prefix);
  592.           cmd_show_list (*list->prefixlist, from_tty, new_prefix);
  593.           /* Close the tuple.  */
  594.           do_cleanups (optionlist_chain);
  595.         }
  596.       else
  597.         {
  598.           if (list->class != no_set_class)
  599.             {
  600.               struct cleanup *option_chain
  601.                 = make_cleanup_ui_out_tuple_begin_end (uiout, "option");

  602.               ui_out_text (uiout, prefix);
  603.               ui_out_field_string (uiout, "name", list->name);
  604.               ui_out_text (uiout, ":  ");
  605.               if (list->type == show_cmd)
  606.                 do_show_command ((char *) NULL, from_tty, list);
  607.               else
  608.                 cmd_func (list, NULL, from_tty);
  609.               /* Close the tuple.  */
  610.               do_cleanups (option_chain);
  611.             }
  612.         }
  613.     }
  614.   /* Close the tuple.  */
  615.   do_cleanups (showlist_chain);
  616. }