diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/utils.c | 133 |
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; |
