]> diplodocus.org Git - nmh/blobdiff - sbr/error.c
seq_list.c: Move interface to own file.
[nmh] / sbr / error.c
index e4bc9e3f96c093f372263574baac2cdd3b715bb4..fc5c6afa1c609693b6a0ffdeddc9978547759159 100644 (file)
@@ -1,20 +1,33 @@
-
-/*
- * error.c -- main error handling routines
+/* error.c -- main error handling routines
  *
  * This code is Copyright (c) 2002, by the authors of nmh.  See the
  * COPYRIGHT file in the root directory of the nmh distribution for
  * complete copyright information.
  */
 
-#include <h/mh.h>
+#include "h/mh.h"
+#include "error.h"
 
 #include <sys/types.h>
 #include <sys/uio.h>
+#include "h/done.h"
+
+/* inform calls advertise() with no what and no tail.
+ * Thus the simple "[invo_name: ]fmt\n" results. */
+void
+inform(char *fmt, ...)
+{
+    va_list ap;
+
+    va_start(ap, fmt);
+    advertise(NULL, NULL, fmt, ap);
+    va_end(ap);
+}
 
 
 /* advise calls advertise() with no tail to print fmt, and perhaps what,
- * to stderr. */
+ * to stderr.
+ * Thus "[invo_name: ]fmt[[ what]: errno]\n" results. */
 void
 advise (const char *what, const char *fmt, ...)
 {
@@ -26,13 +39,15 @@ advise (const char *what, const char *fmt, ...)
 }
 
 
-/* adios calls advertise() with no tail to print fmt, and perhaps what,
- * to stderr, and "ends" the program with an error exit status.  The
- * route to exit is via the done function pointer and may not be
- * straightforward.
- * FIXME: Document if this function can ever return.  If not, perhaps an
- * abort(3) at the end of the routine would make that more clear. */
-void
+/* adios is the same as advise(), but then "ends" the program.
+ * It calls advertise() with no tail to print fmt, and perhaps what, to
+ * stderr, and exits the program with an error status.
+ * Thus "[invo_name: ]fmt[[ what]: errno]\n" results.
+ * The route to exit is via the done function pointer and may not be
+ * straightforward, e.g. longjmp(3), but it must not return to adios().
+ * If it does then it's a bug and adios() will abort(3) as callers do
+ * not expect execution to continue. */
+void NORETURN
 adios (const char *what, const char *fmt, ...)
 {
     va_list ap;
@@ -41,11 +56,28 @@ adios (const char *what, const char *fmt, ...)
     advertise (what, NULL, fmt, ap);
     va_end(ap);
     done (1);
+    abort();
+}
+
+
+/* die is the same as adios(), but without the what as that's commonly
+ * NULL. */
+void NORETURN
+die(const char *fmt, ...)
+{
+    va_list ap;
+
+    va_start(ap, fmt);
+    advertise(NULL, NULL, fmt, ap);
+    va_end(ap);
+    done(1);
+    abort();
 }
 
 
 /* admonish calls advertise() with a tail indicating the program
- * continues. */
+ * continues.
+ * Thus "[invo_name: ]fmt[[ what]: errno], continuing...\n" results. */
 void
 admonish (char *what, char *fmt, ...)
 {
@@ -58,18 +90,17 @@ admonish (char *what, char *fmt, ...)
 
 
 /* advertise prints fmt and ap to stderr after flushing stdout.
- * If invo_name isn't NULL or empty, it precedes the output seperated by ": ".
- * If what isn't NULL, errno as a string is appended.
- * A non-empty what separates fmt from errno, surrounded by " " and ": ".
- * BUG: No space separator before errno if what is "".
- * If tail isn't NULL or empty then ", " and tail are appended
- * before the finishing "\n".
- * In summary: "invo_name: fmt what: errno, tail\n". */
+ * If invo_name isn't NULL or empty then "invo_name: " precedes fmt.
+ * If what isn't NULL or empty      then " what"   is appended.
+ * If what isn't NULL               then ": errno" is appended.
+ * If tail isn't NULL or empty      then ", tail"  is appended.
+ * A "\n" finishes the output to stderr.
+ * In summary: "[invo_name: ]fmt[[ what]: errno][, tail]\n". */
 void
 advertise (const char *what, char *tail, const char *fmt, va_list ap)
 {
     int        eindex = errno;
-    char buffer[NMH_BUFSIZ], errbuf[NMH_BUFSIZ], *err;
+    char buffer[NMH_BUFSIZ], *err;
     struct iovec iob[10], *iov;
     size_t niov;
 
@@ -94,14 +125,9 @@ advertise (const char *what, char *tail, const char *fmt, va_list ap)
        if (*what) {
             ADD_LITERAL(" ");
             ADD_VAR((void *)what);
-            ADD_LITERAL(": ");
        }
+        ADD_LITERAL(": ");
         err = strerror(eindex);
-        if (!err) {
-           /* this shouldn't happen, but we'll test for it just in case */
-           snprintf(errbuf, sizeof(errbuf), "Error %d", eindex);
-            err = errbuf;
-       }
         ADD_VAR(err);
     }
     if (tail && *tail) {