1MODULE = XS::APItest		PACKAGE = XS::APItest::numeric
2
3void
4grok_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)));
17
18void
19grok_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)));
33
34void
35grok_atoUV(number, endsv)
36	SV *number
37	SV *endsv
38    PREINIT:
39	STRLEN len;
40	const char *pv = SvPV(number, len);
41	UV value = 0xdeadbeef;
42	bool result;
43	const char* endptr = pv + len;
44    PPCODE:
45	EXTEND(SP,2);
46	if (endsv == &PL_sv_undef) {
47          result = grok_atoUV(pv, &value, NULL);
48        } else {
49          result = grok_atoUV(pv, &value, &endptr);
50        }
51	PUSHs(result ? &PL_sv_yes : &PL_sv_no);
52	PUSHs(sv_2mortal(newSVuv(value)));
53	if (endsv == &PL_sv_undef) {
54          PUSHs(sv_2mortal(newSVpvn(NULL, 0)));
55	} else {
56	  if (endptr) {
57	    PUSHs(sv_2mortal(newSViv(endptr - pv)));
58	  } else {
59	    PUSHs(sv_2mortal(newSViv(0)));
60	  }
61	}
62
63void
64my_strtod(s)
65        SV *s
66    PREINIT:
67        SV *sv = newSVsv(s);
68        char *endptr = NULL;
69        NV nv;
70    PPCODE:
71        nv = my_strtod(SvPV_force_nolen(sv), &endptr);
72        PUSHs(sv_2mortal(newSVnv(nv)));
73        if (endptr) {
74            sv_chop(sv, endptr);
75            PUSHs(sv_2mortal(sv));
76        }
77