X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fcli%2Fcli-setshow.c;h=37f7918ef6ff6284f36706d7d31caaa34d3a41d8;hb=cdb27c12f30352674694895e06f615fd28ebdbec;hp=37b289dd8ab58eacc57fbece3797d96aa49f14c9;hpb=9a4105ab85f462853dcc065d12659ea5ed44145b;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/cli/cli-setshow.c b/gdb/cli/cli-setshow.c index 37b289dd8a..37f7918ef6 100644 --- a/gdb/cli/cli-setshow.c +++ b/gdb/cli/cli-setshow.c @@ -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, 2010 + 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,15 +14,14 @@ 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 . */ #include "defs.h" #include "readline/tilde.h" #include "value.h" #include #include "gdb_string.h" +#include "arch-utils.h" #include "ui-out.h" @@ -40,6 +40,7 @@ parse_auto_binary_operation (const char *arg) if (arg != NULL && *arg != '\0') { int length = strlen (arg); + while (isspace (arg[length - 1]) && length > 0) length--; if (strncmp (arg, "on", length) == 0 @@ -56,7 +57,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 +86,37 @@ parse_binary_operation (char *arg) return 0; else { - error ("\"on\" or \"off\" expected."); + error (_("\"on\" or \"off\" expected.")); return 0; } } +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 @@ -127,7 +154,7 @@ do_setshow_command (char *arg, int from_tty, struct cmd_list_element *c) right before a newline. */ if (*p == 0) break; - ch = parse_escape (&p); + ch = parse_escape (get_current_arch (), &p); if (ch == 0) break; /* C loses */ else if (ch > 0) @@ -152,13 +179,28 @@ do_setshow_command (char *arg, int from_tty, struct cmd_list_element *c) arg = ""; if (*(char **) c->var != NULL) xfree (*(char **) c->var); - *(char **) c->var = savestring (arg, strlen (arg)); + *(char **) c->var = xstrdup (arg); + break; + case var_optional_filename: + if (arg == NULL) + arg = ""; + if (*(char **) c->var != NULL) + xfree (*(char **) c->var); + *(char **) c->var = xstrdup (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 +211,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; @@ -177,22 +219,28 @@ do_setshow_command (char *arg, int from_tty, struct cmd_list_element *c) case var_integer: { 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 +252,23 @@ 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 +296,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,29 +320,18 @@ do_setshow_command (char *arg, int from_tty, struct cmd_list_element *c) if (c->pre_show_hook) (c->pre_show_hook) (c); - /* Print doc minus "show" at start. */ - print_doc_line (gdb_stdout, c->doc + 5); - - ui_out_text (uiout, " is "); - ui_out_wrap_hint (uiout, " "); - 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); @@ -307,7 +350,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; @@ -318,6 +361,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; @@ -331,18 +375,31 @@ 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")); + } + + + /* FIXME: cagney/2005-02-10: Need to split this in half: code to + convert the value into a string (esentially the above); and + 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); + else + { + char *value = ui_file_xstrdup (stb->stream, NULL); + + make_cleanup (xfree, value); + 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); } - 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); } 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); @@ -364,19 +421,26 @@ cmd_show_list (struct cmd_list_element *list, int from_tty, char *prefix) { struct cleanup *optionlist_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "optionlist"); - ui_out_field_string (uiout, "prefix", list->prefixname + 5); - cmd_show_list (*list->prefixlist, from_tty, list->prefixname + 5); + char *new_prefix = strstr (list->prefixname, "show ") + 5; + + if (ui_out_is_mi_like_p (uiout)) + ui_out_field_string (uiout, "prefix", new_prefix); + cmd_show_list (*list->prefixlist, from_tty, new_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); }