axl_itoa, axl_utoa

This commit is contained in:
NukeBird 2025-12-05 22:46:27 +03:00
parent e32beb707c
commit b8eaa81a22
4 changed files with 342 additions and 13 deletions

View file

@ -186,3 +186,81 @@ i8* axl_strrev(i8* str)
return str;
}
/*static const char digits_lower[] = "0123456789abcdefghijklmnopqrstuvwxyz";*/
static const char digits_upper[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
i8* axl_utoa(u64 val, i8* str, u8 base)
{
if(!str)
{
return NULL;
}
if (base < 2 || base > 36)
{
*str = '\0';
return str;
}
i8* head = str;
const i8* digits = digits_upper;
if (val == 0)
{
*head++ = '0';
*head++ = '\0';
return str;
}
while (val != 0)
{
*head++ = digits[val % base];
val /= base;
}
*head = '\0';
return axl_strrev(str);
}
i8* axl_itoa(i64 val, i8* str, u8 base)
{
if(!str)
{
return NULL;
}
if (base < 2 || base > 36)
{
*str = '\0';
return str;
}
i8* head = str;
u64 uval = val < 0 ? (u64)(-(val)) : (u64)val;
if (uval == 0)
{
*head++ = '0';
*head++ = '\0';
return str;
}
while (uval != 0)
{
*head++ = digits_upper[uval % base];
uval /= base;
}
if (val < 0)
{
*head++ = '-';
}
*head = '\0';
return axl_strrev(str);
}

View file

@ -12,5 +12,7 @@ i32 axl_strncmp(const i8* s1, const i8* s2, u32 n);
const i8* axl_strchr(const i8* str, i8 c);
i8* axl_strstr(const i8* str, const i8* substr);
i8* axl_strrev(i8* str);
i8* axl_utoa(u64 val, i8* str, u8 base);
i8* axl_itoa(i64 val, i8* str, u8 base);
#endif // AXL_STRING

View file

@ -547,6 +547,231 @@ KOAN(strrev_in_place)
ASSERT_STR_EQ("test", str);
}
KOAN(utoa_decimal_zero)
{
i8 buffer[32];
i8* result = axl_utoa(0, buffer, 10);
ASSERT_PTR_EQ(buffer, result);
ASSERT_STR_EQ("0", buffer);
}
KOAN(utoa_decimal_small)
{
i8 buffer[32];
i8* result = axl_utoa(42, buffer, 10);
ASSERT_PTR_EQ(buffer, result);
ASSERT_STR_EQ("42", buffer);
}
KOAN(utoa_decimal_large)
{
i8 buffer[32];
i8* result = axl_utoa(4294967295U, buffer, 10);
ASSERT_PTR_EQ(buffer, result);
ASSERT_STR_EQ("4294967295", buffer);
}
KOAN(utoa_binary)
{
i8 buffer[32];
i8* result = axl_utoa(10, buffer, 2);
ASSERT_PTR_EQ(buffer, result);
ASSERT_STR_EQ("1010", buffer);
}
KOAN(utoa_octal)
{
i8 buffer[32];
i8* result = axl_utoa(255, buffer, 8);
ASSERT_PTR_EQ(buffer, result);
ASSERT_STR_EQ("377", buffer);
}
KOAN(utoa_hexadecimal_lowercase)
{
i8 buffer[32];
i8* result = axl_utoa(0xDEADBEEF, buffer, 16);
ASSERT_PTR_EQ(buffer, result);
ASSERT_STR_EQ("DEADBEEF", buffer);
}
KOAN(utoa_hexadecimal_uppercase)
{
i8 buffer[32];
i8* result = axl_utoa(0xCAFEBABE, buffer, 16);
ASSERT_PTR_EQ(buffer, result);
// Note: implementation should produce lowercase by default
// If uppercase is needed, we'd need a separate function
ASSERT_STR_EQ("CAFEBABE", buffer);
}
KOAN(utoa_base_36)
{
i8 buffer[32];
i8* result = axl_utoa(123456789, buffer, 36);
ASSERT_PTR_EQ(buffer, result);
ASSERT_STR_EQ("21I3V9", buffer);
}
KOAN(utoa_max_base)
{
i8 buffer[32];
i8* result = axl_utoa(35, buffer, 36);
ASSERT_PTR_EQ(buffer, result);
ASSERT_STR_EQ("Z", buffer);
}
KOAN(itoa_positive)
{
i8 buffer[32];
i8* result = axl_itoa(12345, buffer, 10);
ASSERT_PTR_EQ(buffer, result);
ASSERT_STR_EQ("12345", buffer);
}
KOAN(itoa_negative)
{
i8 buffer[32];
i8* result = axl_itoa(-12345, buffer, 10);
ASSERT_PTR_EQ(buffer, result);
ASSERT_STR_EQ("-12345", buffer);
}
KOAN(itoa_zero)
{
i8 buffer[32];
i8* result = axl_itoa(0, buffer, 10);
ASSERT_PTR_EQ(buffer, result);
ASSERT_STR_EQ("0", buffer);
}
KOAN(itoa_min_int)
{
i8 buffer[32];
i8* result = axl_itoa(-9223372036854775807LL - 1, buffer, 10);
ASSERT_PTR_EQ(buffer, result);
ASSERT_STR_EQ("-9223372036854775808", buffer);
}
KOAN(itoa_max_int)
{
i8 buffer[32];
i8* result = axl_itoa(9223372036854775807LL, buffer, 10);
ASSERT_PTR_EQ(buffer, result);
ASSERT_STR_EQ("9223372036854775807", buffer);
}
KOAN(itoa_negative_binary)
{
i8 buffer[32];
i8* result = axl_itoa(-10, buffer, 2);
ASSERT_PTR_EQ(buffer, result);
ASSERT_STR_EQ("-1010", buffer);
}
KOAN(itoa_negative_hex)
{
i8 buffer[32];
i8* result = axl_itoa(-0xDEAD, buffer, 16);
ASSERT_PTR_EQ(buffer, result);
ASSERT_STR_EQ("-DEAD", buffer);
}
KOAN(itoa_positive_octal)
{
i8 buffer[32];
i8* result = axl_itoa(511, buffer, 8);
ASSERT_PTR_EQ(buffer, result);
ASSERT_STR_EQ("777", buffer);
}
KOAN(itoa_negative_octal)
{
i8 buffer[32];
i8* result = axl_itoa(-511, buffer, 8);
ASSERT_PTR_EQ(buffer, result);
ASSERT_STR_EQ("-777", buffer);
}
KOAN(itoa_base_36_positive)
{
i8 buffer[32];
i8* result = axl_itoa(123456789, buffer, 36);
ASSERT_PTR_EQ(buffer, result);
ASSERT_STR_EQ("21I3V9", buffer);
}
KOAN(itoa_base_36_negative)
{
i8 buffer[32];
i8* result = axl_itoa(-123456789, buffer, 36);
ASSERT_PTR_EQ(buffer, result);
ASSERT_STR_EQ("-21I3V9", buffer);
}
KOAN(utoa_buffer_reuse)
{
i8 buffer[32];
i8* result1 = axl_utoa(123, buffer, 10);
ASSERT_PTR_EQ(buffer, result1);
ASSERT_STR_EQ("123", buffer);
i8* result2 = axl_utoa(456, buffer, 10);
ASSERT_PTR_EQ(buffer, result2);
ASSERT_STR_EQ("456", buffer);
}
KOAN(itoa_buffer_reuse)
{
i8 buffer[32];
i8* result1 = axl_itoa(-123, buffer, 10);
ASSERT_PTR_EQ(buffer, result1);
ASSERT_STR_EQ("-123", buffer);
i8* result2 = axl_itoa(456, buffer, 10);
ASSERT_PTR_EQ(buffer, result2);
ASSERT_STR_EQ("456", buffer);
}
KOAN(utoa_edge_cases)
{
i8 buffer[32];
// Test with base 2 (binary)
i8* result1 = axl_utoa(42, buffer, 2);
ASSERT_PTR_EQ(buffer, result1);
ASSERT_STR_EQ("101010", buffer);
// Test with base 8 (octal)
i8* result2 = axl_utoa(777, buffer, 8);
ASSERT_PTR_EQ(buffer, result2);
ASSERT_STR_EQ("1411", buffer);
// Test with base 16 (hex)
i8* result3 = axl_utoa(0xABCD, buffer, 16);
ASSERT_PTR_EQ(buffer, result3);
ASSERT_STR_EQ("ABCD", buffer);
}
KOAN(itoa_edge_cases)
{
i8 buffer[32];
// Test positive to negative transition
i8* result1 = axl_itoa(1, buffer, 10);
ASSERT_PTR_EQ(buffer, result1);
ASSERT_STR_EQ("1", buffer);
i8* result2 = axl_itoa(-1, buffer, 10);
ASSERT_PTR_EQ(buffer, result2);
ASSERT_STR_EQ("-1", buffer);
// Test zero stays zero
i8* result3 = axl_itoa(0, buffer, 10);
ASSERT_PTR_EQ(buffer, result3);
ASSERT_STR_EQ("0", buffer);
}
int main(void)
{
axl_init();

48
main.c
View file

@ -1,4 +1,7 @@
#include "axl.h"
#include "axl_io.h"
#include "axl_memory.h"
#include "axl_string.h"
#include "axl_vlq.h"
#include <windows.h>
@ -30,22 +33,43 @@ int _start(void)
(void)fds;
(void)f;
u32 new_len = 0;
u8 src[] = "Bonjour le monde!";
u32 src_len = axl_strlen((i8*)src);
for(u32 i = 0; i < src_len; i += 4)
for(int i = 64532; i < 64533; ++i)
{
u8 buff[AXL_VLQ_MAX_LEN + 1];
axl_puts("{");
for(int base = 2; base < 17; ++base)
{
i8 buff[32];
axl_memset(buff, '\0', 32);
u32 encoded_l = axl_vlq_encode(*((u32*)(src + i)), buff);
new_len += encoded_l;
i8 text[256];
axl_memset(text, '\0', 256);
buff[encoded_l] = '\0';
axl_puts((i8*)buff);
axl_strcat(text, axl_itoa(i, buff, 10));
axl_strcat(text, "\tof base\t");
axl_strcat(text, axl_itoa(base, buff, 10));
axl_strcat(text, "\tis\t");
axl_strcat(text, axl_itoa(i, buff, base));
axl_puts(text);
}
axl_puts("}");
}
(void)new_len;
/*u32 new_len = 0;*/
/*u8 src[] = "Bonjour le monde!";*/
/*u32 src_len = axl_strlen((i8*)src);*/
/*for(u32 i = 0; i < src_len; i += 4)*/
/*{*/
/* u8 buff[AXL_VLQ_MAX_LEN + 1];*/
/**/
/* u32 encoded_l = axl_vlq_encode(*((u32*)(src + i)), buff);*/
/* new_len += encoded_l;*/
/**/
/* buff[encoded_l] = '\0'; */
/**/
/* axl_puts((i8*)buff);*/
/*}*/
/*(void)new_len;*/
return 0;