#include "options.h"
// --- Static variables --- //
-static char * unspecified_funct = (char*)"???";
+static const char * unspecified_funct = "???";
// --- Function implementations --- //
/**
- * @funct Log
+ * @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 fmt - A format string
* @param ... - Arguments to be printed according to the format string
*/
-void Log(int level, char * funct, char * fmt, ...)
+void LogEx(int level, const char * funct, ...)
{
+ const char *fmt;
+ va_list va;
+ va_start(va, funct);
+ fmt = va_arg(va, const char*);
+
if (fmt == NULL) // sanity check
- Fatal("Log", "Format string is NULL");
+ FatalEx("Log", "Format string is NULL");
// Don't print the message unless we need to
- if (level > g_options.verbosity)
+ if (level > g_options.verbosity)
return;
if (funct == NULL)
funct = unspecified_funct;
// Make a human readable severity string
- char severity[BUFSIZ];
+ 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;
}
fprintf(stderr, "%s [%d] : %s : %s - ", g_options.program, getpid(), severity, funct);
// Then pass additional arguments with the format string to vfprintf for printing
- va_list va;
- va_start(va, fmt);
vfprintf(stderr, fmt, va);
va_end(va);
}
/**
- * @funct Fatal
+ * @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 Fatal(char * funct, char * fmt, ...)
+void FatalEx(const char * funct, ...)
{
+ const char *fmt;
+ va_list va;
+ va_start(va, funct);
+ fmt = va_arg(va, const char*);
if (fmt == NULL)
{
// Fatal error in the Fatal function.
// (This really shouldn't happen unless someone does something insanely stupid)
- Fatal("Fatal", "Format string is NULL");
+ FatalEx("Fatal", "Format string is NULL");
return; // Should never get here
}
fprintf(stderr, "%s [%d] : %s : FATAL - ", g_options.program, getpid(), funct);
- va_list va;
- va_start(va, fmt);
vfprintf(stderr, fmt, va);
va_end(va);
fprintf(stderr, "\n");
#include <stdbool.h>
#include <stdarg.h>
+//To get around a 'pedantic' C99 rule that you must have at least 1 variadic arg, combine fmt into that.
+#define Log(level, ...) LogEx(level, __func__, __VA_ARGS__)
+#define Fatal(...) FatalEx(__func__, __VA_ARGS__)
// An enum to make the severity of log messages human readable in code
enum {LOGERR=0, LOGWARN=1, LOGNOTE=2, LOGINFO=3,LOGDEBUG=4};
-extern void Log(int level, char * funct, char * fmt,...); // General function for printing log messages to stderr
-extern void Fatal(char * funct, char * fmt, ...); // Function that deals with a fatal error (prints a message, then exits the program).
+extern void LogEx(int level, const char * funct, ...); // General function for printing log messages to stderr
+extern void FatalEx(const char * funct, ...); // Function that deals with a fatal error (prints a message, then exits the program).
#endif //_LOG_H
{
opts->program = argv[0]; // program name
opts->verbosity = LOGDEBUG; // default log level
- Log(LOGDEBUG, "ParseArguments", "Called as %s with %d arguments.", opts->program, argc);
+ Log(LOGDEBUG, "Called as %s with %d arguments.", opts->program, argc);
}
/**
{
// At the moment just always exit.
// Call `exit` so that Cleanup will be called to... clean up.
- Log(LOGWARN, "SignalHandler", "Got signal %d (%s). Exiting.", sig, strsignal(sig));
+ Log(LOGWARN, "Got signal %d (%s). Exiting.", sig, strsignal(sig));
exit(sig);
}
*/
void Cleanup()
{
- Log(LOGDEBUG, "Cleanup", "Begin cleanup.");
- Log(LOGDEBUG, "Cleanup", "Finish cleanup.");
+ Log(LOGDEBUG, "Begin cleanup.");
+ Log(LOGDEBUG, "Finish cleanup.");
}
*/
int main(int argc, char ** argv)
{
+ ParseArguments(argc, argv, &g_options);
return 0;
}