axl_itoa, axl_utoa
This commit is contained in:
parent
e32beb707c
commit
b8eaa81a22
4 changed files with 342 additions and 13 deletions
78
axl_string.c
78
axl_string.c
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
48
main.c
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in a new issue