c3c
c3c copied to clipboard
`io::printf*` prints int128/uint128 incorrectly
import std::io;
fn void main()
{
ushort u1 = 1;
uint128 u128 = 2;
long i1 = 1;
int128 i128 = 2;
io::printfln("$$PLATFORM_I128_SUPPORTED = %s", $$PLATFORM_I128_SUPPORTED);
io::printfln("u1 = %s", u1);
io::printfln("u128 = %s", u128);
io::printfln("i1 = %s", i1);
io::printfln("i128 = %s", i128);
}
$$PLATFORM_I128_SUPPORTED = false
u1 = 1
u128 = 0
i1 = 1
i128 = 0
Quick dirty(?) fix:
diff --git a/lib/std/io_printf.c3 b/lib/std/io_printf.c3
index bc0b642..757d390 100644
--- a/lib/std/io_printf.c3
+++ b/lib/std/io_printf.c3
@@ -334,7 +334,7 @@ private fn void! ntoa_format(PrintParam* param, char[] buf, usize len, bool nega
return param.out_reverse(buf[:len]);
}
-$if (env::I128_SUPPORT):
+$if (!env::I128_SUPPORT):
define NtoaType = uint128;
$else:
define NtoaType = ulong;
I wonder whether this works. I deliberately waited to fix full i128 support.
I wonder whether this works.
Yes, I checked with all numeric types (for linux-x64).
Wait, your change is that you turn on the I128 when it isn't supported?
Yes.
import std::io;
import libc;
fn void main()
{
ushort u1 = 1;
uint128 u128 = 2;
long i1 = 1;
int128 i128 = -2;
float f1 = 1.23456789;
double d1 = -0.123456789;
io::printfln("$$PLATFORM_I128_SUPPORTED = %s", $$PLATFORM_I128_SUPPORTED);
io::printfln("u1 = %s", u1);
io::printfln("u128 = %s", u128);
io::printfln("uint128.min = %s", uint128.min);
io::printfln("uint128.max = %s", uint128.max);
io::printfln("i1 = %s", i1);
io::printfln("i128 = %s", i128);
io::printfln("int128.min = %s", int128.min);
io::printfln("int128.max = %s", int128.max);
io::printfln("int.min = %s", int.min);
io::printfln("int.max = %s", int.max);
io::printfln("float.min = %s", float.min);
io::printfln("float.max = %s", float.max);
}
$$PLATFORM_I128_SUPPORTED = false
u1 = 1
u128 = 2
uint128.min = 0
uint128.max = 340282366920938463463374607431768211455
i1 = 1
i128 = -2
int128.min = -170141183460469231731687303715884105728
int128.max = 170141183460469231731687303715884105727
int.min = -340282366920938463463374607429620727808
int.max = 2147483647
float.min = 0.000000
float.max = 3.402823e+38
Should work fine now.
Please close if it works for you @data-man
Thank you!