Index: fusl/src/misc/fmtmsg.c |
diff --git a/fusl/src/misc/fmtmsg.c b/fusl/src/misc/fmtmsg.c |
new file mode 100644 |
index 0000000000000000000000000000000000000000..69170b25429c4974fdcc90e44d941b497fd9eb6d |
--- /dev/null |
+++ b/fusl/src/misc/fmtmsg.c |
@@ -0,0 +1,90 @@ |
+/* Public domain fmtmsg() |
+ * Written by Isaac Dunham, 2014 |
+ */ |
+#include <fmtmsg.h> |
+#include <fcntl.h> |
+#include <unistd.h> |
+#include <stdio.h> |
+#include <string.h> |
+#include <stdlib.h> |
+#include <pthread.h> |
+ |
+/* |
+ * If lstr is the first part of bstr, check that the next char in bstr |
+ * is either \0 or : |
+ */ |
+static int _strcolcmp(const char *lstr, const char *bstr) |
+{ |
+ size_t i = 0; |
+ while (lstr[i] && bstr[i] && (bstr[i] == lstr[i])) i++; |
+ if ( lstr[i] || (bstr[i] && bstr[i] != ':')) return 1; |
+ return 0; |
+} |
+ |
+int fmtmsg(long classification, const char *label, int severity, |
+ const char *text, const char *action, const char *tag) |
+{ |
+ int ret = 0, i, consolefd, verb = 0; |
+ char *errstring = MM_NULLSEV, *cmsg = getenv("MSGVERB"); |
+ char *const msgs[] = { |
+ "label", "severity", "text", "action", "tag", NULL |
+ }; |
+ int cs; |
+ |
+ pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs); |
+ |
+ if (severity == MM_HALT) errstring = "HALT: "; |
+ else if (severity == MM_ERROR) errstring = "ERROR: "; |
+ else if (severity == MM_WARNING) errstring = "WARNING: "; |
+ else if (severity == MM_INFO) errstring = "INFO: "; |
+ |
+ if (classification & MM_CONSOLE) { |
+ consolefd = open("/dev/console", O_WRONLY); |
+ if (consolefd < 0) { |
+ ret = MM_NOCON; |
+ } else { |
+ if (dprintf(consolefd, "%s%s%s%s%s%s%s%s\n", |
+ label?label:"", label?": ":"", |
+ severity?errstring:"", text?text:"", |
+ action?"\nTO FIX: ":"", |
+ action?action:"", action?" ":"", |
+ tag?tag:"" )<1) |
+ ret = MM_NOCON; |
+ close(consolefd); |
+ } |
+ } |
+ |
+ if (classification & MM_PRINT) { |
+ while (cmsg && cmsg[0]) { |
+ for(i=0; msgs[i]; i++) { |
+ if (!_strcolcmp(msgs[i], cmsg)) break; |
+ } |
+ if (msgs[i] == NULL) { |
+ //ignore MSGVERB-unrecognized component |
+ verb = 0xFF; |
+ break; |
+ } else { |
+ verb |= (1 << i); |
+ cmsg = strchr(cmsg, ':'); |
+ if (cmsg) cmsg++; |
+ } |
+ } |
+ if (!verb) verb = 0xFF; |
+ if (dprintf(2, "%s%s%s%s%s%s%s%s\n", |
+ (verb&1 && label) ? label : "", |
+ (verb&1 && label) ? ": " : "", |
+ (verb&2 && severity) ? errstring : "", |
+ (verb&4 && text) ? text : "", |
+ (verb&8 && action) ? "\nTO FIX: " : "", |
+ (verb&8 && action) ? action : "", |
+ (verb&8 && action) ? " " : "", |
+ (verb&16 && tag) ? tag : "" ) < 1) |
+ ret |= MM_NOMSG; |
+ } |
+ if ((ret & (MM_NOCON|MM_NOMSG)) == (MM_NOCON|MM_NOMSG)) |
+ ret = MM_NOTOK; |
+ |
+ pthread_setcancelstate(cs, 0); |
+ |
+ return ret; |
+} |