Replace interp_set_temp with scoped_restore_interp
[binutils-gdb.git] / gdb / cli / cli-setshow.c
index 74d2d007e39d0fd81a6dc0f976b3c81db387c53e..f89d2681ba4054335a478a3bbe9131b919ec1227 100644 (file)
@@ -1,6 +1,6 @@
 /* Handle set and show GDB commands.
 
-   Copyright (C) 2000-2015 Free Software Foundation, Inc.
+   Copyright (C) 2000-2017 Free Software Foundation, Inc.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -134,7 +134,7 @@ is_unlimited_literal (const char *arg)
 {
   size_t len = sizeof ("unlimited") - 1;
 
-  arg = skip_spaces_const (arg);
+  arg = skip_spaces (arg);
 
   return (strncmp (arg, "unlimited", len) == 0
          && (isspace (arg[len]) || arg[len] == '\0'));
@@ -367,24 +367,16 @@ do_set_command (const char *arg, int from_tty, struct cmd_list_element *c)
           message.  */
        if (arg == NULL)
          {
-           char *msg;
-           int msg_len = 0;
-
-           for (i = 0; c->enums[i]; i++)
-             msg_len += strlen (c->enums[i]) + 2;
-
-           msg = (char *) xmalloc (msg_len);
-           *msg = '\0';
-           make_cleanup (xfree, msg);
+           std::string msg;
 
            for (i = 0; c->enums[i]; i++)
              {
                if (i != 0)
-                 strcat (msg, ", ");
-               strcat (msg, c->enums[i]);
+                 msg += ", ";
+               msg += c->enums[i];
              }
            error (_("Requires an argument. Valid arguments are %s."), 
-                  msg);
+                  msg.c_str ());
          }
 
        p = strchr (arg, ' ');
@@ -568,13 +560,10 @@ void
 do_show_command (const char *arg, int from_tty, struct cmd_list_element *c)
 {
   struct ui_out *uiout = current_uiout;
-  struct cleanup *old_chain;
-  struct ui_file *stb;
 
   gdb_assert (c->type == show_cmd);
 
-  stb = mem_fileopen ();
-  old_chain = make_cleanup_ui_file_delete (stb);
+  string_file stb;
 
   /* Possibly call the pre hook.  */
   if (c->pre_show_hook)
@@ -584,29 +573,29 @@ do_show_command (const char *arg, int from_tty, struct cmd_list_element *c)
     {
     case var_string:
       if (*(char **) c->var)
-       fputstr_filtered (*(char **) c->var, '"', stb);
+       stb.putstr (*(char **) c->var, '"');
       break;
     case var_string_noescape:
     case var_optional_filename:
     case var_filename:
     case var_enum:
       if (*(char **) c->var)
-       fputs_filtered (*(char **) c->var, stb);
+       stb.puts (*(char **) c->var);
       break;
     case var_boolean:
-      fputs_filtered (*(int *) c->var ? "on" : "off", stb);
+      stb.puts (*(int *) c->var ? "on" : "off");
       break;
     case var_auto_boolean:
       switch (*(enum auto_boolean*) c->var)
        {
        case AUTO_BOOLEAN_TRUE:
-         fputs_filtered ("on", stb);
+         stb.puts ("on");
          break;
        case AUTO_BOOLEAN_FALSE:
-         fputs_filtered ("off", stb);
+         stb.puts ("off");
          break;
        case AUTO_BOOLEAN_AUTO:
-         fputs_filtered ("auto", stb);
+         stb.puts ("auto");
          break;
        default:
          internal_error (__FILE__, __LINE__,
@@ -619,24 +608,24 @@ do_show_command (const char *arg, int from_tty, struct cmd_list_element *c)
     case var_zuinteger:
       if (c->var_type == var_uinteger
          && *(unsigned int *) c->var == UINT_MAX)
-       fputs_filtered ("unlimited", stb);
+       stb.puts ("unlimited");
       else
-       fprintf_filtered (stb, "%u", *(unsigned int *) c->var);
+       stb.printf ("%u", *(unsigned int *) c->var);
       break;
     case var_integer:
     case var_zinteger:
       if (c->var_type == var_integer
          && *(int *) c->var == INT_MAX)
-       fputs_filtered ("unlimited", stb);
+       stb.puts ("unlimited");
       else
-       fprintf_filtered (stb, "%d", *(int *) c->var);
+       stb.printf ("%d", *(int *) c->var);
       break;
     case var_zuinteger_unlimited:
       {
        if (*(int *) c->var == -1)
-         fputs_filtered ("unlimited", stb);
+         stb.puts ("unlimited");
        else
-         fprintf_filtered (stb, "%d", *(int *) c->var);
+         stb.printf ("%d", *(int *) c->var);
       }
       break;
     default:
@@ -649,19 +638,15 @@ do_show_command (const char *arg, int from_tty, struct cmd_list_element *c)
      code to print the value out.  For the latter there should be
      MI and CLI specific versions.  */
 
-  if (ui_out_is_mi_like_p (uiout))
-    ui_out_field_stream (uiout, "value", stb);
+  if (uiout->is_mi_like_p ())
+    uiout->field_stream ("value", stb);
   else
     {
-      char *value = ui_file_xstrdup (stb, NULL);
-
-      make_cleanup (xfree, value);
       if (c->show_value_func != NULL)
-       c->show_value_func (gdb_stdout, from_tty, c, value);
+       c->show_value_func (gdb_stdout, from_tty, c, stb.c_str ());
       else
-       deprecated_show_value_hack (gdb_stdout, from_tty, c, value);
+       deprecated_show_value_hack (gdb_stdout, from_tty, c, stb.c_str ());
     }
-  do_cleanups (old_chain);
 
   c->func (c, NULL, from_tty);
 }
@@ -671,46 +656,37 @@ do_show_command (const char *arg, int from_tty, struct cmd_list_element *c)
 void
 cmd_show_list (struct cmd_list_element *list, int from_tty, const char *prefix)
 {
-  struct cleanup *showlist_chain;
   struct ui_out *uiout = current_uiout;
 
-  showlist_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "showlist");
+  ui_out_emit_tuple tuple_emitter (uiout, "showlist");
   for (; list != NULL; list = list->next)
     {
       /* If we find a prefix, run its list, prefixing our output by its
          prefix (with "show " skipped).  */
       if (list->prefixlist && !list->abbrev_flag)
        {
-         struct cleanup *optionlist_chain
-           = make_cleanup_ui_out_tuple_begin_end (uiout, "optionlist");
+         ui_out_emit_tuple optionlist_emitter (uiout, "optionlist");
          const char *new_prefix = strstr (list->prefixname, "show ") + 5;
 
-         if (ui_out_is_mi_like_p (uiout))
-           ui_out_field_string (uiout, "prefix", new_prefix);
+         if (uiout->is_mi_like_p ())
+           uiout->field_string ("prefix", new_prefix);
          cmd_show_list (*list->prefixlist, from_tty, new_prefix);
-         /* Close the tuple.  */
-         do_cleanups (optionlist_chain);
        }
       else
        {
          if (list->theclass != no_set_class)
            {
-             struct cleanup *option_chain
-               = make_cleanup_ui_out_tuple_begin_end (uiout, "option");
+             ui_out_emit_tuple option_emitter (uiout, "option");
 
-             ui_out_text (uiout, prefix);
-             ui_out_field_string (uiout, "name", list->name);
-             ui_out_text (uiout, ":  ");
+             uiout->text (prefix);
+             uiout->field_string ("name", list->name);
+             uiout->text (":  ");
              if (list->type == show_cmd)
                do_show_command ((char *) NULL, from_tty, list);
              else
                cmd_func (list, NULL, from_tty);
-             /* Close the tuple.  */
-             do_cleanups (option_chain);
            }
        }
     }
-  /* Close the tuple.  */
-  do_cleanups (showlist_chain);
 }