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 | |
35 | grok_atou(number, endsv) | |
36 | SV *number | |
37 | SV *endsv | |
38 | PREINIT: | |
39 | STRLEN len; | |
40 | const char *pv = SvPV(number, len); | |
41 | UV result; | |
42 | const char* endptr; | |
43 | PPCODE: | |
44 | EXTEND(SP,2); | |
45 | if (endsv == &PL_sv_undef) { | |
46 | result = grok_atou(pv, NULL); | |
47 | } else { | |
48 | result = grok_atou(pv, &endptr); | |
49 | } | |
50 | PUSHs(sv_2mortal(newSVuv(result))); | |
51 | if (endsv == &PL_sv_undef) { | |
52 | PUSHs(sv_2mortal(newSVpvn(NULL, 0))); | |
53 | } else { | |
75feedba JH |
54 | if (endptr) { |
55 | PUSHs(sv_2mortal(newSViv(endptr - pv))); | |
56 | } else { | |
57 | PUSHs(sv_2mortal(newSViv(0))); | |
58 | } | |
dd52de80 | 59 | } |