summaryrefslogtreecommitdiffstats
path: root/src/utils.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/utils.c')
-rw-r--r--src/utils.c193
1 files changed, 151 insertions, 42 deletions
diff --git a/src/utils.c b/src/utils.c
index 27dab87..729b74d 100644
--- a/src/utils.c
+++ b/src/utils.c
@@ -1,7 +1,6 @@
#include "utils.h"
#include <Windows.h>
-#include <strsafe.h>
u8 is_alpha(char c) {
return ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z');
@@ -15,6 +14,31 @@ u8 is_hexadecimal_digit(char c) {
return ('0' <= c && c <= '9') || ('a' <= c && c <= 'f') || ('A' <= c && c <= 'F');
}
+
+// TODO: Improve basic functions perfs
+// max_size: str allocated size
+size_t str_len(const char* str, size_t max_size) {
+ const char* c = str;
+ size_t count = 0U;
+ while (*c != '\0' && count < max_size) {
+ c++;
+ count++;
+ }
+ return count;
+}
+
+void str_cat(char* out, const char* str, size_t c_str) {
+ char* cur_out = out;
+ const char* cur_str = str;
+ u32 index = 0U;
+ while(index < c_str) {
+ *cur_out = *cur_str;
+ cur_out++;
+ cur_str++;
+ index++;
+ }
+}
+
void u64toa(u64 number, char* str, u32 base) {
static char codes[16U] = {
'0',
@@ -37,9 +61,8 @@ void u64toa(u64 number, char* str, u32 base) {
u32 remainder = 0U;
u32 size = 0U;
- if (number == 0) {
+ if (number == 0U) {
str[0U] = codes[0U];
- return;
}
for(; number != 0U; size++) {
@@ -95,74 +118,162 @@ void print(const char* format, ...) {
va_list args;
va_start(args, format);
char formatted_str[4096U] = { 0 };
- STRSAFE_LPSTR cur_char = formatted_str;
+ char* cur_char = formatted_str;
const char* cur_fmt = format;
while(*cur_fmt != '\0') {
if(*cur_fmt == '%') {
cur_fmt++;
- const char* num_start = cur_fmt;
- u8 num_len = 0U;
u64 fill_count = 0U;
- while (is_decimal_digit(*cur_fmt)) {
+
+ // padding length
+ if (*cur_fmt == '.') {
cur_fmt++;
- num_len++;
- }
- if (num_len > 0U) {
- fill_count = atou64(num_start, num_len);
+ const char* num_start = cur_fmt;
+ u8 num_len = 0U;
+
+ while (is_decimal_digit(*cur_fmt)) {
+ cur_fmt++;
+ num_len++;
+ }
+
+ if (num_len > 0U) {
+ fill_count = atou64(num_start, num_len);
+ }
}
+ // TODO: length modifiers
+
+ // conversion specifiers
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);
+ size_t length = str_len(str, sizeof(formatted_str));
i64 relative_fill_count = fill_count - length;
- if (relative_fill_count > 0) {
+ if (relative_fill_count > 1) {
fill_chars((u8*)cur_char, ' ', (u32)relative_fill_count);
cur_char += relative_fill_count;
}
- StringCchCatA(cur_char, length + 1U, str);
+ str_cat(cur_char, str, length);
cur_char += length;
}
} else if(*cur_fmt == 'c') {
char c = va_arg(args, char);
if (fill_count > 1U) {
fill_chars((u8*)cur_char, ' ', (u32)fill_count - 1U);
- cur_char += fill_count - 1U;
+ cur_char += fill_count;
}
- StringCchCatA(cur_char, 1U, &c);
- cur_char += 1U;
- } else if (*cur_fmt == 'x' && is_alpha(cur_fmt[1])) {
- u32 base = 16U;
- cur_fmt++;
+ *cur_char = c;
+ cur_char++;
+ } else if (*cur_fmt == 'x') {
+ u64 number = va_arg(args, u64);
+ u32 str_len = 0;
- if(*cur_fmt == 'b') {
- u8 number = va_arg(args, u8);
- u64toa((u64)number, cur_char, base);
- size_t length = 0U;
- StringCchLengthA(formatted_str, sizeof(formatted_str), &length);
- cur_char = formatted_str + length;
- } else if(*cur_fmt == 'u') {
- u64 number = va_arg(args, u64);
- u64toa(number, cur_char, base);
- size_t length = 0U;
- StringCchLengthA(formatted_str, sizeof(formatted_str), &length);
- cur_char = formatted_str + length;
+ if (number > 0xfffffffffffffff) {
+ str_len = 16U;
+ } else if (number > 0xffffffffffffff) {
+ str_len = 15U;
+ } else if (number > 0xfffffffffffff) {
+ str_len = 14U;
+ } else if (number > 0xffffffffffff) {
+ str_len = 13U;
+ } else if (number > 0xfffffffffff) {
+ str_len = 12U;
+ } else if (number > 0xffffffffff) {
+ str_len = 11U;
+ } else if (number > 0xfffffffff) {
+ str_len = 10U;
+ } else if (number > 0xffffffff) {
+ str_len = 9U;
+ } else if (number > 0xfffffff) {
+ str_len = 8U;
+ } else if (number > 0xffffff) {
+ str_len = 7U;
+ } else if (number > 0xfffff) {
+ str_len = 6U;
+ } else if (number > 0xffff) {
+ str_len = 5U;
+ } else if (number > 0xfff) {
+ str_len = 4U;
+ } else if (number > 0xff) {
+ str_len = 3U;
+ } else if (number > 0xf) {
+ str_len = 2U;
}
+
+ i64 relative_fill_count = fill_count - str_len;
+ if (relative_fill_count > 1) {
+ fill_chars((u8*)cur_char, '0', (u32)relative_fill_count);
+ cur_char += fill_count;
+ }
+ u64toa(number, cur_char, 16U);
+
+ cur_char += str_len;
} else if(*cur_fmt == 'b') {
u8 number = va_arg(args, u8);
+ u32 str_len = 8U - __lzcnt(number);
+
+ i64 relative_fill_count = fill_count - str_len;
+ if (relative_fill_count > 1) {
+ fill_chars((u8*)cur_char, '0', (u32)relative_fill_count);
+ cur_char += fill_count;
+ }
+
u64toa((u64)number, cur_char, 10U);
- size_t length = 0U;
- StringCchLengthA(formatted_str, sizeof(formatted_str), &length);
- cur_char = formatted_str + length;
+ cur_char += str_len;
} else if(*cur_fmt == 'u') {
u64 number = va_arg(args, u64);
+ u32 str_len = 1U;
+
+ if (number > 9999999999999999999U) {
+ str_len = 20U;
+ } else if (number > 999999999999999999U) {
+ str_len = 19U;
+ } else if (number > 99999999999999999U) {
+ str_len = 18U;
+ } else if (number > 9999999999999999U) {
+ str_len = 17U;
+ } else if (number > 999999999999999U) {
+ str_len = 16U;
+ } else if (number > 99999999999999U) {
+ str_len = 15U;
+ } else if (number > 9999999999999U) {
+ str_len = 14U;
+ } else if (number > 999999999999U) {
+ str_len = 13U;
+ } else if (number > 99999999999U) {
+ str_len = 12U;
+ } else if (number > 9999999999U) {
+ str_len = 11U;
+ } else if (number > 999999999U) {
+ str_len = 10U;
+ } else if (number > 99999999U) {
+ str_len = 9U;
+ } else if (number > 9999999U) {
+ str_len = 8U;
+ } else if (number > 999999U) {
+ str_len = 7U;
+ } else if (number > 99999U) {
+ str_len = 6U;
+ } else if (number > 9999U) {
+ str_len = 5U;
+ } else if (number > 999U) {
+ str_len = 4U;
+ } else if (number > 99U) {
+ str_len = 3U;
+ } else if (number > 9U) {
+ str_len = 2U;
+ }
+
+ i64 relative_fill_count = fill_count - str_len;
+ if (relative_fill_count > 1U) {
+ fill_chars((u8*)cur_char, '0', (u32)relative_fill_count);
+ cur_char += fill_count;
+ }
+
u64toa(number, cur_char, 10U);
- size_t length = 0U;
- StringCchLengthA(formatted_str, sizeof(formatted_str), &length);
- cur_char = formatted_str + length;
+ cur_char += str_len;
}
} else {
*cur_char = *cur_fmt;
@@ -173,9 +284,7 @@ void print(const char* format, ...) {
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));
+ SUCCEEDED(WriteFile(standard_err, formatted_str, (u32)(cur_char - formatted_str), NULL, NULL));
}
/* Read debugged process memory at address */