abstracting logging for orca
This commit is contained in:
parent
86a16d3775
commit
794f47b141
|
@ -27,7 +27,7 @@ mg_font create_font()
|
||||||
FILE* fontFile = fopen(fontPathCString, "r");
|
FILE* fontFile = fopen(fontPathCString, "r");
|
||||||
if(!fontFile)
|
if(!fontFile)
|
||||||
{
|
{
|
||||||
LOG_ERROR("Could not load font file '%s': %s\n", fontPathCString, strerror(errno));
|
log_error("Could not load font file '%s': %s\n", fontPathCString, strerror(errno));
|
||||||
return(mg_font_nil());
|
return(mg_font_nil());
|
||||||
}
|
}
|
||||||
unsigned char* fontData = 0;
|
unsigned char* fontData = 0;
|
||||||
|
|
|
@ -69,7 +69,7 @@ mg_font create_font(const char* path)
|
||||||
FILE* fontFile = fopen(fontPathCString, "r");
|
FILE* fontFile = fopen(fontPathCString, "r");
|
||||||
if(!fontFile)
|
if(!fontFile)
|
||||||
{
|
{
|
||||||
LOG_ERROR("Could not load font file '%s'\n", fontPathCString);
|
log_error("Could not load font file '%s'\n", fontPathCString);
|
||||||
return(mg_font_nil());
|
return(mg_font_nil());
|
||||||
}
|
}
|
||||||
unsigned char* fontData = 0;
|
unsigned char* fontData = 0;
|
||||||
|
|
|
@ -29,7 +29,7 @@ mg_font create_font()
|
||||||
FILE* fontFile = fopen(fontPathCString, "r");
|
FILE* fontFile = fopen(fontPathCString, "r");
|
||||||
if(!fontFile)
|
if(!fontFile)
|
||||||
{
|
{
|
||||||
LOG_ERROR("Could not load font file '%s': %s\n", fontPathCString, strerror(errno));
|
log_error("Could not load font file '%s': %s\n", fontPathCString, strerror(errno));
|
||||||
return(mg_font_nil());
|
return(mg_font_nil());
|
||||||
}
|
}
|
||||||
unsigned char* fontData = 0;
|
unsigned char* fontData = 0;
|
||||||
|
|
|
@ -52,7 +52,7 @@ int main()
|
||||||
free(fontPath);
|
free(fontPath);
|
||||||
if(!fontFile)
|
if(!fontFile)
|
||||||
{
|
{
|
||||||
LOG_ERROR("Could not load font file '%s'\n", fontPath);
|
log_error("Could not load font file '%s'\n", fontPath);
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
unsigned char* fontData = 0;
|
unsigned char* fontData = 0;
|
||||||
|
|
|
@ -28,7 +28,7 @@ mg_font create_font()
|
||||||
FILE* fontFile = fopen(fontPathCString, "r");
|
FILE* fontFile = fopen(fontPathCString, "r");
|
||||||
if(!fontFile)
|
if(!fontFile)
|
||||||
{
|
{
|
||||||
LOG_ERROR("Could not load font file '%s': %s\n", fontPathCString, strerror(errno));
|
log_error("Could not load font file '%s': %s\n", fontPathCString, strerror(errno));
|
||||||
return(mg_font_nil());
|
return(mg_font_nil());
|
||||||
}
|
}
|
||||||
unsigned char* fontData = 0;
|
unsigned char* fontData = 0;
|
||||||
|
|
|
@ -159,7 +159,7 @@ mg_font create_font()
|
||||||
FILE* fontFile = fopen(fontPathCString, "r");
|
FILE* fontFile = fopen(fontPathCString, "r");
|
||||||
if(!fontFile)
|
if(!fontFile)
|
||||||
{
|
{
|
||||||
LOG_ERROR("Could not load font file '%s': %s\n", fontPathCString, strerror(errno));
|
log_error("Could not load font file '%s': %s\n", fontPathCString, strerror(errno));
|
||||||
return(mg_font_nil());
|
return(mg_font_nil());
|
||||||
}
|
}
|
||||||
unsigned char* fontData = 0;
|
unsigned char* fontData = 0;
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -349,7 +349,7 @@ static int mg_gl_canvas_compile_compute_program_named(const char* name, const ch
|
||||||
char buffer[256];
|
char buffer[256];
|
||||||
int size = 0;
|
int size = 0;
|
||||||
glGetProgramInfoLog(program, 256, &size, buffer);
|
glGetProgramInfoLog(program, 256, &size, buffer);
|
||||||
LOG_ERROR("Shader link error (%s): %.*s\n", name, size, buffer);
|
log_error("Shader link error (%s): %.*s\n", name, size, buffer);
|
||||||
|
|
||||||
res = -1;
|
res = -1;
|
||||||
}
|
}
|
||||||
|
@ -391,7 +391,7 @@ int mg_gl_canvas_compile_render_program_named(const char* progName,
|
||||||
char buffer[256];
|
char buffer[256];
|
||||||
int size = 0;
|
int size = 0;
|
||||||
glGetProgramInfoLog(program, 256, &size, buffer);
|
glGetProgramInfoLog(program, 256, &size, buffer);
|
||||||
LOG_ERROR("Shader link error (%s): %.*s\n", progName, size, buffer);
|
log_error("Shader link error (%s): %.*s\n", progName, size, buffer);
|
||||||
res = -1;
|
res = -1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
#define STB_IMAGE_IMPLEMENTATION
|
#define STB_IMAGE_IMPLEMENTATION
|
||||||
#include"stb_image.h"
|
#include"stb_image.h"
|
||||||
|
|
||||||
#include"debug_log.h"
|
#include"platform_log.h"
|
||||||
#include"graphics_internal.h"
|
#include"graphics_internal.h"
|
||||||
|
|
||||||
typedef struct mg_glyph_map_entry
|
typedef struct mg_glyph_map_entry
|
||||||
|
@ -618,7 +618,7 @@ void mg_matrix_stack_push(mg_canvas_data* canvas, mg_mat2x3 transform)
|
||||||
{
|
{
|
||||||
if(canvas->matrixStackSize >= MG_MATRIX_STACK_MAX_DEPTH)
|
if(canvas->matrixStackSize >= MG_MATRIX_STACK_MAX_DEPTH)
|
||||||
{
|
{
|
||||||
LOG_ERROR("matrix stack overflow\n");
|
log_error("matrix stack overflow\n");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -631,7 +631,7 @@ void mg_matrix_stack_pop(mg_canvas_data* canvas)
|
||||||
{
|
{
|
||||||
if(canvas->matrixStackSize == 0)
|
if(canvas->matrixStackSize == 0)
|
||||||
{
|
{
|
||||||
LOG_ERROR("matrix stack underflow\n");
|
log_error("matrix stack underflow\n");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -656,7 +656,7 @@ void mg_clip_stack_push(mg_canvas_data* canvas, mp_rect clip)
|
||||||
{
|
{
|
||||||
if(canvas->clipStackSize >= MG_CLIP_STACK_MAX_DEPTH)
|
if(canvas->clipStackSize >= MG_CLIP_STACK_MAX_DEPTH)
|
||||||
{
|
{
|
||||||
LOG_ERROR("clip stack overflow\n");
|
log_error("clip stack overflow\n");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -669,7 +669,7 @@ void mg_clip_stack_pop(mg_canvas_data* canvas)
|
||||||
{
|
{
|
||||||
if(canvas->clipStackSize == 0)
|
if(canvas->clipStackSize == 0)
|
||||||
{
|
{
|
||||||
LOG_ERROR("clip stack underflow\n");
|
log_error("clip stack underflow\n");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -2772,7 +2772,7 @@ void mg_flush_commands(int primitiveCount, mg_primitive* primitives, mg_path_elt
|
||||||
{
|
{
|
||||||
if(nextIndex >= primitiveCount)
|
if(nextIndex >= primitiveCount)
|
||||||
{
|
{
|
||||||
LOG_ERROR("invalid location '%i' in graphics command buffer would cause an overrun\n", nextIndex);
|
log_error("invalid location '%i' in graphics command buffer would cause an overrun\n", nextIndex);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
mg_primitive* primitive = &(primitives[nextIndex]);
|
mg_primitive* primitive = &(primitives[nextIndex]);
|
||||||
|
@ -2812,7 +2812,7 @@ void mg_flush_commands(int primitiveCount, mg_primitive* primitives, mg_path_elt
|
||||||
}
|
}
|
||||||
else if(primitive->jump >= primitiveCount)
|
else if(primitive->jump >= primitiveCount)
|
||||||
{
|
{
|
||||||
LOG_ERROR("invalid jump location '%i' in graphics command buffer\n", primitive->jump);
|
log_error("invalid jump location '%i' in graphics command buffer\n", primitive->jump);
|
||||||
goto exit_command_loop;
|
goto exit_command_loop;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -3231,7 +3231,7 @@ mp_rect mg_glyph_outlines_from_font_data(mg_font_data* fontData, str32 glyphIndi
|
||||||
|
|
||||||
if(!glyphIndex || glyphIndex >= fontData->glyphCount)
|
if(!glyphIndex || glyphIndex >= fontData->glyphCount)
|
||||||
{
|
{
|
||||||
LOG_WARNING("code point is not present in font ranges\n");
|
log_warning("code point is not present in font ranges\n");
|
||||||
//NOTE(martin): try to find the replacement character
|
//NOTE(martin): try to find the replacement character
|
||||||
glyphIndex = mg_font_get_glyph_index_from_font_data(fontData, 0xfffd);
|
glyphIndex = mg_font_get_glyph_index_from_font_data(fontData, 0xfffd);
|
||||||
if(!glyphIndex)
|
if(!glyphIndex)
|
||||||
|
|
|
@ -7,21 +7,13 @@
|
||||||
*
|
*
|
||||||
*****************************************************************/
|
*****************************************************************/
|
||||||
|
|
||||||
//---------------------------------------------------------------
|
|
||||||
// utilities implementations
|
|
||||||
//---------------------------------------------------------------
|
|
||||||
#include"util/debug_log.c"
|
|
||||||
#include"util/memory.c"
|
|
||||||
#include"util/strings.c"
|
|
||||||
#include"util/utf8.c"
|
|
||||||
#include"util/hash.c"
|
|
||||||
#include"util/ringbuffer.c"
|
|
||||||
|
|
||||||
//---------------------------------------------------------------
|
//---------------------------------------------------------------
|
||||||
// platform implementations
|
// platform implementations
|
||||||
//---------------------------------------------------------------
|
//---------------------------------------------------------------
|
||||||
#include"platform.h"
|
#include"platform.h"
|
||||||
|
|
||||||
|
#include"platform/std_log.c"
|
||||||
|
|
||||||
#if defined(PLATFORM_WIN64)
|
#if defined(PLATFORM_WIN64)
|
||||||
#include"platform/win32_memory.c"
|
#include"platform/win32_memory.c"
|
||||||
#include"platform/win32_clock.c"
|
#include"platform/win32_clock.c"
|
||||||
|
@ -47,6 +39,15 @@
|
||||||
#error "Unsupported platform"
|
#error "Unsupported platform"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
//---------------------------------------------------------------
|
||||||
|
// utilities implementations
|
||||||
|
//---------------------------------------------------------------
|
||||||
|
#include"util/memory.c"
|
||||||
|
#include"util/strings.c"
|
||||||
|
#include"util/utf8.c"
|
||||||
|
#include"util/hash.c"
|
||||||
|
#include"util/ringbuffer.c"
|
||||||
|
|
||||||
//---------------------------------------------------------------
|
//---------------------------------------------------------------
|
||||||
// app/graphics layer
|
// app/graphics layer
|
||||||
//---------------------------------------------------------------
|
//---------------------------------------------------------------
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
#include"platform.h"
|
#include"platform.h"
|
||||||
#include"typedefs.h"
|
#include"typedefs.h"
|
||||||
#include"macro_helpers.h"
|
#include"macro_helpers.h"
|
||||||
#include"debug_log.h"
|
#include"platform_log.h"
|
||||||
#include"lists.h"
|
#include"lists.h"
|
||||||
#include"memory.h"
|
#include"memory.h"
|
||||||
#include"strings.h"
|
#include"strings.h"
|
||||||
|
|
|
@ -99,7 +99,7 @@ void mp_queue_event(mp_event* event)
|
||||||
{
|
{
|
||||||
if(ringbuffer_write_available(&__mpApp.eventQueue) < sizeof(mp_event))
|
if(ringbuffer_write_available(&__mpApp.eventQueue) < sizeof(mp_event))
|
||||||
{
|
{
|
||||||
LOG_ERROR("event queue full\n");
|
log_error("event queue full\n");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -223,7 +223,7 @@ static void mp_update_text(utf32 codepoint)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
LOG_WARNING("too many input codepoints per frame, dropping input");
|
log_warning("too many input codepoints per frame, dropping input");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -80,7 +80,7 @@ void mg_mtl_print_log(int bufferIndex, id<MTLBuffer> logBuffer, id<MTLBuffer> lo
|
||||||
|
|
||||||
if(size)
|
if(size)
|
||||||
{
|
{
|
||||||
LOG_INFO("Log from buffer %i:\n", bufferIndex);
|
log_info("Log from buffer %i:\n", bufferIndex);
|
||||||
|
|
||||||
int index = 0;
|
int index = 0;
|
||||||
while(index < size)
|
while(index < size)
|
||||||
|
@ -1160,7 +1160,7 @@ mg_canvas_backend* mg_mtl_canvas_create(mg_surface surface)
|
||||||
if(err != nil)
|
if(err != nil)
|
||||||
{
|
{
|
||||||
const char* errStr = [[err localizedDescription] UTF8String];
|
const char* errStr = [[err localizedDescription] UTF8String];
|
||||||
LOG_ERROR("error : %s\n", errStr);
|
log_error("error : %s\n", errStr);
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
id<MTLFunction> pathFunction = [library newFunctionWithName:@"mtl_path_setup"];
|
id<MTLFunction> pathFunction = [library newFunctionWithName:@"mtl_path_setup"];
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
#include"ringbuffer.h"
|
#include"ringbuffer.h"
|
||||||
#include"memory.h"
|
#include"memory.h"
|
||||||
#include"macro_helpers.h"
|
#include"macro_helpers.h"
|
||||||
#include"debug_log.h"
|
#include"platform_log.h"
|
||||||
#include"platform_clock.h"
|
#include"platform_clock.h"
|
||||||
#include"graphics_internal.h"
|
#include"graphics_internal.h"
|
||||||
|
|
||||||
|
@ -269,14 +269,14 @@ static void mp_update_keyboard_layout()
|
||||||
__mpApp.osx.kbLayoutInputSource = TISCopyCurrentKeyboardLayoutInputSource();
|
__mpApp.osx.kbLayoutInputSource = TISCopyCurrentKeyboardLayoutInputSource();
|
||||||
if(!__mpApp.osx.kbLayoutInputSource)
|
if(!__mpApp.osx.kbLayoutInputSource)
|
||||||
{
|
{
|
||||||
LOG_ERROR("Failed to load keyboard layout input source");
|
log_error("Failed to load keyboard layout input source");
|
||||||
}
|
}
|
||||||
|
|
||||||
__mpApp.osx.kbLayoutUnicodeData = TISGetInputSourceProperty(__mpApp.osx.kbLayoutInputSource,
|
__mpApp.osx.kbLayoutUnicodeData = TISGetInputSourceProperty(__mpApp.osx.kbLayoutInputSource,
|
||||||
kTISPropertyUnicodeKeyLayoutData);
|
kTISPropertyUnicodeKeyLayoutData);
|
||||||
if(!__mpApp.osx.kbLayoutUnicodeData)
|
if(!__mpApp.osx.kbLayoutUnicodeData)
|
||||||
{
|
{
|
||||||
LOG_ERROR("Failed to load keyboard layout unicode data");
|
log_error("Failed to load keyboard layout unicode data");
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(__mpApp.keyLabels, 0, sizeof(mp_key_utf8)*MP_KEY_COUNT);
|
memset(__mpApp.keyLabels, 0, sizeof(mp_key_utf8)*MP_KEY_COUNT);
|
||||||
|
@ -1352,7 +1352,7 @@ mp_window mp_window_create(mp_rect contentRect, const char* title, mp_window_sty
|
||||||
mp_window_data* window = mp_window_alloc();
|
mp_window_data* window = mp_window_alloc();
|
||||||
if(!window)
|
if(!window)
|
||||||
{
|
{
|
||||||
LOG_ERROR("Could not allocate window data\n");
|
log_error("Could not allocate window data\n");
|
||||||
return((mp_window){0});
|
return((mp_window){0});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1833,14 +1833,14 @@ mp_view mp_view_create(mp_window windowHandle, mp_rect frame)
|
||||||
mp_window_data* window = mp_window_ptr_from_handle(windowHandle);
|
mp_window_data* window = mp_window_ptr_from_handle(windowHandle);
|
||||||
if(!window)
|
if(!window)
|
||||||
{
|
{
|
||||||
LOG_ERROR("Can't create view for nil window\n");
|
log_error("Can't create view for nil window\n");
|
||||||
return(mp_view_nil());
|
return(mp_view_nil());
|
||||||
}
|
}
|
||||||
|
|
||||||
mp_view_data* view = mp_view_alloc();
|
mp_view_data* view = mp_view_alloc();
|
||||||
if(!view)
|
if(!view)
|
||||||
{
|
{
|
||||||
LOG_ERROR("Could not allocate view data\n");
|
log_error("Could not allocate view data\n");
|
||||||
return(mp_view_nil());
|
return(mp_view_nil());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,74 @@
|
||||||
|
/************************************************************//**
|
||||||
|
*
|
||||||
|
* @file: orca_log.c
|
||||||
|
* @author: Martin Fouilleul
|
||||||
|
* @date: 18/04/2023
|
||||||
|
*
|
||||||
|
*****************************************************************/
|
||||||
|
#include"platform_log.c"
|
||||||
|
#include"util/memory.h"
|
||||||
|
#include"util/strings.h"
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
ORCA_LOG_OUTPUT_CONSOLE,
|
||||||
|
ORCA_LOG_OUTPUT_FILE
|
||||||
|
} orca_log_output_kind;
|
||||||
|
|
||||||
|
typedef struct log_output
|
||||||
|
{
|
||||||
|
orca_log_output_kind kind;
|
||||||
|
//TODO: file output
|
||||||
|
} log_output;
|
||||||
|
|
||||||
|
static log_output _logDefaultOutput = {.kind = ORCA_LOG_OUTPUT_CONSOLE};
|
||||||
|
log_output* LOG_DEFAULT_OUTPUT = &_logDefaultOutput;
|
||||||
|
|
||||||
|
extern void orca_log_entry(log_level level,
|
||||||
|
int fileLen,
|
||||||
|
const char* file,
|
||||||
|
int functionLen,
|
||||||
|
const char* function,
|
||||||
|
int line,
|
||||||
|
int msgLen,
|
||||||
|
const char* msg);
|
||||||
|
|
||||||
|
typedef struct orca_log_context
|
||||||
|
{
|
||||||
|
mem_arena* arena;
|
||||||
|
str8_list list;
|
||||||
|
} orca_log_context;
|
||||||
|
|
||||||
|
char* log_stbsp_callback(char const* buf, void* user, int len)
|
||||||
|
{
|
||||||
|
orca_log_context* ctx = (orca_log_context*)user;
|
||||||
|
|
||||||
|
str8 string = str8_push_buffer(ctx->arena, len, (char*)buf);
|
||||||
|
str8_list_push(ctx->arena, &ctx->list, string);
|
||||||
|
|
||||||
|
return((char*)buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
void platform_log_entry(log_output* output,
|
||||||
|
log_level level,
|
||||||
|
str8 function,
|
||||||
|
str8 file,
|
||||||
|
int line,
|
||||||
|
const char* fmt,
|
||||||
|
va_list ap)
|
||||||
|
{
|
||||||
|
mem_arena* scratch = mem_scratch();
|
||||||
|
mem_arena_marker marker = mem_arena_mark(scratch);
|
||||||
|
|
||||||
|
orca_log_context ctx = {.arena = scratch,
|
||||||
|
.list = {0}};
|
||||||
|
|
||||||
|
char buf[STB_SPRINTF_MIN];
|
||||||
|
stbsp_vsprintfcb(log_stbsp_callback, &ctx, buf, fmt, ap);
|
||||||
|
|
||||||
|
str8 string = str8_list_join(scratch, ctx.list);
|
||||||
|
|
||||||
|
orca_log_entry(level, str8_ip(function), str8_ip(file), line, str8_ip(string));
|
||||||
|
|
||||||
|
mem_arena_clear_to(scratch, marker);
|
||||||
|
}
|
|
@ -0,0 +1,101 @@
|
||||||
|
/************************************************************//**
|
||||||
|
*
|
||||||
|
* @file: orca_strings.c
|
||||||
|
* @author: Martin Fouilleul
|
||||||
|
* @date: 18/04/2023
|
||||||
|
*
|
||||||
|
*****************************************************************/
|
||||||
|
#include"platform_strings.h"
|
||||||
|
|
||||||
|
#define STB_SPRINTF_IMPLEMENTATION
|
||||||
|
#include"ext/stb_sprintf.h"
|
||||||
|
|
||||||
|
size_t strlen(const char *s)
|
||||||
|
{
|
||||||
|
size_t len = 0;
|
||||||
|
while(s[len] != '\0')
|
||||||
|
{
|
||||||
|
len++;
|
||||||
|
}
|
||||||
|
return(len);
|
||||||
|
}
|
||||||
|
|
||||||
|
int strcmp(const char *s1, const char *s2)
|
||||||
|
{
|
||||||
|
size_t i = 0;
|
||||||
|
while(s1[i] != '\0' && s1[i] == s2[i])
|
||||||
|
{
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
int res = 0;
|
||||||
|
if(s1[i] != s2[i])
|
||||||
|
{
|
||||||
|
if(s1[i] == '\0')
|
||||||
|
{
|
||||||
|
res = -1;
|
||||||
|
}
|
||||||
|
else if(s2[i] == '\0')
|
||||||
|
{
|
||||||
|
res = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
res = (unsigned char)s1[i] - (unsigned char)s2[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return(res);
|
||||||
|
}
|
||||||
|
|
||||||
|
int strncmp(const char *s1, const char *s2, size_t n)
|
||||||
|
{
|
||||||
|
size_t i = 0;
|
||||||
|
while(i < n && s1[i] != '\0' && s1[i] == s2[i])
|
||||||
|
{
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
int res = 0;
|
||||||
|
if(s1[i] != s2[i])
|
||||||
|
{
|
||||||
|
if(s1[i] == '\0')
|
||||||
|
{
|
||||||
|
res = -1;
|
||||||
|
}
|
||||||
|
else if(s2[i] == '\0')
|
||||||
|
{
|
||||||
|
res = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
res = (unsigned char)s1[i] - (unsigned char)s2[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return(res);
|
||||||
|
}
|
||||||
|
|
||||||
|
char* strcpy(char *restrict s1, const char *restrict s2)
|
||||||
|
{
|
||||||
|
size_t i = 0;
|
||||||
|
while(s2[i] != '\0')
|
||||||
|
{
|
||||||
|
s1[i] = s2[i];
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
s1[i] = '\0';
|
||||||
|
return(s1);
|
||||||
|
}
|
||||||
|
|
||||||
|
char* strncpy(char *restrict s1, const char *restrict s2, size_t len)
|
||||||
|
{
|
||||||
|
size_t i = 0;
|
||||||
|
while(i < len && s2[i] != '\0')
|
||||||
|
{
|
||||||
|
s1[i] = s2[i];
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
while(i < len)
|
||||||
|
{
|
||||||
|
s1[i] = 0;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
return(s1);
|
||||||
|
}
|
|
@ -78,7 +78,7 @@ void mp_clock_init()
|
||||||
|
|
||||||
if(sysctl(mib, 2, &tv, &size, 0, 0) == -1)
|
if(sysctl(mib, 2, &tv, &size, 0, 0) == -1)
|
||||||
{
|
{
|
||||||
LOG_ERROR("can't read boot time\n");
|
log_error("can't read boot time\n");
|
||||||
}
|
}
|
||||||
//NOTE(martin): convert boot date to timestamp
|
//NOTE(martin): convert boot date to timestamp
|
||||||
__initialTimestamp__ = (((u64)tv.tv_sec + CLK_JAN_1970) << 32)
|
__initialTimestamp__ = (((u64)tv.tv_sec + CLK_JAN_1970) << 32)
|
||||||
|
|
|
@ -0,0 +1,56 @@
|
||||||
|
/************************************************************//**
|
||||||
|
*
|
||||||
|
* @file: platform_log.c
|
||||||
|
* @author: Martin Fouilleul
|
||||||
|
* @date: 18/04/2023
|
||||||
|
*
|
||||||
|
*****************************************************************/
|
||||||
|
#include"platform_log.h"
|
||||||
|
|
||||||
|
typedef struct log_config
|
||||||
|
{
|
||||||
|
log_output* output;
|
||||||
|
log_level level;
|
||||||
|
} log_config;
|
||||||
|
|
||||||
|
//TODO: make default output a compile-time constant to avoid check in log_entry()?
|
||||||
|
static log_config __logConfig = {0, LOG_LEVEL_INFO};
|
||||||
|
|
||||||
|
void log_set_output(log_output* output)
|
||||||
|
{
|
||||||
|
__logConfig.output = output;
|
||||||
|
}
|
||||||
|
|
||||||
|
void log_set_level(log_level level)
|
||||||
|
{
|
||||||
|
__logConfig.level = level;
|
||||||
|
}
|
||||||
|
|
||||||
|
void platform_log_entry(log_output* output,
|
||||||
|
log_level level,
|
||||||
|
str8 function,
|
||||||
|
str8 file,
|
||||||
|
int line,
|
||||||
|
const char* fmt,
|
||||||
|
va_list ap);
|
||||||
|
|
||||||
|
void log_entry(log_level level,
|
||||||
|
str8 function,
|
||||||
|
str8 file,
|
||||||
|
int line,
|
||||||
|
const char* fmt,
|
||||||
|
...)
|
||||||
|
{
|
||||||
|
if(!__logConfig.output)
|
||||||
|
{
|
||||||
|
__logConfig.output = LOG_DEFAULT_OUTPUT;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(level <= __logConfig.level)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
va_start(ap, fmt);
|
||||||
|
platform_log_entry(__logConfig.output, level, function, file, line, fmt, ap);
|
||||||
|
va_end(ap);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,58 @@
|
||||||
|
/************************************************************//**
|
||||||
|
*
|
||||||
|
* @file: platform_log.h
|
||||||
|
* @author: Martin Fouilleul
|
||||||
|
* @date: 18/04/2023
|
||||||
|
*
|
||||||
|
*****************************************************************/
|
||||||
|
#ifndef __PLATFORM_LOG_H_
|
||||||
|
#define __PLATFORM_LOG_H_
|
||||||
|
|
||||||
|
#include"platform.h"
|
||||||
|
#include"strings.h"
|
||||||
|
|
||||||
|
typedef enum { LOG_LEVEL_ERROR,
|
||||||
|
LOG_LEVEL_WARNING,
|
||||||
|
LOG_LEVEL_INFO,
|
||||||
|
LOG_LEVEL_COUNT } log_level;
|
||||||
|
|
||||||
|
typedef struct log_output log_output;
|
||||||
|
|
||||||
|
extern log_output* LOG_DEFAULT_OUTPUT;
|
||||||
|
|
||||||
|
MP_API void log_set_level(log_level level);
|
||||||
|
MP_API void log_set_output(log_output* output);
|
||||||
|
MP_API void log_entry(log_level level,
|
||||||
|
str8 function,
|
||||||
|
str8 file,
|
||||||
|
int line,
|
||||||
|
const char* fmt,
|
||||||
|
...);
|
||||||
|
|
||||||
|
#define log_generic(level, msg, ...) log_entry(level, STR8(__FUNCTION__), STR8(__FILE__), __LINE__, msg, ##__VA_ARGS__)
|
||||||
|
|
||||||
|
#define log_error(msg, ...) log_generic(LOG_LEVEL_ERROR, msg, ##__VA_ARGS__)
|
||||||
|
|
||||||
|
#ifndef LOG_COMPILE_WARNING
|
||||||
|
#define LOG_COMPILE_WARNING 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef LOG_COMPILE_INFO
|
||||||
|
#define LOG_COMPILE_INFO 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if LOG_COMPILE_WARNING || LOG_COMPILE_INFO
|
||||||
|
#define log_warning(msg, ...) log_generic(LOG_LEVEL_WARNING, msg, ##__VA_ARGS__)
|
||||||
|
|
||||||
|
#if LOG_COMPILE_INFO
|
||||||
|
#define log_info(msg, ...) log_generic(LOG_LEVEL_INFO, msg, ##__VA_ARGS__ )
|
||||||
|
#else
|
||||||
|
#define log_info(msg, ...)
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#define log_warning(msg, ...)
|
||||||
|
#define log_info(msg, ...)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#endif //__PLATFORM_LOG_H_
|
|
@ -0,0 +1,28 @@
|
||||||
|
/************************************************************//**
|
||||||
|
*
|
||||||
|
* @file: platform_strings.h
|
||||||
|
* @author: Martin Fouilleul
|
||||||
|
* @date: 18/04/2023
|
||||||
|
*
|
||||||
|
*****************************************************************/
|
||||||
|
#ifndef __PLATFORM_STRINGS_H_
|
||||||
|
#define __PLATFORM_STRINGS_H_
|
||||||
|
|
||||||
|
#include"platform.h"
|
||||||
|
#include"platform_varg.h"
|
||||||
|
|
||||||
|
#if PLATFORM_ORCA
|
||||||
|
#include"ext/stb_sprintf.h"
|
||||||
|
|
||||||
|
size_t strlen(const char *s);
|
||||||
|
int strcmp(const char *s1, const char *s2);
|
||||||
|
char* strcpy(char *restrict s1, const char *restrict s2);
|
||||||
|
|
||||||
|
#define vsnprintf stbsp_vsnprintf
|
||||||
|
|
||||||
|
#else
|
||||||
|
#include<string.h>
|
||||||
|
#include<stdio.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif //__PLATFORM_STRINGS_H_
|
|
@ -11,6 +11,7 @@
|
||||||
#include"platform.h"
|
#include"platform.h"
|
||||||
|
|
||||||
#if PLATFORM_ORCA
|
#if PLATFORM_ORCA
|
||||||
|
#define va_list __builtin_va_list
|
||||||
#define va_start __builtin_va_start
|
#define va_start __builtin_va_start
|
||||||
#define va_arg __builtin_va_arg
|
#define va_arg __builtin_va_arg
|
||||||
#define va_copy __builtin_va_copy
|
#define va_copy __builtin_va_copy
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
#include<stdlib.h> // malloc()/free()
|
#include<stdlib.h> // malloc()/free()
|
||||||
|
|
||||||
#include"platform_socket.h"
|
#include"platform_socket.h"
|
||||||
#include"debug_log.h"
|
#include"platform_log.h"
|
||||||
|
|
||||||
typedef struct in_addr in_addr;
|
typedef struct in_addr in_addr;
|
||||||
typedef struct sockaddr_in sockaddr_in;
|
typedef struct sockaddr_in sockaddr_in;
|
||||||
|
@ -457,19 +457,19 @@ net_ip SocketGetDefaultExternalIP()
|
||||||
platform_socket* sock = SocketOpen(SOCK_UDP);
|
platform_socket* sock = SocketOpen(SOCK_UDP);
|
||||||
if(!sock)
|
if(!sock)
|
||||||
{
|
{
|
||||||
LOG_ERROR("can't create socket");
|
log_error("can't create socket");
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(SocketConnect(sock, &addr) != 0)
|
if(SocketConnect(sock, &addr) != 0)
|
||||||
{
|
{
|
||||||
LOG_ERROR("can't connect socket: %s\n", SocketGetLastErrorMessage());
|
log_error("can't connect socket: %s\n", SocketGetLastErrorMessage());
|
||||||
LOG_WARNING("try loopback interface\n");
|
log_warning("try loopback interface\n");
|
||||||
|
|
||||||
addr.ip = HostToNetIP(SOCK_IP_LOOPBACK);
|
addr.ip = HostToNetIP(SOCK_IP_LOOPBACK);
|
||||||
if(SocketConnect(sock, &addr) != 0)
|
if(SocketConnect(sock, &addr) != 0)
|
||||||
{
|
{
|
||||||
LOG_ERROR("can't connect socket: %s\n", SocketGetLastErrorMessage());
|
log_error("can't connect socket: %s\n", SocketGetLastErrorMessage());
|
||||||
SocketClose(sock);
|
SocketClose(sock);
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,74 @@
|
||||||
|
/************************************************************//**
|
||||||
|
*
|
||||||
|
* @file: std_log.c
|
||||||
|
* @author: Martin Fouilleul
|
||||||
|
* @date: 18/04/2023
|
||||||
|
*
|
||||||
|
*****************************************************************/
|
||||||
|
#include<stdio.h>
|
||||||
|
#include"platform_log.c"
|
||||||
|
|
||||||
|
#if PLATFORM_WIN32 || PLATFORM_WIN64
|
||||||
|
#include<io.h>
|
||||||
|
#define isatty _isatty
|
||||||
|
#define fileno _fileno
|
||||||
|
#elif PLATFORM_MACOS || PLATFORM_LINUX
|
||||||
|
#include<unistd.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static const char* LOG_HEADINGS[LOG_LEVEL_COUNT] = {
|
||||||
|
"Error",
|
||||||
|
"Warning",
|
||||||
|
"Info"};
|
||||||
|
|
||||||
|
static const char* LOG_FORMATS[LOG_LEVEL_COUNT] = {
|
||||||
|
"\033[38;5;9m\033[1m",
|
||||||
|
"\033[38;5;13m\033[1m",
|
||||||
|
"\033[38;5;10m\033[1m"};
|
||||||
|
|
||||||
|
static const char* LOG_FORMAT_STOP = "\033[m";
|
||||||
|
|
||||||
|
typedef struct log_output
|
||||||
|
{
|
||||||
|
FILE* f;
|
||||||
|
} log_output;
|
||||||
|
|
||||||
|
static log_output _logDefaultOutput = {0};
|
||||||
|
log_output* LOG_DEFAULT_OUTPUT = &_logDefaultOutput;
|
||||||
|
|
||||||
|
void platform_log_entry(log_output* output,
|
||||||
|
log_level level,
|
||||||
|
str8 function,
|
||||||
|
str8 file,
|
||||||
|
int line,
|
||||||
|
const char* fmt,
|
||||||
|
va_list ap)
|
||||||
|
{
|
||||||
|
if(output == LOG_DEFAULT_OUTPUT && output->f == 0)
|
||||||
|
{
|
||||||
|
output->f = stdout;
|
||||||
|
}
|
||||||
|
|
||||||
|
int fd = fileno(output->f);
|
||||||
|
if(isatty(fd))
|
||||||
|
{
|
||||||
|
fprintf(output->f,
|
||||||
|
"%s%s:%s %.*s() in %.*s:%i: ",
|
||||||
|
LOG_FORMATS[level],
|
||||||
|
LOG_HEADINGS[level],
|
||||||
|
LOG_FORMAT_STOP,
|
||||||
|
str8_ip(function),
|
||||||
|
str8_ip(file),
|
||||||
|
line);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fprintf(output->f,
|
||||||
|
"%s: %.*s() in %.*s:%i: ",
|
||||||
|
LOG_HEADINGS[level],
|
||||||
|
str8_ip(function),
|
||||||
|
str8_ip(file),
|
||||||
|
line);
|
||||||
|
}
|
||||||
|
vfprintf(output->f, fmt, ap);
|
||||||
|
}
|
|
@ -10,7 +10,7 @@
|
||||||
#include<stdio.h>
|
#include<stdio.h>
|
||||||
#include<stdlib.h>
|
#include<stdlib.h>
|
||||||
|
|
||||||
#include"debug_log.h"
|
#include"platform_log.h"
|
||||||
#include"typedefs.h"
|
#include"typedefs.h"
|
||||||
|
|
||||||
int RandomSeedFromDevice()
|
int RandomSeedFromDevice()
|
||||||
|
@ -18,7 +18,7 @@ int RandomSeedFromDevice()
|
||||||
FILE* urandom = fopen("/dev/urandom", "r");
|
FILE* urandom = fopen("/dev/urandom", "r");
|
||||||
if(!urandom)
|
if(!urandom)
|
||||||
{
|
{
|
||||||
LOG_ERROR("can't open /dev/urandom\n");
|
log_error("can't open /dev/urandom\n");
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -31,7 +31,7 @@ int RandomSeedFromDevice()
|
||||||
int size = fread(seed.buff, 1, 4, urandom);
|
int size = fread(seed.buff, 1, 4, urandom);
|
||||||
if(size != 4)
|
if(size != 4)
|
||||||
{
|
{
|
||||||
LOG_ERROR("couldn't read from /dev/urandom\n");
|
log_error("couldn't read from /dev/urandom\n");
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
4
src/ui.c
4
src/ui.c
|
@ -126,7 +126,7 @@ void ui_stack_pop(ui_stack_elt** stack)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
LOG_ERROR("ui stack underflow\n");
|
log_error("ui stack underflow\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -470,7 +470,7 @@ ui_box* ui_box_make_str8(str8 string, ui_flags flags)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//maybe this should be a warning that we're trying to make the box twice in the same frame?
|
//maybe this should be a warning that we're trying to make the box twice in the same frame?
|
||||||
LOG_WARNING("trying to make ui box '%.*s' multiple times in the same frame\n", (int)box->string.len, box->string.ptr);
|
log_warning("trying to make ui box '%.*s' multiple times in the same frame\n", (int)box->string.len, box->string.ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
//NOTE: setup per-frame state
|
//NOTE: setup per-frame state
|
||||||
|
|
|
@ -1,156 +0,0 @@
|
||||||
/************************************************************//**
|
|
||||||
*
|
|
||||||
* @file: debug_log.c
|
|
||||||
* @author: Martin Fouilleul
|
|
||||||
* @date: 22/10/2020
|
|
||||||
* @revision:
|
|
||||||
*
|
|
||||||
*****************************************************************/
|
|
||||||
#include"debug_log.h"
|
|
||||||
#include"platform_varg.h"
|
|
||||||
|
|
||||||
static const char* LOG_HEADINGS[LOG_LEVEL_COUNT] = {
|
|
||||||
"Error",
|
|
||||||
"Warning",
|
|
||||||
"Info"};
|
|
||||||
|
|
||||||
static const char* LOG_FORMATS[LOG_LEVEL_COUNT] = {
|
|
||||||
"\033[38;5;9m\033[1m",
|
|
||||||
"\033[38;5;13m\033[1m",
|
|
||||||
"\033[38;5;10m\033[1m"};
|
|
||||||
|
|
||||||
static const char* LOG_FORMAT_STOP = "\033[m";
|
|
||||||
|
|
||||||
typedef struct log_config
|
|
||||||
{
|
|
||||||
log_output output;
|
|
||||||
log_level level;
|
|
||||||
bool enableVTColor;
|
|
||||||
|
|
||||||
} log_config;
|
|
||||||
|
|
||||||
#if PLATFORM_ORCA
|
|
||||||
#define LOG_DEFAULT_OUTPUT (log_output){.kind = ORCA_LOG_OUTPUT_CONSOLE}
|
|
||||||
#define LOG_DEFAULT_ENABLE_VT_COLOR true
|
|
||||||
#else
|
|
||||||
#define LOG_DEFAULT_OUTPUT 0
|
|
||||||
#define LOG_DEFAULT_ENABLE_VT_COLOR true
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static log_config __logConfig = {.output = LOG_DEFAULT_OUTPUT,
|
|
||||||
.level = LOG_DEFAULT_LEVEL,
|
|
||||||
.enableVTColor = LOG_DEFAULT_ENABLE_VT_COLOR};
|
|
||||||
|
|
||||||
void log_set_output(log_output output)
|
|
||||||
{
|
|
||||||
__logConfig.output = output;
|
|
||||||
}
|
|
||||||
|
|
||||||
void log_set_level(log_level level)
|
|
||||||
{
|
|
||||||
__logConfig.level = level;
|
|
||||||
}
|
|
||||||
|
|
||||||
void log_enable_vt_color(bool enable)
|
|
||||||
{
|
|
||||||
__logConfig.enableVTColor = enable;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if PLATFORM_ORCA
|
|
||||||
|
|
||||||
#define STB_SPRINTF_IMPLEMENTATION
|
|
||||||
#include"ext/stb_sprintf.h"
|
|
||||||
|
|
||||||
typedef int orca_log_mode;
|
|
||||||
enum {ORCA_LOG_BEGIN, ORCA_LOG_APPEND};
|
|
||||||
|
|
||||||
extern void orca_log_entry(log_level level,
|
|
||||||
int fileLen,
|
|
||||||
const char* file,
|
|
||||||
int functionLen,
|
|
||||||
const char* function,
|
|
||||||
int line);
|
|
||||||
|
|
||||||
extern void orca_log_append(int msgLen, const char* msg);
|
|
||||||
|
|
||||||
char* log_stbsp_callback(char const* buf, void* user, int len)
|
|
||||||
{
|
|
||||||
orca_log_append(len, buf);
|
|
||||||
return((char*)buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//TODO: later, move this to orca_strings in milepost
|
|
||||||
size_t strlen(const char *s)
|
|
||||||
{
|
|
||||||
size_t len = 0;
|
|
||||||
while(s[len] != '\0')
|
|
||||||
{
|
|
||||||
len++;
|
|
||||||
}
|
|
||||||
return(len);
|
|
||||||
}
|
|
||||||
|
|
||||||
void log_generic(log_level level,
|
|
||||||
const char* functionName,
|
|
||||||
const char* fileName,
|
|
||||||
u32 line,
|
|
||||||
const char* msg,
|
|
||||||
...)
|
|
||||||
{
|
|
||||||
if(level <= __logConfig.level)
|
|
||||||
{
|
|
||||||
orca_log_entry(level, strlen(functionName), functionName, strlen(fileName), fileName, line);
|
|
||||||
|
|
||||||
char buf[STB_SPRINTF_MIN];
|
|
||||||
|
|
||||||
va_list ap;
|
|
||||||
va_start(ap, msg);
|
|
||||||
stbsp_vsprintfcb(log_stbsp_callback, 0, buf, msg, ap);
|
|
||||||
va_end(ap);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
void log_generic(log_level level,
|
|
||||||
const char* functionName,
|
|
||||||
const char* fileName,
|
|
||||||
u32 line,
|
|
||||||
const char* msg,
|
|
||||||
...)
|
|
||||||
{
|
|
||||||
if(__logConfig.output == 0)
|
|
||||||
{
|
|
||||||
__logConfig.output = stdout;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(level <= __logConfig.level)
|
|
||||||
{
|
|
||||||
if(__logConfig.enableVTColor)
|
|
||||||
{
|
|
||||||
fprintf(__logConfig.output,
|
|
||||||
"%s%s:%s %s() in %s:%i: ",
|
|
||||||
LOG_FORMATS[level],
|
|
||||||
LOG_HEADINGS[level],
|
|
||||||
LOG_FORMAT_STOP,
|
|
||||||
functionName,
|
|
||||||
fileName,
|
|
||||||
line);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
fprintf(__logConfig.output,
|
|
||||||
"%s: %s() in %s:%i: ",
|
|
||||||
LOG_HEADINGS[level],
|
|
||||||
functionName,
|
|
||||||
fileName,
|
|
||||||
line);
|
|
||||||
}
|
|
||||||
va_list ap;
|
|
||||||
va_start(ap, msg);
|
|
||||||
vfprintf(__logConfig.output, msg, ap);
|
|
||||||
va_end(ap);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
|
@ -1,80 +0,0 @@
|
||||||
/************************************************************//**
|
|
||||||
*
|
|
||||||
* @file: debug_log.h
|
|
||||||
* @author: Martin Fouilleul
|
|
||||||
* @date: 05/04/2019
|
|
||||||
* @revision:
|
|
||||||
*
|
|
||||||
*****************************************************************/
|
|
||||||
#ifndef __DEBUG_LOG_H_
|
|
||||||
#define __DEBUG_LOG_H_
|
|
||||||
|
|
||||||
#include"platform.h"
|
|
||||||
#include"typedefs.h"
|
|
||||||
#include"macro_helpers.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
//NOTE(martin): the default logging level can be adjusted by defining LOG_DEFAULT_LEVEL.
|
|
||||||
// It can be adjusted at runtime with log_set_level()
|
|
||||||
#ifndef LOG_DEFAULT_LEVEL
|
|
||||||
#define LOG_DEFAULT_LEVEL LOG_LEVEL_WARNING
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef enum { LOG_LEVEL_ERROR,
|
|
||||||
LOG_LEVEL_WARNING,
|
|
||||||
LOG_LEVEL_INFO,
|
|
||||||
LOG_LEVEL_COUNT } log_level;
|
|
||||||
|
|
||||||
#ifdef PLATFORM_ORCA
|
|
||||||
typedef enum
|
|
||||||
{
|
|
||||||
ORCA_LOG_OUTPUT_CONSOLE,
|
|
||||||
ORCA_LOG_OUTPUT_FILE
|
|
||||||
} orca_log_output_kind;
|
|
||||||
|
|
||||||
typedef struct log_output
|
|
||||||
{
|
|
||||||
orca_log_output_kind kind;
|
|
||||||
//TODO: file
|
|
||||||
} log_output;
|
|
||||||
|
|
||||||
#else
|
|
||||||
#include<stdio.h>
|
|
||||||
typedef FILE* log_output;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
MP_API void log_set_level(log_level level);
|
|
||||||
MP_API void log_set_output(log_output output);
|
|
||||||
MP_API void log_enable_vt_color(bool enable);
|
|
||||||
|
|
||||||
MP_API void log_generic(log_level level,
|
|
||||||
const char* functionName,
|
|
||||||
const char* fileName,
|
|
||||||
u32 line,
|
|
||||||
const char* msg,
|
|
||||||
...);
|
|
||||||
|
|
||||||
//NOTE(martin): warnings, messages, and debug info can be enabled in debug mode by defining LOG_COMPILE_XXX, XXX being the max desired log level
|
|
||||||
// error logging is always compiled
|
|
||||||
#define LOG_ERROR(msg, ...) log_generic(LOG_LEVEL_ERROR, __FUNCTION__, __FILE__, __LINE__, msg, ##__VA_ARGS__ )
|
|
||||||
|
|
||||||
#if defined(LOG_COMPILE_WARNING) || defined(LOG_COMPILE_INFO)
|
|
||||||
#define LOG_WARNING(msg, ...) log_generic(LOG_LEVEL_WARNING, __FUNCTION__, __FILE__, __LINE__, msg, ##__VA_ARGS__ )
|
|
||||||
|
|
||||||
#if defined(LOG_COMPILE_INFO)
|
|
||||||
#define LOG_INFO(msg, ...) log_generic(LOG_LEVEL_INFO, __FUNCTION__, __FILE__, __LINE__, msg, ##__VA_ARGS__ )
|
|
||||||
#else
|
|
||||||
#define LOG_INFO(msg, ...)
|
|
||||||
#endif
|
|
||||||
#else
|
|
||||||
#define LOG_WARNING(msg, ...)
|
|
||||||
#define LOG_INFO(msg, ...)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
} // extern "C"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif //__DEBUG_LOG_H_
|
|
|
@ -115,6 +115,23 @@ void mem_arena_clear(mem_arena* arena)
|
||||||
arena->currentChunk = list_first_entry(&arena->chunks, mem_arena_chunk, listElt);
|
arena->currentChunk = list_first_entry(&arena->chunks, mem_arena_chunk, listElt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mem_arena_marker mem_arena_mark(mem_arena* arena)
|
||||||
|
{
|
||||||
|
mem_arena_marker marker = {.chunk = arena->currentChunk,
|
||||||
|
.offset = arena->currentChunk->offset};
|
||||||
|
#if DEBUG
|
||||||
|
marker.arena = arena;
|
||||||
|
#endif
|
||||||
|
return(marker);
|
||||||
|
}
|
||||||
|
|
||||||
|
void mem_arena_clear_to(mem_arena* arena, mem_arena_marker marker)
|
||||||
|
{
|
||||||
|
DEBUG_ASSERT(arena == marker.arena);
|
||||||
|
arena->currentChunk = marker.chunk;
|
||||||
|
arena->currentChunk->offset = marker.offset;
|
||||||
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------
|
||||||
//NOTE(martin): memory pool
|
//NOTE(martin): memory pool
|
||||||
//--------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------
|
||||||
|
|
|
@ -38,6 +38,15 @@ typedef struct mem_arena
|
||||||
|
|
||||||
} mem_arena;
|
} mem_arena;
|
||||||
|
|
||||||
|
typedef struct mem_arena_marker
|
||||||
|
{
|
||||||
|
#if DEBUG
|
||||||
|
mem_arena* arena;
|
||||||
|
#endif
|
||||||
|
mem_arena_chunk* chunk;
|
||||||
|
u64 offset;
|
||||||
|
} mem_arena_marker;
|
||||||
|
|
||||||
typedef struct mem_arena_options
|
typedef struct mem_arena_options
|
||||||
{
|
{
|
||||||
mem_base_allocator* base;
|
mem_base_allocator* base;
|
||||||
|
@ -50,6 +59,8 @@ MP_API void mem_arena_release(mem_arena* arena);
|
||||||
|
|
||||||
MP_API void* mem_arena_alloc(mem_arena* arena, u64 size);
|
MP_API void* mem_arena_alloc(mem_arena* arena, u64 size);
|
||||||
MP_API void mem_arena_clear(mem_arena* arena);
|
MP_API void mem_arena_clear(mem_arena* arena);
|
||||||
|
MP_API mem_arena_marker mem_arena_mark(mem_arena* arena);
|
||||||
|
MP_API void mem_arena_clear_to(mem_arena* arena, mem_arena_marker marker);
|
||||||
|
|
||||||
#define mem_arena_alloc_type(arena, type) ((type*)mem_arena_alloc(arena, sizeof(type)))
|
#define mem_arena_alloc_type(arena, type) ((type*)mem_arena_alloc(arena, sizeof(type)))
|
||||||
#define mem_arena_alloc_array(arena, type, count) ((type*)mem_arena_alloc(arena, sizeof(type)*(count)))
|
#define mem_arena_alloc_array(arena, type, count) ((type*)mem_arena_alloc(arena, sizeof(type)*(count)))
|
||||||
|
|
|
@ -6,8 +6,6 @@
|
||||||
* @revision:
|
* @revision:
|
||||||
*
|
*
|
||||||
*****************************************************************/
|
*****************************************************************/
|
||||||
#include<string.h> // strlen(), strcpy(), etc.
|
|
||||||
#include<stdarg.h> // va_list() etc.
|
|
||||||
#include"macro_helpers.h"
|
#include"macro_helpers.h"
|
||||||
#include"strings.h"
|
#include"strings.h"
|
||||||
|
|
||||||
|
|
|
@ -9,10 +9,11 @@
|
||||||
#ifndef __STRINGS_H_
|
#ifndef __STRINGS_H_
|
||||||
#define __STRINGS_H_
|
#define __STRINGS_H_
|
||||||
|
|
||||||
#include<string.h> // strlen
|
|
||||||
#include"typedefs.h"
|
#include"typedefs.h"
|
||||||
#include"lists.h"
|
#include"lists.h"
|
||||||
#include"memory.h"
|
#include"memory.h"
|
||||||
|
#include"platform_strings.h"
|
||||||
|
#include"platform_varg.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
|
Loading…
Reference in New Issue