message: Get rid of 'shipped' member in struct message.
authorBen Pfaff <blp@cs.stanford.edu>
Sat, 3 Jul 2021 01:07:24 +0000 (18:07 -0700)
committerBen Pfaff <blp@cs.stanford.edu>
Mon, 5 Jul 2021 01:22:12 +0000 (18:22 -0700)
It seemed to me that it wasn't a very clean design, since it required a
message to be modified as part of emitting it.

src/libpspp/message.c
src/libpspp/message.h

index e97017770ed0d5fe377dc75ffe4e93d94b1349f0..e40b34c93c9a7b959ca03e06793b3d763f8f20bd 100644 (file)
@@ -268,24 +268,26 @@ msg_ui_any_errors (void)
 }
 
 
-static int entrances = 0;
-
 static void
 ship_message (struct msg *m)
 {
-  entrances++;
-  if (! m->shipped)
-    {
-      if (msg_handler && entrances <= 1)
-       msg_handler (m, msg_aux);
-      else
-       {
-         fwrite (m->text, 1, strlen (m->text), stderr);
-         fwrite ("\n", 1, 1, stderr);
-       }
-    }
-  m->shipped = true;
-  entrances--;
+  enum { MAX_STACK = 4 };
+  static struct msg *stack[MAX_STACK];
+  static size_t n;
+
+  /* If we're recursing on a given message, or recursing deeply, drop it. */
+  if (n >= MAX_STACK)
+    return;
+  for (size_t i = 0; i < n; i++)
+    if (stack[i] == m)
+      return;
+
+  stack[n++] = m;
+  if (msg_handler && n <= 1)
+    msg_handler (m, msg_aux);
+  else
+    fprintf (stderr, "%s\n", m->text);
+  n--;
 }
 
 static void
@@ -348,7 +350,6 @@ process_msg (struct msg *m)
 void
 msg_emit (struct msg *m)
 {
-  m->shipped = false;
   if (!messages_disabled)
      process_msg (m);
 
index ebd788aecd2ec725fa5096e54c2e6d8ee5011109..af7bc699d7afcc3d4e3e21122d580a38f7b0af62 100644 (file)
@@ -81,7 +81,6 @@ struct msg
     int first_column;           /* 1-based first column, or 0 if none. */
     int last_column;            /* 1-based exclusive last column (0=none). */
     char *text;                 /* Error text. */
-    bool shipped;               /* True if this message has been emitted */
   };
 
 /* Initialization. */