case FF_LITERAL:
arg = *fpc++;
- if (targ_is_utf8 && !SvUTF8(formsv)) {
+ item_is_utf8 = targ_is_utf8 ? !!DO_UTF8(formsv) : !!SvUTF8(formsv);
+ if (targ_is_utf8 && !item_is_utf8) {
char *s;
SvCUR_set(PL_formtarget, t - SvPVX_const(PL_formtarget));
*t = '\0';
f += arg;
break;
}
- if (!targ_is_utf8 && DO_UTF8(formsv)) {
+ if (!targ_is_utf8 && item_is_utf8) {
SvCUR_set(PL_formtarget, t - SvPVX_const(PL_formtarget));
*t = '\0';
- sv_utf8_upgrade_flags_grow(PL_formtarget, SV_GMAGIC, fudge + 1);
+ sv_utf8_upgrade_flags_grow(PL_formtarget, 0, fudge + 1);
t = SvEND(PL_formtarget);
targ_is_utf8 = TRUE;
}
if (!targ_is_utf8) {
SvCUR_set(PL_formtarget, t - SvPVX_const(PL_formtarget));
*t = '\0';
- sv_utf8_upgrade_flags_grow(PL_formtarget, SV_GMAGIC,
+ sv_utf8_upgrade_flags_grow(PL_formtarget, 0,
fudge + 1);
t = SvEND(PL_formtarget);
targ_is_utf8 = TRUE;
const bool oneline = fpc[-1] == FF_LINESNGL;
const char *s = item = SvPV_const(sv, len);
const char *const send = s + len;
- U8 *tmp = NULL;
item_is_utf8 = DO_UTF8(sv);
- itemsize = len;
- if (!itemsize)
+ if (!len)
break;
gotsome = TRUE;
- chophere = s + itemsize;
+ chophere = s + len;
source = (U8 *) s;
to_copy = len;
while (s < send) {
break;
} else {
if (s == send) {
- itemsize--;
to_copy--;
} else
lines++;
}
}
}
+ }
+
+ {
+ U8 *tmp = NULL;
if (targ_is_utf8 && !item_is_utf8) {
source = tmp = bytes_to_utf8(source, &to_copy);
SvCUR_set(PL_formtarget,
Copy(source, t, to_copy, char);
t += to_copy;
SvCUR_set(PL_formtarget, SvCUR(PL_formtarget) + to_copy);
- if (item_is_utf8) {
- if (SvGMAGICAL(sv)) {
- /* Mustn't call sv_pos_b2u() as it does a second
- mg_get(). Is this a bug? Do we need a _flags()
- variant? */
- itemsize = utf8_length(source, source + itemsize);
- } else {
- sv_pos_b2u(sv, &itemsize);
- }
- assert(!tmp);
- } else if (tmp) {
+ if (tmp)
Safefree(tmp);
- }
break;
}