From f8ef5dd8b3229d3ffa4157916c7c8fabbab642b1 Mon Sep 17 00:00:00 2001 From: Charlie Malmqvist Date: Mon, 19 Aug 2024 14:08:03 +0200 Subject: [PATCH] String format vectors %v2 %v3 %v4 --- oogabooga/string_format.c | 47 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/oogabooga/string_format.c b/oogabooga/string_format.c index 69c8126..2b437aa 100644 --- a/oogabooga/string_format.c +++ b/oogabooga/string_format.c @@ -4,6 +4,17 @@ inline int crt_sprintf(char *str, const char *format, ...); int vsnprintf(char* buffer, size_t n, const char* fmt, va_list args); bool is_pointer_valid(void *p); +u64 format_string_to_buffer(char* buffer, u64 count, const char* fmt, va_list args); +u64 format_string_to_buffer_vararg(char* buffer, u64 count, const char* fmt, ...) { + va_list args; + va_start(args, fmt); + u64 n = format_string_to_buffer(buffer, count, fmt, args); + va_end(args); + return n; +} +typedef struct _8_Bytes {u8 _[8];} _8_Bytes; +typedef struct _12_Bytes {u8 _[12];} _12_Bytes; +typedef struct _16_Bytes {u8 _[16];} _16_Bytes; u64 format_string_to_buffer(char* buffer, u64 count, const char* fmt, va_list args) { if (!buffer) count = UINT64_MAX; const char* p = fmt; @@ -58,6 +69,42 @@ u64 format_string_to_buffer(char* buffer, u64 count, const char* fmt, va_list ar len += 1; assert(len < (1024ULL*1024ULL*1024ULL*1ULL), "The argument passed to %%cs is either way too big, missing null-termination or simply not a char*."); } + } else if (*p == 'v' && *(p+1) == '2') { + p += 2; + + _8_Bytes data = va_arg(args, _8_Bytes); + + f32 x = *(((f32*)(&data))+0); + f32 y = *(((f32*)(&data))+1); + + u64 n = format_string_to_buffer_vararg(buffer ? bufp : 0, 128, "{ X: %f, Y: %f }", x, y); + + bufp += n; + } else if (*p == 'v' && *(p+1) == '3') { + p += 2; + + _12_Bytes data = va_arg(args, _12_Bytes); + + f32 x = *(((f32*)(&data))+0); + f32 y = *(((f32*)(&data))+1); + f32 z = *(((f32*)(&data))+2); + + u64 n = format_string_to_buffer_vararg(buffer ? bufp : 0, 196, "{ X: %f, Y: %f, Z: %f }", x, y, z); + + bufp += n; + } else if (*p == 'v' && *(p+1) == '4') { + p += 2; + + _16_Bytes data = va_arg(args, _16_Bytes); + + f32 x = *(((f32*)(&data))+0); + f32 y = *(((f32*)(&data))+1); + f32 z = *(((f32*)(&data))+2); + f32 w = *(((f32*)(&data))+3); + + u64 n = format_string_to_buffer_vararg(buffer ? bufp : 0, 256, "{ X: %f, Y: %f, Z: %f, W: %f }", x, y, z, w); + + bufp += n; } else { // Fallback to standard vsnprintf char temp_buffer[512];