From 2911f0c00dbb41abba7f84b5daba8a37de88519e Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Fri, 2 Jul 2021 18:07:24 -0700 Subject: [PATCH] message: Get rid of 'shipped' member in struct message. 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 | 33 +++++++++++++++++---------------- src/libpspp/message.h | 1 - 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/libpspp/message.c b/src/libpspp/message.c index e97017770e..e40b34c93c 100644 --- a/src/libpspp/message.c +++ b/src/libpspp/message.c @@ -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); diff --git a/src/libpspp/message.h b/src/libpspp/message.h index ebd788aecd..af7bc699d7 100644 --- a/src/libpspp/message.h +++ b/src/libpspp/message.h @@ -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. */ -- 2.30.2