* Makefile.tpl: Make GCC use a separate config.cache.
[deliverable/binutils-gdb.git] / gdb / complaints.c
index 95ded4c4a8a982c1e5599cb47635c3cf86e4dba0..ed24f432406abce9a34fc25d23fd4db25ad399ce 100644 (file)
@@ -60,6 +60,15 @@ struct complain
   struct complain *next;
 };
 
+/* The explanatory message that should accompany the complaint.  The
+   message is in two parts - pre and post - that are printed around
+   the complaint text.  */
+struct explanation
+{
+  const char *prefix;
+  const char *postfix;
+};
+
 struct complaints
 {
   struct complain *root;
@@ -75,20 +84,21 @@ struct complaints
   /* The explanatory messages that should accompany the complaint.
      NOTE: cagney/2002-08-14: In a desperate attempt at being vaguely
      i18n friendly, this is an array of two messages.  When present,
-     EXPLANATION[SERIES] is used to wrap the message.  */
-  const char **explanation;
+     the PRE and POST EXPLANATION[SERIES] are used to wrap the
+     message.  */
+  const struct explanation *explanation;
 };
 
 static struct complain complaint_sentinel;
 
 /* The symbol table complaint table.  */
 
-static const char *symfile_explanations[] = {
-  "During symbol reading, %s.\n",
-  "During symbol reading...%s...",
-  "%s...",
-  "%s...",
-  NULL
+static struct explanation symfile_explanations[] = {
+  { "During symbol reading, ", "." },
+  { "During symbol reading...", "..."},
+  { "", "..."},
+  { "", "..."},
+  { NULL, NULL }
 };
 
 static struct complaints symfile_complaint_book = {
@@ -181,6 +191,7 @@ vcomplaint (struct complaints **c, const char *file, int line, const char *fmt,
   else
     {
       if (complaints->explanation == NULL)
+       /* A [v]warning() call always appends a newline.  */
        vwarning (complaint->fmt, args);
       else
        {
@@ -191,10 +202,20 @@ vcomplaint (struct complaints **c, const char *file, int line, const char *fmt,
          wrap_here ("");
          if (series != SUBSEQUENT_MESSAGE)
            begin_line ();
-         fprintf_filtered (gdb_stderr,
-                           complaints->explanation[series],
-                           msg);
-         wrap_here ("");
+         fprintf_filtered (gdb_stderr, "%s%s%s",
+                           complaints->explanation[series].prefix, msg,
+                           complaints->explanation[series].postfix);
+         /* Force a line-break after any isolated message.  For the
+             other cases, clear_complaints() takes care of any missing
+             trailing newline, the wrap_here() is just a hint.  */
+         if (series == ISOLATED_MESSAGE)
+           /* It would be really nice to use begin_line() here.
+              Unfortunately that function doesn't track GDB_STDERR and
+              consequently will sometimes supress a line when it
+              shouldn't.  */
+           fputs_filtered ("\n", gdb_stderr);
+         else
+           wrap_here ("");
          do_cleanups (cleanups);
        }
     }
@@ -238,16 +259,6 @@ internal_complaint (struct complaints **complaints, const char *file,
   va_end (args);
 }
 
-void
-complain (struct complaint *complaint, ...)
-{
-  va_list args;
-  va_start (args, complaint);
-  vcomplaint (&symfile_complaints, NULL/*file*/, 0/*line*/,
-             complaint->message, args);
-  va_end (args);
-}
-
 /* Clear out / initialize all complaint counters that have ever been
    incremented.  If LESS_VERBOSE is 1, be less verbose about
    successive complaints, since the messages are appearing all
@@ -267,10 +278,26 @@ clear_complaints (struct complaints **c, int less_verbose, int noisy)
       p->counter = 0;
     }
 
-  if (complaints->series > 1 && !warning_hook)
+  switch (complaints->series)
     {
-      /* Terminate previous series, since caller won't.  */
-      puts_filtered ("\n");
+    case FIRST_MESSAGE:
+      /* Haven't yet printed anything.  */
+      break;
+    case SHORT_FIRST_MESSAGE:
+      /* Haven't yet printed anything.  */
+      break;
+    case ISOLATED_MESSAGE:
+      /* The code above, always forces a line-break.  No need to do it
+         here.  */
+      break;
+    case SUBSEQUENT_MESSAGE:
+      /* It would be really nice to use begin_line() here.
+         Unfortunately that function doesn't track GDB_STDERR and
+         consequently will sometimes supress a line when it shouldn't.  */
+      fputs_unfiltered ("\n", gdb_stderr);
+      break;
+    default:
+      internal_error (__FILE__, __LINE__, "bad switch");
     }
 
   if (!less_verbose)
This page took 0.026002 seconds and 4 git commands to generate.