ref: 979ae53cfee913c2d303ab0f95aaa65dace1c7b5
dir: /libnpe_sdl3/log.c/
#include "_sdl.h"
static SDL_LogPriority logpri[SDL_LOG_CATEGORY_COUNT] = {
[SDL_LOG_CATEGORY_APPLICATION] SDL_LOG_PRIORITY_INFO,
[SDL_LOG_CATEGORY_ASSERT] SDL_LOG_PRIORITY_WARN,
[SDL_LOG_CATEGORY_TEST] SDL_LOG_PRIORITY_VERBOSE,
};
static char *logcat[SDL_LOG_CATEGORY_COUNT] = {
[SDL_LOG_CATEGORY_APPLICATION] "app",
[SDL_LOG_CATEGORY_ERROR] "error",
[SDL_LOG_CATEGORY_ASSERT] "assert",
[SDL_LOG_CATEGORY_SYSTEM] "system",
[SDL_LOG_CATEGORY_AUDIO] "audio",
[SDL_LOG_CATEGORY_VIDEO] "video",
[SDL_LOG_CATEGORY_RENDER] "render",
[SDL_LOG_CATEGORY_INPUT] "input",
[SDL_LOG_CATEGORY_TEST] "test",
};
static void warn(void*, int, SDL_LogPriority, const char*);
static SDL_LogOutputFunction logfn = warn;
static void *logaux;
static char*
evsmprint(char *fmt, va_list arg)
{
char *s;
if((s = vsmprint(fmt, arg)) == nil)
sysfatal("smprint: %r");
setmalloctag(s, getcallerpc(&fmt));
return s;
}
static void
warn(void *, int cat, SDL_LogPriority p, const char *msg)
{
char *l;
if(cat < 0 || cat >= nelem(logcat))
l = "user";
else{
if(logpri[cat] == SDL_LOG_PRIORITY_INVALID)
logpri[cat] = SDL_LOG_PRIORITY_ERROR;
if(p < logpri[cat])
return;
l = logcat[cat];
}
fprint(2, "[%s] %s\n", l, msg);
}
void
SDL_SetLogPriorities(SDL_LogPriority p)
{
SDL_LogPriority *lp;
if(p <= SDL_LOG_PRIORITY_INVALID || p >= SDL_LOG_PRIORITY_COUNT){
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "SDL_SetLogPriorities: invalid priority %d", p);
return;
}
for(lp=logpri; lp<logpri+nelem(logpri);)
*lp++ = p;
}
void
SDL_GetLogOutputFunction(SDL_LogOutputFunction *callback, void **userdata)
{
if(callback != nil)
*callback = logfn;
if(userdata != nil)
*userdata = logaux;
}
void
SDL_SetLogOutputFunction(SDL_LogOutputFunction callback, void *userdata)
{
if(callback == nil){ /* FIXME: verify */
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "SDL_SetLogOutputFunction: invalid callback");
return;
}
logfn = callback;
logaux = userdata;
}
static void
logmsg(int cat, SDL_LogPriority p, const char *fmt, va_list arg)
{
char *s;
s = evsmprint(fmt, arg);
logfn(logaux, cat, p, s);
free(s);
}
void
SDL_Log(const char *fmt, ...)
{
va_list arg;
va_start(arg, fmt);
logmsg(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, fmt, arg);
va_end(arg);
}
void
SDL_LogDebug(int cat, const char *fmt, ...)
{
va_list arg;
va_start(arg, fmt);
logmsg(cat, SDL_LOG_PRIORITY_DEBUG, fmt, arg);
va_end(arg);
}
void
SDL_LogInfo(int cat, const char *fmt, ...)
{
va_list arg;
va_start(arg, fmt);
logmsg(cat, SDL_LOG_PRIORITY_INFO, fmt, arg);
va_end(arg);
}
void
SDL_LogError(int cat, const char *fmt, ...)
{
va_list arg;
va_start(arg, fmt);
logmsg(cat, SDL_LOG_PRIORITY_ERROR, fmt, arg);
va_end(arg);
}
void
SDL_LogCritical(int cat, const char *fmt, ...)
{
va_list arg;
va_start(arg, fmt);
logmsg(cat, SDL_LOG_PRIORITY_CRITICAL, fmt, arg);
va_end(arg);
}