summaryrefslogtreecommitdiffstats
path: root/src/utils.c
diff options
context:
space:
mode:
authorladevieq <ladevie.quentin@gmail.com>2024-08-21 23:56:16 +0200
committerladevieq <ladevie.quentin@gmail.com>2024-08-21 23:56:16 +0200
commitd5ea670c6a047c1cd9c2d18e5f7877c5b791352a (patch)
tree2ecab30d4ec06777b73c63c7fc800575ce13bab0 /src/utils.c
parentfa57140c3e3a56f23a37351a66d51f2cf3464561 (diff)
Split code in multiple files
Rework parser Add command to step in
Diffstat (limited to 'src/utils.c')
-rw-r--r--src/utils.c93
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));
+}