shithub: npe

ref: 979ae53cfee913c2d303ab0f95aaa65dace1c7b5
dir: /libnpe_sdl3/log.c/

View raw version
#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);
}