Str2I64() octal prefix 0o

* Comment at top of function hints that 0o18 is treated as an octal number but it is not
* Adding the appropriate switch-case makes it work by adjusting radix
* Update comment: this function is more like strtol() because it returns a signed result
* This function doesn't behave like strtol() because "0" prefix can't be used for octal, e.g. "0777" (maybe it could be supported in future)
This commit is contained in:
Michael Mikonos 2023-08-03 14:35:17 +08:00 committed by GitHub
parent b32f9cea77
commit 79ac2b651f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -1,5 +1,5 @@
I64 Str2I64(U8 *st, I64 radix=10, U8 **_end_ptr=NULL) I64 Str2I64(U8 *st, I64 radix=10, U8 **_end_ptr=NULL)
{//String to I64. Similar to strtoul(). {//String to I64. Similar to strtol().
//Allows radix change with "0x20" "0b1010" "0d123" "0o18". //Allows radix change with "0x20" "0b1010" "0d123" "0o18".
//Be careful of Str2I64("0b101", 16)-->0xB101. //Be careful of Str2I64("0b101", 16)-->0xB101.
Bool neg = FALSE; Bool neg = FALSE;
@ -32,6 +32,7 @@ I64 Str2I64(U8 *st, I64 radix=10, U8 **_end_ptr=NULL)
switch (ch) switch (ch)
{ {
case 'B': radix = 2; st++; break; case 'B': radix = 2; st++; break;
case 'O': radix = 8; st++; break;
case 'D': radix = 10; st++; break; case 'D': radix = 10; st++; break;
case 'X': radix = 16; st++; break; case 'X': radix = 16; st++; break;
} }
@ -86,13 +87,13 @@ to avoid this.
} }
if (!StrNCompare(src - 1, "inf", 3)) if (!StrNCompare(src - 1, "inf", 3))
{ {
d=ì; d=ì;
src += 3; src += 3;
goto a2f_end; goto a2f_end;
} }
if (*src == 'ì') if (*src == 'ì')
{ {
d = ì; d = ì;
src++; src++;
goto a2f_end; goto a2f_end;
} }