Commit | Line | Data |
---|---|---|
ffe53d21 NC |
1 | MODULE = XS::APItest PACKAGE = XS::APItest::numeric |
2 | ||
3 | void | |
4 | grok_number(number) | |
5 | SV *number | |
6 | PREINIT: | |
7 | STRLEN len; | |
8 | const char *pv = SvPV(number, len); | |
9 | UV value; | |
10 | int result; | |
11 | PPCODE: | |
12 | EXTEND(SP,2); | |
13 | result = grok_number(pv, len, &value); | |
14 | PUSHs(sv_2mortal(newSViv(result))); | |
15 | if (result & IS_NUMBER_IN_UV) | |
16 | PUSHs(sv_2mortal(newSVuv(value))); | |
e222d7e2 TC |
17 | |
18 | void | |
19 | grok_number_flags(number, flags) | |
20 | SV *number | |
21 | U32 flags | |
22 | PREINIT: | |
23 | STRLEN len; | |
24 | const char *pv = SvPV(number, len); | |
25 | UV value; | |
26 | int result; | |
27 | PPCODE: | |
28 | EXTEND(SP,2); | |
29 | result = grok_number_flags(pv, len, &value, flags); | |
30 | PUSHs(sv_2mortal(newSViv(result))); | |
31 | if (result & IS_NUMBER_IN_UV) | |
32 | PUSHs(sv_2mortal(newSVuv(value))); | |
dd52de80 JH |
33 | |
34 | void | |
22ff3130 | 35 | grok_atoUV(number, endsv) |
dd52de80 JH |
36 | SV *number |
37 | SV *endsv | |
38 | PREINIT: | |
39 | STRLEN len; | |
40 | const char *pv = SvPV(number, len); | |
22ff3130 HS |
41 | UV value = 0xdeadbeef; |
42 | bool result; | |
5d4a52b5 | 43 | const char* endptr = pv + len; |
dd52de80 JH |
44 | PPCODE: |
45 | EXTEND(SP,2); | |
46 | if (endsv == &PL_sv_undef) { | |
22ff3130 | 47 | result = grok_atoUV(pv, &value, NULL); |
dd52de80 | 48 | } else { |
22ff3130 | 49 | result = grok_atoUV(pv, &value, &endptr); |
dd52de80 | 50 | } |
22ff3130 HS |
51 | PUSHs(result ? &PL_sv_yes : &PL_sv_no); |
52 | PUSHs(sv_2mortal(newSVuv(value))); | |
dd52de80 JH |
53 | if (endsv == &PL_sv_undef) { |
54 | PUSHs(sv_2mortal(newSVpvn(NULL, 0))); | |
55 | } else { | |
75feedba JH |
56 | if (endptr) { |
57 | PUSHs(sv_2mortal(newSViv(endptr - pv))); | |
58 | } else { | |
59 | PUSHs(sv_2mortal(newSViv(0))); | |
60 | } | |
dd52de80 | 61 | } |