X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=doop.c;h=1d81ca07f63f223144db79c007b3cbc6f4a3cff0;hb=fc2007d4a9b17b1ac334e18213f5b0840803b58d;hp=87338168904da2dd5de04db24dcd32a041081910;hpb=0bcc34c2b0b0cb62c0df3d5e562b779fb96595ba;p=p5sagit%2Fp5-mst-13.2.git diff --git a/doop.c b/doop.c index 8733816..1d81ca0 100644 --- a/doop.c +++ b/doop.c @@ -1,7 +1,7 @@ /* doop.c * * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, - * 2000, 2001, 2002, 2004, 2005, by Larry Wall and others + * 2000, 2001, 2002, 2004, 2005, 2006, by Larry Wall and others * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. @@ -28,6 +28,7 @@ STATIC I32 S_do_trans_simple(pTHX_ SV *sv) { + dVAR; U8 *s; U8 *d; const U8 *send; @@ -96,11 +97,11 @@ S_do_trans_simple(pTHX_ SV *sv) STATIC I32 S_do_trans_count(pTHX_ SV *sv) { + dVAR; const U8 *s; const U8 *send; I32 matches = 0; STRLEN len; - const I32 complement = PL_op->op_private & OPpTRANS_COMPLEMENT; const short * const tbl = (short*)cPVOP->op_pv; if (!tbl) @@ -114,7 +115,8 @@ S_do_trans_count(pTHX_ SV *sv) if (tbl[*s++] >= 0) matches++; } - else + else { + const I32 complement = PL_op->op_private & OPpTRANS_COMPLEMENT; while (s < send) { STRLEN ulen; const UV c = utf8n_to_uvchr(s, send - s, &ulen, 0); @@ -125,6 +127,7 @@ S_do_trans_count(pTHX_ SV *sv) matches++; s += ulen; } + } return matches; } @@ -132,15 +135,13 @@ S_do_trans_count(pTHX_ SV *sv) STATIC I32 S_do_trans_complex(pTHX_ SV *sv) { + dVAR; U8 *s; U8 *send; U8 *d; U8 *dstart; I32 isutf8; I32 matches = 0; - const I32 grows = PL_op->op_private & OPpTRANS_GROWS; - const I32 complement = PL_op->op_private & OPpTRANS_COMPLEMENT; - const I32 del = PL_op->op_private & OPpTRANS_DELETE; STRLEN len, rlen = 0; const short * const tbl = (short*)cPVOP->op_pv; @@ -188,6 +189,10 @@ S_do_trans_complex(pTHX_ SV *sv) SvCUR_set(sv, d - dstart); } else { /* isutf8 */ + const I32 complement = PL_op->op_private & OPpTRANS_COMPLEMENT; + const I32 grows = PL_op->op_private & OPpTRANS_GROWS; + const I32 del = PL_op->op_private & OPpTRANS_DELETE; + if (grows) Newx(d, len*2+1, U8); else @@ -296,6 +301,7 @@ S_do_trans_complex(pTHX_ SV *sv) STATIC I32 S_do_trans_simple_utf8(pTHX_ SV *sv) { + dVAR; U8 *s; U8 *send; U8 *d; @@ -307,7 +313,7 @@ S_do_trans_simple_utf8(pTHX_ SV *sv) SV* const rv = (SV*)cSVOP->op_sv; HV* const hv = (HV*)SvRV(rv); - SV* const * svp = hv_fetch(hv, "NONE", 4, FALSE); + SV* const * svp = hv_fetchs(hv, "NONE", FALSE); const UV none = svp ? SvUV(*svp) : 0x7fffffff; const UV extra = none + 1; UV final = 0; @@ -321,16 +327,17 @@ S_do_trans_simple_utf8(pTHX_ SV *sv) const U8 * const e = s + len; while (t < e) { const U8 ch = *t++; - if ((hibit = !NATIVE_IS_INVARIANT(ch))) + hibit = !NATIVE_IS_INVARIANT(ch); + if (hibit) { + s = bytes_to_utf8(s, &len); break; + } } - if (hibit) - s = bytes_to_utf8(s, &len); } send = s + len; start = s; - svp = hv_fetch(hv, "FINAL", 5, FALSE); + svp = hv_fetchs(hv, "FINAL", FALSE); if (svp) final = SvUV(*svp); @@ -395,14 +402,16 @@ S_do_trans_simple_utf8(pTHX_ SV *sv) STATIC I32 S_do_trans_count_utf8(pTHX_ SV *sv) { + dVAR; const U8 *s; - const U8 *start = 0, *send; + const U8 *start = NULL; + const U8 *send; I32 matches = 0; STRLEN len; SV* const rv = (SV*)cSVOP->op_sv; HV* const hv = (HV*)SvRV(rv); - SV* const * const svp = hv_fetch(hv, "NONE", 4, FALSE); + SV* const * const svp = hv_fetchs(hv, "NONE", FALSE); const UV none = svp ? SvUV(*svp) : 0x7fffffff; const UV extra = none + 1; U8 hibit = 0; @@ -413,11 +422,12 @@ S_do_trans_count_utf8(pTHX_ SV *sv) const U8 * const e = s + len; while (t < e) { const U8 ch = *t++; - if ((hibit = !NATIVE_IS_INVARIANT(ch))) + hibit = !NATIVE_IS_INVARIANT(ch); + if (hibit) { + start = s = bytes_to_utf8(s, &len); break; + } } - if (hibit) - start = s = bytes_to_utf8(s, &len); } send = s + len; @@ -436,6 +446,7 @@ S_do_trans_count_utf8(pTHX_ SV *sv) STATIC I32 S_do_trans_complex_utf8(pTHX_ SV *sv) { + dVAR; U8 *start, *send; U8 *d; I32 matches = 0; @@ -444,7 +455,7 @@ S_do_trans_complex_utf8(pTHX_ SV *sv) const I32 grows = PL_op->op_private & OPpTRANS_GROWS; SV * const rv = (SV*)cSVOP->op_sv; HV * const hv = (HV*)SvRV(rv); - SV * const *svp = hv_fetch(hv, "NONE", 4, FALSE); + SV * const *svp = hv_fetchs(hv, "NONE", FALSE); const UV none = svp ? SvUV(*svp) : 0x7fffffff; const UV extra = none + 1; UV final = 0; @@ -460,16 +471,17 @@ S_do_trans_complex_utf8(pTHX_ SV *sv) const U8 * const e = s + len; while (t < e) { const U8 ch = *t++; - if ((hibit = !NATIVE_IS_INVARIANT(ch))) + hibit = !NATIVE_IS_INVARIANT(ch); + if (hibit) { + s = bytes_to_utf8(s, &len); break; + } } - if (hibit) - s = bytes_to_utf8(s, &len); } send = s + len; start = s; - svp = hv_fetch(hv, "FINAL", 5, FALSE); + svp = hv_fetchs(hv, "FINAL", FALSE); if (svp) { final = SvUV(*svp); havefinal = TRUE; @@ -596,6 +608,7 @@ S_do_trans_complex_utf8(pTHX_ SV *sv) I32 Perl_do_trans(pTHX_ SV *sv) { + dVAR; STRLEN len; const I32 hasutf = (PL_op->op_private & (OPpTRANS_FROM_UTF|OPpTRANS_TO_UTF)); @@ -644,6 +657,7 @@ Perl_do_trans(pTHX_ SV *sv) void Perl_do_join(pTHX_ register SV *sv, SV *del, register SV **mark, register SV **sp) { + dVAR; SV ** const oldmark = mark; register I32 items = sp - mark; register STRLEN len; @@ -700,6 +714,7 @@ Perl_do_join(pTHX_ register SV *sv, SV *del, register SV **mark, register SV **s void Perl_do_sprintf(pTHX_ SV *sv, I32 len, SV **sarg) { + dVAR; STRLEN patlen; const char * const pat = SvPV_const(*sarg, patlen); bool do_taint = FALSE; @@ -717,6 +732,7 @@ Perl_do_sprintf(pTHX_ SV *sv, I32 len, SV **sarg) UV Perl_do_vecget(pTHX_ SV *sv, I32 offset, I32 size) { + dVAR; STRLEN srclen, len; const unsigned char *s = (const unsigned char *) SvPV_const(sv, srclen); UV retnum = 0; @@ -855,6 +871,7 @@ Perl_do_vecget(pTHX_ SV *sv, I32 offset, I32 size) void Perl_do_vecset(pTHX_ SV *sv) { + dVAR; register I32 offset; register I32 size; register unsigned char *s; @@ -936,6 +953,7 @@ Perl_do_vecset(pTHX_ SV *sv) void Perl_do_chop(pTHX_ register SV *astr, register SV *sv) { + dVAR; STRLEN len; char *s; @@ -967,6 +985,13 @@ Perl_do_chop(pTHX_ register SV *astr, register SV *sv) if (SvREADONLY(sv)) Perl_croak(aTHX_ PL_no_modify); } + + if (PL_encoding && !SvUTF8(sv)) { + /* like in do_chomp(), utf8-ize the sv as a side-effect + * if we're using encoding. */ + sv_recode_to_utf8(sv, PL_encoding); + } + s = SvPV(sv, len); if (len && !SvPOK(sv)) s = SvPV_force(sv, len); @@ -1004,6 +1029,7 @@ Perl_do_chop(pTHX_ register SV *astr, register SV *sv) I32 Perl_do_chomp(pTHX_ register SV *sv) { + dVAR; register I32 count; STRLEN len; char *s; @@ -1139,6 +1165,7 @@ Perl_do_chomp(pTHX_ register SV *sv) void Perl_do_vop(pTHX_ I32 optype, SV *sv, SV *left, SV *right) { + dVAR; #ifdef LIBERAL register long *dl; register long *ll; @@ -1174,7 +1201,7 @@ Perl_do_vop(pTHX_ I32 optype, SV *sv, SV *left, SV *right) } else if (SvOK(sv) || SvTYPE(sv) > SVt_PVMG) { dc = SvPV_force_nomg_nolen(sv); - if (SvCUR(sv) < (STRLEN)len) { + if (SvLEN(sv) < (STRLEN)(len + 1)) { dc = SvGROW(sv, (STRLEN)(len + 1)); (void)memzero(dc + SvCUR(sv), len - SvCUR(sv) + 1); } @@ -1303,6 +1330,7 @@ Perl_do_vop(pTHX_ I32 optype, SV *sv, SV *left, SV *right) case OP_BIT_AND: while (len--) *dc++ = *lc++ & *rc++; + *dc = '\0'; break; case OP_BIT_XOR: while (len--) @@ -1329,6 +1357,7 @@ finish: OP * Perl_do_kv(pTHX) { + dVAR; dSP; HV * const hv = (HV*)POPs; HV *keys;