From 45f308bd4f6de9403ae63692b7d970f38cd900d6 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Tue, 8 Feb 2011 23:13:58 -0800 Subject: [PATCH] Added a way to replace the default logging mechanism --- include/SDL_log.h | 16 ++++++++++++++++ src/SDL_log.c | 39 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/include/SDL_log.h b/include/SDL_log.h index 512dd3d22..8912e3c42 100644 --- a/include/SDL_log.h +++ b/include/SDL_log.h @@ -177,6 +177,22 @@ extern DECLSPEC void SDLCALL SDL_LogMessageV(int category, SDL_LogPriority priority, 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++ */ #ifdef __cplusplus diff --git a/src/SDL_log.c b/src/SDL_log.c index fd4f3aedc..222684809 100755 --- a/src/SDL_log.c +++ b/src/SDL_log.c @@ -45,11 +45,19 @@ typedef struct SDL_LogLevel struct SDL_LogLevel *next; } 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_LogPriority SDL_application_priority = DEFAULT_APPLICATION_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] = { + NULL, "VERBOSE", "DEBUG", "INFO", @@ -235,6 +243,11 @@ SDL_LogMessageV(int category, SDL_LogPriority priority, const char *fmt, va_list { 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 */ if (priority < 0 || priority >= SDL_NUM_LOG_PRIORITIES) { return; @@ -250,7 +263,14 @@ SDL_LogMessageV(int category, SDL_LogPriority priority, const char *fmt, va_list return; } 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__) /* 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 fprintf(stderr, "%s: %s\n", SDL_priority_prefixes[priority], message); #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: */