X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=doop.c;h=be3e67410960586587586d1415560e8235464f32;hb=377729033bd4c3e2f6c0ac6b0d2bde9a83c5da6d;hp=0be09acfc90d8dcfd109b77ab8e2d44bcbfda82c;hpb=a863c7d16499251f020c5d26d232aa865fa0b197;p=p5sagit%2Fp5-mst-13.2.git diff --git a/doop.c b/doop.c index 0be09ac..be3e674 100644 --- a/doop.c +++ b/doop.c @@ -19,9 +19,7 @@ #endif I32 -do_trans(sv,arg) -SV *sv; -OP *arg; +do_trans(SV *sv, OP *arg) { dTHR; register short *tbl; @@ -33,7 +31,7 @@ OP *arg; register I32 squash = op->op_private & OPpTRANS_SQUASH; STRLEN len; - if (SvREADONLY(sv)) + if (SvREADONLY(sv) && !(op->op_private & OPpTRANS_COUNTONLY)) croak(no_modify); tbl = (short*)cPVOP->op_pv; s = (U8*)SvPV(sv, len); @@ -54,6 +52,14 @@ OP *arg; } s++; } + SvSETMAGIC(sv); + } + else if (op->op_private & OPpTRANS_COUNTONLY) { + while (s < send) { + if (tbl[*s] >= 0) + matches++; + s++; + } } else { d = s; @@ -76,17 +82,13 @@ OP *arg; matches += send - d; /* account for disappeared chars */ *d = '\0'; SvCUR_set(sv, d - (U8*)SvPVX(sv)); + SvSETMAGIC(sv); } - SvSETMAGIC(sv); return matches; } void -do_join(sv,del,mark,sp) -register SV *sv; -SV *del; -register SV **mark; -register SV **sp; +do_join(register SV *sv, SV *del, register SV **mark, register SV **sp) { SV **oldmark = mark; register I32 items = sp - mark; @@ -142,10 +144,7 @@ register SV **sp; } void -do_sprintf(sv,len,sarg) -SV *sv; -I32 len; -SV **sarg; +do_sprintf(SV *sv, I32 len, SV **sarg) { STRLEN patlen; char *pat = SvPV(*sarg, patlen); @@ -158,8 +157,7 @@ SV **sarg; } void -do_vecset(sv) -SV *sv; +do_vecset(SV *sv) { SV *targ = LvTARG(sv); register I32 offset; @@ -210,9 +208,7 @@ SV *sv; } void -do_chop(astr,sv) -register SV *astr; -register SV *sv; +do_chop(register SV *astr, register SV *sv) { STRLEN len; char *s; @@ -254,8 +250,7 @@ register SV *sv; } I32 -do_chomp(sv) -register SV *sv; +do_chomp(register SV *sv) { dTHR; register I32 count; @@ -329,11 +324,7 @@ register SV *sv; } void -do_vop(optype,sv,left,right) -I32 optype; -SV *sv; -SV *left; -SV *right; +do_vop(I32 optype, SV *sv, SV *left, SV *right) { dTHR; /* just for taint */ #ifdef LIBERAL @@ -447,10 +438,9 @@ SV *right; } OP * -do_kv(ARGS) -dARGS +do_kv(ARGSproto) { - dSP; + djSP; HV *hv = (HV*)POPs; register HE *entry; SV *tmpstr; @@ -532,3 +522,4 @@ dARGS } return NORMAL; } +