From c69f7953c79652c43ca56392d0df0bcf446da517 Mon Sep 17 00:00:00 2001 From: Pablo Marcos Oltra Date: Thu, 26 Jul 2018 21:57:45 +0200 Subject: [PATCH] Add SetTraceLogCallback to enable users setting custom logging (#597) --- examples/core/core_custom_logging.c | 90 ++++++++++++++++++++++++++ examples/core/core_custom_logging.png | Bin 0 -> 15200 bytes src/raylib.h | 6 ++ src/utils.c | 19 +++++- 4 files changed, 112 insertions(+), 3 deletions(-) create mode 100644 examples/core/core_custom_logging.c create mode 100644 examples/core/core_custom_logging.png diff --git a/examples/core/core_custom_logging.c b/examples/core/core_custom_logging.c new file mode 100644 index 000000000..95bfd727b --- /dev/null +++ b/examples/core/core_custom_logging.c @@ -0,0 +1,90 @@ +/******************************************************************************************* +* +* raylib [core] example - Custom logging +* +* Welcome to raylib! +* +* To test examples, just press F6 and execute raylib_compile_execute script +* Note that compiled executable is placed in the same folder as .c file +* +* You can find all basic examples on C:\raylib\raylib\examples folder or +* raylib official webpage: www.raylib.com +* +* Enjoy using raylib. :) +* +* This example has been created using raylib 2.0 (www.raylib.com) +* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) +* +* Copyright (c) 2018 Ramon Santamaria (@raysan5) and Pablo Marcos Oltra (@pamarcos) +* +********************************************************************************************/ + +#include "raylib.h" + +#include // Required for: fopen(), fclose(), fputc(), fwrite(), printf(), fprintf(), funopen() +#include // Required for: time_t, tm, time(), localtime(), strftime() + +void logCustom(int msgType, const char *text, va_list args) +{ + char timeStr[64]; + time_t now = time(NULL); + struct tm *tm_info = localtime(&now); + + strftime(timeStr, sizeof(timeStr), "%Y-%m-%d %H:%M:%S", tm_info); + printf("[%s] ", timeStr); + + switch (msgType) + { + case LOG_INFO: printf("[INFO] : "); break; + case LOG_ERROR: printf("[ERROR]: "); break; + case LOG_WARNING: printf("[WARN] : "); break; + case LOG_DEBUG: printf("[DEBUG]: "); break; + default: break; + } + vprintf(text, args); + printf("\n"); +} + +int main(int argc, char* argv[]) +{ + // Initialization + //-------------------------------------------------------------------------------------- + int screenWidth = 800; + int screenHeight = 450; + + // First thing we do is setting our custom logger to ensure everything raylib logs + // will use our own logger instead of its internal one + SetTraceLogCallback(logCustom); + + InitWindow(screenWidth, screenHeight, "raylib [core] example - custom logging"); + + SetTargetFPS(60); + //-------------------------------------------------------------------------------------- + + // Main game loop + while (!WindowShouldClose()) // Detect window close button or ESC key + { + // Update + //---------------------------------------------------------------------------------- + // TODO: Update your variables here + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + BeginDrawing(); + + ClearBackground(RAYWHITE); + + DrawText("Check out the console output to see the custom logger in action!", 60, 200, 20, LIGHTGRAY); + + EndDrawing(); + //---------------------------------------------------------------------------------- + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +} diff --git a/examples/core/core_custom_logging.png b/examples/core/core_custom_logging.png new file mode 100644 index 0000000000000000000000000000000000000000..478fef7414ee5ecf81cd17b34ca84645b239d578 GIT binary patch literal 15200 zcmeAS@N?(olHy`uVBq!ia0y~yU{+vYU_8XZ1{4ubUVDOp!CKwZ#WAEJF8R-|udnOd z0u7{?7AxW)N;nvoT?~-pZM-NTft6saYCVv_o?^1Lx9va%M-LXlpr_2iP52;oNuY)e z+>I9{CtP%~#pMi#?E(^S8+z2X;dH|;h#NNIbOXoaZp#Vyb zqoFVw3Zvx$xX>Og9YOWlXef+^0<3v6nifXW!f0ARZtIWch|wG|nj=PY1bQEPv|Jc1 z7e>p4(Q;w5T);N|Ia)f7mX4#P<7nwfV(DnY(Rg~gzH!5cj0cN=fd`y@afPKKj8f); zE=z=4RK(<4+*hw&Wn~xik?*m;@X+kW9cK-j6;I=m&PrxIG`{lrVFBm+gOB*Do==|` z_q=bK_LHRz3n#sIf6e^pQTdAY%NcfZQK~;*@SMoVFE?Rvb56iQG~_8BFbX<6>w?d* z7gc*N##o@u=L9(=Y*_PQL1{(5NIl=T5^F1Fqo{3t$dQlic(A(*jOVaVa zv6Dv4$x#0jF+tahgsdMsznLcy^KJ2M=XV|~8=qa!+SkEbA9d7z=SSD~Up!V>XNskYFvy#;K&bPIw_1aUD zwV%56`hqn&WoN2iyU!f@?$Iaqt#=MPs5-o^VtD2gbh!CSQOlj8Nl_n<7;ptRC6utG zm^k8#bGLMd44Ere+Slvq;E(6Gt(;q3rcHvODcpv$*;Y1zJUMw#hMmd77yS2 zCCer+oV2bj>X-bAq9hY}N2i1x)21)}dLV<#oew-W_XWr7;9^D4+}vEogMwE!%(Ggm zd}zzOi4NxTqu$A_tSs1ZPC@XK_*(a6Zt2h5!upiV_fDMU*XFfLO7ESF?7?OJc5?5Y zs_Omcz5c~C>VM*S^Toyri}&8eH^vg+e>whP8B~SRie{xK}%I1P~%*DfWj_R^=eHc{je07-?pOMXJi1|Z@8jc52p0d1$!Ty;j&9r11_u{7~GV&x(DjEP&{;YrQSThkYW4#b#TD&}= z7t3^~f&kN&d%q2(7=g)h5+o7q?Z=aW+`bc8Lvbch zoUN?FQW$^>2w;g|aEnpWHwR}nS}Z%^q6yB#W$*{$$xytWv{qQ$nTyK_30r_+&4#_e z0=ls+o}=d+(37w5B|A_7JAhNmjTiY&WJqD3eFsHO9V9`m!keIg;e5mltw2U_L6O9a zGm;MLvjB?|x8SeHB$mcfesAk(abQK8Adb1Xl59#86dUtXwAShni)nj z!)RuJHWo)S!)Rt0%?zWN0oIor?LdRm!e}#Tw3#$IngrcMGMX7iGs9?R7|jf@asAOg r!)Tvjw9hcwXBbL-2F6{j3=9&Rn6@tXurn68bC$u=)z4*}Q$iB}IKe4B literal 0 HcmV?d00001 diff --git a/src/raylib.h b/src/raylib.h index 251dd0208..4e64cdee0 100644 --- a/src/raylib.h +++ b/src/raylib.h @@ -71,6 +71,8 @@ #ifndef RAYLIB_H #define RAYLIB_H +#include // Required for va_list + #if defined(_WIN32) && defined(BUILD_LIBTYPE_SHARED) #define RLAPI __declspec(dllexport) // We are building raylib as a Win32 shared library (.dll) #elif defined(_WIN32) && defined(USE_LIBTYPE_SHARED) @@ -727,6 +729,9 @@ typedef enum { HMD_SONY_PSVR } VrDeviceType; +// Callbacks to be implemented by users +typedef void (*TraceLogCallback)(int msgType, const char *text, va_list args); + #ifdef __cplusplus extern "C" { // Prevents name mangling of functions #endif @@ -796,6 +801,7 @@ RLAPI Color Fade(Color color, float alpha); // Color fade- RLAPI void ShowLogo(void); // Activate raylib logo at startup (can be done with flags) RLAPI void SetConfigFlags(unsigned char flags); // Setup window configuration flags (view FLAGS) RLAPI void SetTraceLog(unsigned char types); // Enable trace log message types (bit flags based) +RLAPI void SetTraceLogCallback(TraceLogCallback callback); // Set a trace log callback to enable custom logging bypassing raylib's one RLAPI void TraceLog(int logType, const char *text, ...); // Show trace log messages (LOG_INFO, LOG_WARNING, LOG_ERROR, LOG_DEBUG) RLAPI void TakeScreenshot(const char *fileName); // Takes a screenshot of current screen (saved a .png) RLAPI int GetRandomValue(int min, int max); // Returns a random value between min and max (both included) diff --git a/src/utils.c b/src/utils.c index 74780680d..f7c19afb4 100644 --- a/src/utils.c +++ b/src/utils.c @@ -74,6 +74,7 @@ FILE *funopen(const void *cookie, int (*readfn)(void *, char *, int), // Log types messages supported flags (bit based) static unsigned char logTypeFlags = LOG_INFO | LOG_WARNING | LOG_ERROR; +static TraceLogCallback logCallback = NULL; #if defined(PLATFORM_ANDROID) AAssetManager *assetManager; @@ -99,11 +100,26 @@ void SetTraceLog(unsigned char types) logTypeFlags = types; } +// Set a trace log callback to enable custom logging bypassing raylib's one +void SetTraceLogCallback(TraceLogCallback callback) +{ + logCallback = callback; +} + // Show trace log messages (LOG_INFO, LOG_WARNING, LOG_ERROR, LOG_DEBUG) void TraceLog(int msgType, const char *text, ...) { #if defined(SUPPORT_TRACELOG) static char buffer[128]; + va_list args; + va_start(args, text); + + if (logCallback) + { + logCallback(msgType, text, args); + va_end(args); + return; + } switch(msgType) { @@ -117,9 +133,6 @@ void TraceLog(int msgType, const char *text, ...) strcat(buffer, text); strcat(buffer, "\n"); - va_list args; - va_start(args, text); - #if defined(PLATFORM_ANDROID) switch(msgType) {