Modify logging functions to use inbuilt function naming identifiers
[matches/MCTX3420.git] / rpi / log.c
index 3a8c55c..412a34c 100644 (file)
--- a/rpi/log.c
+++ b/rpi/log.c
+/**
+ * @file log.c
+ * @purpose Implement logging and error handling functions
+ */
+
+
+#include <unistd.h>
+
+// --- Custom headers --- //
 #include "log.h"
 #include "options.h"
-#include <unistd.h>
 
-static int last_len = 0;
+// --- Static variables --- //
+static const char * unspecified_funct = "???";
+
+// --- Function implementations --- //
 
-void log_print(int level, char * funct, char * fmt, ...)
+/**
+ * @funct LogEx
+ * @purpose Print a message to stderr
+ * @param level - Specify how severe the message is.
+       If level is higher (less urgent) than the program's verbosity (see options.h) no message will be printed
+ * @param funct - String indicating the function name from which this function was called.
+       If this is NULL, Log will show the unspecified_funct string instead
+ * @param fmt - A format string
+ * @param ... - Arguments to be printed according to the format string
+ */
+void LogEx(int level, const char * funct, ...)
 {
-       if (level > options.verbosity)
+       const char *fmt;
+       va_list va;
+       va_start(va, funct);
+       fmt = va_arg(va, const char*);
+       
+       if (fmt == NULL) // sanity check
+               FatalEx("Log", "Format string is NULL");
+
+       // Don't print the message unless we need to
+       if (level > g_options.verbosity)
                return;
 
-       
+       if (funct == NULL)
+               funct = unspecified_funct;
 
-       char severity[BUFSIZ];
+       // Make a human readable severity string
+       const char *severity;
        switch (level)
        {
                case LOGERR:
-                       sprintf(severity, "ERROR");
+                       severity = "ERROR";
                        break;
                case LOGWARN:
-                       sprintf(severity, "WARNING");
+                       severity = "WARNING";
                        break;
                case LOGNOTE:
-                       sprintf(severity, "NOTICE");
+                       severity = "NOTICE";
                        break;
                case LOGINFO:
-                       sprintf(severity, "INFO");
+                       severity = "INFO";
                        break;
                default:
-                       sprintf(severity, "DEBUG");
+                       severity = "DEBUG";
                        break;
        }
 
-       if (funct != NULL)
-               last_len = fprintf(stderr, "%s [%d] : %s : %s - ", options.program, getpid(), severity, funct);
-       else
-       {
-               for (int i = 0; i < last_len; ++i);
-                       fprintf(stderr, " ");
-       }
-       va_list va;
-       va_start(va, fmt);
+       // Print: Program name, PID, severity string, function name first
+       fprintf(stderr, "%s [%d] : %s : %s - ", g_options.program, getpid(), severity, funct);
+
+       // Then pass additional arguments with the format string to vfprintf for printing
        vfprintf(stderr, fmt, va);
        va_end(va);
+
+       // End log messages with a newline
        fprintf(stderr, "\n");
 }
 
-void error(char * funct, char * fmt, ...)
+/**
+ * @funct FatalEx
+ * @purpose Handle a Fatal error in the program by printing a message and exiting the program
+       CALLING THIS FUNCTION WILL CAUSE THE PROGAM TO EXIT
+ * @param funct - Name of the calling function
+ * @param fmt - A format string
+ * @param ... - Arguments to be printed according to the format string
+ */
+void FatalEx(const char * funct, ...)
 {
-       if (funct != NULL)
-               last_len = fprintf(stderr, "%s [%d] : Fatal error in %s - ", options.program, getpid(), funct);
-       else
+       const char *fmt;
+       va_list va;
+       va_start(va, funct);
+       fmt = va_arg(va, const char*);
+       
+       if (fmt == NULL)
        {
-               for (int i = 0; i < last_len; ++i)
-                       fprintf(stderr, " ");
-               fprintf(stderr, "Fatal - ");
+               // Fatal error in the Fatal function.
+               // (This really shouldn't happen unless someone does something insanely stupid)
+               FatalEx("Fatal", "Format string is NULL");
+               return; // Should never get here
        }
-       va_list va;
-       va_start(va, fmt);
+
+       if (funct == NULL)
+               funct = unspecified_funct;
+
+       fprintf(stderr, "%s [%d] : %s : FATAL - ", g_options.program, getpid(), funct);
+
        vfprintf(stderr, fmt, va);
        va_end(va);
        fprintf(stderr, "\n");

UCC git Repository :: git.ucc.asn.au