kettek2/wiki/games/newsboy/Newsboy_0x00/engine/report.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;
}