summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/utils.c133
1 files changed, 115 insertions, 18 deletions
diff --git a/src/utils.c b/src/utils.c
index f24510c..b0c95a9 100644
--- a/src/utils.c
+++ b/src/utils.c
@@ -106,6 +106,51 @@ void u64toa(u64 number, char* str, u32 base) {
}
}
+void i64toa(i64 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;
+ u64 u_number = ~number + 1;
+
+ if (number == 0) {
+ str[0U] = codes[0U];
+ }
+
+ for(; u_number != 0; size++) {
+ remainder = u_number % base;
+ u_number /= base;
+ str[size] = codes[remainder];
+ }
+
+ if (number < 0) {
+ str[size] = '-';
+ size++;
+ }
+
+ for(u32 i = 0; i < size / 2U; i++) {
+ char c = str[i];
+ str[i] = str[size - i - 1];
+ str[size - i - 1] = c;
+ }
+}
+
u64 atou64(const char* str, u32 len) {
u64 number = 0U;
u32 base = 10U;
@@ -254,41 +299,41 @@ void print(const char* format, ...) {
u64 number = va_arg(args, u64);
u32 str_len = 1U;
- if (number > 9999999999999999999U) {
+ if (number > 9999999999999999999U) {
str_len = 20U;
- } else if (number > 999999999999999999U) {
+ } else if (number > 999999999999999999U) {
str_len = 19U;
- } else if (number > 99999999999999999U) {
+ } else if (number > 99999999999999999U) {
str_len = 18U;
- } else if (number > 9999999999999999U) {
+ } else if (number > 9999999999999999U) {
str_len = 17U;
- } else if (number > 999999999999999U) {
+ } else if (number > 999999999999999U) {
str_len = 16U;
- } else if (number > 99999999999999U) {
+ } else if (number > 99999999999999U) {
str_len = 15U;
- } else if (number > 9999999999999U) {
+ } else if (number > 9999999999999U) {
str_len = 14U;
- } else if (number > 999999999999U) {
+ } else if (number > 999999999999U) {
str_len = 13U;
- } else if (number > 99999999999U) {
+ } else if (number > 99999999999U) {
str_len = 12U;
- } else if (number > 9999999999U) {
+ } else if (number > 9999999999U) {
str_len = 11U;
- } else if (number > 999999999U) {
+ } else if (number > 999999999U) {
str_len = 10U;
- } else if (number > 99999999U) {
+ } else if (number > 99999999U) {
str_len = 9U;
- } else if (number > 9999999U) {
+ } else if (number > 9999999U) {
str_len = 8U;
- } else if (number > 999999U) {
+ } else if (number > 999999U) {
str_len = 7U;
- } else if (number > 99999U) {
+ } else if (number > 99999U) {
str_len = 6U;
- } else if (number > 9999U) {
+ } else if (number > 9999U) {
str_len = 5U;
- } else if (number > 999U) {
+ } else if (number > 999U) {
str_len = 4U;
- } else if (number > 99U) {
+ } else if (number > 99U) {
str_len = 3U;
} else if (number > 9U) {
str_len = 2U;
@@ -302,6 +347,58 @@ void print(const char* format, ...) {
u64toa(number, cur_char, 10U);
cur_char += str_len;
+ } else if(*cur_fmt == 'd') {
+ i64 number = va_arg(args, i64);
+ u32 str_len = 1U;
+
+ if (number < -999999999999999999) {
+ str_len = 20U;
+ } else if (999999999999999999 < number || number < -99999999999999999) {
+ str_len = 19U;
+ } else if (99999999999999999 < number || number < -9999999999999999) {
+ str_len = 18U;
+ } else if (9999999999999999 < number || number < -999999999999999) {
+ str_len = 17U;
+ } else if (999999999999999 < number || number < -99999999999999) {
+ str_len = 16U;
+ } else if (99999999999999 < number || number < -9999999999999) {
+ str_len = 15U;
+ } else if (9999999999999 < number || number < -999999999999) {
+ str_len = 14U;
+ } else if (999999999999 < number || number < -99999999999) {
+ str_len = 13U;
+ } else if (99999999999 < number || number < -9999999999) {
+ str_len = 12U;
+ } else if (9999999999 < number || number < -999999999) {
+ str_len = 11U;
+ } else if (999999999 < number || number < -99999999) {
+ str_len = 10U;
+ } else if (99999999 < number || number < -9999999) {
+ str_len = 9U;
+ } else if (9999999 < number || number < -999999) {
+ str_len = 8U;
+ } else if (999999 < number || number < -99999) {
+ str_len = 7U;
+ } else if (99999 < number || number < -9999) {
+ str_len = 6U;
+ } else if (9999 < number || number < -999) {
+ str_len = 5U;
+ } else if (999 < number || number < -99) {
+ str_len = 4U;
+ } else if (99 < number || number < -9) {
+ str_len = 3U;
+ } else if (9 < number || number < 0) {
+ str_len = 2U;
+ }
+
+ i64 relative_fill_count = fill_count - str_len;
+ if (relative_fill_count > 0) {
+ fill_chars((u8*)cur_char, '0', (u32)relative_fill_count);
+ cur_char += relative_fill_count;
+ }
+
+ i64toa(number, cur_char, 10U);
+ cur_char += str_len;
}
} else {
*cur_char = *cur_fmt;