From fd475232ee12089f817f237cc755fe4444ec483b Mon Sep 17 00:00:00 2001 From: steven-na Date: Sat, 22 Aug 2026 21:52:29 -0700 Subject: Fixed va_list bug and strng_dup off by one --- src/log.c | 45 +++++++++++++++++++++++++-------------------- src/smrt_arena.c | 19 +++++++++++++------ src/string.h | 4 ++-- 3 files changed, 40 insertions(+), 28 deletions(-) diff --git a/src/log.c b/src/log.c index 670fbb5..c67b8b2 100644 --- a/src/log.c +++ b/src/log.c @@ -54,7 +54,7 @@ static inline void unlock() { if (L.lock_proc) L.lock_proc(false); } static inline void write_to_file(LogLevelE lvl, const char *src_file, u64 src_line, const char *fmt, struct tm* time, va_list va) { if (!L.log_file) { return; } char time_str[64]; - time_str[strftime(time_str, sizeof(time_str), "%Y-%m-%d %H:%M:%S", time)] = '\0'; + strftime(time_str, sizeof(time_str), "%Y-%m-%d %H:%M:%S", time); fprintf(L.log_file, "%s [%-5s] %s:%lu ", time_str, level_strings[lvl], src_file, src_line); vfprintf(L.log_file, fmt, va); @@ -66,32 +66,37 @@ void log_log(LogLevelE lvl, const char *src_file, u64 src_line, const char *fmt, lock(); - va_list va; - va_list fva; - va_start(va, fmt); - va_copy(fva, va); - va_end(va); - time_t t = time(NULL); - struct tm* time = localtime(&t); + struct tm tm_info; + struct tm* time_ptr = localtime_r(&t, &tm_info); - if (L.quiet || lvl < L.lvl) { goto skip; } + bool should_log_to_console = !(L.quiet || lvl < L.lvl); - char time_str[16]; - time_str[strftime(time_str, sizeof(time_str), "%H:%M:%S", time)] = '\0'; + va_list va; + va_start(va, fmt); + + if (should_log_to_console) { + char time_str[16]; + strftime(time_str, sizeof(time_str), "%H:%M:%S", time_ptr); #ifndef LOG_NO_COLOR - fprintf(L.log_default, "%s %s[%-5s] \x1b[0m\x1b[90m%s:%lu:\x1b[0m ", - time_str, level_colors[lvl], level_strings[lvl], src_file, src_line); + fprintf(L.log_default, "%s %s[%-5s] \x1b[0m\x1b[90m%s:%lu:\x1b[0m ", + time_str, level_colors[lvl], level_strings[lvl], src_file, src_line); #else - fprintf(L.log_default, "%s %-5s %s:%lu: ", - time_str, level_strings[L.lvl], src_file, src_line); -#endif /* ifndef LOG_NO_COLOR */ + fprintf(L.log_default, "%s %-5s %s:%lu: ", + time_str, level_strings[L.lvl], src_file, src_line); +#endif + + vfprintf(L.log_default, fmt, va); + fprintf(L.log_default, "\n"); + } + + va_list fva; + va_copy(fva, va); + va_end(va); - vfprintf(L.log_default, fmt, va); - fprintf(L.log_default, "\n"); + write_to_file(lvl, src_file, src_line, fmt, time_ptr, fva); + va_end(fva); -skip: - write_to_file(lvl, src_file, src_line, fmt, time, fva); unlock(); } diff --git a/src/smrt_arena.c b/src/smrt_arena.c index 055877d..b117473 100644 --- a/src/smrt_arena.c +++ b/src/smrt_arena.c @@ -1,3 +1,4 @@ +#include #if defined(__linux__) #ifndef _DEFAULT_SOURCE #define _DEFAULT_SOURCE @@ -33,8 +34,8 @@ smrt_arena_t *smrt_arena_create(u64 reserve_size, u64 commit_size, b32 auto_deco arena->auto_decommit = auto_decommit; #ifndef NLOG_TRACE - log_trace("Created smrt_arena; Total %lu bytes, Commit size %lu bytes", - reserve_size, commit_size); + log_trace("Created smrt_arena %lu; Total %lu bytes, Commit size %lu bytes", + (uintptr_t)arena, reserve_size, commit_size); #endif /* ifndef NLOG_TRACE */ return arena; @@ -84,6 +85,11 @@ void *smrt_arena_push(smrt_arena_t *arena, u64 alloc_amount, b32 zero_out) { return NULL; } + #ifndef NLOG_TRACE + log_trace("Committed new memory on arena %lu to size %lu", + (uintptr_t)arena, arena->commit_size); + #endif /* ifndef NLOG_TRACE */ + arena->commit_pos = new_commit_pos; } @@ -156,9 +162,10 @@ void smrt_arena_destroy(smrt_arena_t *arena) { } smrta_temp_t smrta_temp_start(smrt_arena_t *arena) { - #ifndef NLOG_TRACE - log_trace("Starting temp arena"); - #endif /* ifndef NLOG_TRACE */ + #ifndef NLOG_TRACE + log_trace("Starting temp arena %lu at pos %lu", (uintptr_t)arena, arena->pos); + #endif /* ifndef NLOG_TRACE */ + return (smrta_temp_t){ .arena=arena, @@ -169,7 +176,7 @@ smrta_temp_t smrta_temp_start(smrt_arena_t *arena) { void smrta_temp_end(smrta_temp_t temp) { smrt_arena_pop_to(temp.arena, temp.start_pos); #ifndef NLOG_TRACE - log_trace("Ending temp arena"); + log_trace("Ending temp arena %lu %lu->%lu", (uintptr_t)temp.arena, temp.start_pos, temp.arena->pos); #endif /* ifndef NLOG_TRACE */ } diff --git a/src/string.h b/src/string.h index 9ff4978..ea4fd9b 100644 --- a/src/string.h +++ b/src/string.h @@ -40,8 +40,8 @@ static inline strng_view_t sv_from(strng_t const *string) { return (strng_view_t){ .string=(char*)((u8*)string+STRNG_BASE_POS), .start=0, - .end=string->len, - .max=string->len, + .end=string->len-1, + .max=string->len-1, }; } -- cgit v1.2.3