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))); 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))); 33 34 void 35 grok_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 63 void 64 my_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