1void 2constant(sv) 3 PREINIT: 4#ifdef dXSTARG 5 dXSTARG; /* Faster if we have it. */ 6#else 7 dTARGET; 8#endif 9 STRLEN len; 10 int type; 11 /* IV iv; Uncomment this if you need to return IVs */ 12 /* NV nv; Uncomment this if you need to return NVs */ 13 /* const char *pv; Uncomment this if you need to return PVs */ 14 INPUT: 15 SV * sv; 16 const char * s = SvPV(sv, len); 17 PPCODE: 18 type = constant(aTHX_ s, len); 19 /* Return 1 or 2 items. First is error message, or undef if no error. 20 Second, if present, is found value */ 21 switch (type) { 22 case PERL_constant_NOTFOUND: 23 sv = 24 sv_2mortal(newSVpvf("%s is not a valid Router::R3 macro", s)); 25 PUSHs(sv); 26 break; 27 case PERL_constant_NOTDEF: 28 sv = sv_2mortal(newSVpvf( 29 "Your vendor has not defined Router::R3 macro %s, used", 30 s)); 31 PUSHs(sv); 32 break; 33 /* Uncomment this if you need to return IVs 34 case PERL_constant_ISIV: 35 EXTEND(SP, 1); 36 PUSHs(&PL_sv_undef); 37 PUSHi(iv); 38 break; */ 39 /* Uncomment this if you need to return NOs 40 case PERL_constant_ISNO: 41 EXTEND(SP, 1); 42 PUSHs(&PL_sv_undef); 43 PUSHs(&PL_sv_no); 44 break; */ 45 /* Uncomment this if you need to return NVs 46 case PERL_constant_ISNV: 47 EXTEND(SP, 1); 48 PUSHs(&PL_sv_undef); 49 PUSHn(nv); 50 break; */ 51 /* Uncomment this if you need to return PVs 52 case PERL_constant_ISPV: 53 EXTEND(SP, 1); 54 PUSHs(&PL_sv_undef); 55 PUSHp(pv, strlen(pv)); 56 break; */ 57 /* Uncomment this if you need to return PVNs 58 case PERL_constant_ISPVN: 59 EXTEND(SP, 1); 60 PUSHs(&PL_sv_undef); 61 PUSHp(pv, iv); 62 break; */ 63 /* Uncomment this if you need to return SVs 64 case PERL_constant_ISSV: 65 EXTEND(SP, 1); 66 PUSHs(&PL_sv_undef); 67 PUSHs(sv); 68 break; */ 69 /* Uncomment this if you need to return UNDEFs 70 case PERL_constant_ISUNDEF: 71 break; */ 72 /* Uncomment this if you need to return UVs 73 case PERL_constant_ISUV: 74 EXTEND(SP, 1); 75 PUSHs(&PL_sv_undef); 76 PUSHu((UV)iv); 77 break; */ 78 /* Uncomment this if you need to return YESs 79 case PERL_constant_ISYES: 80 EXTEND(SP, 1); 81 PUSHs(&PL_sv_undef); 82 PUSHs(&PL_sv_yes); 83 break; */ 84 default: 85 sv = sv_2mortal(newSVpvf( 86 "Unexpected return type %d while processing Router::R3 macro %s, used", 87 type, s)); 88 PUSHs(sv); 89 } 90