Continue reforming error message support. In this phase, we divide
authorBen Pfaff <blp@gnu.org>
Mon, 17 Apr 2006 03:49:48 +0000 (03:49 +0000)
committerBen Pfaff <blp@gnu.org>
Mon, 17 Apr 2006 03:49:48 +0000 (03:49 +0000)
the classification of messages along "category" and "severity" axes.

14 files changed:
src/ChangeLog
src/data/casefile.c
src/data/data-in.c
src/data/por-file-reader.c
src/data/sys-file-reader.c
src/language/expressions/helpers.c
src/language/stats/flip.c
src/language/utilities/set.q
src/libpspp/ChangeLog
src/libpspp/message.h
src/message.c
src/ui/gui/ChangeLog
src/ui/gui/message-dialog.c
src/ui/gui/message-dialog.h

index e31c7f24a7f715d42e64773c5f27e7611a55ad4b..cbabd2dadee39e9c17b37f7b7b3d606a52d42ece 100644 (file)
@@ -1,3 +1,16 @@
+Sun Apr 16 20:41:10 2006  Ben Pfaff  <blp@gnu.org>
+
+       Continue reforming error message support.  In this phase, we
+       divide the classification of messages along "category" and
+       "severity" axes.
+
+       * message.c: (err_vmsg) Rewrite to deal with categories and
+       severities in a straightforward manner instead of mixing them into
+       classes.
+       [0] (puts_stderr) Removed (dead code).
+       (msg) Changed first argument from `int' to `enum msg_class'.
+       (tmsg) Ditto.
+
 Sun Apr 16 18:53:12 2006  Ben Pfaff  <blp@gnu.org>
 
        GNU standards require "file name" instead of "filename" in
index 1ae743bd965fd81ea2c57738ae5e9f114959b1fd..cf2d4f8dc8b212f17e90efdd420e59202f85821a 100644 (file)
@@ -736,7 +736,8 @@ io_error (struct casefile *cf, const char *format, ...)
       struct error e;
       va_list args;
 
-      e.class = ME;
+      e.category = MSG_GENERAL;
+      e.severity = MSG_ERROR;
       e.where.file_name = NULL;
       e.where.line_number = -1;
       e.title = NULL;
index 44fd7995f632ad86b092007fdfefa257adca3a84..1180b32b0ab0ea4c3d8b3a02ee608ceabccb62be 100644 (file)
@@ -60,8 +60,9 @@ vdls_error (const struct data_in *i, const char *format, va_list args)
   else
     ds_printf (&title, _("(columns %d-%d"), i->f1, i->f2);
   ds_printf (&title, _(", field type %s) "), fmt_to_string (&i->format));
-    
-  e.class = DE;
+
+  e.category = MSG_DATA;
+  e.severity = MSG_ERROR;
   err_location (&e.where);
   e.title = ds_c_str (&title);
 
index 0824bb311147993a0ad6795abfd654bea54f2ee9..5b49fa5aa90632e41d013f581b538debad13bb5a 100644 (file)
@@ -90,7 +90,8 @@ error (struct pfm_reader *r, const char *msg, ...)
   char *title;
   va_list args;
 
-  e.class = ME;
+  e.category = MSG_GENERAL;
+  e.severity = MSG_ERROR;
   e.where.file_name = NULL;
   e.where.line_number = 0;
   file_name = fh_get_file_name (r->fh);
index 7ccf969b775e9ea763d1b35cae40bc345d696ac3..ebf0a7b1bb7194f1cf1ea9ecaac61bbe7c4699fa 100644 (file)
@@ -126,7 +126,8 @@ corrupt_msg (int class, const char *format,...)
   struct error e;
   va_list args;
 
-  e.class = class;
+  e.category = msg_class_to_category (class);
+  e.severity = msg_class_to_severity (class);
   e.where.file_name = NULL;
   e.where.line_number = 0;
   e.title = _("corrupt system file: ");
index ff1621479505e151cabb289cdd97d2d80ed9962d..9d0d18cab134185f5d5b4d308e21a7a5be12fef4 100644 (file)
@@ -15,7 +15,8 @@ expr_error (void *aux UNUSED, const char *format, ...)
 
   /* FIXME: we can do better about saying where the error
      occurred. */
-  e.class = SE;
+  e.category = MSG_SYNTAX;
+  e.severity = MSG_ERROR;
   err_location (&e.where);
   e.title = NULL;
 
index 43d6d0f5b2a7916b5690625a03d322682d14fa17..f2c0290c0b31cf3823e2438cfd4793ae34645261 100644 (file)
@@ -91,7 +91,7 @@ cmd_flip (void)
 
   if (temporary != 0)
     {
-      msg (SM, _("FLIP ignores TEMPORARY.  "
+      msg (SW, _("FLIP ignores TEMPORARY.  "
                  "Temporary transformations will be made permanent."));
       cancel_temporary (); 
     }
index 19a287b219d0e6d32947614a1db6a91b843217c8..66ababdd790eeb91f06c92d35fe285327e32ab68 100644 (file)
@@ -469,9 +469,9 @@ static void
 show_blanks (void) 
 {
   if (get_blanks () == SYSMIS)
-    msg (MM, _("BLANKS is SYSMIS."));
+    msg (MN, _("BLANKS is SYSMIS."));
   else
-    msg (MM, _("BLANKS is %g."), get_blanks ());
+    msg (MN, _("BLANKS is %g."), get_blanks ());
 
 }
 
@@ -503,7 +503,7 @@ show_cc (int idx)
   out = format_cc (cc->neg_suffix, cc->grouping, out);
   *out = '\0';
   
-  msg (MM, _("CC%c is \"%s\"."), "ABCDE"[idx], cc_string);
+  msg (MN, _("CC%c is \"%s\"."), "ABCDE"[idx], cc_string);
 }
 
 
@@ -540,61 +540,61 @@ show_cce (void)
 static void
 show_decimals (void) 
 {
-  msg (MM, _("DECIMAL is \"%c\"."), get_decimal ());
+  msg (MN, _("DECIMAL is \"%c\"."), get_decimal ());
 }
 
 static void
 show_endcmd (void) 
 {
-  msg (MM, _("ENDCMD is \"%c\"."), get_endcmd ());
+  msg (MN, _("ENDCMD is \"%c\"."), get_endcmd ());
 }
 
 static void
 show_format (void) 
 {
-  msg (MM, _("FORMAT is %s."), fmt_to_string (get_format ()));
+  msg (MN, _("FORMAT is %s."), fmt_to_string (get_format ()));
 }
 
 static void
 show_length (void) 
 {
-  msg (MM, _("LENGTH is %d."), get_viewlength ());
+  msg (MN, _("LENGTH is %d."), get_viewlength ());
 }
 
 static void
 show_mxerrs (void) 
 {
-  msg (MM, _("MXERRS is %d."), get_mxerrs ());
+  msg (MN, _("MXERRS is %d."), get_mxerrs ());
 }
 
 static void
 show_mxloops (void) 
 {
-  msg (MM, _("MXLOOPS is %d."), get_mxloops ());
+  msg (MN, _("MXLOOPS is %d."), get_mxloops ());
 }
 
 static void
 show_mxwarns (void) 
 {
-  msg (MM, _("MXWARNS is %d."), get_mxwarns ());
+  msg (MN, _("MXWARNS is %d."), get_mxwarns ());
 }
 
 static void
 show_scompression (void) 
 {
   if (get_scompression ())
-    msg (MM, _("SCOMPRESSION is ON."));
+    msg (MN, _("SCOMPRESSION is ON."));
   else
-    msg (MM, _("SCOMPRESSION is OFF."));
+    msg (MN, _("SCOMPRESSION is OFF."));
 }
 
 static void
 show_undefined (void) 
 {
   if (get_undefined ())
-    msg (MM, _("UNDEFINED is WARN."));
+    msg (MN, _("UNDEFINED is WARN."));
   else
-    msg (MM, _("UNDEFINED is NOWARN."));
+    msg (MN, _("UNDEFINED is NOWARN."));
 }
 
 static void
@@ -602,15 +602,15 @@ show_weight (void)
 {
   struct variable *var = dict_get_weight (default_dict);
   if (var == NULL)
-    msg (MM, _("WEIGHT is off."));
+    msg (MN, _("WEIGHT is off."));
   else
-    msg (MM, _("WEIGHT is variable %s."), var->name);
+    msg (MN, _("WEIGHT is variable %s."), var->name);
 }
 
 static void
 show_width (void) 
 {
-  msg (MM, _("WIDTH is %d."), get_viewwidth ());
+  msg (MN, _("WIDTH is %d."), get_viewwidth ());
 }
 
 struct show_sbc 
@@ -661,13 +661,13 @@ show_all_cc (void)
 static void
 show_warranty (void) 
 {
-  msg (MM, lack_of_warranty);
+  msg (MN, lack_of_warranty);
 }
 
 static void
 show_copying (void) 
 {
-  msg (MM, copyleft);
+  msg (MN, copyleft);
 }
 
 int
index 2c80db58c339be0744a6337cd13f2a8150890900..88955ac42ca3797e2f3e8197f9921cc02c59f754 100644 (file)
@@ -1,3 +1,19 @@
+Sun Apr 16 20:43:35 2006  Ben Pfaff  <blp@gnu.org>
+
+       Continue reforming error message support.  In this phase, we
+       divide the classification of messages along "category" and
+       "severity" axes.
+
+       * message.h: (enum msg_class) Named this set of enumerations.
+       (enum msg_category) New enum: MSG_GENERAL, MSG_SYNTAX, MSG_DATA.
+       (enum msg_severity) New enum: MSG_ERROR, MSG_WARNING, MSG_NOTE.
+       (msg_class_to_category) New inline function.
+       (msg_class_to_severity) New inline function.
+       (msg_class_from_category_and_severity) New inline function.
+       (struct error) Removed `class' member, added `category',
+       `severity'.  Updated all users of this struct to use the new
+       members.
+
 Sun Apr 16 20:33:19 2006  Ben Pfaff  <blp@gnu.org>
 
        * str.c (ds_vprintf): Don't try to write into the string if it is
index 3422a6ed1e456c964915a493bf0674d4005e213f..9dae1e40ac98396fcfa3d834a17c2346e21c68d0 100644 (file)
 #include "compiler.h"
 
 /* Message classes. */
-enum
+enum msg_class
   {
-    SE, SW, SM,                        /* Script error/warning/message. */
-    DE, DW,                    /* Data-file error/warning. */
-    ME, MW, MM,                        /* General error/warning/message. */
+    ME, MW, MN,                        /* General error/warning/note. */
+    SE, SW, SN,                        /* Script error/warning/note. */
+    DE, DW, DN,                        /* Data-file error/note. */
     MSG_CLASS_CNT,
   };
 
+/* What kind of message is this? */
+enum msg_category 
+  {
+    MSG_GENERAL,        /* General info. */
+    MSG_SYNTAX,         /* Messages that relate to syntax files. */
+    MSG_DATA            /* Messages that relate to data files. */
+  };
+
+/* How important a condition is it? */
+enum msg_severity 
+  {
+    MSG_ERROR,
+    MSG_WARNING,
+    MSG_NOTE
+  };
+
+static inline enum msg_category
+msg_class_to_category (enum msg_class class) 
+{
+  return class / 3;
+}
+
+static inline enum msg_severity
+msg_class_to_severity (enum msg_class class) 
+{
+  return class % 3;
+}
+
+static inline enum msg_class
+msg_class_from_category_and_severity (enum msg_category category,
+                                      enum msg_severity severity) 
+{
+  return category * 3 + severity;
+}
+
 /* A file location.  */
 struct file_locator
   {
@@ -43,7 +78,8 @@ struct file_locator
 /* An error message. */
 struct error
   {
-    int class;                 /* One of the classes above. */
+    enum msg_category category; /* Message category. */
+    enum msg_severity severity; /* Message severity. */
     struct file_locator where; /* File location, or (NULL, -1). */
     const char *title;         /* Special text inserted if not null. */
   };
@@ -61,9 +97,9 @@ extern int err_already_flagged;
 extern int err_verbosity;
 
 /* Functions. */
-void msg (int class, const char *format, ...)
+void msg (enum msg_class, const char *format, ...)
      PRINTF_FORMAT (2, 3);
-void tmsg (int class, const char *title, const char *format, ...)
+void tmsg (enum msg_class, const char *title, const char *format, ...)
      PRINTF_FORMAT (3, 4);
 
 void verbose_msg (int level, const char *format, ...)
index e6a8f76b11f346e96355053d8a0dc6b9bfea8e4d..b96cdb0d7bc36607e389950c56e4943da248d9d8 100644 (file)
@@ -45,17 +45,18 @@ int err_verbosity;
 
 static char *command_name;
 \f
-/* Fairly common public functions. */
+/* Public functions. */
 
 /* Writes error message in CLASS, with title TITLE and text FORMAT,
    formatted with printf, to the standard places. */
 void
-tmsg (int class, const char *title, const char *format, ...)
+tmsg (enum msg_class class, const char *title, const char *format, ...)
 {
   struct error e;
   va_list args;
 
-  e.class = class;
+  e.category = msg_class_to_category (class);
+  e.severity = msg_class_to_severity (class);
   err_location (&e.where);
   e.title = title;
 
@@ -67,12 +68,13 @@ tmsg (int class, const char *title, const char *format, ...)
 /* Writes error message in CLASS, with text FORMAT, formatted with
    printf, to the standard places. */
 void
-msg (int class, const char *format, ...)
+msg (enum msg_class class, const char *format, ...)
 {
   struct error e;
   va_list args;
 
-  e.class = class;
+  e.category = msg_class_to_category (class);
+  e.severity = msg_class_to_severity (class);
   err_location (&e.where);
   e.title = NULL;
 
@@ -104,12 +106,12 @@ void
 err_check_count (void)
 {
   if (get_errorbreak() && err_error_count)
-    msg (MM, _("Terminating execution of syntax file due to error."));
+    msg (MN, _("Terminating execution of syntax file due to error."));
   else if (err_error_count > get_mxerrs() )
-    msg (MM, _("Errors (%d) exceeds limit (%d)."),
+    msg (MN, _("Errors (%d) exceeds limit (%d)."),
         err_error_count, get_mxerrs());
   else if (err_error_count + err_warning_count > get_mxwarns() )
-    msg (MM, _("Warnings (%d) exceed limit (%d)."),
+    msg (MN, _("Warnings (%d) exceed limit (%d)."),
         err_error_count + err_warning_count, get_mxwarns() );
   else
     return;
@@ -141,42 +143,37 @@ err_done (void)
 void
 err_vmsg (const struct error *e, const char *format, va_list args)
 {
-  /* Class flags. */
-  enum
+  struct category 
     {
-      ERR_IN_PROCEDURE = 01,   /* 1=Display name of current procedure. */
-      ERR_WITH_FILE = 02,      /* 1=Display file name and line number. */
+      bool show_command_name;   /* Show command name with error? */
+      bool show_file_location;  /* Show syntax file location? */
     };
 
-  /* Describes one class of error. */
-  struct error_class
+  static const struct category categories[] = 
     {
-      int flags;               /* Zero or more of ERR_*. */
-      int *count;              /* Counting category. */
-      const char *banner;      /* Banner. */
+      {false, false},           /* MSG_GENERAL. */
+      {true, true},             /* MSG_SYNTAX. */
+      {false, true},            /* MSG_DATA. */
     };
 
-  static const struct error_class error_classes[MSG_CLASS_CNT] =
+  struct severity 
     {
-      {3, &err_error_count, N_("error")},      /* SE */
-      {3, &err_warning_count, N_("warning")},  /* SW */
-      {3, NULL, N_("note")},                   /* SM */
-
-      {2, &err_error_count, N_("error")},      /* DE */
-      {2, &err_warning_count, N_("warning")},  /* DW */
-
-      {0, &err_error_count, N_("error")},      /* ME */
-      {0, &err_warning_count, N_("warning")},  /* MW */
-      {0, NULL, N_("note")},                   /* MM */
+      const char *name;         /* How to identify this severity. */
+      int *count;               /* Number of msgs with this severity so far. */
+    };
+  
+  static struct severity severities[] = 
+    {
+      {N_("error"), &err_error_count},          /* MSG_ERROR. */
+      {N_("warning"), &err_warning_count},      /* MSG_WARNING. */
+      {NULL, NULL},                             /* MSG_NOTE. */
     };
 
-  struct string msg;
+  const struct category *category = &categories[e->category];
+  const struct severity *severity = &severities[e->severity];
+  struct string msg = DS_INITIALIZER;
 
-  assert (e->class >= 0 && e->class < MSG_CLASS_CNT);
-  assert (format != NULL);
-  
-  ds_init (&msg, 64);
-  if (e->where.file_name && (error_classes[e->class].flags & ERR_WITH_FILE))
+  if (category->show_file_location && e->where.file_name)
     {
       ds_printf (&msg, "%s:", e->where.file_name);
       if (e->where.line_number != -1)
@@ -184,16 +181,13 @@ err_vmsg (const struct error *e, const char *format, va_list args)
       ds_putc (&msg, ' ');
     }
 
-  ds_printf (&msg, "%s: ", gettext (error_classes[e->class].banner));
+  if (severity->name != NULL)
+    ds_printf (&msg, "%s: ", gettext (severity->name));
   
-  {
-    int *count = error_classes[e->class].count;
-    if (count)
-      (*count)++;
-  }
+  if (severity->count != NULL)
+    ++*severity->count;
   
-  if (command_name != NULL
-      && (error_classes[e->class].flags & ERR_IN_PROCEDURE))
+  if (category->show_command_name && command_name != NULL)
     ds_printf (&msg, "%s: ", command_name);
 
   if (e->title)
@@ -202,11 +196,7 @@ err_vmsg (const struct error *e, const char *format, va_list args)
   ds_vprintf (&msg, format, args);
 
   /* FIXME: Check set_messages and set_errors to determine where to
-     send errors and messages.
-
-     Please note that this is not trivial.  We have to avoid an
-     infinite loop in reporting errors that originate in the output
-     section. */
+     send errors and messages. */
   dump_message (ds_c_str (&msg), 8, puts_stdout, get_viewwidth());
 
   ds_destroy (&msg);
@@ -214,16 +204,6 @@ err_vmsg (const struct error *e, const char *format, va_list args)
 \f
 /* Private functions. */
 
-#if 0
-/* Write S followed by a newline to stderr. */
-static void
-puts_stderr (const char *s)
-{
-  fputs (s, stderr);
-  fputc ('\n', stderr);
-}
-#endif
-
 /* Write S followed by a newline to stdout. */
 static void
 puts_stdout (const char *s)
index f55f6eb0a35ab35c3037c8ab30edc56b0a73c186..c60dee15cb6580848ab7812bf3d5291c3220f2ca 100644 (file)
@@ -1,3 +1,13 @@
+Sun Apr 16 20:45:35 2006  Ben Pfaff  <blp@gnu.org>
+
+       Continue reforming error message support.  In this phase, we
+       divide the classification of messages along "category" and
+       "severity" axes.
+
+       * message-dialog.c: (vmsg) Use severity and category in
+       straightforward fashion instead of the less obvious "class".
+       (err_vmsg) Construct class before passing along to vmsg().
+
 Sun Apr 16 16:06:54 2006  Ben Pfaff  <blp@gnu.org>
 
        Continue reforming error message support.  In this phase, we get
index 693db49f70f2a9ddd1dcfd281b8d6a8820a0f5bd..c5928d357306b1928e0230081614c460fafdbfc3 100644 (file)
@@ -50,41 +50,31 @@ vmsg(int klass, const char *fmt, va_list args)
                    
   gint message_type;
 
-  switch (klass)
+  switch (msg_class_to_severity (klass))
     {
-    case SE:
-    case DE:
-    case ME:
+    case MSG_ERROR:
       message_type = GTK_MESSAGE_ERROR;
       break;
-    case SW:
-    case DW:
-    case MW:
+    case MSG_WARNING:
       message_type = GTK_MESSAGE_WARNING;
       break;
-    case SM:
-    case MM:
+    case MSG_NOTE:
     default:
       message_type = GTK_MESSAGE_INFO;
       break;
     };
   
-  switch (klass
+  switch (msg_class_to_category (klass)
     {
-    case SE:
-    case SW:
-    case SM:
+    case MSG_SYNTAX:
       msg = g_strdup(_("Script Error"));
       break;
 
-    case DE:
-    case DW:
+    case MSG_DATA:
       msg = g_strdup(_("Data File Error"));
       break;
 
-    case ME:
-    case MW:
-    case MM:
+    case MSG_GENERAL:
     default:
       msg = g_strdup(_("PSPP Error"));
       break;
@@ -113,7 +103,7 @@ vmsg(int klass, const char *fmt, va_list args)
 
 
 void 
-msg(int klass, const char *fmt, ...)
+msg(enum msg_class klass, const char *fmt, ...)
 {
   va_list ap;
   va_start(ap, fmt);
@@ -125,7 +115,8 @@ msg(int klass, const char *fmt, ...)
 void
 err_vmsg (const struct error *e, const char *format, va_list args)
 {
-  vmsg(e->class, format, args);
+  vmsg(msg_class_from_category_and_severity (e->category, e->severity),
+       format, args);
 }
 
 
index 3b85e60f2c1834f7f3db428fe8321e99eccf6c86..66a33633d25e413f8bf49c4a59cf6949fe608a42 100644 (file)
@@ -24,8 +24,4 @@
 
 #include <libpspp/message.h>
 
-void vmsg(int klass, const char *fmt, va_list args);
-void  msg(int klass, const char *fmt, ...);
-
-
 #endif