I32 ch;
/* Need to check this, otherwise 128..255 won't match */
- const UV c = utf8n_to_uvchr(s, send - s, &ulen, 0);
+ const UV c = utf8n_to_uvchr(s, send - s, &ulen, UTF8_ALLOW_DEFAULT);
if (c < 0x100 && (ch = tbl[c]) >= 0) {
matches++;
d = uvchr_to_utf8(d, ch);
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);
+ const UV c = utf8n_to_uvchr(s, send - s, &ulen, UTF8_ALLOW_DEFAULT);
if (c < 0x100) {
if (tbl[c] >= 0)
matches++;
UV pch = 0xfeedface;
while (s < send) {
STRLEN len;
- const UV comp = utf8_to_uvchr(s, &len);
+ const UV comp = utf8n_to_uvchr(s, send - s, &len,
+ UTF8_ALLOW_DEFAULT);
I32 ch;
if (comp > 0xff) {
else {
while (s < send) {
STRLEN len;
- const UV comp = utf8_to_uvchr(s, &len);
+ const UV comp = utf8n_to_uvchr(s, send - s, &len,
+ UTF8_ALLOW_DEFAULT);
I32 ch;
if (comp > 0xff) {
if (!complement) {
}
else {
STRLEN len;
- uv = utf8_to_uvuni(s, &len);
+ uv = utf8n_to_uvuni(s, send - s, &len, UTF8_ALLOW_DEFAULT);
if (uv != puv) {
Move(s, d, len, U8);
d += len;
(void)SvPOK_only(sv);
if (left_utf || right_utf) {
UV duc, luc, ruc;
- char * const dcsave = dc;
+ char *dcorig = dc;
+ char *dcsave = NULL;
STRLEN lulen = leftlen;
STRLEN rulen = rightlen;
STRLEN ulen;
dc = (char*)uvchr_to_utf8((U8*)dc, duc);
}
if (sv == left || sv == right)
- (void)sv_usepvn(sv, dcsave, needlen);
- SvCUR_set(sv, dc - dcsave);
+ (void)sv_usepvn(sv, dcorig, needlen);
+ SvCUR_set(sv, dc - dcorig);
break;
case OP_BIT_XOR:
while (lulen && rulen) {
dc = (char*)uvchr_to_utf8((U8*)dc, duc);
}
mop_up_utf:
+ if (rulen)
+ dcsave = savepvn(rc, rulen);
+ else if (lulen)
+ dcsave = savepvn(lc, lulen);
if (sv == left || sv == right)
- (void)sv_usepvn(sv, dcsave, needlen);
- SvCUR_set(sv, dc - dcsave);
+ (void)sv_usepvn(sv, dcorig, needlen); /* Uses Renew(). */
+ SvCUR_set(sv, dc - dcorig);
if (rulen)
- sv_catpvn(sv, rc, rulen);
+ sv_catpvn(sv, dcsave, rulen);
else if (lulen)
- sv_catpvn(sv, lc, lulen);
+ sv_catpvn(sv, dcsave, lulen);
else
*SvEND(sv) = '\0';
+ Safefree(dcsave);
break;
}
SvUTF8_on(sv);
if (LvTARG(TARG) != (SV*)keys) {
if (LvTARG(TARG))
SvREFCNT_dec(LvTARG(TARG));
- LvTARG(TARG) = SvREFCNT_inc(keys);
+ LvTARG(TARG) = SvREFCNT_inc_simple(keys);
}
PUSHs(TARG);
RETURN;