String format vectors %v2 %v3 %v4
This commit is contained in:
parent
b231b58247
commit
f8ef5dd8b3
1 changed files with 47 additions and 0 deletions
|
@ -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];
|
||||
|
|
Reference in a new issue