Added a way to replace the default logging mechanism
This commit is contained in:
parent
8f92919310
commit
631784d9a2
2 changed files with 54 additions and 1 deletions
|
@ -177,6 +177,22 @@ extern DECLSPEC void SDLCALL SDL_LogMessageV(int category,
|
||||||
SDL_LogPriority priority,
|
SDL_LogPriority priority,
|
||||||
const char *fmt, va_list ap);
|
const char *fmt, va_list ap);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief The prototype for the log output function
|
||||||
|
*/
|
||||||
|
typedef void (*SDL_LogOutputFunction)(void *userdata, int category, SDL_LogPriority priority, const char *message);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Get the current log output function.
|
||||||
|
*/
|
||||||
|
extern DECLSPEC void SDLCALL SDL_LogGetOutputFunction(SDL_LogOutputFunction *callback, void **userdata);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This function allows you to replace the default log output
|
||||||
|
* function with one of your own.
|
||||||
|
*/
|
||||||
|
extern DECLSPEC void SDLCALL SDL_LogSetOutputFunction(SDL_LogOutputFunction callback, void *userdata);
|
||||||
|
|
||||||
|
|
||||||
/* Ends C function definitions when using C++ */
|
/* Ends C function definitions when using C++ */
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
|
@ -45,11 +45,19 @@ typedef struct SDL_LogLevel
|
||||||
struct SDL_LogLevel *next;
|
struct SDL_LogLevel *next;
|
||||||
} SDL_LogLevel;
|
} SDL_LogLevel;
|
||||||
|
|
||||||
|
/* The default log output function */
|
||||||
|
static void SDL_LogOutput(void *userdata,
|
||||||
|
int category, SDL_LogPriority priority,
|
||||||
|
const char *message);
|
||||||
|
|
||||||
static SDL_LogLevel *SDL_loglevels;
|
static SDL_LogLevel *SDL_loglevels;
|
||||||
static SDL_LogPriority SDL_application_priority = DEFAULT_APPLICATION_PRIORITY;
|
static SDL_LogPriority SDL_application_priority = DEFAULT_APPLICATION_PRIORITY;
|
||||||
static SDL_LogPriority SDL_default_priority = DEFAULT_PRIORITY;
|
static SDL_LogPriority SDL_default_priority = DEFAULT_PRIORITY;
|
||||||
|
static SDL_LogOutputFunction SDL_log_function = SDL_LogOutput;
|
||||||
|
static void *SDL_log_userdata = NULL;
|
||||||
|
|
||||||
static const char *SDL_priority_prefixes[SDL_NUM_LOG_PRIORITIES] = {
|
static const char *SDL_priority_prefixes[SDL_NUM_LOG_PRIORITIES] = {
|
||||||
|
NULL,
|
||||||
"VERBOSE",
|
"VERBOSE",
|
||||||
"DEBUG",
|
"DEBUG",
|
||||||
"INFO",
|
"INFO",
|
||||||
|
@ -235,6 +243,11 @@ SDL_LogMessageV(int category, SDL_LogPriority priority, const char *fmt, va_list
|
||||||
{
|
{
|
||||||
char *message;
|
char *message;
|
||||||
|
|
||||||
|
/* Nothing to do if we don't have an output function */
|
||||||
|
if (!SDL_log_function) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/* Make sure we don't exceed array bounds */
|
/* Make sure we don't exceed array bounds */
|
||||||
if (priority < 0 || priority >= SDL_NUM_LOG_PRIORITIES) {
|
if (priority < 0 || priority >= SDL_NUM_LOG_PRIORITIES) {
|
||||||
return;
|
return;
|
||||||
|
@ -250,7 +263,14 @@ SDL_LogMessageV(int category, SDL_LogPriority priority, const char *fmt, va_list
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
SDL_vsnprintf(message, SDL_MAX_LOG_MESSAGE, fmt, ap);
|
SDL_vsnprintf(message, SDL_MAX_LOG_MESSAGE, fmt, ap);
|
||||||
|
SDL_log_function(SDL_log_userdata, category, priority, message);
|
||||||
|
SDL_stack_free(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
SDL_LogOutput(void *userdata, int category, SDL_LogPriority priority,
|
||||||
|
const char *message)
|
||||||
|
{
|
||||||
#if defined(__WIN32__)
|
#if defined(__WIN32__)
|
||||||
/* Way too many allocations here, urgh */
|
/* Way too many allocations here, urgh */
|
||||||
{
|
{
|
||||||
|
@ -277,7 +297,24 @@ SDL_LogMessageV(int category, SDL_LogPriority priority, const char *fmt, va_list
|
||||||
#if HAVE_STDIO_H
|
#if HAVE_STDIO_H
|
||||||
fprintf(stderr, "%s: %s\n", SDL_priority_prefixes[priority], message);
|
fprintf(stderr, "%s: %s\n", SDL_priority_prefixes[priority], message);
|
||||||
#endif
|
#endif
|
||||||
SDL_stack_free(message);
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
SDL_LogGetOutputFunction(SDL_LogOutputFunction *callback, void **userdata)
|
||||||
|
{
|
||||||
|
if (callback) {
|
||||||
|
*callback = SDL_log_function;
|
||||||
|
}
|
||||||
|
if (userdata) {
|
||||||
|
*userdata = SDL_log_userdata;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
SDL_LogSetOutputFunction(SDL_LogOutputFunction callback, void *userdata)
|
||||||
|
{
|
||||||
|
SDL_log_function = callback;
|
||||||
|
SDL_log_userdata = userdata;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* vi: set ts=4 sw=4 expandtab: */
|
/* vi: set ts=4 sw=4 expandtab: */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue