2009-01-23 Pedro Alves <pedro@codesourcery.com>
[deliverable/binutils-gdb.git] / gdb / cli / cli-setshow.c
index 8f84345a0b078867323b6810987627d1ab148b67..206a55d8f0b4dbd68d038f885085dd4f7f58b957 100644 (file)
@@ -1,10 +1,11 @@
 /* Handle set and show GDB commands.
 
-   Copyright 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+   Copyright (c) 2000, 2001, 2002, 2003, 2007, 2008, 2009
+   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
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
@@ -13,9 +14,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA.  */
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #include "defs.h"
 #include "readline/tilde.h"
@@ -56,7 +55,7 @@ parse_auto_binary_operation (const char *arg)
               || (strncmp (arg, "-1", length) == 0 && length > 1))
        return AUTO_BOOLEAN_AUTO;
     }
-  error ("\"on\", \"off\" or \"auto\" expected.");
+  error (_("\"on\", \"off\" or \"auto\" expected."));
   return AUTO_BOOLEAN_AUTO; /* pacify GCC */
 }
 
@@ -85,11 +84,37 @@ parse_binary_operation (char *arg)
     return 0;
   else
     {
-      error ("\"on\" or \"off\" expected.");
+      error (_("\"on\" or \"off\" expected."));
       return 0;
     }
 }
 \f
+void
+deprecated_show_value_hack (struct ui_file *ignore_file,
+                           int ignore_from_tty,
+                           struct cmd_list_element *c,
+                           const char *value)
+{
+  /* If there's no command or value, don't try to print it out.  */
+  if (c == NULL || value == NULL)
+    return;
+  /* Print doc minus "show" at start.  */
+  print_doc_line (gdb_stdout, c->doc + 5);
+  switch (c->var_type)
+    {
+    case var_string:
+    case var_string_noescape:
+    case var_optional_filename:
+    case var_filename:
+    case var_enum:
+      printf_filtered ((" is \"%s\".\n"), value);
+      break;
+    default:
+      printf_filtered ((" is %s.\n"), value);
+      break;
+    }
+}
+
 /* Do a "set" or "show" command.  ARG is NULL if no argument, or the text
    of the argument, and FROM_TTY is nonzero if this command is being entered
    directly by the user (i.e. these are just like any other
@@ -154,11 +179,25 @@ do_setshow_command (char *arg, int from_tty, struct cmd_list_element *c)
            xfree (*(char **) c->var);
          *(char **) c->var = savestring (arg, strlen (arg));
          break;
+       case var_optional_filename:
+         if (arg == NULL)
+           arg = "";
+         if (*(char **) c->var != NULL)
+           xfree (*(char **) c->var);
+         *(char **) c->var = savestring (arg, strlen (arg));
+         break;
        case var_filename:
          if (arg == NULL)
-           error_no_arg ("filename to set it to.");
+           error_no_arg (_("filename to set it to."));
          if (*(char **) c->var != NULL)
            xfree (*(char **) c->var);
+         {
+           /* Clear trailing whitespace of filename.  */
+           char *ptr = arg + strlen (arg) - 1;
+           while (ptr >= arg && (*ptr == ' ' || *ptr == '\t'))
+             ptr--;
+           *(ptr + 1) = '\0';
+         }
          *(char **) c->var = tilde_expand (arg);
          break;
        case var_boolean:
@@ -169,7 +208,7 @@ do_setshow_command (char *arg, int from_tty, struct cmd_list_element *c)
          break;
        case var_uinteger:
          if (arg == NULL)
-           error_no_arg ("integer to set it to.");
+           error_no_arg (_("integer to set it to."));
          *(unsigned int *) c->var = parse_and_eval_long (arg);
          if (*(unsigned int *) c->var == 0)
            *(unsigned int *) c->var = UINT_MAX;
@@ -178,21 +217,26 @@ do_setshow_command (char *arg, int from_tty, struct cmd_list_element *c)
          {
            unsigned int val;
            if (arg == NULL)
-             error_no_arg ("integer to set it to.");
+             error_no_arg (_("integer to set it to."));
            val = parse_and_eval_long (arg);
            if (val == 0)
              *(int *) c->var = INT_MAX;
            else if (val >= INT_MAX)
-             error ("integer %u out of range", val);
+             error (_("integer %u out of range"), val);
            else
              *(int *) c->var = val;
            break;
          }
        case var_zinteger:
          if (arg == NULL)
-           error_no_arg ("integer to set it to.");
+           error_no_arg (_("integer to set it to."));
          *(int *) c->var = parse_and_eval_long (arg);
          break;
+       case var_zuinteger:
+         if (arg == NULL)
+           error_no_arg (_("integer to set it to."));
+         *(unsigned int *) c->var = parse_and_eval_long (arg);
+         break;
        case var_enum:
          {
            int i;
@@ -204,16 +248,22 @@ do_setshow_command (char *arg, int from_tty, struct cmd_list_element *c)
            /* if no argument was supplied, print an informative error message */
            if (arg == NULL)
              {
-               char msg[1024];
-               strcpy (msg, "Requires an argument. Valid arguments are ");
+               char *msg;
+               int msg_len = 0;
+               for (i = 0; c->enums[i]; i++)
+                 msg_len += strlen (c->enums[i]) + 2;
+
+               msg = xmalloc (msg_len);
+               *msg = '\0';
+               make_cleanup (xfree, msg);
+               
                for (i = 0; c->enums[i]; i++)
                  {
                    if (i != 0)
                      strcat (msg, ", ");
                    strcat (msg, c->enums[i]);
                  }
-               strcat (msg, ".");
-               error ("%s", msg);
+               error (_("Requires an argument. Valid arguments are %s."), msg);
              }
 
            p = strchr (arg, ' ');
@@ -241,23 +291,22 @@ do_setshow_command (char *arg, int from_tty, struct cmd_list_element *c)
                }
 
            if (nmatches <= 0)
-             error ("Undefined item: \"%s\".", arg);
+             error (_("Undefined item: \"%s\"."), arg);
 
            if (nmatches > 1)
-             error ("Ambiguous item \"%s\".", arg);
+             error (_("Ambiguous item \"%s\"."), arg);
 
            *(const char **) c->var = match;
          }
          break;
        default:
-         error ("gdb internal error: bad var_type in do_setshow_command");
+         error (_("gdb internal error: bad var_type in do_setshow_command"));
        }
     }
   else if (c->type == show_cmd)
     {
       struct cleanup *old_chain;
       struct ui_stream *stb;
-      int quote;
 
       stb = ui_out_stream_new (uiout);
       old_chain = make_cleanup_ui_out_stream_delete (stb);
@@ -266,24 +315,18 @@ do_setshow_command (char *arg, int from_tty, struct cmd_list_element *c)
       if (c->pre_show_hook)
        (c->pre_show_hook) (c);
 
-      quote = 0;
       switch (c->var_type)
        {
        case var_string:
-         {
-           unsigned char *p;
-
-           if (*(unsigned char **) c->var)
-             fputstr_filtered (*(unsigned char **) c->var, '"', stb->stream);
-           quote = 1;
-         }
+         if (*(char **) c->var)
+           fputstr_filtered (*(char **) c->var, '"', stb->stream);
          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->stream);
-         quote = 1;
          break;
        case var_boolean:
          fputs_filtered (*(int *) c->var ? "on" : "off", stb->stream);
@@ -302,7 +345,7 @@ do_setshow_command (char *arg, int from_tty, struct cmd_list_element *c)
              break;
            default:
              internal_error (__FILE__, __LINE__,
-                             "do_setshow_command: invalid var_auto_boolean");
+                             _("do_setshow_command: invalid var_auto_boolean"));
              break;
            }
          break;
@@ -313,6 +356,7 @@ do_setshow_command (char *arg, int from_tty, struct cmd_list_element *c)
              break;
            }
          /* else fall through */
+       case var_zuinteger:
        case var_zinteger:
          fprintf_filtered (stb->stream, "%u", *(unsigned int *) c->var);
          break;
@@ -326,7 +370,7 @@ do_setshow_command (char *arg, int from_tty, struct cmd_list_element *c)
          break;
 
        default:
-         error ("gdb internal error: bad var_type in do_setshow_command");
+         error (_("gdb internal error: bad var_type in do_setshow_command"));
        }
 
 
@@ -337,33 +381,20 @@ do_setshow_command (char *arg, int from_tty, struct cmd_list_element *c)
 
       if (ui_out_is_mi_like_p (uiout))
        ui_out_field_stream (uiout, "value", stb);
-      else if (c->fprint_setshow != NULL)
+      else
        {
          long length;
          char *value = ui_file_xstrdup (stb->stream, &length);
          make_cleanup (xfree, value);
-         c->fprint_setshow (c, gdb_stdout, value);
-         fprintf_filtered (gdb_stdout, "\n");
-       }
-      else
-       {
-         /* Print doc minus "show" at start.  */
-         print_doc_line (gdb_stdout, c->doc + 5);
-
-         ui_out_text (uiout, " is ");
-         ui_out_wrap_hint (uiout, "    ");
-         if (quote)
-           ui_out_text (uiout, "\"");
-         ui_out_field_stream (uiout, "value", stb);
-         if (quote)
-           ui_out_text (uiout, "\"");
-         ui_out_text (uiout, ".\n");
-         do_cleanups (old_chain);
+         if (c->show_value_func != NULL)
+           c->show_value_func (gdb_stdout, from_tty, c, value);
+         else
+           deprecated_show_value_hack (gdb_stdout, from_tty, c, value);
        }
       do_cleanups (old_chain);
     }
   else
-    error ("gdb internal error: bad cmd_type in do_setshow_command");
+    error (_("gdb internal error: bad cmd_type in do_setshow_command"));
   c->func (c, NULL, from_tty);
   if (c->type == set_cmd && deprecated_set_hook)
     deprecated_set_hook (c);
@@ -392,14 +423,17 @@ cmd_show_list (struct cmd_list_element *list, int from_tty, char *prefix)
          /* Close the tuple.  */
          do_cleanups (optionlist_chain);
        }
-      if (list->type == show_cmd)
+      else
        {
          struct cleanup *option_chain
            = make_cleanup_ui_out_tuple_begin_end (uiout, "option");
          ui_out_text (uiout, prefix);
          ui_out_field_string (uiout, "name", list->name);
          ui_out_text (uiout, ":  ");
-         do_setshow_command ((char *) NULL, from_tty, list);
+         if (list->type == show_cmd)
+           do_setshow_command ((char *) NULL, from_tty, list);
+         else
+           cmd_func (list, NULL, from_tty);
           /* Close the tuple.  */
          do_cleanups (option_chain);
        }
This page took 0.02722 seconds and 4 git commands to generate.