[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH] std: Added signed number support to atoi().
From: |
Jordan Yelloz |
Subject: |
[PATCH] std: Added signed number support to atoi(). |
Date: |
Sat, 4 Dec 2021 07:06:53 -0800 |
For example, it's now possible to get the number -10 as a result of calling
atoi("-10") or 239 as a result of calling atoi("+ef", 16).
2021-12-03 Jordan Yelloz <jordan@yelloz.me>
* libpoke/std.pk (atoi): Added code that extracts any single leading '+'
or '-', decides a polarity of the number to parse, and shifts over the
input string by 1 character if necessary before parsing the digits.
* testsuite/poke.std/std-test.pk: Added tests for new behaviors.
---
libpoke/std.pk | 23 +++++++++++++++++++++--
testsuite/poke.std/std-test.pk | 12 ++++++++++++
2 files changed, 33 insertions(+), 2 deletions(-)
diff --git a/libpoke/std.pk b/libpoke/std.pk
index bd38b7e1b527..178968c9bee5 100644
--- a/libpoke/std.pk
+++ b/libpoke/std.pk
@@ -90,18 +90,37 @@ fun atoi = (string s, int<32> b = 10) int<64>:
((c >= 'a') && (c <= 'f')) || ((c >= 'A') && (c <= 'F'));
}
+ fun signchar = (string str) int<8>:
+ {
+ if (str'length > 1) return str[0];
+ return 0;
+ }
+
+ fun signum = (uint<8> c) int<32>:
+ {
+ if (c == '-') return -1;
+ if (c == '+') return +1;
+ return 0;
+ }
+
if (!(b in [2, 8, 10, 16]))
raise E_inval;
+ var sign = signum(signchar(s));
+ if (sign == 0)
+ sign = +1;
+ else
+ s = s[1:];
+
for (c in s)
{
if (!valid(c, b))
- return result;
+ break;
result = result * b + htoi(c);
}
- return result;
+ return sign * result;
}
fun ltos = (int<64> i, uint<32> base = 10) string:
diff --git a/testsuite/poke.std/std-test.pk b/testsuite/poke.std/std-test.pk
index 5de5afb65589..8654c07ba496 100644
--- a/testsuite/poke.std/std-test.pk
+++ b/testsuite/poke.std/std-test.pk
@@ -24,19 +24,31 @@ var tests = [
func = lambda (string name) void:
{
assert (atoi ("0", 2) == 0L);
+ assert (atoi ("+0", 2) == 0L);
+ assert (atoi ("-0", 2) == 0L);
assert (atoi ("1", 2) == 1L);
+ assert (atoi ("+1", 2) == 1L);
+ assert (atoi ("-1", 2) == -1L);
assert (atoi ("111111111", 2) == 511L);
assert (atoi ("x", 2) == 0L);
+ assert (atoi ("+x", 2) == 0L);
+ assert (atoi ("-x", 2) == 0L);
assert (atoi ("1111x234", 2) == 15L);
assert (atoi ("1777", 8) == 1023L);
+ assert (atoi ("+1777", 8) == 1023L);
+ assert (atoi ("-1777", 8) == -1023L);
assert (atoi ("1777", 10) == 1777L);
assert (atoi ("1777") == 1777L);
+ assert (atoi ("+1777") == 1777L);
+ assert (atoi ("-1777") == -1777L);
assert (atoi ("fce2", 16) == 64738L);
assert (atoi ("bEeF", 16) == 48879L);
assert (atoi ("deadbeef", 16) == 0xdeadbeef);
+ assert (atoi ("+deadbeef", 16) == 0xdeadbeef);
+ assert (atoi ("-deadbeef", 16) == -0xdeadbeef);
},
},
PkTest {
--
2.34.1
- [PATCH] std: Added signed number support to atoi().,
Jordan Yelloz <=