76 lines
1.4 KiB
C
76 lines
1.4 KiB
C
#include "report.h"
|
|
#include <stdio.h>
|
|
#include <stdarg.h>
|
|
#include <stdlib.h>
|
|
|
|
char severity_names[][4] = {
|
|
"GEN",
|
|
"WRN",
|
|
"ERR",
|
|
"SEV",
|
|
"DBG",
|
|
"NIL"
|
|
};
|
|
|
|
int severity_levels[] = {
|
|
1,
|
|
2,
|
|
4,
|
|
8,
|
|
16,
|
|
32
|
|
};
|
|
int report_level = REPORT_NORMAL;
|
|
|
|
int report_count = 0;
|
|
|
|
void (*doReport)(const char *, ...) = NULL;
|
|
|
|
void report(int severity, const char *context, const char *message, ...) {
|
|
if ((report_level & severity_levels[severity]) != severity_levels[severity]) {
|
|
return;
|
|
}
|
|
va_list args;
|
|
if (severity < 0 || severity >= NIL) severity = NIL;
|
|
// TODO: if doReport != NULL, write to temp buffer, then pass
|
|
if (doReport == NULL) {
|
|
printf(">>%s>> %s: ", severity_names[severity], context);
|
|
va_start(args, message);
|
|
vfprintf(stdout, message, args);
|
|
va_end(args);
|
|
printf("\n");
|
|
} else {
|
|
char buf[128];
|
|
char *buffer;
|
|
int overflow;
|
|
va_list args;
|
|
|
|
buffer = buf;
|
|
|
|
va_start(args, message);
|
|
overflow = vsnprintf(buffer, 128, message, args);
|
|
va_end(args);
|
|
// did we overflow?
|
|
if (overflow >= 128) {
|
|
buffer = (char*)malloc(overflow+1);
|
|
va_start(args, message);
|
|
overflow = vsnprintf(buffer, overflow+1, message, args);
|
|
va_end(args);
|
|
}
|
|
doReport(buffer);
|
|
|
|
if (buffer != buf) {
|
|
free(buffer);
|
|
}
|
|
}
|
|
}
|
|
|
|
int setReportLevel(int flags) {
|
|
report_level = flags;
|
|
return report_level;
|
|
}
|
|
|
|
int getReportLevel() {
|
|
return report_level;
|
|
}
|