diff options
| author | ladevieq <ladevie.quentin@gmail.com> | 2024-08-21 23:56:16 +0200 |
|---|---|---|
| committer | ladevieq <ladevie.quentin@gmail.com> | 2024-08-21 23:56:16 +0200 |
| commit | d5ea670c6a047c1cd9c2d18e5f7877c5b791352a (patch) | |
| tree | 2ecab30d4ec06777b73c63c7fc800575ce13bab0 /src/utils.c | |
| parent | fa57140c3e3a56f23a37351a66d51f2cf3464561 (diff) | |
Split code in multiple files
Rework parser
Add command to step in
Diffstat (limited to 'src/utils.c')
| -rw-r--r-- | src/utils.c | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/src/utils.c b/src/utils.c new file mode 100644 index 0000000..71377bc --- /dev/null +++ b/src/utils.c @@ -0,0 +1,93 @@ +#include <strsafe.h> +#include <Windows.h> + +#include "types.h" + +void u64toa(u64 number, char* str, u32 base) { + static char codes[16U] = { + '0', + '1', + '2', + '3', + '4', + '5', + '6', + '7', + '8', + '9', + 'A', + 'B', + 'C', + 'D', + 'E', + 'F', + }; + u32 remainder = 0U; + u32 size = 0U; + + if (number == 0) { + str[0U] = codes[0U]; + return; + } + + for(; number != 0U; size++) { + remainder = number % base; + number /= base; + str[size] = codes[remainder]; + } + + for(u32 i = 0; i < size / 2U; i++) { + char c = str[i]; + str[i] = str[size - i - 1]; + str[size - i - 1] = c; + } +} + +void print(const char* format, ...) { + va_list args; + va_start(args, format); + char formatted_str[4096U] = {}; + STRSAFE_LPSTR cur_char = formatted_str; + + const char* cur_fmt = format; + while(*cur_fmt != '\0') { + if(*cur_fmt == '%') { + cur_fmt++; + if (*cur_fmt == 's') { + const char* str = va_arg(args, const char*); + if(str != NULL) { + size_t length = 0U; + StringCchLengthA(str, sizeof(formatted_str), &length); + StringCchCatA(cur_char, length + 1U, str); + cur_char += length; + } + } else if(*cur_fmt == 'c') { + char c = va_arg(args, char); + StringCchCatA(cur_char, 1U, &c); + cur_char += 1U; + } else if(*cur_fmt == 'u') { + u64 number = va_arg(args, u64); + u64toa(number, cur_char, 10); + size_t length = 0U; + StringCchLengthA(formatted_str, sizeof(formatted_str), &length); + cur_char = formatted_str + length; + } else if(*cur_fmt == 'x') { + u64 number = va_arg(args, u64); + u64toa(number, cur_char, 16); + size_t length = 0U; + StringCchLengthA(formatted_str, sizeof(formatted_str), &length); + cur_char = formatted_str + length; + } + } else { + *cur_char = *cur_fmt; + cur_char++; + } + cur_fmt++; + } + va_end(args); + + HANDLE standard_err = GetStdHandle(STD_ERROR_HANDLE); + size_t length = 0U; + StringCchLengthA(formatted_str, sizeof(formatted_str), &length); + SUCCEEDED(WriteFile(standard_err, formatted_str, (DWORD)length, NULL, NULL)); +} |
