*/
UV
-Perl_to_utf8_case(pTHX_ U8 *p, U8* ustrp, STRLEN *lenp, SV **swashp,char *normal, char *special)
+Perl_to_utf8_case(pTHX_ U8 *p, U8* ustrp, STRLEN *lenp, SV **swashp, char *normal, char *special)
{
UV uv;
SV *val = HeVAL(he);
char *s = SvPV(val, *lenp);
U8 c = *(U8*)s;
+
if (*lenp > 1 || UNI_IS_INVARIANT(c))
Copy(s, ustrp, *lenp, U8);
else {
for (t = ustrp, tend = t + *lenp; t < tend; t += tlen) {
UV c = utf8_to_uvchr(t, &tlen);
- d = uvchr_to_utf8(d, UNI_TO_NATIVE(c));
+
+ if (tlen > 0)
+ d = uvchr_to_utf8(d, UNI_TO_NATIVE(c));
+ else
+ break;
}
*lenp = d - tmpbuf;
Copy(tmpbuf, ustrp, *lenp, U8);
}
/* isPRINT() is the locale-blind version. */
if (!ok && (flags & UNI_DISPLAY_ISPRINT) && isPRINT(u & 0xFF)) {
- Perl_sv_catpvf(aTHX_ dsv, "%c", u);
+ Perl_sv_catpvf(aTHX_ dsv, "%c", (char)(u & 0xFF));
ok = TRUE;
}
}
if ((e1 == 0 && f1 == 0) || (e2 == 0 && f2 == 0) || (f1 == 0 && f2 == 0))
return 1; /* mismatch; possible infinite loop or false positive */
+ if (!u1 || !u2)
+ natbuf[1] = 0; /* Need to terminate the buffer. */
+
while ((e1 == 0 || p1 < e1) &&
(f1 == 0 || p1 < f1) &&
(e2 == 0 || p2 < e2) &&