From: Jarkko Hietaniemi Date: Sat, 16 Feb 2002 16:14:19 +0000 (+0000) Subject: Retreat, retreat! (retract #14715 and #14716) X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=640ed10d7c25ae7621893c11f70653a184961f71;p=p5sagit%2Fp5-mst-13.2.git Retreat, retreat! (retract #14715 and #14716) p4raw-id: //depot/perl@14723 --- diff --git a/utf8.c b/utf8.c index 52768ad..71aaf8a 100644 --- a/utf8.c +++ b/utf8.c @@ -1287,34 +1287,23 @@ to the hash is by Perl_to_utf8_case(). UV Perl_to_utf8_case(pTHX_ U8 *p, U8* ustrp, STRLEN *lenp, SV **swashp, char *normal, char *special) { - UV uv0, uv1, uv2; - U8 tmpbuf[UTF8_MAXLEN_FOLD+1]; - STRLEN len; + UV uv; if (!*swashp) *swashp = swash_init("utf8", normal, &PL_sv_undef, 4, 0); - uv0 = utf8_to_uvchr(p, 0); - uv1 = NATIVE_TO_UNI(uv0); - uvuni_to_utf8(tmpbuf, uv1); - uv2 = swash_fetch(*swashp, tmpbuf, TRUE); - if (uv2) { - /* It was "normal" (single character mapping). */ - uv2 = UNI_TO_NATIVE(uv2); - len = uvchr_to_utf8(ustrp, uv2) - ustrp; - if (lenp) - *lenp = len; - - return uv2; - } - else { + uv = swash_fetch(*swashp, p, TRUE); + if (!uv) { HV *hv; SV *keysv; HE *he; + uv = utf8_to_uvchr(p, 0); + if ((hv = get_hv(special, FALSE)) && - (keysv = sv_2mortal(Perl_newSVpvf(aTHX_ "%04"UVXf, uv1))) && + (keysv = sv_2mortal(Perl_newSVpvf(aTHX_ "%04"UVXf, uv))) && (he = hv_fetch_ent(hv, keysv, FALSE, 0))) { SV *val = HeVAL(he); + STRLEN len; char *s = SvPV(val, len); if (len > 1) { @@ -1327,6 +1316,8 @@ Perl_to_utf8_case(pTHX_ U8 *p, U8* ustrp, STRLEN *lenp, SV **swashp, char *norma * mapping, since any characters in the low 256 * are in Unicode code points, not EBCDIC. * --jhi */ + + U8 tmpbuf[UTF8_MAXLEN_FOLD+1]; U8 *d = tmpbuf; U8 *t, *tend; @@ -1360,17 +1351,14 @@ Perl_to_utf8_case(pTHX_ U8 *p, U8* ustrp, STRLEN *lenp, SV **swashp, char *norma } if (lenp) *lenp = len; - return utf8_to_uvchr(ustrp, 0); } - - /* So it was not "special": just copy it. */ - len = uvchr_to_utf8(ustrp, uv0) - ustrp; - if (lenp) - *lenp = len; - - return uv0; + uv = NATIVE_TO_UNI(uv); } + if (lenp) + *lenp = UNISKIP(uv); + uvuni_to_utf8(ustrp, uv); + return uv; } /*