Acme-StringFormat
view release on metacpan or search on metacpan
StringFormat.xs view on Meta::CPAN
if(*p != '%'){
break;
}
}
p++;
}
if(p == end && ckWARN(WARN_PRINTF)){
Perl_warner(aTHX_ packWARN(WARN_PRINTF), "Arguments mismatch for %s", HINT_KEY);
}
/* end of formatter */
while(p < end){
if(*p == '%'){
if(*(p+1) == '%'){
p++;
}
else{
break;
}
}
p++;
}
#if 0
printf("#%s\n#", start);
{
int i;
for(i = 0; i < (p - start); i++){
printf(" ");
}
printf("^\n");
}
#endif
sv_vsetpvfn(TARG, start, (STRLEN)(p - start), NULL, &rhs, 1, &maybe_tainted);
if(end != p) sv_catpvn(TARG, p, (STRLEN)(end - p));
if(SvTAINTED(lhs)) SvTAINTED_on(TARG);
if(SvUTF8(lhs)) SvUTF8_on(TARG);
if(opASSIGN){
sv_setsv(lhs, TARG);
TARG = lhs;
}
SP--;
SETs(TARG);
RETURN;
}
return PL_ppaddr[OP_MODULO](aTHX);
}
static OP*
sf_ck_modulo(pTHX_ OP* o){
HE* he = hv_fetch_ent(GvHV(PL_hintgv), sf_hint_key, FALSE, sf_hash);
if( he && SvTRUE(HeVAL(he)) ){
o->op_flags |= OPf_SPECIAL;
o->op_ppaddr = sf_pp_modulo;
}
return sf_old_ck_modulo(aTHX_ o);
}
MODULE = Acme::StringFormat PACKAGE = Acme::StringFormat
PROTOTYPES: DISABLE
BOOT:
sf_hint_key = newSVpvs(HINT_KEY);
PERL_HASH(sf_hash, HINT_KEY, sizeof(HINT_KEY)-1);
SV*
_enter(...)
CODE:
PERL_UNUSED_ARG(items);
if(sf_depth == 0){
sf_old_ck_modulo = PL_check[OP_MODULO];
PL_check[OP_MODULO] = sf_ck_modulo;
}
sf_depth++;
RETVAL = newSV(0);
sv_setref_uv(RETVAL, HINT_KEY, sf_depth);
OUTPUT:
RETVAL
void
DESTROY(...)
CODE:
PERL_UNUSED_ARG(items);
if(sf_depth == 0){
Perl_croak(aTHX_ "panic: %s scope underflow", HINT_KEY);
}
if(sf_depth == 1){
PL_check[OP_MODULO] = sf_old_ck_modulo;
}
sf_depth--;
( run in 1.412 second using v1.01-cache-2.11-cpan-39bf76dae61 )