fix treatment of octal strings in try_u64/s64_from_str8_c_rules

This commit is contained in:
Ryan Fleury
2025-05-20 14:10:34 -07:00
parent 95dbba1144
commit 2f5082fb61
+19 -13
View File
@@ -603,44 +603,50 @@ s32_from_str8(String8 string, U32 radix)
} }
internal B32 internal B32
try_u64_from_str8_c_rules(String8 string, U64 *x){ try_u64_from_str8_c_rules(String8 string, U64 *x)
{
B32 is_integer = 0; B32 is_integer = 0;
if (str8_is_integer(string, 10)){ if(str8_is_integer(string, 10) && !str8_match(str8_prefix(string, 1), str8_lit("0"), 0))
{
is_integer = 1; is_integer = 1;
*x = u64_from_str8(string, 10); *x = u64_from_str8(string, 10);
} }
else{ else
{
String8 hex_string = str8_skip(string, 2); String8 hex_string = str8_skip(string, 2);
if (str8_match(str8_prefix(string, 2), str8_lit("0x"), 0) && if(str8_match(str8_prefix(string, 2), str8_lit("0x"), 0) &&
str8_is_integer(hex_string, 0x10)){ str8_is_integer(hex_string, 0x10))
{
is_integer = 1; is_integer = 1;
*x = u64_from_str8(hex_string, 0x10); *x = u64_from_str8(hex_string, 0x10);
} }
else if (str8_match(str8_prefix(string, 2), str8_lit("0b"), 0) && else if(str8_match(str8_prefix(string, 2), str8_lit("0b"), 0) && str8_is_integer(hex_string, 2))
str8_is_integer(hex_string, 2)){ {
is_integer = 1; is_integer = 1;
*x = u64_from_str8(hex_string, 2); *x = u64_from_str8(hex_string, 2);
} }
else{ else
{
String8 oct_string = str8_skip(string, 1); String8 oct_string = str8_skip(string, 1);
if (str8_match(str8_prefix(string, 1), str8_lit("0"), 0) && if(str8_match(str8_prefix(string, 1), str8_lit("0"), 0) && str8_is_integer(hex_string, 010))
str8_is_integer(hex_string, 010)){ {
is_integer = 1; is_integer = 1;
*x = u64_from_str8(oct_string, 010); *x = u64_from_str8(oct_string, 010);
} }
} }
} }
return(is_integer); return is_integer;
} }
internal B32 internal B32
try_s64_from_str8_c_rules(String8 string, S64 *x){ try_s64_from_str8_c_rules(String8 string, S64 *x)
{
String8 string_tail = {0}; String8 string_tail = {0};
S64 sign = sign_from_str8(string, &string_tail); S64 sign = sign_from_str8(string, &string_tail);
U64 x_u64 = 0; U64 x_u64 = 0;
B32 is_integer = try_u64_from_str8_c_rules(string_tail, &x_u64); B32 is_integer = try_u64_from_str8_c_rules(string_tail, &x_u64);
*x = x_u64*sign; *x = x_u64*sign;
return(is_integer); return is_integer;
} }
//- rjf: integer -> string //- rjf: integer -> string