File tree Expand file tree Collapse file tree 1 file changed +16
-31
lines changed Expand file tree Collapse file tree 1 file changed +16
-31
lines changed Original file line number Diff line number Diff line change 1
1
class HLL::Actions ;
2
2
3
3
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 ;
35
20
}
36
21
37
22
our sub ints_to_string ($ ints ) {
You can’t perform that action at this time.
0 commit comments