*** empty log message ***
[deliverable/binutils-gdb.git] / gdb / top.c
index f033c07015ec632f569f871d27bcc71f5f7b3cbd..155f2c51764a92c8e40a3f3a449ee149f4faadd6 100644 (file)
--- a/gdb/top.c
+++ b/gdb/top.c
@@ -1,7 +1,7 @@
 /* Top level stuff for GDB, the GNU debugger.
 
-   Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994,
-   1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+   Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994,
+   1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
    Free Software Foundation, Inc.
 
    This file is part of GDB.
@@ -18,8 +18,8 @@
 
    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.  */
+   Foundation, Inc., 51 Franklin Street, Fifth Floor,
+   Boston, MA 02110-1301, USA.  */
 
 #include "defs.h"
 #include "gdbcmd.h"
@@ -46,6 +46,7 @@
 #include "serial.h"
 #include "doublest.h"
 #include "gdb_assert.h"
+#include "main.h"
 
 /* readline include files */
 #include "readline/readline.h"
 
 /* Initialization file name for gdb.  This is overridden in some configs.  */
 
+#ifndef PATH_MAX
+# ifdef FILENAME_MAX
+#  define PATH_MAX FILENAME_MAX
+# else
+#  define PATH_MAX 512
+# endif
+#endif
+
 #ifndef        GDBINIT_FILENAME
 #define        GDBINIT_FILENAME        ".gdbinit"
 #endif
-char gdbinit[] = GDBINIT_FILENAME;
+char gdbinit[PATH_MAX + 1] = GDBINIT_FILENAME;
 
 int inhibit_gdbinit = 0;
 
@@ -88,6 +97,14 @@ extern char lang_frame_mismatch_warn[];              /* language.c */
 /* Flag for whether we want all the "from_tty" gubbish printed.  */
 
 int caution = 1;               /* Default is yes, sigh. */
+static void
+show_caution (struct ui_file *file, int from_tty,
+             struct cmd_list_element *c, const char *value)
+{
+  fprintf_filtered (file, _("\
+Whether to confirm potentially dangerous operations is %s.\n"),
+                   value);
+}
 
 /* stdio stream that command input is being read from.  Set to stdin normally.
    Set by source_command to the file we are sourcing.  Set to NULL if we are
@@ -95,6 +112,10 @@ int caution = 1;            /* Default is yes, sigh. */
 
 FILE *instream;
 
+/* Flag to indicate whether a user defined command is currently running.  */
+
+int in_user_command;
+
 /* Current working directory.  */
 
 char *current_directory;
@@ -167,9 +188,6 @@ int remote_debug = 0;
    target is off and running, which gdb is doing something else. */
 int target_executing = 0;
 
-/* Level of control structure.  */
-static int control_level;
-
 /* Sbrk location on entry to main.  Used for statistics only.  */
 #ifdef HAVE_SBRK
 char *lim_at_start;
@@ -382,6 +400,9 @@ execute_command (char *p, int from_tty)
       char *arg;
       line = p;
 
+      /* If trace-commands is set then this will print this command.  */
+      print_command_trace (p);
+
       c = lookup_cmd (&p, cmdlist, "", 0, 1);
 
       /* If the target is running, we allow only a limited set of
@@ -391,7 +412,7 @@ execute_command (char *p, int from_tty)
            && strcmp (c->name, "pwd") != 0
            && strcmp (c->name, "show") != 0
            && strcmp (c->name, "stop") != 0)
-         error ("Cannot execute this command while the target is running.");
+         error (_("Cannot execute this command while the target is running."));
 
       /* Pass null arg rather than an empty one.  */
       arg = *p ? p : 0;
@@ -427,7 +448,7 @@ execute_command (char *p, int from_tty)
       else if (c->type == set_cmd || c->type == show_cmd)
        do_setshow_command (arg, from_tty & caution, c);
       else if (!cmd_func_p (c))
-       error ("That is not a command, just a help topic.");
+       error (_("That is not a command, just a help topic."));
       else if (deprecated_call_command_hook)
        deprecated_call_command_hook (c, arg, from_tty & caution);
       else
@@ -519,7 +540,7 @@ command_loop (void)
        {
          long cmd_time = get_run_time () - time_at_cmd_start;
 
-         printf_unfiltered ("Command execution time: %ld.%06ld\n",
+         printf_unfiltered (_("Command execution time: %ld.%06ld\n"),
                             cmd_time / 1000000, cmd_time % 1000000);
        }
 
@@ -530,7 +551,7 @@ command_loop (void)
          long space_now = lim - lim_at_start;
          long space_diff = space_now - space_at_cmd_start;
 
-         printf_unfiltered ("Space used: %ld (%c%ld for this command)\n",
+         printf_unfiltered (_("Space used: %ld (%c%ld for this command)\n"),
                             space_now,
                             (space_diff >= 0 ? '+' : '-'),
                             space_diff);
@@ -655,13 +676,40 @@ gdb_readline (char *prompt_arg)
    substitution.  These variables are given default values at the end
    of this file.  */
 static int command_editing_p;
+
 /* NOTE 1999-04-29: This variable will be static again, once we modify
    gdb to use the event loop as the default command loop and we merge
    event-top.c into this file, top.c */
+
 /* static */ int history_expansion_p;
+
 static int write_history_p;
+static void
+show_write_history_p (struct ui_file *file, int from_tty,
+                     struct cmd_list_element *c, const char *value)
+{
+  fprintf_filtered (file, _("Saving of the history record on exit is %s.\n"),
+                   value);
+}
+
 static int history_size;
+static void
+show_history_size (struct ui_file *file, int from_tty,
+                  struct cmd_list_element *c, const char *value)
+{
+  fprintf_filtered (file, _("The size of the command history is %s.\n"),
+                   value);
+}
+
 static char *history_filename;
+static void
+show_history_filename (struct ui_file *file, int from_tty,
+                      struct cmd_list_element *c, const char *value)
+{
+  fprintf_filtered (file, _("\
+The filename in which to record the command history is \"%s\".\n"),
+                   value);
+}
 
 /* This is like readline(), but it has some gdb-specific behavior.
    gdb can use readline in both the synchronous and async modes during
@@ -723,7 +771,7 @@ float_handler (int signo)
   /* This message is based on ANSI C, section 4.7.  Note that integer
      divide by zero causes this, so "float" is a misnomer.  */
   signal (SIGFPE, float_handler);
-  error ("Erroneous arithmetic operation.");
+  error (_("Erroneous arithmetic operation."));
 }
 
 static void
@@ -868,11 +916,11 @@ command_line_input (char *prompt_arg, int repeat, char *annotation_suffix)
        }
 
       /* Don't use fancy stuff if not talking to stdin.  */
-      if (deprecated_readline_hook && instream == NULL)
+      if (deprecated_readline_hook && input_from_terminal_p ())
        {
          rl = (*deprecated_readline_hook) (local_prompt);
        }
-      else if (command_editing_p && instream == stdin && ISATTY (instream))
+      else if (command_editing_p && input_from_terminal_p ())
        {
          rl = gdb_readline_wrapper (local_prompt);
        }
@@ -1020,7 +1068,7 @@ print_gdb_version (struct ui_file *stream)
 
   /* Second line is a copyright notice. */
 
-  fprintf_filtered (stream, "Copyright 2004 Free Software Foundation, Inc.\n");
+  fprintf_filtered (stream, "Copyright (C) 2006 Free Software Foundation, Inc.\n");
 
   /* Following the copyright is a brief statement that the program is
      free software, that users are free to copy and change it on
@@ -1143,6 +1191,8 @@ quit_force (char *args, int from_tty)
 
       exit_code = (int) value_as_long (val);
     }
+  else if (return_child_result)
+    exit_code = return_child_result_value;
 
   qt.args = args;
   qt.from_tty = from_tty;
@@ -1154,13 +1204,22 @@ quit_force (char *args, int from_tty)
   exit (exit_code);
 }
 
-/* Returns whether GDB is running on a terminal and whether the user
-   desires that questions be asked of them on that terminal.  */
+/* Returns whether GDB is running on a terminal and input is
+   currently coming from that terminal.  */
 
 int
 input_from_terminal_p (void)
 {
-  return gdb_has_a_terminal () && (instream == stdin) & caution;
+  if (gdb_has_a_terminal () && instream == stdin)
+    return 1;
+
+  /* If INSTREAM is unset, and we are not in a user command, we
+     must be in Insight.  That's like having a terminal, for our
+     purposes.  */
+  if (instream == NULL && !in_user_command)
+    return 1;
+
+  return 0;
 }
 \f
 static void
@@ -1258,14 +1317,14 @@ set_history_size_command (char *args, int from_tty, struct cmd_list_element *c)
   else
     {
       history_size = INT_MAX;
-      error ("History size must be non-negative");
+      error (_("History size must be non-negative"));
     }
 }
 
 void
 set_history (char *args, int from_tty)
 {
-  printf_unfiltered ("\"set history\" must be followed by the name of a history subcommand.\n");
+  printf_unfiltered (_("\"set history\" must be followed by the name of a history subcommand.\n"));
   help_list (sethistlist, "set history ", -1, gdb_stdout);
 }
 
@@ -1327,14 +1386,47 @@ init_history (void)
          that was read.  */
 #ifdef __MSDOS__
       /* No leading dots in file names are allowed on MSDOS.  */
-      history_filename = concat (current_directory, "/_gdb_history", NULL);
+      history_filename = concat (current_directory, "/_gdb_history",
+                                (char *)NULL);
 #else
-      history_filename = concat (current_directory, "/.gdb_history", NULL);
+      history_filename = concat (current_directory, "/.gdb_history",
+                                (char *)NULL);
 #endif
     }
   read_history (history_filename);
 }
 
+static void
+show_new_async_prompt (struct ui_file *file, int from_tty,
+                      struct cmd_list_element *c, const char *value)
+{
+  fprintf_filtered (file, _("Gdb's prompt is \"%s\".\n"), value);
+}
+
+static void
+show_async_command_editing_p (struct ui_file *file, int from_tty,
+                             struct cmd_list_element *c, const char *value)
+{
+  fprintf_filtered (file, _("\
+Editing of command lines as they are typed is %s.\n"),
+                   value);
+}
+
+static void
+show_annotation_level (struct ui_file *file, int from_tty,
+                      struct cmd_list_element *c, const char *value)
+{
+  fprintf_filtered (file, _("Annotation_level is %s.\n"), value);
+}
+
+static void
+show_exec_done_display_p (struct ui_file *file, int from_tty,
+                         struct cmd_list_element *c, const char *value)
+{
+  fprintf_filtered (file, _("\
+Notification of completion for asynchronous execution commands is %s.\n"),
+                   value);
+}
 static void
 init_main (void)
 {
@@ -1374,65 +1466,79 @@ init_main (void)
      15 is Control-o, the same binding this function has in Bash.  */
   rl_add_defun ("operate-and-get-next", gdb_rl_operate_and_get_next, 15);
 
-  c = add_set_cmd ("prompt", class_support, var_string,
-                  (char *) &new_async_prompt, "Set gdb's prompt",
-                  &setlist);
-  deprecated_add_show_from_set (c, &showlist);
-  set_cmd_sfunc (c, set_async_prompt);
+  add_setshow_string_cmd ("prompt", class_support,
+                         &new_async_prompt, _("\
+Set gdb's prompt"), _("\
+Show gdb's prompt"), NULL,
+                         set_async_prompt,
+                         show_new_async_prompt,
+                         &setlist, &showlist);
 
-  add_com ("dont-repeat", class_support, dont_repeat_command, "Don't repeat this command.\n\
+  add_com ("dont-repeat", class_support, dont_repeat_command, _("\
+Don't repeat this command.\n\
 Primarily used inside of user-defined commands that should not be repeated when\n\
-hitting return.");
+hitting return."));
 
-  c = add_set_cmd ("editing", class_support, var_boolean, (char *) &async_command_editing_p,
-                  "Set editing of command lines as they are typed.\n\
+  add_setshow_boolean_cmd ("editing", class_support,
+                          &async_command_editing_p, _("\
+Set editing of command lines as they are typed."), _("\
+Show editing of command lines as they are typed."), _("\
 Use \"on\" to enable the editing, and \"off\" to disable it.\n\
 Without an argument, command line editing is enabled.  To edit, use\n\
-EMACS-like or VI-like commands like control-P or ESC.", &setlist);
-
-  deprecated_add_show_from_set (c, &showlist);
-  set_cmd_sfunc (c, set_async_editing_command);
-
-  deprecated_add_show_from_set
-    (add_set_cmd ("save", no_class, var_boolean, (char *) &write_history_p,
-                 "Set saving of the history record on exit.\n\
+EMACS-like or VI-like commands like control-P or ESC."),
+                          set_async_editing_command,
+                          show_async_command_editing_p,
+                          &setlist, &showlist);
+
+  add_setshow_boolean_cmd ("save", no_class, &write_history_p, _("\
+Set saving of the history record on exit."), _("\
+Show saving of the history record on exit."), _("\
 Use \"on\" to enable the saving, and \"off\" to disable it.\n\
-Without an argument, saving is enabled.", &sethistlist),
-     &showhistlist);
-
-  c = add_set_cmd ("size", no_class, var_integer, (char *) &history_size,
-                  "Set the size of the command history,\n\
-ie. the number of previous commands to keep a record of.", &sethistlist);
-  deprecated_add_show_from_set (c, &showhistlist);
-  set_cmd_sfunc (c, set_history_size_command);
-
-  c = add_set_cmd ("filename", no_class, var_filename,
-                  (char *) &history_filename,
-                  "Set the filename in which to record the command history\n\
-(the list of previous commands of which a record is kept).", &sethistlist);
-  set_cmd_completer (c, filename_completer);
-  deprecated_add_show_from_set (c, &showhistlist);
-
-  deprecated_add_show_from_set
-    (add_set_cmd ("confirm", class_support, var_boolean,
-                 (char *) &caution,
-                 "Set whether to confirm potentially dangerous operations.",
-                 &setlist),
-     &showlist);
-
-  c = add_set_cmd ("annotate", class_obscure, var_zinteger,
-                  (char *) &annotation_level, "Set annotation_level.\n\
+Without an argument, saving is enabled."),
+                          NULL,
+                          show_write_history_p,
+                          &sethistlist, &showhistlist);
+
+  add_setshow_integer_cmd ("size", no_class, &history_size, _("\
+Set the size of the command history,"), _("\
+Show the size of the command history,"), _("\
+ie. the number of previous commands to keep a record of."),
+                          set_history_size_command,
+                          show_history_size,
+                          &sethistlist, &showhistlist);
+
+  add_setshow_filename_cmd ("filename", no_class, &history_filename, _("\
+Set the filename in which to record the command history"), _("\
+Show the filename in which to record the command history"), _("\
+(the list of previous commands of which a record is kept)."),
+                           NULL,
+                           show_history_filename,
+                           &sethistlist, &showhistlist);
+
+  add_setshow_boolean_cmd ("confirm", class_support, &caution, _("\
+Set whether to confirm potentially dangerous operations."), _("\
+Show whether to confirm potentially dangerous operations."), NULL,
+                          NULL,
+                          show_caution,
+                          &setlist, &showlist);
+
+  add_setshow_zinteger_cmd ("annotate", class_obscure, &annotation_level, _("\
+Set annotation_level."), _("\
+Show annotation_level."), _("\
 0 == normal;     1 == fullname (for use when running under emacs)\n\
-2 == output annotated suitably for use by programs that control GDB.",
-                  &setlist);
-  deprecated_add_show_from_set (c, &showlist);
-  set_cmd_sfunc (c, set_async_annotation_level);
-
-  deprecated_add_show_from_set
-    (add_set_cmd ("exec-done-display", class_support, var_boolean, (char *) &exec_done_display_p,
-                 "Set notification of completion for asynchronous execution commands.\n\
-Use \"on\" to enable the notification, and \"off\" to disable it.", &setlist),
-     &showlist);
+2 == output annotated suitably for use by programs that control GDB."),
+                           set_async_annotation_level,
+                           show_annotation_level,
+                           &setlist, &showlist);
+
+  add_setshow_boolean_cmd ("exec-done-display", class_support,
+                          &exec_done_display_p, _("\
+Set notification of completion for asynchronous execution commands."), _("\
+Show notification of completion for asynchronous execution commands."), _("\
+Use \"on\" to enable the notification, and \"off\" to disable it."),
+                          NULL,
+                          show_exec_done_display_p,
+                          &setlist, &showlist);
 }
 
 void
@@ -1460,6 +1566,8 @@ gdb_init (char *argv0)
   init_cli_cmds();
   init_main ();                        /* But that omits this file!  Do it now */
 
+  initialize_stdin_serial ();
+
   async_init_signals ();
 
   /* We need a default language for parsing expressions, so simple things like
This page took 0.02964 seconds and 4 git commands to generate.