String format vectors %v2 %v3 %v4

This commit is contained in:
Charlie Malmqvist 2024-08-19 14:08:03 +02:00
parent b231b58247
commit f8ef5dd8b3

View file

@ -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];