#include "report.h" #include #include #include 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; }