Honour PRIVATE keyword
[deliverable/binutils-gdb.git] / gdb / utils.c
index ba936d508c2e3d8f865f76e58b1f9bbabd17be0f..3bc5fed2a30791027b57a480dc240f6a32c281c0 100644 (file)
@@ -1,7 +1,7 @@
 /* General utility routines for GDB, the GNU debugger.
 
    Copyright 1986, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
-   1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 Free Software
+   1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software
    Foundation, Inc.
 
    This file is part of GDB.
 #include "gdb_string.h"
 #include "event-top.h"
 
+#ifdef TUI
+#include "tui/tui.h"           /* For tui_get_command_dimension.   */
+#endif
+
 #ifdef __GO32__
 #include <pc.h>
 #endif
 #include <term.h>
 #endif
 
-#include <readline/readline.h>
-
-#ifdef USE_MMALLOC
-#include "mmalloc.h"
-#endif
+#include "readline/readline.h"
 
 #ifdef NEED_DECLARATION_MALLOC
 extern PTR malloc ();          /* OK: PTR */
@@ -98,10 +98,6 @@ static void fputs_maybe_filtered (const char *, struct ui_file *, int);
 
 static void do_my_cleanups (struct cleanup **, struct cleanup *);
 
-#if defined (USE_MMALLOC) && !defined (NO_MMCHECK)
-static void malloc_botch (void);
-#endif
-
 static void prompt_for_continue (void);
 
 static void set_screen_size (void);
@@ -628,6 +624,38 @@ do_write (void *data, const char *buffer, long length_buffer)
   ui_file_write (data, buffer, length_buffer);
 }
 
+/* Cause a silent error to occur.  Any error message is recorded
+   though it is not issued.  */
+NORETURN void
+error_silent (const char *string, ...)
+{
+  va_list args;
+  struct ui_file *tmp_stream = mem_fileopen ();
+  va_start (args, string);
+  make_cleanup_ui_file_delete (tmp_stream);
+  vfprintf_unfiltered (tmp_stream, string, args);
+  /* Copy the stream into the GDB_LASTERR buffer.  */
+  ui_file_rewind (gdb_lasterr);
+  ui_file_put (tmp_stream, do_write, gdb_lasterr);
+  va_end (args);
+
+  throw_exception (RETURN_ERROR);
+}
+
+/* Output an error message including any pre-print text to gdb_stderr.  */
+void
+error_output_message (char *pre_print, char *msg)
+{
+  target_terminal_ours ();
+  wrap_here ("");              /* Force out any buffered output */
+  gdb_flush (gdb_stdout);
+  annotate_error_begin ();
+  if (pre_print)
+    fputs_filtered (pre_print, gdb_stderr);
+  fputs_filtered (msg, gdb_stderr);
+  fprintf_filtered (gdb_stderr, "\n");
+}
+
 NORETURN void
 error_stream (struct ui_file *stream)
 {
@@ -951,18 +979,12 @@ request_quit (int signo)
      about USG defines and stuff like that.  */
   signal (signo, request_quit);
 
-#ifdef REQUEST_QUIT
-  REQUEST_QUIT;
-#else
   if (immediate_quit)
     quit ();
-#endif
 }
 \f
 /* Memory management stuff (malloc friends).  */
 
-#if !defined (USE_MMALLOC)
-
 static void *
 mmalloc (void *md, size_t size)
 {
@@ -990,63 +1012,13 @@ mfree (void *md, void *ptr)
   free (ptr);                  /* NOTE: GDB's only call to free() */
 }
 
-#endif /* USE_MMALLOC */
-
-#if !defined (USE_MMALLOC) || defined (NO_MMCHECK)
-
-void
-init_malloc (void *md)
-{
-}
-
-#else /* Have mmalloc and want corruption checking */
-
-static void
-malloc_botch (void)
-{
-  fprintf_unfiltered (gdb_stderr, "Memory corruption\n");
-  internal_error (__FILE__, __LINE__, "failed internal consistency check");
-}
-
-/* Attempt to install hooks in mmalloc/mrealloc/mfree for the heap specified
-   by MD, to detect memory corruption.  Note that MD may be NULL to specify
-   the default heap that grows via sbrk.
-
-   Note that for freshly created regions, we must call mmcheckf prior to any
-   mallocs in the region.  Otherwise, any region which was allocated prior to
-   installing the checking hooks, which is later reallocated or freed, will
-   fail the checks!  The mmcheck function only allows initial hooks to be
-   installed before the first mmalloc.  However, anytime after we have called
-   mmcheck the first time to install the checking hooks, we can call it again
-   to update the function pointer to the memory corruption handler.
-
-   Returns zero on failure, non-zero on success. */
-
-#ifndef MMCHECK_FORCE
-#define MMCHECK_FORCE 0
-#endif
-
+/* This used to do something interesting with USE_MMALLOC.
+ * It can be retired any time.  -- chastain 2004-01-19.  */
 void
 init_malloc (void *md)
 {
-  if (!mmcheckf (md, malloc_botch, MMCHECK_FORCE))
-    {
-      /* Don't use warning(), which relies on current_target being set
-         to something other than dummy_target, until after
-         initialize_all_files(). */
-
-      fprintf_unfiltered
-       (gdb_stderr,
-        "warning: failed to install memory consistency checks; ");
-      fprintf_unfiltered (gdb_stderr,
-                         "configuration should define NO_MMCHECK or MMCHECK_FORCE\n");
-    }
-
-  mmtrace ();
 }
 
-#endif /* Have mmalloc and want corruption checking  */
-
 /* Called when a memory allocation fails, with the number of bytes of
    memory requested in SIZE. */
 
@@ -1363,6 +1335,145 @@ query (const char *ctlstr, ...)
 }
 \f
 
+/* This function supports the nquery() and yquery() functions.
+   Ask user a y-or-n question and return 0 if answer is no, 1 if
+   answer is yes, or default the answer to the specified default.
+   DEFCHAR is either 'y' or 'n' and refers to the default answer.
+   CTLSTR is the control string and should end in "? ".  It should
+   not say how to answer, because we do that.
+   ARGS are the arguments passed along with the CTLSTR argument to
+   printf.  */
+
+static int
+defaulted_query (const char *ctlstr, const char defchar, va_list args)
+{
+  int answer;
+  int ans2;
+  int retval;
+  int def_value;
+  char def_answer, not_def_answer;
+  char *y_string, *n_string;
+
+  /* Set up according to which answer is the default.  */
+  if (defchar == 'y')
+    {
+      def_value = 1;
+      def_answer = 'Y';
+      not_def_answer = 'N';
+      y_string = "[y]";
+      n_string = "n";
+    }
+  else
+    {
+      def_value = 0;
+      def_answer = 'N';
+      not_def_answer = 'Y';
+      y_string = "y";
+      n_string = "[n]";
+    }
+
+  if (query_hook)
+    {
+      return query_hook (ctlstr, args);
+    }
+
+  /* Automatically answer default value if input is not from a terminal.  */
+  if (!input_from_terminal_p ())
+    return def_value;
+
+  while (1)
+    {
+      wrap_here ("");          /* Flush any buffered output */
+      gdb_flush (gdb_stdout);
+
+      if (annotation_level > 1)
+       printf_filtered ("\n\032\032pre-%cquery\n", defchar);
+
+      vfprintf_filtered (gdb_stdout, ctlstr, args);
+      printf_filtered ("(%s or %s) ", y_string, n_string);
+
+      if (annotation_level > 1)
+       printf_filtered ("\n\032\032%cquery\n", defchar);
+
+      wrap_here ("");
+      gdb_flush (gdb_stdout);
+
+      answer = fgetc (stdin);
+      clearerr (stdin);                /* in case of C-d */
+      if (answer == EOF)       /* C-d */
+       {
+         retval = def_value;
+         break;
+       }
+      /* Eat rest of input line, to EOF or newline */
+      if (answer != '\n')
+       do
+         {
+           ans2 = fgetc (stdin);
+           clearerr (stdin);
+         }
+       while (ans2 != EOF && ans2 != '\n' && ans2 != '\r');
+
+      if (answer >= 'a')
+       answer -= 040;
+      /* Check answer.  For the non-default, the user must specify
+         the non-default explicitly.  */
+      if (answer == not_def_answer)
+       {
+         retval = !def_value;
+         break;
+       }
+      /* Otherwise, for the default, the user may either specify
+         the required input or have it default by entering nothing.  */
+      if (answer == def_answer || answer == '\n' || 
+         answer == '\r' || answer == EOF)
+       {
+         retval = def_value;
+         break;
+       }
+      /* Invalid entries are not defaulted and require another selection.  */
+      printf_filtered ("Please answer %s or %s.\n",
+                      y_string, n_string);
+    }
+
+  if (annotation_level > 1)
+    printf_filtered ("\n\032\032post-%cquery\n", defchar);
+  return retval;
+}
+\f
+
+/* Ask user a y-or-n question and return 0 if answer is no, 1 if
+   answer is yes, or 0 if answer is defaulted.
+   Takes three args which are given to printf to print the question.
+   The first, a control string, should end in "? ".
+   It should not say how to answer, because we do that.  */
+
+int
+nquery (const char *ctlstr, ...)
+{
+  va_list args;
+
+  va_start (args, ctlstr);
+  return defaulted_query (ctlstr, 'n', args);
+  va_end (args);
+}
+
+/* Ask user a y-or-n question and return 0 if answer is no, 1 if
+   answer is yes, or 1 if answer is defaulted.
+   Takes three args which are given to printf to print the question.
+   The first, a control string, should end in "? ".
+   It should not say how to answer, because we do that.  */
+
+int
+yquery (const char *ctlstr, ...)
+{
+  va_list args;
+
+  va_start (args, ctlstr);
+  return defaulted_query (ctlstr, 'y', args);
+  va_end (args);
+}
+
 /* Print an error message saying that we couldn't make sense of a
    \^mumble sequence in a string or character constant.  START and END
    indicate a substring of some larger string that contains the
@@ -1610,12 +1721,14 @@ init_page_info (void)
   if (!tui_get_command_dimension (&chars_per_line, &lines_per_page))
 #endif
     {
-#if defined(__GO32__)
-      lines_per_page = ScreenRows ();
-      chars_per_line = ScreenCols ();
-#else
       int rows, cols;
 
+#if defined(__GO32__)
+      rows = ScreenRows ();
+      cols = ScreenCols ();
+      lines_per_page = rows;
+      chars_per_line = cols;
+#else
       /* Make sure Readline has initialized its terminal settings.  */
       rl_reset_terminal (NULL);
 
@@ -1641,8 +1754,8 @@ init_page_info (void)
       /* If the output is not a terminal, don't paginate it.  */
       if (!ui_file_isatty (gdb_stdout))
        lines_per_page = UINT_MAX;
-    }
 #endif
+    }
 
   set_screen_size ();
   set_width ();
This page took 0.027408 seconds and 4 git commands to generate.