authorgravatar for kaihlavirta@gmail.comMikko Kaihlavirta <kaihlavirta@gmail.com> 2023-06-24 13:06:56+03:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-06-24 13:02:45-07:00
logfa6cea22bf9cd5ff6a9dd882166cf7e479acfd6c
tree7a9c35d8c3b6e20dd148f7937627e04071422d0f
parentea1d64dae4bb34d62e9cfddf7e3da493ed8063e9

fix parseInt failing when a correct base is given


1 files changed, 25 insertions(+), 20 deletions(-)

lib/std/fmt.zig+25-20
...@@ -1753,6 +1753,14 @@ test "parseInt" {...@@ -1753,6 +1753,14 @@ test "parseInt" {
1753 try std.testing.expect((try parseInt(u8, "255", 10)) == 255);1753 try std.testing.expect((try parseInt(u8, "255", 10)) == 255);
1754 try std.testing.expectError(error.Overflow, parseInt(u8, "256", 10));1754 try std.testing.expectError(error.Overflow, parseInt(u8, "256", 10));
17551755
1756 // Test different bases
1757 try std.testing.expect((try parseInt(i32, "0b10", 2)) == 0b10);
1758 try std.testing.expect((try parseInt(i32, "0o10", 8)) == 0o10);
1759 try std.testing.expect((try parseInt(i32, "0x10", 16)) == 0x10);
1760 try std.testing.expect((try parseInt(i32, "10", 2)) == 0b10);
1761 try std.testing.expect((try parseInt(i32, "10", 8)) == 0o10);
1762 try std.testing.expect((try parseInt(i32, "10", 16)) == 0x10);
1763
1756 // +0 and -0 should work for unsigned1764 // +0 and -0 should work for unsigned
1757 try std.testing.expect((try parseInt(u8, "-0", 10)) == 0);1765 try std.testing.expect((try parseInt(u8, "-0", 10)) == 0);
1758 try std.testing.expect((try parseInt(u8, "+0", 10)) == 0);1766 try std.testing.expect((try parseInt(u8, "+0", 10)) == 0);
...@@ -1804,28 +1812,25 @@ fn parseWithSign(...@@ -1804,28 +1812,25 @@ fn parseWithSign(
18041812
1805 var buf_base = base;1813 var buf_base = base;
1806 var buf_start = buf;1814 var buf_start = buf;
1807 if (base == 0) {1815
1808 // Treat is as a decimal number by default.1816 if (buf.len > 2 and buf[0] == '0') {
1809 buf_base = 10;1817 switch (std.ascii.toLower(buf[1])) {
1810 // Detect the base by looking at buf prefix.1818 'b' => {
1811 if (buf.len > 2 and buf[0] == '0') {1819 if (base == 0) buf_base = 2;
1812 switch (std.ascii.toLower(buf[1])) {1820 buf_start = buf[2..];
1813 'b' => {1821 },
1814 buf_base = 2;1822 'o' => {
1815 buf_start = buf[2..];1823 if (base == 0) buf_base = 8;
1816 },1824 buf_start = buf[2..];
1817 'o' => {1825 },
1818 buf_base = 8;1826 'x' => {
1819 buf_start = buf[2..];1827 if (base == 0) buf_base = 16;
1820 },1828 buf_start = buf[2..];
1821 'x' => {1829 },
1822 buf_base = 16;1830 else => {},
1823 buf_start = buf[2..];
1824 },
1825 else => {},
1826 }
1827 }1831 }
1828 }1832 }
1833 if (buf_base == 0) buf_base = 10;
18291834
1830 const add = switch (sign) {1835 const add = switch (sign) {
1831 .pos => math.add,1836 .pos => math.add,