X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=doop.c;h=4e5866e9c443cb6392cbfc590072ddad36f25c26;hb=47aa779ee4c1a50e927b23367536ef9b5d706729;hp=c6270e44f4fb21152a745c587d56dd85853ece1e;hpb=4757a2438b123364ad98fc0cb4698e56331f713b;p=p5sagit%2Fp5-mst-13.2.git diff --git a/doop.c b/doop.c index c6270e4..4e5866e 100644 --- a/doop.c +++ b/doop.c @@ -1,6 +1,6 @@ /* doop.c * - * Copyright (c) 1991-1997, Larry Wall + * Copyright (c) 1991-1999, Larry Wall * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. @@ -18,7 +18,20 @@ #include #endif -static I32 +#ifndef PERL_OBJECT +static I32 do_trans_CC_simple _((SV *sv)); +static I32 do_trans_CC_count _((SV *sv)); +static I32 do_trans_CC_complex _((SV *sv)); +static I32 do_trans_UU_simple _((SV *sv)); +static I32 do_trans_UU_count _((SV *sv)); +static I32 do_trans_UU_complex _((SV *sv)); +static I32 do_trans_UC_simple _((SV *sv)); +static I32 do_trans_CU_simple _((SV *sv)); +static I32 do_trans_UC_trivial _((SV *sv)); +static I32 do_trans_CU_trivial _((SV *sv)); +#endif + +STATIC I32 do_trans_CC_simple(SV *sv) { dTHR; @@ -48,7 +61,7 @@ do_trans_CC_simple(SV *sv) return matches; } -static I32 +STATIC I32 do_trans_CC_count(SV *sv) { dTHR; @@ -74,7 +87,7 @@ do_trans_CC_count(SV *sv) return matches; } -static I32 +STATIC I32 do_trans_CC_complex(SV *sv) { dTHR; @@ -131,7 +144,7 @@ do_trans_CC_complex(SV *sv) return matches; } -static I32 +STATIC I32 do_trans_UU_simple(SV *sv) { dTHR; @@ -183,7 +196,7 @@ do_trans_UU_simple(SV *sv) return matches; } -static I32 +STATIC I32 do_trans_UU_count(SV *sv) { dTHR; @@ -202,16 +215,15 @@ do_trans_UU_count(SV *sv) send = s + len; while (s < send) { - if ((uv = swash_fetch(rv, s)) < none) { - s += UTF8SKIP(s); + if ((uv = swash_fetch(rv, s)) < none) matches++; - } + s += UTF8SKIP(s); } return matches; } -static I32 +STATIC I32 do_trans_UC_simple(SV *sv) { dTHR; @@ -264,7 +276,7 @@ do_trans_UC_simple(SV *sv) return matches; } -static I32 +STATIC I32 do_trans_CU_simple(SV *sv) { dTHR; @@ -327,7 +339,7 @@ do_trans_CU_simple(SV *sv) /* utf-8 to latin-1 */ -static I32 +STATIC I32 do_trans_UC_trivial(SV *sv) { dTHR; @@ -359,7 +371,7 @@ do_trans_UC_trivial(SV *sv) /* latin-1 to utf-8 */ -static I32 +STATIC I32 do_trans_CU_trivial(SV *sv) { dTHR; @@ -393,7 +405,7 @@ do_trans_CU_trivial(SV *sv) return matches; } -static I32 +STATIC I32 do_trans_UU_complex(SV *sv) { dTHR; @@ -581,10 +593,11 @@ do_trans_UU_complex(SV *sv) I32 do_trans(SV *sv) { + dTHR; STRLEN len; if (SvREADONLY(sv) && !(PL_op->op_private & OPpTRANS_IDENTICAL)) - croak(no_modify); + croak(PL_no_modify); (void)SvPV(sv, len); if (!len) @@ -640,8 +653,7 @@ do_join(register SV *sv, SV *del, register SV **mark, register SV **sp) mark++; len = (items > 0 ? (delimlen * (items - 1) ) : 0); - if (SvTYPE(sv) < SVt_PV) - sv_upgrade(sv, SVt_PV); + (void)SvUPGRADE(sv, SVt_PV); if (SvLEN(sv) < len + items) { /* current length is way too short */ while (items-- > 0) { if (*mark && !SvGMAGICAL(*mark) && SvOK(*mark)) { @@ -767,7 +779,7 @@ do_chop(register SV *astr, register SV *sv) } return; } - if (SvTYPE(sv) == SVt_PVHV) { + else if (SvTYPE(sv) == SVt_PVHV) { HV* hv = (HV*)sv; HE* entry; (void)hv_iterinit(hv); @@ -776,6 +788,8 @@ do_chop(register SV *astr, register SV *sv) do_chop(astr,hv_iterval(hv,entry)); return; } + else if (SvREADONLY(sv)) + croak(PL_no_modify); s = SvPV(sv, len); if (len && !SvPOK(sv)) s = SvPV_force(sv, len); @@ -819,6 +833,8 @@ do_chomp(register SV *sv) if (RsSNARF(PL_rs)) return 0; + if (RsRECORD(PL_rs)) + return 0; count = 0; if (SvTYPE(sv) == SVt_PVAV) { register I32 i; @@ -832,7 +848,7 @@ do_chomp(register SV *sv) } return count; } - if (SvTYPE(sv) == SVt_PVHV) { + else if (SvTYPE(sv) == SVt_PVHV) { HV* hv = (HV*)sv; HE* entry; (void)hv_iterinit(hv); @@ -841,6 +857,8 @@ do_chomp(register SV *sv) count += do_chomp(hv_iterval(hv,entry)); return count; } + else if (SvREADONLY(sv)) + croak(PL_no_modify); s = SvPV(sv, len); if (len && !SvPOKp(sv)) s = SvPV_force(sv, len); @@ -909,7 +927,8 @@ do_vop(I32 optype, SV *sv, SV *left, SV *right) len = leftlen < rightlen ? leftlen : rightlen; lensave = len; if (SvOK(sv) || SvTYPE(sv) > SVt_PVMG) { - dc = SvPV_force(sv, PL_na); + STRLEN n_a; + dc = SvPV_force(sv, n_a); if (SvCUR(sv) < len) { dc = SvGROW(sv, len + 1); (void)memzero(dc + SvCUR(sv), len - SvCUR(sv) + 1); @@ -1048,7 +1067,7 @@ do_kv(ARGSproto) RETURN; } - if (!SvRMAGICAL(keys) || !mg_find((SV*)keys,'P')) + if (! SvTIED_mg((SV*)keys, 'P')) i = HvKEYS(keys); else { i = 0; @@ -1067,10 +1086,9 @@ do_kv(ARGSproto) if (dokeys) XPUSHs(hv_iterkeysv(entry)); /* won't clobber stack_sp */ if (dovalues) { - tmpstr = sv_newmortal(); PUTBACK; - sv_setsv(tmpstr,realhv ? - hv_iterval(hv,entry) : avhv_iterval((AV*)hv,entry)); + tmpstr = realhv ? + hv_iterval(hv,entry) : avhv_iterval((AV*)hv,entry); DEBUG_H(sv_setpvf(tmpstr, "%lu%%%d=%lu", (unsigned long)HeHASH(entry), HvMAX(keys)+1,