Skip to content

Commit 43a41af

Browse files
committed
convert string_to_int to nqp
1 parent 1308785 commit 43a41af

File tree

1 file changed

+16
-31
lines changed

1 file changed

+16
-31
lines changed

src/HLL/Actions.pm

Lines changed: 16 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,22 @@
11
class HLL::Actions;
22

33
our sub string_to_int($src, $base) {
4-
Q:PIR {
5-
.local pmc src
6-
.local string src_s
7-
src = find_lex '$src'
8-
src_s = src
9-
.local int base, pos, eos, result
10-
$P0 = find_lex '$base'
11-
base = $P0
12-
pos = 0
13-
eos = length src_s
14-
result = 0
15-
str_loop:
16-
unless pos < eos goto str_done
17-
.local string char
18-
char = substr src_s, pos, 1
19-
if char == '_' goto str_next
20-
.local int digitval
21-
digitval = index "00112233445566778899AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz", char
22-
if digitval < 0 goto err_base
23-
digitval >>= 1
24-
if digitval >= base goto err_base
25-
result *= base
26-
result += digitval
27-
str_next:
28-
inc pos
29-
goto str_loop
30-
err_base:
31-
src.'panic'('Invalid radix conversion of "', char, '"')
32-
str_done:
33-
%r = box result
34-
};
4+
my $len := pir::length($src);
5+
my $i := 0;
6+
my $result := 0;
7+
8+
while $i < $len {
9+
my $char := pir::substr($src, $i, 1);
10+
next if $char eq '_';
11+
my $digitval := pir::index("00112233445566778899AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz", $char);
12+
$digitval := pir::set__ip($digitval / 2);
13+
if $digitval < 0 || $digitval >= $base {
14+
$src.panic("Invalid radix conversion of character '$char'");
15+
}
16+
$result := $base * $result + $digitval,
17+
$i := $i + 1;
18+
}
19+
$result;
3520
}
3621

3722
our sub ints_to_string($ints) {

0 commit comments

Comments
 (0)