* hppa-tdep.c (hppa_push_arguments): Allocate enough space for
[deliverable/binutils-gdb.git] / gdb / main.c
index b2643f5d347ee98295d81e7ce978a3eea12a7156..5e00b8639ad8437ab5e111aa146c4737559f4e86 100644 (file)
@@ -72,19 +72,19 @@ static void
 command_loop_marker PARAMS ((int));
 
 static void
-print_gdb_version PARAMS ((void));
+print_gdb_version PARAMS ((FILE *));
 
 static void
 quit_command PARAMS ((char *, int));
 
 static void
-initialize_main PARAMS ((void));
+init_main PARAMS ((void));
 
 static void
-initialize_history PARAMS ((void));
+init_history PARAMS ((void));
 
 static void
-initialize_cmd_lists PARAMS ((void));
+init_cmd_lists PARAMS ((void));
 
 static void
 float_handler PARAMS ((int));
@@ -149,6 +149,9 @@ info_command PARAMS ((char *, int));
 static void
 do_nothing PARAMS ((int));
 
+static int
+quit_cover PARAMS ((char *));
+
 static void
 disconnect PARAMS ((int));
 
@@ -166,7 +169,8 @@ source_cleanup PARAMS ((FILE *));
 #ifndef        GDBINIT_FILENAME
 #define        GDBINIT_FILENAME        ".gdbinit"
 #endif
-char gdbinit[] = GDBINIT_FILENAME;
+static char gdbinit[] = GDBINIT_FILENAME;
+static int inhibit_gdbinit = 0;
 
 #define        ALL_CLEANUPS    ((struct cleanup *)0)
 
@@ -174,6 +178,14 @@ char gdbinit[] = GDBINIT_FILENAME;
 
 extern char *version;
 
+/* Canonical host name as a string. */
+
+extern char *host_canonical;
+
+/* Canonical target name as a string. */
+
+extern char *target_canonical;
+
 /* Message to be printed before the error message, when an error occurs.  */
 
 extern char *error_pre_print;
@@ -287,7 +299,6 @@ static char dirbuf[1024];
 
 void (*window_hook) PARAMS ((FILE *, char *));
 
-extern int frame_file_full_name;
 extern int mapped_symbol_files;
 extern int readnow_symbol_files;
 
@@ -326,33 +337,63 @@ static void stop_sig PARAMS ((int));
 #define sigsetmask(n)
 #endif
 \f
-/* This is how `error' returns to command level.  */
+/* Where to go for return_to_top_level (RETURN_ERROR).  */
+static jmp_buf error_return;
+/* Where to go for return_to_top_level (RETURN_QUIT).  */
+static jmp_buf quit_return;
 
-jmp_buf to_top_level;
+/* Temporary variable for SET_TOP_LEVEL.  */
+static int top_level_val;
+
+/* Do a setjmp on error_return and quit_return.  catch_errors is
+   generally a cleaner way to do this, but main() would look pretty
+   ugly if it had to use catch_errors each time.  */
+
+#define SET_TOP_LEVEL() \
+  (((top_level_val = setjmp (error_return)) \
+    ? (PTR) 0 : (PTR) memcpy (quit_return, error_return, sizeof (jmp_buf))) \
+   , top_level_val)
+
+/* Return for reason REASON.  This generally gets back to the command
+   loop, but can be caught via catch_errors.  */
 
 NORETURN void
-return_to_top_level ()
+return_to_top_level (reason)
+     enum return_reason reason;
 {
   quit_flag = 0;
   immediate_quit = 0;
   bpstat_clear_actions(stop_bpstat);   /* Clear queued breakpoint commands */
   disable_current_display ();
   do_cleanups (ALL_CLEANUPS);
-  (NORETURN void) longjmp (to_top_level, 1);
+  (NORETURN void) longjmp
+    (reason == RETURN_ERROR ? error_return : quit_return, 1);
 }
 
-/* Call FUNC with arg ARGS, catching any errors.
-   If there is no error, return the value returned by FUNC.
-   If there is an error, print ERRSTRING, print the specific error message,
-                        then return zero.  */
+/* Call FUNC with arg ARGS, catching any errors.  If there is no
+   error, return the value returned by FUNC.  If there is an error,
+   print ERRSTRING, print the specific error message, then return
+   zero.
+
+   MASK specifies what to catch; it is normally set to
+   RETURN_MASK_ALL, if for no other reason than that the code which
+   calls catch_errors might not be set up to deal with a quit which
+   isn't caught.  But if the code can deal with it, it generally
+   should be RETURN_MASK_ERROR, unless for some reason it is more
+   useful to abort only the portion of the operation inside the
+   catch_errors.  Note that quit should return to the command line
+   fairly quickly, even if some further processing is being done.  */
 
 int
-catch_errors (func, args, errstring)
+catch_errors (func, args, errstring, mask)
      int (*func) PARAMS ((char *));
-     char *args;
+     PTR args;
      char *errstring;
+     return_mask mask;
 {
-  jmp_buf saved;
+  jmp_buf saved_error;
+  jmp_buf saved_quit;
+  jmp_buf tmp_jmp;
   int val;
   struct cleanup *saved_cleanup_chain;
   char *saved_error_pre_print;
@@ -360,18 +401,30 @@ catch_errors (func, args, errstring)
   saved_cleanup_chain = save_cleanups ();
   saved_error_pre_print = error_pre_print;
 
-  memcpy ((char *)saved, (char *)to_top_level, sizeof (jmp_buf));
+  if (mask & RETURN_MASK_ERROR)
+    memcpy ((char *)saved_error, (char *)error_return, sizeof (jmp_buf));
+  if (mask & RETURN_MASK_QUIT)
+    memcpy (saved_quit, quit_return, sizeof (jmp_buf));
   error_pre_print = errstring;
 
-  if (setjmp (to_top_level) == 0)
-    val = (*func) (args);
+  if (setjmp (tmp_jmp) == 0)
+    {
+      if (mask & RETURN_MASK_ERROR)
+       memcpy (error_return, tmp_jmp, sizeof (jmp_buf));
+      if (mask & RETURN_MASK_QUIT)
+       memcpy (quit_return, tmp_jmp, sizeof (jmp_buf));
+      val = (*func) (args);
+    }
   else
     val = 0;
 
   restore_cleanups (saved_cleanup_chain);
 
   error_pre_print = saved_error_pre_print;
-  memcpy ((char *)to_top_level, (char *)saved, sizeof (jmp_buf));
+  if (mask & RETURN_MASK_ERROR)
+    memcpy (error_return, saved_error, sizeof (jmp_buf));
+  if (mask & RETURN_MASK_QUIT)
+    memcpy (quit_return, saved_quit, sizeof (jmp_buf));
   return val;
 }
 
@@ -381,10 +434,23 @@ static void
 disconnect (signo)
 int signo;
 {
-  kill_inferior_fast ();
-  signal (signo, SIG_DFL);
+  catch_errors (quit_cover, NULL,
+               "Could not kill the program being debugged", RETURN_MASK_ALL);
+  signal (SIGHUP, SIG_DFL);
   kill (getpid (), SIGHUP);
 }
+
+/* Just a little helper function for disconnect().  */
+
+static int
+quit_cover (s)
+char *s;
+{
+  caution = 0;         /* Throw caution to the wind -- we're exiting.
+                          This prevents asking the user dumb questions.  */
+  quit_command((char *)0, 0);
+  return 0;
+}
 \f
 /* Clean up on error during a "source" command (or execution of a
    user-defined command).  */
@@ -416,7 +482,6 @@ main (argc, argv)
      char **argv;
 {
   int count;
-  static int inhibit_gdbinit = 0;
   static int quiet = 0;
   static int batch = 0;
 
@@ -456,7 +521,7 @@ main (argc, argv)
 #endif
 
   /* If error() is called from initialization code, just exit */
-  if (setjmp (to_top_level)) {
+  if (SET_TOP_LEVEL ()) {
     exit(1);
   }
 
@@ -503,6 +568,7 @@ main (argc, argv)
        {"m", no_argument, &mapped_symbol_files, 1},
        {"quiet", no_argument, &quiet, 1},
        {"q", no_argument, &quiet, 1},
+       {"silent", no_argument, &quiet, 1},
        {"nx", no_argument, &inhibit_gdbinit, 1},
        {"n", no_argument, &inhibit_gdbinit, 1},
        {"batch", no_argument, &batch, 1},
@@ -596,21 +662,20 @@ main (argc, argv)
          ADDITIONAL_OPTION_CASES
 #endif
          case '?':
-           fprintf_filtered (stderr,
-                    "Use `%s +help' for a complete list of options.\n",
+           fprintf (stderr,
+                    "Use `%s --help' for a complete list of options.\n",
                     argv[0]);
            exit (1);
          }
-
       }
+
     if (print_help)
       {
-       fputs ("\
-This is GDB, the GNU debugger.  Use the command\n\
-    gdb [options] [executable [core-file]]\n\
-to enter the debugger.\n\
-\n\
-Options available are:\n\
+       print_gdb_version(stderr);
+       fputs ("\n\
+This is the GNU debugger.  Usage:\n\
+    gdb [options] [executable-file [core-file or process-id]]\n\
+Options:\n\
   -help             Print this message.\n\
   -quiet            Do not print version number on startup.\n\
   -fullname         Output information used by emacs-GDB interface.\n\
@@ -653,7 +718,7 @@ GDB manual (available as on-line info or a printed manual).\n", stderr);
          corearg = argv[optind];
          break;
        case 3:
-         fprintf_filtered (stderr,
+         fprintf (stderr,
                   "Excess command line arguments ignored. (%s%s)\n",
                   argv[optind], (optind == argc - 1) ? "" : " ...");
          break;
@@ -664,9 +729,9 @@ GDB manual (available as on-line info or a printed manual).\n", stderr);
 
   /* Run the init function of each source file */
 
-  initialize_cmd_lists ();     /* This needs to be done first */
+  init_cmd_lists ();   /* This needs to be done first */
   initialize_all_files ();
-  initialize_main ();          /* But that omits this file!  Do it now */
+  init_main ();                /* But that omits this file!  Do it now */
   init_signals ();
 
   if (!quiet)
@@ -674,7 +739,7 @@ GDB manual (available as on-line info or a printed manual).\n", stderr);
       /* Print all the junk at the top, with trailing "..." if we are about
         to read a symbol file (possibly slowly).  */
       print_gnu_advertisement ();
-      print_gdb_version ();
+      print_gdb_version (stdout);
       if (symarg)
        printf_filtered ("..");
       wrap_here("");
@@ -685,6 +750,12 @@ GDB manual (available as on-line info or a printed manual).\n", stderr);
   /* We may get more than one warning, don't double space all of them... */
   warning_pre_print = "\nwarning: ";
 
+  /* We need a default language for parsing expressions, so simple things like
+     "set width 0" won't fail if no language is explicitly set in a config file
+     or implicitly set by reading an executable during startup. */
+  set_language (language_c);
+  expected_language = current_language;        /* don't warn about the change.  */
+
   /* Read and execute $HOME/.gdbinit file, if it exists.  This is done
      *before* all the command line arguments are processed; it sets
      global parameters, which are independent of what file you are
@@ -699,9 +770,7 @@ GDB manual (available as on-line info or a printed manual).\n", stderr);
       strcat (homeinit, gdbinit);
       if (!inhibit_gdbinit && access (homeinit, R_OK) == 0)
        {
-         /* The official language of expressions in $HOME/.gdbinit is C. */
-         set_language (language_c);
-         if (!setjmp (to_top_level))
+         if (!SET_TOP_LEVEL ())
            source_command (homeinit, 0);
        }
       do_cleanups (ALL_CLEANUPS);
@@ -722,7 +791,7 @@ GDB manual (available as on-line info or a printed manual).\n", stderr);
   /* Now perform all the actions indicated by the arguments.  */
   if (cdarg != NULL)
     {
-      if (!setjmp (to_top_level))
+      if (!SET_TOP_LEVEL ())
        {
          cd_command (cdarg, 0);
          init_source_path ();
@@ -731,18 +800,18 @@ GDB manual (available as on-line info or a printed manual).\n", stderr);
   do_cleanups (ALL_CLEANUPS);
 
   for (i = 0; i < ndir; i++)
-    if (!setjmp (to_top_level))
+    if (!SET_TOP_LEVEL ())
       directory_command (dirarg[i], 0);
   free ((PTR)dirarg);
   do_cleanups (ALL_CLEANUPS);
 
   if (execarg != NULL
       && symarg != NULL
-      && strcmp (execarg, symarg) == 0)
+      && STREQ (execarg, symarg))
     {
       /* The exec file and the symbol-file are the same.  If we can't open
         it, better only print one error message.  */
-      if (!setjmp (to_top_level))
+      if (!SET_TOP_LEVEL ())
        {
          exec_file_command (execarg, !batch);
          symbol_file_command (symarg, 0);
@@ -751,10 +820,10 @@ GDB manual (available as on-line info or a printed manual).\n", stderr);
   else
     {
       if (execarg != NULL)
-       if (!setjmp (to_top_level))
+       if (!SET_TOP_LEVEL ())
          exec_file_command (execarg, !batch);
       if (symarg != NULL)
-       if (!setjmp (to_top_level))
+       if (!SET_TOP_LEVEL ())
          symbol_file_command (symarg, 0);
     }
   do_cleanups (ALL_CLEANUPS);
@@ -768,14 +837,14 @@ GDB manual (available as on-line info or a printed manual).\n", stderr);
   warning_pre_print = "\nwarning: ";
 
   if (corearg != NULL)
-    if (!setjmp (to_top_level))
+    if (!SET_TOP_LEVEL ())
       core_file_command (corearg, !batch);
-    else if (isdigit (corearg[0]) && !setjmp (to_top_level))
+    else if (isdigit (corearg[0]) && !SET_TOP_LEVEL ())
       attach_command (corearg, !batch);
   do_cleanups (ALL_CLEANUPS);
 
   if (ttyarg != NULL)
-    if (!setjmp (to_top_level))
+    if (!SET_TOP_LEVEL ())
       tty_command (ttyarg, !batch);
   do_cleanups (ALL_CLEANUPS);
 
@@ -794,21 +863,14 @@ GDB manual (available as on-line info or a printed manual).\n", stderr);
       || memcmp ((char *) &homebuf, (char *) &cwdbuf, sizeof (struct stat)))
     if (!inhibit_gdbinit && access (gdbinit, R_OK) == 0)
       {
-       /* If no language has been set yet, default to C. */
-       if (current_language->la_language == language_unknown)
-         set_language (language_c);
-       if (!setjmp (to_top_level))
+       if (!SET_TOP_LEVEL ())
          source_command (gdbinit, 0);
       }
   do_cleanups (ALL_CLEANUPS);
 
   for (i = 0; i < ncmd; i++)
     {
-      /* If no language has been set yet, default to C.  For consistency with
-         other places, we redo this each time before sourcing commands. */
-      if (current_language->la_language == language_unknown)
-       set_language (language_c);
-      if (!setjmp (to_top_level))
+      if (!SET_TOP_LEVEL ())
        {
          if (cmdarg[i][0] == '-' && cmdarg[i][1] == '\0')
            read_command_file (stdin);
@@ -820,7 +882,7 @@ GDB manual (available as on-line info or a printed manual).\n", stderr);
   free ((PTR)cmdarg);
 
   /* Read in the old history after all the command files have been read. */
-  initialize_history();
+  init_history();
 
   if (batch)
     {
@@ -839,7 +901,7 @@ GDB manual (available as on-line info or a printed manual).\n", stderr);
 
   while (1)
     {
-      if (!setjmp (to_top_level))
+      if (!SET_TOP_LEVEL ())
        {
          do_cleanups (ALL_CLEANUPS);           /* Do complete cleanup */
          command_loop ();
@@ -849,6 +911,34 @@ GDB manual (available as on-line info or a printed manual).\n", stderr);
   /* No exit -- exit is through quit_command.  */
 }
 
+void
+execute_user_command (c, args)
+     struct cmd_list_element *c;
+     char *args;
+{
+  register struct command_line *cmdlines;
+  struct cleanup *old_chain;
+  
+  if (args)
+    error ("User-defined commands cannot take arguments.");
+
+  cmdlines = c->user_commands;
+  if (cmdlines == 0)
+    /* Null command */
+    return;
+
+  /* Set the instream to 0, indicating execution of a
+     user-defined function.  */
+  old_chain = make_cleanup (source_cleanup, instream);
+  instream = (FILE *) 0;
+  while (cmdlines)
+    {
+      execute_command (cmdlines->line, 0);
+      cmdlines = cmdlines->next;
+    }
+  do_cleanups (old_chain);
+}
+
 /* Execute the line P as a command.
    Pass FROM_TTY as second argument to the defining function.  */
 
@@ -858,9 +948,7 @@ execute_command (p, from_tty)
      int from_tty;
 {
   register struct cmd_list_element *c;
-  register struct command_line *cmdlines;
   register enum language flang;
-  static const struct language_defn *saved_language = 0;
   static int warned = 0;
 
   free_all_values ();
@@ -877,28 +965,13 @@ execute_command (p, from_tty)
       c = lookup_cmd (&p, cmdlist, "", 0, 1);
       /* Pass null arg rather than an empty one.  */
       arg = *p ? p : 0;
+
+      /* If this command has been hooked, run the hook first. */
+      if (c->hook)
+       execute_user_command (c->hook, (char *)0);
+
       if (c->class == class_user)
-       {
-         struct cleanup *old_chain;
-         
-         if (*p)
-           error ("User-defined commands cannot take arguments.");
-         cmdlines = c->user_commands;
-         if (cmdlines == 0)
-           /* Null command */
-           return;
-
-         /* Set the instream to 0, indicating execution of a
-            user-defined function.  */
-         old_chain =  make_cleanup (source_cleanup, instream);
-         instream = (FILE *) 0;
-         while (cmdlines)
-           {
-             execute_command (cmdlines->line, 0);
-             cmdlines = cmdlines->next;
-           }
-         do_cleanups (old_chain);
-       }
+       execute_user_command (c, arg);
       else if (c->type == set_cmd || c->type == show_cmd)
        do_setshow_command (arg, from_tty & caution, c);
       else if (c->function.cfunc == NO_FUNCTION)
@@ -908,13 +981,11 @@ execute_command (p, from_tty)
    }
 
   /* Tell the user if the language has changed (except first time).  */
-  if (current_language != saved_language)
+  if (current_language != expected_language)
   {
     if (language_mode == language_mode_auto) {
-      if (saved_language)
-       language_info (1);      /* Print what changed.  */
+      language_info (1);       /* Print what changed.  */
     }
-    saved_language = current_language;
     warned = 0;
   }
 
@@ -1077,6 +1148,48 @@ noop_completer (text)
   return NULL;
 }
 
+/* Complete on filenames.  */
+/* FIXME: This would be a lot more useful if the word breaks got set
+   to not include '/'.  Probably best to make it up to each completer
+   to do its own word breaking.  */
+char **
+filename_completer (text)
+     char *text;
+{
+  /* From readline.  */
+  extern char *filename_completion_function ();
+  int subsequent_name;
+  char **return_val;
+  int return_val_used;
+  int return_val_alloced;
+
+  return_val_used = 0;
+  /* Small for testing.  */
+  return_val_alloced = 1;
+  return_val = (char **) xmalloc (return_val_alloced * sizeof (char *));
+
+  subsequent_name = 0;
+  while (1)
+    {
+      char *p;
+      p = filename_completion_function (text, subsequent_name);
+      if (return_val_used >= return_val_alloced)
+       {
+         return_val_alloced *= 2;
+         return_val =
+           (char **) xrealloc (return_val,
+                               return_val_alloced * sizeof (char *));
+       }
+      /* The string itself has already been stored in newly malloc'd space
+        for us by filename_completion_function.  */
+      return_val[return_val_used++] = p;
+      if (p == NULL)
+       break;
+      subsequent_name = 1;
+    }
+  return return_val;
+}
+
 /* Generate symbol names one by one for the completer.  Each time we are
    called return another potential completion to the caller.
 
@@ -1129,6 +1242,11 @@ symbol_completion_function (text, matches)
         special word break set for command strings, which leaves out the
         '-' character used in some commands. */
 
+      /* FIXME: Using rl_completer_word_break_characters is the wrong
+        approach, because "show foo-bar<TAB>" won't know to use the
+        new set until too late.  Better approach is to do the word breaking
+        ourself.  */
+
       rl_completer_word_break_characters =
          gdb_completer_word_break_characters;
 
@@ -1306,7 +1424,7 @@ int signo;
 #else
   signal (STOP_SIGNAL, stop_sig);
 #endif
-  printf_filtered ("%s", prompt);
+  printf ("%s", prompt);
   fflush (stdout);
 
   /* Forget about any previous command -- null line now will do nothing.  */
@@ -1433,7 +1551,7 @@ command_line_input (prrompt, repeat)
   }
 
 #ifdef STOP_SIGNAL
-  signal (SIGTSTP, SIG_DFL);
+  signal (STOP_SIGNAL, SIG_DFL);
 #endif
   immediate_quit--;
 
@@ -1452,7 +1570,7 @@ command_line_input (prrompt, repeat)
       if (expanded)
        {
          /* Print the changes.  */
-         printf_filtered ("%s\n", history_value);
+         printf ("%s\n", history_value);
 
          /* If there was an error, call this function again.  */
          if (expanded < 0)
@@ -1650,7 +1768,7 @@ info_command (arg, from_tty)
      char *arg;
      int from_tty;
 {
-  printf_filtered ("\"info\" must be followed by the name of an info command.\n");
+  printf ("\"info\" must be followed by the name of an info command.\n");
   help_list (infolist, "info ", -1, stdout);
 }
 
@@ -1737,14 +1855,16 @@ define_command (comname, from_tty)
      int from_tty;
 {
   register struct command_line *cmds;
-  register struct cmd_list_element *c, *newc;
+  register struct cmd_list_element *c, *newc, *hookc = 0;
   char *tem = comname;
+#define        HOOK_STRING     "hook-"
+#define        HOOK_LEN 5
 
   validate_comname (comname);
 
   /* Look it up, and verify that we got an exact match.  */
   c = lookup_cmd (&tem, cmdlist, "", -1, 1);
-  if (c && 0 != strcmp (comname, c->name))
+  if (c && !STREQ (comname, c->name))
     c = 0;
     
   if (c)
@@ -1757,16 +1877,36 @@ define_command (comname, from_tty)
        error ("Command \"%s\" not redefined.", c->name);
     }
 
+  /* If this new command is a hook, then mark the command which it
+     is hooking.  Note that we allow hooking `help' commands, so that
+     we can hook the `stop' pseudo-command.  */
+
+  if (!strncmp (comname, HOOK_STRING, HOOK_LEN))
+    {
+      /* Look up cmd it hooks, and verify that we got an exact match.  */
+      tem = comname+HOOK_LEN;
+      hookc = lookup_cmd (&tem, cmdlist, "", -1, 0);
+      if (hookc && !STREQ (comname+HOOK_LEN, hookc->name))
+       hookc = 0;
+      if (!hookc)
+       {
+         warning ("Your new `%s' command does not hook any existing command.",
+                  comname);
+         if (!query ("Proceed? ", (char *)0))
+           error ("Not confirmed.");
+       }
+    }
+
   comname = savestring (comname, strlen (comname));
 
-  /* If the rest of the commands will be case insensetive, this one 
+  /* If the rest of the commands will be case insensitive, this one 
      should behave in the same manner. */
   for (tem = comname; *tem; tem++)
     if (isupper(*tem)) *tem = tolower(*tem);
 
   if (from_tty)
     {
-      printf_filtered ("Type commands for definition of \"%s\".\n\
+      printf ("Type commands for definition of \"%s\".\n\
 End with a line saying just \"end\".\n", comname);
       fflush (stdout);
     }
@@ -1780,6 +1920,14 @@ End with a line saying just \"end\".\n", comname);
           (c && c->class == class_user)
           ? c->doc : savestring ("User-defined.", 13), &cmdlist);
   newc->user_commands = cmds;
+
+  /* If this new command is a hook, then mark both commands as being
+     tied.  */
+  if (hookc)
+    {
+      hookc->hook = newc;      /* Target gets hooked.  */
+      newc->hookee = hookc;    /* We are marked as hooking target cmd.  */
+    }
 }
 
 static void
@@ -1799,7 +1947,7 @@ document_command (comname, from_tty)
     error ("Command \"%s\" is built-in.", comname);
 
   if (from_tty)
-    printf_filtered ("Type documentation for \"%s\".\n\
+    printf ("Type documentation for \"%s\".\n\
 End with a line saying just \"end\".\n", comname);
 
   doclines = read_command_lines ();
@@ -1830,7 +1978,7 @@ End with a line saying just \"end\".\n", comname);
 static void
 print_gnu_advertisement()
 {
-    printf_filtered ("\
+    printf ("\
 GDB is free software and you are welcome to distribute copies of it\n\
  under certain conditions; type \"show copying\" to see the conditions.\n\
 There is absolutely no warranty for GDB; type \"show warranty\" for details.\n\
@@ -1838,11 +1986,18 @@ There is absolutely no warranty for GDB; type \"show warranty\" for details.\n\
 }
 
 static void
-print_gdb_version ()
+print_gdb_version (stream)
+  FILE *stream;
 {
-  printf_filtered ("\
-GDB %s, Copyright 1992 Free Software Foundation, Inc.",
-         version);
+  fprintf_filtered (stream, "\
+GDB %s (%s", version, host_canonical);
+
+  if (strcmp(host_canonical, target_canonical))
+    fprintf_filtered (stream, " --target %s", target_canonical);
+
+  fprintf_filtered (stream, "), ");
+  wrap_here("");
+  fprintf_filtered (stream, "Copyright 1993 Free Software Foundation, Inc.");
 }
 
 /* ARGSUSED */
@@ -1853,7 +2008,7 @@ show_version (args, from_tty)
 {
   immediate_quit++;
   print_gnu_advertisement ();
-  print_gdb_version ();
+  print_gdb_version (stdout);
   printf_filtered ("\n");
   immediate_quit--;
 }
@@ -1863,7 +2018,7 @@ show_version (args, from_tty)
 void
 print_prompt ()
 {
-  printf_filtered ("%s", prompt);
+  printf ("%s", prompt);
   fflush (stdout);
 }
 \f
@@ -1874,12 +2029,20 @@ quit_command (args, from_tty)
 {
   if (inferior_pid != 0 && target_has_execution)
     {
-      if (query ("The program is running.  Quit anyway? "))
+      if (attach_flag)
        {
-         target_kill ();
+         if (query ("The program is running.  Quit anyway (and detach it)? "))
+           target_detach (args, from_tty);
+         else
+           error ("Not confirmed.");
        }
       else
-       error ("Not confirmed.");
+       {
+         if (query ("The program is running.  Quit anyway (and kill it)? "))
+           target_kill ();
+         else
+           error ("Not confirmed.");
+       }
     }
   /* Save the history information if it is appropriate to do so.  */
   if (write_history_p && history_filename)
@@ -1905,11 +2068,11 @@ pwd_command (args, from_tty)
   if (args) error ("The \"pwd\" command does not take an argument: %s", args);
   getcwd (dirbuf, sizeof (dirbuf));
 
-  if (strcmp (dirbuf, current_directory))
-    printf_filtered ("Working directory %s\n (canonically %s).\n",
+  if (!STREQ (dirbuf, current_directory))
+    printf ("Working directory %s\n (canonically %s).\n",
            current_directory, dirbuf);
   else
-    printf_filtered ("Working directory %s.\n", current_directory);
+    printf ("Working directory %s.\n", current_directory);
 }
 
 static void
@@ -1988,14 +2151,15 @@ source_command (args, from_tty)
   struct cleanup *cleanups;
   char *file = args;
 
-  if (file == 0)
-    /* Let source without arguments read .gdbinit.  */
-    file = gdbinit;
+  if (file == NULL)
+    {
+      error ("source command requires pathname of file to source.");
+    }
 
   file = tilde_expand (file);
   make_cleanup (free, file);
 
-  stream = fopen (file, "r");
+  stream = fopen (file, FOPEN_RT);
   if (stream == 0)
     perror_with_name (file);
 
@@ -2016,7 +2180,7 @@ echo_command (text, from_tty)
   register int c;
 
   if (text)
-    while (c = *p++)
+    while ((c = *p++) != '\0')
       {
        if (c == '\\')
          {
@@ -2129,13 +2293,13 @@ set_history_size_command (args, from_tty, c)
      int from_tty;
      struct cmd_list_element *c;
 {
-  if (history_size == UINT_MAX)
+  if (history_size == INT_MAX)
     unstifle_history ();
   else if (history_size >= 0)
     stifle_history (history_size);
   else
     {
-      history_size = UINT_MAX;
+      history_size = INT_MAX;
       error ("History size must be non-negative");
     }
 }
@@ -2146,7 +2310,7 @@ set_history (args, from_tty)
      char *args;
      int from_tty;
 {
-  printf_filtered ("\"set history\" must be followed by the name of a history subcommand.\n");
+  printf ("\"set history\" must be followed by the name of a history subcommand.\n");
   help_list (sethistlist, "set history ", -1, stdout);
 }
 
@@ -2192,6 +2356,7 @@ 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.");
 }
 
@@ -2204,7 +2369,7 @@ batch_mode ()
 
 \f
 static void
-initialize_cmd_lists ()
+init_cmd_lists ()
 {
   cmdlist = NULL;
   infolist = NULL;
@@ -2236,7 +2401,7 @@ initialize_cmd_lists ()
  */
 
 static void
-initialize_history()
+init_history()
 {
   char *tmpenv;
 
@@ -2261,7 +2426,7 @@ initialize_history()
 }
 
 static void
-initialize_main ()
+init_main ()
 {
   struct cmd_list_element *c;
   
@@ -2313,10 +2478,11 @@ The commands below can be used to select other frames by number or address.",
 
   add_com ("pwd", class_files, pwd_command,
           "Print working directory.  This is used for your program as well.");
-  add_com ("cd", class_files, cd_command,
+  c = add_cmd ("cd", class_files, cd_command,
           "Set working directory to DIR for debugger and program being debugged.\n\
 The change does not take effect for the program being debugged\n\
-until the next time it is started.");
+until the next time it is started.", &cmdlist);
+  c->completer = filename_completer;
 
   add_show_from_set
     (add_set_cmd ("prompt", class_support, var_string, (char *)&prompt,
@@ -2344,17 +2510,18 @@ Use the \"document\" command to give documentation for the new command.\n\
 Commands defined in this way do not take arguments.");
 
 #ifdef __STDC__
-  add_com ("source", class_support, source_command,
+  c = add_cmd ("source", class_support, source_command,
           "Read commands from a file named FILE.\n\
 Note that the file \"" GDBINIT_FILENAME "\" is read automatically in this way\n\
-when gdb is started.");
+when gdb is started.", &cmdlist);
 #else
   /* Punt file name, we can't help it easily.  */
-  add_com ("source", class_support, source_command,
+  c = add_cmd ("source", class_support, source_command,
           "Read commands from a file named FILE.\n\
 Note that the file \".gdbinit\" is read automatically in this way\n\
-when gdb is started.");
+when gdb is started.", &cmdlist);
 #endif
+  c->completer = filename_completer;
 
   add_com ("quit", class_support, quit_command, "Exit gdb.");
   add_com ("help", class_support, help_command, "Print list of commands.");
@@ -2397,7 +2564,7 @@ Use \"on\" to enable 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_uinteger, (char *)&history_size,
+  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);
   add_show_from_set (c, &showhistlist);
This page took 0.035008 seconds and 4 git commands to generate.