further speeding up of is_utf8_string()
[p5sagit/p5-mst-13.2.git] / utf8.c
1 /*    utf8.c
2  *
3  *    Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005 by Larry Wall and
4  *    others
5  *
6  *    You may distribute under the terms of either the GNU General Public
7  *    License or the Artistic License, as specified in the README file.
8  *
9  */
10
11 /*
12  * 'What a fix!' said Sam. 'That's the one place in all the lands we've ever
13  * heard of that we don't want to see any closer; and that's the one place
14  * we're trying to get to!  And that's just where we can't get, nohow.'
15  *
16  * 'Well do I understand your speech,' he answered in the same language;
17  * 'yet few strangers do so.  Why then do you not speak in the Common Tongue,
18  * as is the custom in the West, if you wish to be answered?'
19  *
20  * ...the travellers perceived that the floor was paved with stones of many
21  * hues; branching runes and strange devices intertwined beneath their feet.
22  */
23
24 #include "EXTERN.h"
25 #define PERL_IN_UTF8_C
26 #include "perl.h"
27
28 static const char unees[] =
29     "Malformed UTF-8 character (unexpected end of string)";
30
31 /* 
32 =head1 Unicode Support
33
34 This file contains various utility functions for manipulating UTF8-encoded
35 strings. For the uninitiated, this is a method of representing arbitrary
36 Unicode characters as a variable number of bytes, in such a way that
37 characters in the ASCII range are unmodified, and a zero byte never appears
38 within non-zero characters.
39
40 =for apidoc A|U8 *|uvuni_to_utf8_flags|U8 *d|UV uv|UV flags
41
42 Adds the UTF-8 representation of the Unicode codepoint C<uv> to the end
43 of the string C<d>; C<d> should be have at least C<UTF8_MAXBYTES+1> free
44 bytes available. The return value is the pointer to the byte after the
45 end of the new character. In other words,
46
47     d = uvuni_to_utf8_flags(d, uv, flags);
48
49 or, in most cases,
50
51     d = uvuni_to_utf8(d, uv);
52
53 (which is equivalent to)
54
55     d = uvuni_to_utf8_flags(d, uv, 0);
56
57 is the recommended Unicode-aware way of saying
58
59     *(d++) = uv;
60
61 =cut
62 */
63
64 U8 *
65 Perl_uvuni_to_utf8_flags(pTHX_ U8 *d, UV uv, UV flags)
66 {
67     if (ckWARN(WARN_UTF8)) {
68          if (UNICODE_IS_SURROGATE(uv) &&
69              !(flags & UNICODE_ALLOW_SURROGATE))
70               Perl_warner(aTHX_ packWARN(WARN_UTF8), "UTF-16 surrogate 0x%04"UVxf, uv);
71          else if (
72                   ((uv >= 0xFDD0 && uv <= 0xFDEF &&
73                     !(flags & UNICODE_ALLOW_FDD0))
74                    ||
75                    ((uv & 0xFFFE) == 0xFFFE && /* Either FFFE or FFFF. */
76                     !(flags & UNICODE_ALLOW_FFFF))) &&
77                   /* UNICODE_ALLOW_SUPER includes
78                    * FFFEs and FFFFs beyond 0x10FFFF. */
79                   ((uv <= PERL_UNICODE_MAX) ||
80                    !(flags & UNICODE_ALLOW_SUPER))
81                   )
82               Perl_warner(aTHX_ packWARN(WARN_UTF8),
83                          "Unicode character 0x%04"UVxf" is illegal", uv);
84     }
85     if (UNI_IS_INVARIANT(uv)) {
86         *d++ = (U8)UTF_TO_NATIVE(uv);
87         return d;
88     }
89 #if defined(EBCDIC)
90     else {
91         STRLEN len  = UNISKIP(uv);
92         U8 *p = d+len-1;
93         while (p > d) {
94             *p-- = (U8)UTF_TO_NATIVE((uv & UTF_CONTINUATION_MASK) | UTF_CONTINUATION_MARK);
95             uv >>= UTF_ACCUMULATION_SHIFT;
96         }
97         *p = (U8)UTF_TO_NATIVE((uv & UTF_START_MASK(len)) | UTF_START_MARK(len));
98         return d+len;
99     }
100 #else /* Non loop style */
101     if (uv < 0x800) {
102         *d++ = (U8)(( uv >>  6)         | 0xc0);
103         *d++ = (U8)(( uv        & 0x3f) | 0x80);
104         return d;
105     }
106     if (uv < 0x10000) {
107         *d++ = (U8)(( uv >> 12)         | 0xe0);
108         *d++ = (U8)(((uv >>  6) & 0x3f) | 0x80);
109         *d++ = (U8)(( uv        & 0x3f) | 0x80);
110         return d;
111     }
112     if (uv < 0x200000) {
113         *d++ = (U8)(( uv >> 18)         | 0xf0);
114         *d++ = (U8)(((uv >> 12) & 0x3f) | 0x80);
115         *d++ = (U8)(((uv >>  6) & 0x3f) | 0x80);
116         *d++ = (U8)(( uv        & 0x3f) | 0x80);
117         return d;
118     }
119     if (uv < 0x4000000) {
120         *d++ = (U8)(( uv >> 24)         | 0xf8);
121         *d++ = (U8)(((uv >> 18) & 0x3f) | 0x80);
122         *d++ = (U8)(((uv >> 12) & 0x3f) | 0x80);
123         *d++ = (U8)(((uv >>  6) & 0x3f) | 0x80);
124         *d++ = (U8)(( uv        & 0x3f) | 0x80);
125         return d;
126     }
127     if (uv < 0x80000000) {
128         *d++ = (U8)(( uv >> 30)         | 0xfc);
129         *d++ = (U8)(((uv >> 24) & 0x3f) | 0x80);
130         *d++ = (U8)(((uv >> 18) & 0x3f) | 0x80);
131         *d++ = (U8)(((uv >> 12) & 0x3f) | 0x80);
132         *d++ = (U8)(((uv >>  6) & 0x3f) | 0x80);
133         *d++ = (U8)(( uv        & 0x3f) | 0x80);
134         return d;
135     }
136 #ifdef HAS_QUAD
137     if (uv < UTF8_QUAD_MAX)
138 #endif
139     {
140         *d++ =                            0xfe; /* Can't match U+FEFF! */
141         *d++ = (U8)(((uv >> 30) & 0x3f) | 0x80);
142         *d++ = (U8)(((uv >> 24) & 0x3f) | 0x80);
143         *d++ = (U8)(((uv >> 18) & 0x3f) | 0x80);
144         *d++ = (U8)(((uv >> 12) & 0x3f) | 0x80);
145         *d++ = (U8)(((uv >>  6) & 0x3f) | 0x80);
146         *d++ = (U8)(( uv        & 0x3f) | 0x80);
147         return d;
148     }
149 #ifdef HAS_QUAD
150     {
151         *d++ =                            0xff;         /* Can't match U+FFFE! */
152         *d++ =                            0x80;         /* 6 Reserved bits */
153         *d++ = (U8)(((uv >> 60) & 0x0f) | 0x80);        /* 2 Reserved bits */
154         *d++ = (U8)(((uv >> 54) & 0x3f) | 0x80);
155         *d++ = (U8)(((uv >> 48) & 0x3f) | 0x80);
156         *d++ = (U8)(((uv >> 42) & 0x3f) | 0x80);
157         *d++ = (U8)(((uv >> 36) & 0x3f) | 0x80);
158         *d++ = (U8)(((uv >> 30) & 0x3f) | 0x80);
159         *d++ = (U8)(((uv >> 24) & 0x3f) | 0x80);
160         *d++ = (U8)(((uv >> 18) & 0x3f) | 0x80);
161         *d++ = (U8)(((uv >> 12) & 0x3f) | 0x80);
162         *d++ = (U8)(((uv >>  6) & 0x3f) | 0x80);
163         *d++ = (U8)(( uv        & 0x3f) | 0x80);
164         return d;
165     }
166 #endif
167 #endif /* Loop style */
168 }
169  
170 U8 *
171 Perl_uvuni_to_utf8(pTHX_ U8 *d, UV uv)
172 {
173     return Perl_uvuni_to_utf8_flags(aTHX_ d, uv, 0);
174 }
175
176 /*
177
178 Tests if some arbitrary number of bytes begins in a valid UTF-8
179 character.  Note that an INVARIANT (i.e. ASCII) character is a valid
180 UTF-8 character.  The actual number of bytes in the UTF-8 character
181 will be returned if it is valid, otherwise 0.
182
183 This is the "slow" version as opposed to the "fast" version which is
184 the "unrolled" IS_UTF8_CHAR().  E.g. for t/uni/class.t the speed
185 difference is a factor of 2 to 3.  For lengths (UTF8SKIP(s)) of four
186 or less you should use the IS_UTF8_CHAR(), for lengths of five or more
187 you should use the _slow().  In practice this means that the _slow()
188 will be used very rarely, since the maximum Unicode code point (as of
189 Unicode 4.1) is U+10FFFF, which encodes in UTF-8 to four bytes.  Only
190 the "Perl extended UTF-8" (the infamous 'v-strings') will encode into
191 five bytes or more.
192
193 =cut */
194 STRLEN
195 S_is_utf8_char_slow(pTHX_ const U8 *s, const STRLEN len)
196 {
197     U8 u = *s;
198     STRLEN slen;
199     UV uv, ouv;
200
201     if (UTF8_IS_INVARIANT(u))
202         return 1;
203
204     if (!UTF8_IS_START(u))
205         return 0;
206
207     if (len < 2 || !UTF8_IS_CONTINUATION(s[1]))
208         return 0;
209
210     slen = len - 1;
211     s++;
212     u &= UTF_START_MASK(len);
213     uv  = u;
214     ouv = uv;
215     while (slen--) {
216         if (!UTF8_IS_CONTINUATION(*s))
217             return 0;
218         uv = UTF8_ACCUMULATE(uv, *s);
219         if (uv < ouv) 
220             return 0;
221         ouv = uv;
222         s++;
223     }
224
225     if ((STRLEN)UNISKIP(uv) < len)
226         return 0;
227
228     return len;
229 }
230
231 /*
232 =for apidoc A|STRLEN|is_utf8_char|const U8 *s
233
234 Tests if some arbitrary number of bytes begins in a valid UTF-8
235 character.  Note that an INVARIANT (i.e. ASCII) character is a valid
236 UTF-8 character.  The actual number of bytes in the UTF-8 character
237 will be returned if it is valid, otherwise 0.
238
239 =cut */
240 STRLEN
241 Perl_is_utf8_char(pTHX_ const U8 *s)
242 {
243     STRLEN len;
244 #ifdef IS_UTF8_CHAR
245     len = UTF8SKIP(s);
246     if (len <= 4)
247         return IS_UTF8_CHAR(s, len) ? len : 0;
248 #endif /* #ifdef IS_UTF8_CHAR */
249     return S_is_utf8_char_slow(s, len);
250 }
251
252 /*
253 =for apidoc A|bool|is_utf8_string|const U8 *s|STRLEN len
254
255 Returns true if first C<len> bytes of the given string form a valid
256 UTF-8 string, false otherwise.  Note that 'a valid UTF-8 string' does
257 not mean 'a string that contains code points above 0x7F encoded in UTF-8'
258 because a valid ASCII string is a valid UTF-8 string.
259
260 =cut
261 */
262
263 bool
264 Perl_is_utf8_string(pTHX_ const U8 *s, STRLEN len)
265 {
266     const U8* x = s;
267     const U8* send;
268
269     if (!len && s)
270         len = strlen((const char *)s);
271     send = s + len;
272
273     while (x < send) {
274         STRLEN c;
275          /* Inline the easy bits of is_utf8_char() here for speed... */
276          if (UTF8_IS_INVARIANT(*x))
277               c = 1;
278          else if (!UTF8_IS_START(*x))
279               return FALSE;
280          else {
281               /* ... and call is_utf8_char() only if really needed. */
282 #ifdef IS_UTF8_CHAR
283              c = UTF8SKIP(x);
284              if (c <= 4) {
285                  if (!IS_UTF8_CHAR(x, c))
286                      return FALSE;
287              } else {
288                  if (!S_is_utf8_char_slow(x, c))
289                      return FALSE;
290              }
291 #else
292              c = is_utf8_char(x);
293 #endif /* #ifdef IS_UTF8_CHAR */
294               if (!c)
295                    return FALSE;
296          }
297         x += c;
298     }
299     if (x != send)
300         return FALSE;
301
302     return TRUE;
303 }
304
305 /*
306 =for apidoc A|bool|is_utf8_string_loc|const U8 *s|STRLEN len|const U8 **p
307
308 Like is_ut8_string but store the location of the failure in
309 the last argument.
310
311 =cut
312 */
313
314 bool
315 Perl_is_utf8_string_loc(pTHX_ const U8 *s, STRLEN len, const U8 **p)
316 {
317     const U8* x = s;
318     const U8* send;
319     STRLEN c;
320
321     if (!len && s)
322         len = strlen((const char *)s);
323     send = s + len;
324
325     while (x < send) {
326          /* Inline the easy bits of is_utf8_char() here for speed... */
327          if (UTF8_IS_INVARIANT(*x))
328               c = 1;
329          else if (!UTF8_IS_START(*x)) {
330               if (p)
331                   *p = x;
332               return FALSE;
333          }
334          else {
335               /* ... and call is_utf8_char() only if really needed. */
336               c = is_utf8_char(x);
337               if (!c) {
338                    if (p)
339                       *p = x;
340                    return FALSE;
341               }
342          }
343         x += c;
344     }
345     if (x != send) {
346        if (p)
347            *p = x;
348         return FALSE;
349     }
350
351     return TRUE;
352 }
353
354 /*
355 =for apidoc A|UV|utf8n_to_uvuni|const U8 *s|STRLEN curlen|STRLEN *retlen|U32 flags
356
357 Bottom level UTF-8 decode routine.
358 Returns the unicode code point value of the first character in the string C<s>
359 which is assumed to be in UTF-8 encoding and no longer than C<curlen>;
360 C<retlen> will be set to the length, in bytes, of that character.
361
362 If C<s> does not point to a well-formed UTF-8 character, the behaviour
363 is dependent on the value of C<flags>: if it contains UTF8_CHECK_ONLY,
364 it is assumed that the caller will raise a warning, and this function
365 will silently just set C<retlen> to C<-1> and return zero.  If the
366 C<flags> does not contain UTF8_CHECK_ONLY, warnings about
367 malformations will be given, C<retlen> will be set to the expected
368 length of the UTF-8 character in bytes, and zero will be returned.
369
370 The C<flags> can also contain various flags to allow deviations from
371 the strict UTF-8 encoding (see F<utf8.h>).
372
373 Most code should use utf8_to_uvchr() rather than call this directly.
374
375 =cut
376 */
377
378 UV
379 Perl_utf8n_to_uvuni(pTHX_ const U8 *s, STRLEN curlen, STRLEN *retlen, U32 flags)
380 {
381     const U8 *s0 = s;
382     UV uv = *s, ouv = 0;
383     STRLEN len = 1;
384     const bool dowarn = ckWARN_d(WARN_UTF8);
385     const UV startbyte = *s;
386     STRLEN expectlen = 0;
387     U32 warning = 0;
388
389 /* This list is a superset of the UTF8_ALLOW_XXX. */
390
391 #define UTF8_WARN_EMPTY                          1
392 #define UTF8_WARN_CONTINUATION                   2
393 #define UTF8_WARN_NON_CONTINUATION               3
394 #define UTF8_WARN_FE_FF                          4
395 #define UTF8_WARN_SHORT                          5
396 #define UTF8_WARN_OVERFLOW                       6
397 #define UTF8_WARN_SURROGATE                      7
398 #define UTF8_WARN_LONG                           8
399 #define UTF8_WARN_FFFF                           9 /* Also FFFE. */
400
401     if (curlen == 0 &&
402         !(flags & UTF8_ALLOW_EMPTY)) {
403         warning = UTF8_WARN_EMPTY;
404         goto malformed;
405     }
406
407     if (UTF8_IS_INVARIANT(uv)) {
408         if (retlen)
409             *retlen = 1;
410         return (UV) (NATIVE_TO_UTF(*s));
411     }
412
413     if (UTF8_IS_CONTINUATION(uv) &&
414         !(flags & UTF8_ALLOW_CONTINUATION)) {
415         warning = UTF8_WARN_CONTINUATION;
416         goto malformed;
417     }
418
419     if (UTF8_IS_START(uv) && curlen > 1 && !UTF8_IS_CONTINUATION(s[1]) &&
420         !(flags & UTF8_ALLOW_NON_CONTINUATION)) {
421         warning = UTF8_WARN_NON_CONTINUATION;
422         goto malformed;
423     }
424
425 #ifdef EBCDIC
426     uv = NATIVE_TO_UTF(uv);
427 #else
428     if ((uv == 0xfe || uv == 0xff) &&
429         !(flags & UTF8_ALLOW_FE_FF)) {
430         warning = UTF8_WARN_FE_FF;
431         goto malformed;
432     }
433 #endif
434
435     if      (!(uv & 0x20))      { len =  2; uv &= 0x1f; }
436     else if (!(uv & 0x10))      { len =  3; uv &= 0x0f; }
437     else if (!(uv & 0x08))      { len =  4; uv &= 0x07; }
438     else if (!(uv & 0x04))      { len =  5; uv &= 0x03; }
439 #ifdef EBCDIC
440     else if (!(uv & 0x02))      { len =  6; uv &= 0x01; }
441     else                        { len =  7; uv &= 0x01; }
442 #else
443     else if (!(uv & 0x02))      { len =  6; uv &= 0x01; }
444     else if (!(uv & 0x01))      { len =  7; uv = 0; }
445     else                        { len = 13; uv = 0; } /* whoa! */
446 #endif
447
448     if (retlen)
449         *retlen = len;
450
451     expectlen = len;
452
453     if ((curlen < expectlen) &&
454         !(flags & UTF8_ALLOW_SHORT)) {
455         warning = UTF8_WARN_SHORT;
456         goto malformed;
457     }
458
459     len--;
460     s++;
461     ouv = uv;
462
463     while (len--) {
464         if (!UTF8_IS_CONTINUATION(*s) &&
465             !(flags & UTF8_ALLOW_NON_CONTINUATION)) {
466             s--;
467             warning = UTF8_WARN_NON_CONTINUATION;
468             goto malformed;
469         }
470         else
471             uv = UTF8_ACCUMULATE(uv, *s);
472         if (!(uv > ouv)) {
473             /* These cannot be allowed. */
474             if (uv == ouv) {
475                 if (expectlen != 13 && !(flags & UTF8_ALLOW_LONG)) {
476                     warning = UTF8_WARN_LONG;
477                     goto malformed;
478                 }
479             }
480             else { /* uv < ouv */
481                 /* This cannot be allowed. */
482                 warning = UTF8_WARN_OVERFLOW;
483                 goto malformed;
484             }
485         }
486         s++;
487         ouv = uv;
488     }
489
490     if (UNICODE_IS_SURROGATE(uv) &&
491         !(flags & UTF8_ALLOW_SURROGATE)) {
492         warning = UTF8_WARN_SURROGATE;
493         goto malformed;
494     } else if ((expectlen > (STRLEN)UNISKIP(uv)) &&
495                !(flags & UTF8_ALLOW_LONG)) {
496         warning = UTF8_WARN_LONG;
497         goto malformed;
498     } else if (UNICODE_IS_ILLEGAL(uv) &&
499                !(flags & UTF8_ALLOW_FFFF)) {
500         warning = UTF8_WARN_FFFF;
501         goto malformed;
502     }
503
504     return uv;
505
506 malformed:
507
508     if (flags & UTF8_CHECK_ONLY) {
509         if (retlen)
510             *retlen = -1;
511         return 0;
512     }
513
514     if (dowarn) {
515         SV* sv = sv_2mortal(newSVpv("Malformed UTF-8 character ", 0));
516
517         switch (warning) {
518         case 0: /* Intentionally empty. */ break;
519         case UTF8_WARN_EMPTY:
520             Perl_sv_catpv(aTHX_ sv, "(empty string)");
521             break;
522         case UTF8_WARN_CONTINUATION:
523             Perl_sv_catpvf(aTHX_ sv, "(unexpected continuation byte 0x%02"UVxf", with no preceding start byte)", uv);
524             break;
525         case UTF8_WARN_NON_CONTINUATION:
526             if (s == s0)
527                 Perl_sv_catpvf(aTHX_ sv, "(unexpected non-continuation byte 0x%02"UVxf", immediately after start byte 0x%02"UVxf")",
528                            (UV)s[1], startbyte);
529             else
530                 Perl_sv_catpvf(aTHX_ sv, "(unexpected non-continuation byte 0x%02"UVxf", %d byte%s after start byte 0x%02"UVxf", expected %d bytes)",
531                            (UV)s[1], s - s0, s - s0 > 1 ? "s" : "", startbyte, (int)expectlen);
532               
533             break;
534         case UTF8_WARN_FE_FF:
535             Perl_sv_catpvf(aTHX_ sv, "(byte 0x%02"UVxf")", uv);
536             break;
537         case UTF8_WARN_SHORT:
538             Perl_sv_catpvf(aTHX_ sv, "(%d byte%s, need %d, after start byte 0x%02"UVxf")",
539                            (int)curlen, curlen == 1 ? "" : "s", (int)expectlen, startbyte);
540             expectlen = curlen;         /* distance for caller to skip */
541             break;
542         case UTF8_WARN_OVERFLOW:
543             Perl_sv_catpvf(aTHX_ sv, "(overflow at 0x%"UVxf", byte 0x%02x, after start byte 0x%02"UVxf")",
544                            ouv, *s, startbyte);
545             break;
546         case UTF8_WARN_SURROGATE:
547             Perl_sv_catpvf(aTHX_ sv, "(UTF-16 surrogate 0x%04"UVxf")", uv);
548             break;
549         case UTF8_WARN_LONG:
550             Perl_sv_catpvf(aTHX_ sv, "(%d byte%s, need %d, after start byte 0x%02"UVxf")",
551                            (int)expectlen, expectlen == 1 ? "": "s", UNISKIP(uv), startbyte);
552             break;
553         case UTF8_WARN_FFFF:
554             Perl_sv_catpvf(aTHX_ sv, "(character 0x%04"UVxf")", uv);
555             break;
556         default:
557             Perl_sv_catpv(aTHX_ sv, "(unknown reason)");
558             break;
559         }
560         
561         if (warning) {
562             const char *s = SvPVX_const(sv);
563
564             if (PL_op)
565                 Perl_warner(aTHX_ packWARN(WARN_UTF8),
566                             "%s in %s", s,  OP_DESC(PL_op));
567             else
568                 Perl_warner(aTHX_ packWARN(WARN_UTF8), "%s", s);
569         }
570     }
571
572     if (retlen)
573         *retlen = expectlen ? expectlen : len;
574
575     return 0;
576 }
577
578 /*
579 =for apidoc A|UV|utf8_to_uvchr|const U8 *s|STRLEN *retlen
580
581 Returns the native character value of the first character in the string C<s>
582 which is assumed to be in UTF-8 encoding; C<retlen> will be set to the
583 length, in bytes, of that character.
584
585 If C<s> does not point to a well-formed UTF-8 character, zero is
586 returned and retlen is set, if possible, to -1.
587
588 =cut
589 */
590
591 UV
592 Perl_utf8_to_uvchr(pTHX_ const U8 *s, STRLEN *retlen)
593 {
594     return Perl_utf8n_to_uvchr(aTHX_ s, UTF8_MAXBYTES, retlen,
595                                ckWARN(WARN_UTF8) ? 0 : UTF8_ALLOW_ANY);
596 }
597
598 /*
599 =for apidoc A|UV|utf8_to_uvuni|const U8 *s|STRLEN *retlen
600
601 Returns the Unicode code point of the first character in the string C<s>
602 which is assumed to be in UTF-8 encoding; C<retlen> will be set to the
603 length, in bytes, of that character.
604
605 This function should only be used when returned UV is considered
606 an index into the Unicode semantic tables (e.g. swashes).
607
608 If C<s> does not point to a well-formed UTF-8 character, zero is
609 returned and retlen is set, if possible, to -1.
610
611 =cut
612 */
613
614 UV
615 Perl_utf8_to_uvuni(pTHX_ const U8 *s, STRLEN *retlen)
616 {
617     /* Call the low level routine asking for checks */
618     return Perl_utf8n_to_uvuni(aTHX_ s, UTF8_MAXBYTES, retlen,
619                                ckWARN(WARN_UTF8) ? 0 : UTF8_ALLOW_ANY);
620 }
621
622 /*
623 =for apidoc A|STRLEN|utf8_length|const U8 *s|const U8 *e
624
625 Return the length of the UTF-8 char encoded string C<s> in characters.
626 Stops at C<e> (inclusive).  If C<e E<lt> s> or if the scan would end
627 up past C<e>, croaks.
628
629 =cut
630 */
631
632 STRLEN
633 Perl_utf8_length(pTHX_ const U8 *s, const U8 *e)
634 {
635     STRLEN len = 0;
636
637     /* Note: cannot use UTF8_IS_...() too eagerly here since e.g.
638      * the bitops (especially ~) can create illegal UTF-8.
639      * In other words: in Perl UTF-8 is not just for Unicode. */
640
641     if (e < s)
642         goto warn_and_return;
643     while (s < e) {
644         const U8 t = UTF8SKIP(s);
645         if (e - s < t) {
646             warn_and_return:
647             if (ckWARN_d(WARN_UTF8)) {
648                 if (PL_op)
649                     Perl_warner(aTHX_ packWARN(WARN_UTF8),
650                             "%s in %s", unees, OP_DESC(PL_op));
651                 else
652                     Perl_warner(aTHX_ packWARN(WARN_UTF8), unees);
653             }
654             return len;
655         }
656         s += t;
657         len++;
658     }
659
660     return len;
661 }
662
663 /*
664 =for apidoc A|IV|utf8_distance|const U8 *a|const U8 *b
665
666 Returns the number of UTF-8 characters between the UTF-8 pointers C<a>
667 and C<b>.
668
669 WARNING: use only if you *know* that the pointers point inside the
670 same UTF-8 buffer.
671
672 =cut
673 */
674
675 IV
676 Perl_utf8_distance(pTHX_ const U8 *a, const U8 *b)
677 {
678     IV off = 0;
679
680     /* Note: cannot use UTF8_IS_...() too eagerly here since  e.g.
681      * the bitops (especially ~) can create illegal UTF-8.
682      * In other words: in Perl UTF-8 is not just for Unicode. */
683
684     if (a < b) {
685         while (a < b) {
686             const U8 c = UTF8SKIP(a);
687             if (b - a < c)
688                 goto warn_and_return;
689             a += c;
690             off--;
691         }
692     }
693     else {
694         while (b < a) {
695             const U8 c = UTF8SKIP(b);
696
697             if (a - b < c) {
698                 warn_and_return:
699                 if (ckWARN_d(WARN_UTF8)) {
700                     if (PL_op)
701                         Perl_warner(aTHX_ packWARN(WARN_UTF8),
702                                     "%s in %s", unees, OP_DESC(PL_op));
703                     else
704                         Perl_warner(aTHX_ packWARN(WARN_UTF8), unees);
705                 }
706                 return off;
707             }
708             b += c;
709             off++;
710         }
711     }
712
713     return off;
714 }
715
716 /*
717 =for apidoc A|U8 *|utf8_hop|U8 *s|I32 off
718
719 Return the UTF-8 pointer C<s> displaced by C<off> characters, either
720 forward or backward.
721
722 WARNING: do not use the following unless you *know* C<off> is within
723 the UTF-8 data pointed to by C<s> *and* that on entry C<s> is aligned
724 on the first byte of character or just after the last byte of a character.
725
726 =cut
727 */
728
729 U8 *
730 Perl_utf8_hop(pTHX_ const U8 *s, I32 off)
731 {
732     /* Note: cannot use UTF8_IS_...() too eagerly here since e.g
733      * the bitops (especially ~) can create illegal UTF-8.
734      * In other words: in Perl UTF-8 is not just for Unicode. */
735
736     if (off >= 0) {
737         while (off--)
738             s += UTF8SKIP(s);
739     }
740     else {
741         while (off++) {
742             s--;
743             while (UTF8_IS_CONTINUATION(*s))
744                 s--;
745         }
746     }
747     return (U8 *)s;
748 }
749
750 /*
751 =for apidoc A|U8 *|utf8_to_bytes|U8 *s|STRLEN *len
752
753 Converts a string C<s> of length C<len> from UTF-8 into byte encoding.
754 Unlike C<bytes_to_utf8>, this over-writes the original string, and
755 updates len to contain the new length.
756 Returns zero on failure, setting C<len> to -1.
757
758 =cut
759 */
760
761 U8 *
762 Perl_utf8_to_bytes(pTHX_ U8 *s, STRLEN *len)
763 {
764     U8 *send;
765     U8 *d;
766     U8 *save = s;
767
768     /* ensure valid UTF-8 and chars < 256 before updating string */
769     for (send = s + *len; s < send; ) {
770         U8 c = *s++;
771
772         if (!UTF8_IS_INVARIANT(c) &&
773             (!UTF8_IS_DOWNGRADEABLE_START(c) || (s >= send)
774              || !(c = *s++) || !UTF8_IS_CONTINUATION(c))) {
775             *len = -1;
776             return 0;
777         }
778     }
779
780     d = s = save;
781     while (s < send) {
782         STRLEN ulen;
783         *d++ = (U8)utf8_to_uvchr(s, &ulen);
784         s += ulen;
785     }
786     *d = '\0';
787     *len = d - save;
788     return save;
789 }
790
791 /*
792 =for apidoc A|U8 *|bytes_from_utf8|const U8 *s|STRLEN *len|bool *is_utf8
793
794 Converts a string C<s> of length C<len> from UTF-8 into byte encoding.
795 Unlike C<utf8_to_bytes> but like C<bytes_to_utf8>, returns a pointer to
796 the newly-created string, and updates C<len> to contain the new
797 length.  Returns the original string if no conversion occurs, C<len>
798 is unchanged. Do nothing if C<is_utf8> points to 0. Sets C<is_utf8> to
799 0 if C<s> is converted or contains all 7bit characters.
800
801 =cut
802 */
803
804 U8 *
805 Perl_bytes_from_utf8(pTHX_ const U8 *s, STRLEN *len, bool *is_utf8)
806 {
807     U8 *d;
808     const U8 *start = s;
809     const U8 *send;
810     I32 count = 0;
811
812     if (!*is_utf8)
813         return (U8 *)start;
814
815     /* ensure valid UTF-8 and chars < 256 before converting string */
816     for (send = s + *len; s < send;) {
817         U8 c = *s++;
818         if (!UTF8_IS_INVARIANT(c)) {
819             if (UTF8_IS_DOWNGRADEABLE_START(c) && s < send &&
820                 (c = *s++) && UTF8_IS_CONTINUATION(c))
821                 count++;
822             else
823                 return (U8 *)start;
824         }
825     }
826
827     *is_utf8 = 0;               
828
829     Newz(801, d, (*len) - count + 1, U8);
830     s = start; start = d;
831     while (s < send) {
832         U8 c = *s++;
833         if (!UTF8_IS_INVARIANT(c)) {
834             /* Then it is two-byte encoded */
835             c = UTF8_ACCUMULATE(NATIVE_TO_UTF(c), *s++);
836             c = ASCII_TO_NATIVE(c);
837         }
838         *d++ = c;
839     }
840     *d = '\0';
841     *len = d - start;
842     return (U8 *)start;
843 }
844
845 /*
846 =for apidoc A|U8 *|bytes_to_utf8|const U8 *s|STRLEN *len
847
848 Converts a string C<s> of length C<len> from ASCII into UTF-8 encoding.
849 Returns a pointer to the newly-created string, and sets C<len> to
850 reflect the new length.
851
852 If you want to convert to UTF-8 from other encodings than ASCII,
853 see sv_recode_to_utf8().
854
855 =cut
856 */
857
858 U8*
859 Perl_bytes_to_utf8(pTHX_ const U8 *s, STRLEN *len)
860 {
861     const U8 * const send = s + (*len);
862     U8 *d;
863     U8 *dst;
864
865     Newz(801, d, (*len) * 2 + 1, U8);
866     dst = d;
867
868     while (s < send) {
869         const UV uv = NATIVE_TO_ASCII(*s++);
870         if (UNI_IS_INVARIANT(uv))
871             *d++ = (U8)UTF_TO_NATIVE(uv);
872         else {
873             *d++ = (U8)UTF8_EIGHT_BIT_HI(uv);
874             *d++ = (U8)UTF8_EIGHT_BIT_LO(uv);
875         }
876     }
877     *d = '\0';
878     *len = d-dst;
879     return dst;
880 }
881
882 /*
883  * Convert native (big-endian) or reversed (little-endian) UTF-16 to UTF-8.
884  *
885  * Destination must be pre-extended to 3/2 source.  Do not use in-place.
886  * We optimize for native, for obvious reasons. */
887
888 U8*
889 Perl_utf16_to_utf8(pTHX_ U8* p, U8* d, I32 bytelen, I32 *newlen)
890 {
891     U8* pend;
892     U8* dstart = d;
893
894     if (bytelen == 1 && p[0] == 0) { /* Be understanding. */
895          d[0] = 0;
896          *newlen = 1;
897          return d;
898     }
899
900     if (bytelen & 1)
901         Perl_croak(aTHX_ "panic: utf16_to_utf8: odd bytelen %"UVf, (UV)bytelen);
902
903     pend = p + bytelen;
904
905     while (p < pend) {
906         UV uv = (p[0] << 8) + p[1]; /* UTF-16BE */
907         p += 2;
908         if (uv < 0x80) {
909             *d++ = (U8)uv;
910             continue;
911         }
912         if (uv < 0x800) {
913             *d++ = (U8)(( uv >>  6)         | 0xc0);
914             *d++ = (U8)(( uv        & 0x3f) | 0x80);
915             continue;
916         }
917         if (uv >= 0xd800 && uv < 0xdbff) {      /* surrogates */
918             UV low = (p[0] << 8) + p[1];
919             p += 2;
920             if (low < 0xdc00 || low >= 0xdfff)
921                 Perl_croak(aTHX_ "Malformed UTF-16 surrogate");
922             uv = ((uv - 0xd800) << 10) + (low - 0xdc00) + 0x10000;
923         }
924         if (uv < 0x10000) {
925             *d++ = (U8)(( uv >> 12)         | 0xe0);
926             *d++ = (U8)(((uv >>  6) & 0x3f) | 0x80);
927             *d++ = (U8)(( uv        & 0x3f) | 0x80);
928             continue;
929         }
930         else {
931             *d++ = (U8)(( uv >> 18)         | 0xf0);
932             *d++ = (U8)(((uv >> 12) & 0x3f) | 0x80);
933             *d++ = (U8)(((uv >>  6) & 0x3f) | 0x80);
934             *d++ = (U8)(( uv        & 0x3f) | 0x80);
935             continue;
936         }
937     }
938     *newlen = d - dstart;
939     return d;
940 }
941
942 /* Note: this one is slightly destructive of the source. */
943
944 U8*
945 Perl_utf16_to_utf8_reversed(pTHX_ U8* p, U8* d, I32 bytelen, I32 *newlen)
946 {
947     U8* s = (U8*)p;
948     U8* send = s + bytelen;
949     while (s < send) {
950         U8 tmp = s[0];
951         s[0] = s[1];
952         s[1] = tmp;
953         s += 2;
954     }
955     return utf16_to_utf8(p, d, bytelen, newlen);
956 }
957
958 /* for now these are all defined (inefficiently) in terms of the utf8 versions */
959
960 bool
961 Perl_is_uni_alnum(pTHX_ UV c)
962 {
963     U8 tmpbuf[UTF8_MAXBYTES+1];
964     uvchr_to_utf8(tmpbuf, c);
965     return is_utf8_alnum(tmpbuf);
966 }
967
968 bool
969 Perl_is_uni_alnumc(pTHX_ UV c)
970 {
971     U8 tmpbuf[UTF8_MAXBYTES+1];
972     uvchr_to_utf8(tmpbuf, c);
973     return is_utf8_alnumc(tmpbuf);
974 }
975
976 bool
977 Perl_is_uni_idfirst(pTHX_ UV c)
978 {
979     U8 tmpbuf[UTF8_MAXBYTES+1];
980     uvchr_to_utf8(tmpbuf, c);
981     return is_utf8_idfirst(tmpbuf);
982 }
983
984 bool
985 Perl_is_uni_alpha(pTHX_ UV c)
986 {
987     U8 tmpbuf[UTF8_MAXBYTES+1];
988     uvchr_to_utf8(tmpbuf, c);
989     return is_utf8_alpha(tmpbuf);
990 }
991
992 bool
993 Perl_is_uni_ascii(pTHX_ UV c)
994 {
995     U8 tmpbuf[UTF8_MAXBYTES+1];
996     uvchr_to_utf8(tmpbuf, c);
997     return is_utf8_ascii(tmpbuf);
998 }
999
1000 bool
1001 Perl_is_uni_space(pTHX_ UV c)
1002 {
1003     U8 tmpbuf[UTF8_MAXBYTES+1];
1004     uvchr_to_utf8(tmpbuf, c);
1005     return is_utf8_space(tmpbuf);
1006 }
1007
1008 bool
1009 Perl_is_uni_digit(pTHX_ UV c)
1010 {
1011     U8 tmpbuf[UTF8_MAXBYTES+1];
1012     uvchr_to_utf8(tmpbuf, c);
1013     return is_utf8_digit(tmpbuf);
1014 }
1015
1016 bool
1017 Perl_is_uni_upper(pTHX_ UV c)
1018 {
1019     U8 tmpbuf[UTF8_MAXBYTES+1];
1020     uvchr_to_utf8(tmpbuf, c);
1021     return is_utf8_upper(tmpbuf);
1022 }
1023
1024 bool
1025 Perl_is_uni_lower(pTHX_ UV c)
1026 {
1027     U8 tmpbuf[UTF8_MAXBYTES+1];
1028     uvchr_to_utf8(tmpbuf, c);
1029     return is_utf8_lower(tmpbuf);
1030 }
1031
1032 bool
1033 Perl_is_uni_cntrl(pTHX_ UV c)
1034 {
1035     U8 tmpbuf[UTF8_MAXBYTES+1];
1036     uvchr_to_utf8(tmpbuf, c);
1037     return is_utf8_cntrl(tmpbuf);
1038 }
1039
1040 bool
1041 Perl_is_uni_graph(pTHX_ UV c)
1042 {
1043     U8 tmpbuf[UTF8_MAXBYTES+1];
1044     uvchr_to_utf8(tmpbuf, c);
1045     return is_utf8_graph(tmpbuf);
1046 }
1047
1048 bool
1049 Perl_is_uni_print(pTHX_ UV c)
1050 {
1051     U8 tmpbuf[UTF8_MAXBYTES+1];
1052     uvchr_to_utf8(tmpbuf, c);
1053     return is_utf8_print(tmpbuf);
1054 }
1055
1056 bool
1057 Perl_is_uni_punct(pTHX_ UV c)
1058 {
1059     U8 tmpbuf[UTF8_MAXBYTES+1];
1060     uvchr_to_utf8(tmpbuf, c);
1061     return is_utf8_punct(tmpbuf);
1062 }
1063
1064 bool
1065 Perl_is_uni_xdigit(pTHX_ UV c)
1066 {
1067     U8 tmpbuf[UTF8_MAXBYTES_CASE+1];
1068     uvchr_to_utf8(tmpbuf, c);
1069     return is_utf8_xdigit(tmpbuf);
1070 }
1071
1072 UV
1073 Perl_to_uni_upper(pTHX_ UV c, U8* p, STRLEN *lenp)
1074 {
1075     uvchr_to_utf8(p, c);
1076     return to_utf8_upper(p, p, lenp);
1077 }
1078
1079 UV
1080 Perl_to_uni_title(pTHX_ UV c, U8* p, STRLEN *lenp)
1081 {
1082     uvchr_to_utf8(p, c);
1083     return to_utf8_title(p, p, lenp);
1084 }
1085
1086 UV
1087 Perl_to_uni_lower(pTHX_ UV c, U8* p, STRLEN *lenp)
1088 {
1089     uvchr_to_utf8(p, c);
1090     return to_utf8_lower(p, p, lenp);
1091 }
1092
1093 UV
1094 Perl_to_uni_fold(pTHX_ UV c, U8* p, STRLEN *lenp)
1095 {
1096     uvchr_to_utf8(p, c);
1097     return to_utf8_fold(p, p, lenp);
1098 }
1099
1100 /* for now these all assume no locale info available for Unicode > 255 */
1101
1102 bool
1103 Perl_is_uni_alnum_lc(pTHX_ UV c)
1104 {
1105     return is_uni_alnum(c);     /* XXX no locale support yet */
1106 }
1107
1108 bool
1109 Perl_is_uni_alnumc_lc(pTHX_ UV c)
1110 {
1111     return is_uni_alnumc(c);    /* XXX no locale support yet */
1112 }
1113
1114 bool
1115 Perl_is_uni_idfirst_lc(pTHX_ UV c)
1116 {
1117     return is_uni_idfirst(c);   /* XXX no locale support yet */
1118 }
1119
1120 bool
1121 Perl_is_uni_alpha_lc(pTHX_ UV c)
1122 {
1123     return is_uni_alpha(c);     /* XXX no locale support yet */
1124 }
1125
1126 bool
1127 Perl_is_uni_ascii_lc(pTHX_ UV c)
1128 {
1129     return is_uni_ascii(c);     /* XXX no locale support yet */
1130 }
1131
1132 bool
1133 Perl_is_uni_space_lc(pTHX_ UV c)
1134 {
1135     return is_uni_space(c);     /* XXX no locale support yet */
1136 }
1137
1138 bool
1139 Perl_is_uni_digit_lc(pTHX_ UV c)
1140 {
1141     return is_uni_digit(c);     /* XXX no locale support yet */
1142 }
1143
1144 bool
1145 Perl_is_uni_upper_lc(pTHX_ UV c)
1146 {
1147     return is_uni_upper(c);     /* XXX no locale support yet */
1148 }
1149
1150 bool
1151 Perl_is_uni_lower_lc(pTHX_ UV c)
1152 {
1153     return is_uni_lower(c);     /* XXX no locale support yet */
1154 }
1155
1156 bool
1157 Perl_is_uni_cntrl_lc(pTHX_ UV c)
1158 {
1159     return is_uni_cntrl(c);     /* XXX no locale support yet */
1160 }
1161
1162 bool
1163 Perl_is_uni_graph_lc(pTHX_ UV c)
1164 {
1165     return is_uni_graph(c);     /* XXX no locale support yet */
1166 }
1167
1168 bool
1169 Perl_is_uni_print_lc(pTHX_ UV c)
1170 {
1171     return is_uni_print(c);     /* XXX no locale support yet */
1172 }
1173
1174 bool
1175 Perl_is_uni_punct_lc(pTHX_ UV c)
1176 {
1177     return is_uni_punct(c);     /* XXX no locale support yet */
1178 }
1179
1180 bool
1181 Perl_is_uni_xdigit_lc(pTHX_ UV c)
1182 {
1183     return is_uni_xdigit(c);    /* XXX no locale support yet */
1184 }
1185
1186 U32
1187 Perl_to_uni_upper_lc(pTHX_ U32 c)
1188 {
1189     /* XXX returns only the first character -- do not use XXX */
1190     /* XXX no locale support yet */
1191     STRLEN len;
1192     U8 tmpbuf[UTF8_MAXBYTES_CASE+1];
1193     return (U32)to_uni_upper(c, tmpbuf, &len);
1194 }
1195
1196 U32
1197 Perl_to_uni_title_lc(pTHX_ U32 c)
1198 {
1199     /* XXX returns only the first character XXX -- do not use XXX */
1200     /* XXX no locale support yet */
1201     STRLEN len;
1202     U8 tmpbuf[UTF8_MAXBYTES_CASE+1];
1203     return (U32)to_uni_title(c, tmpbuf, &len);
1204 }
1205
1206 U32
1207 Perl_to_uni_lower_lc(pTHX_ U32 c)
1208 {
1209     /* XXX returns only the first character -- do not use XXX */
1210     /* XXX no locale support yet */
1211     STRLEN len;
1212     U8 tmpbuf[UTF8_MAXBYTES_CASE+1];
1213     return (U32)to_uni_lower(c, tmpbuf, &len);
1214 }
1215
1216 bool
1217 Perl_is_utf8_alnum(pTHX_ const U8 *p)
1218 {
1219     if (!is_utf8_char(p))
1220         return FALSE;
1221     if (!PL_utf8_alnum)
1222         /* NOTE: "IsWord", not "IsAlnum", since Alnum is a true
1223          * descendant of isalnum(3), in other words, it doesn't
1224          * contain the '_'. --jhi */
1225         PL_utf8_alnum = swash_init("utf8", "IsWord", &PL_sv_undef, 0, 0);
1226     return swash_fetch(PL_utf8_alnum, p, TRUE) != 0;
1227 /*    return *p == '_' || is_utf8_alpha(p) || is_utf8_digit(p); */
1228 #ifdef SURPRISINGLY_SLOWER  /* probably because alpha is usually true */
1229     if (!PL_utf8_alnum)
1230         PL_utf8_alnum = swash_init("utf8", "",
1231             sv_2mortal(newSVpv("+utf8::IsAlpha\n+utf8::IsDigit\n005F\n",0)), 0, 0);
1232     return swash_fetch(PL_utf8_alnum, p, TRUE) != 0;
1233 #endif
1234 }
1235
1236 bool
1237 Perl_is_utf8_alnumc(pTHX_ const U8 *p)
1238 {
1239     if (!is_utf8_char(p))
1240         return FALSE;
1241     if (!PL_utf8_alnum)
1242         PL_utf8_alnum = swash_init("utf8", "IsAlnumC", &PL_sv_undef, 0, 0);
1243     return swash_fetch(PL_utf8_alnum, p, TRUE) != 0;
1244 /*    return is_utf8_alpha(p) || is_utf8_digit(p); */
1245 #ifdef SURPRISINGLY_SLOWER  /* probably because alpha is usually true */
1246     if (!PL_utf8_alnum)
1247         PL_utf8_alnum = swash_init("utf8", "",
1248             sv_2mortal(newSVpv("+utf8::IsAlpha\n+utf8::IsDigit\n005F\n",0)), 0, 0);
1249     return swash_fetch(PL_utf8_alnum, p, TRUE) != 0;
1250 #endif
1251 }
1252
1253 bool
1254 Perl_is_utf8_idfirst(pTHX_ const U8 *p) /* The naming is historical. */
1255 {
1256     if (*p == '_')
1257         return TRUE;
1258     if (!is_utf8_char(p))
1259         return FALSE;
1260     if (!PL_utf8_idstart) /* is_utf8_idstart would be more logical. */
1261         PL_utf8_idstart = swash_init("utf8", "IdStart", &PL_sv_undef, 0, 0);
1262     return swash_fetch(PL_utf8_idstart, p, TRUE) != 0;
1263 }
1264
1265 bool
1266 Perl_is_utf8_idcont(pTHX_ const U8 *p)
1267 {
1268     if (*p == '_')
1269         return TRUE;
1270     if (!is_utf8_char(p))
1271         return FALSE;
1272     if (!PL_utf8_idcont)
1273         PL_utf8_idcont = swash_init("utf8", "IdContinue", &PL_sv_undef, 0, 0);
1274     return swash_fetch(PL_utf8_idcont, p, TRUE) != 0;
1275 }
1276
1277 bool
1278 Perl_is_utf8_alpha(pTHX_ const U8 *p)
1279 {
1280     if (!is_utf8_char(p))
1281         return FALSE;
1282     if (!PL_utf8_alpha)
1283         PL_utf8_alpha = swash_init("utf8", "IsAlpha", &PL_sv_undef, 0, 0);
1284     return swash_fetch(PL_utf8_alpha, p, TRUE) != 0;
1285 }
1286
1287 bool
1288 Perl_is_utf8_ascii(pTHX_ const U8 *p)
1289 {
1290     if (!is_utf8_char(p))
1291         return FALSE;
1292     if (!PL_utf8_ascii)
1293         PL_utf8_ascii = swash_init("utf8", "IsAscii", &PL_sv_undef, 0, 0);
1294     return swash_fetch(PL_utf8_ascii, p, TRUE) != 0;
1295 }
1296
1297 bool
1298 Perl_is_utf8_space(pTHX_ const U8 *p)
1299 {
1300     if (!is_utf8_char(p))
1301         return FALSE;
1302     if (!PL_utf8_space)
1303         PL_utf8_space = swash_init("utf8", "IsSpacePerl", &PL_sv_undef, 0, 0);
1304     return swash_fetch(PL_utf8_space, p, TRUE) != 0;
1305 }
1306
1307 bool
1308 Perl_is_utf8_digit(pTHX_ const U8 *p)
1309 {
1310     if (!is_utf8_char(p))
1311         return FALSE;
1312     if (!PL_utf8_digit)
1313         PL_utf8_digit = swash_init("utf8", "IsDigit", &PL_sv_undef, 0, 0);
1314     return swash_fetch(PL_utf8_digit, p, TRUE) != 0;
1315 }
1316
1317 bool
1318 Perl_is_utf8_upper(pTHX_ const U8 *p)
1319 {
1320     if (!is_utf8_char(p))
1321         return FALSE;
1322     if (!PL_utf8_upper)
1323         PL_utf8_upper = swash_init("utf8", "IsUppercase", &PL_sv_undef, 0, 0);
1324     return swash_fetch(PL_utf8_upper, p, TRUE) != 0;
1325 }
1326
1327 bool
1328 Perl_is_utf8_lower(pTHX_ const U8 *p)
1329 {
1330     if (!is_utf8_char(p))
1331         return FALSE;
1332     if (!PL_utf8_lower)
1333         PL_utf8_lower = swash_init("utf8", "IsLowercase", &PL_sv_undef, 0, 0);
1334     return swash_fetch(PL_utf8_lower, p, TRUE) != 0;
1335 }
1336
1337 bool
1338 Perl_is_utf8_cntrl(pTHX_ const U8 *p)
1339 {
1340     if (!is_utf8_char(p))
1341         return FALSE;
1342     if (!PL_utf8_cntrl)
1343         PL_utf8_cntrl = swash_init("utf8", "IsCntrl", &PL_sv_undef, 0, 0);
1344     return swash_fetch(PL_utf8_cntrl, p, TRUE) != 0;
1345 }
1346
1347 bool
1348 Perl_is_utf8_graph(pTHX_ const U8 *p)
1349 {
1350     if (!is_utf8_char(p))
1351         return FALSE;
1352     if (!PL_utf8_graph)
1353         PL_utf8_graph = swash_init("utf8", "IsGraph", &PL_sv_undef, 0, 0);
1354     return swash_fetch(PL_utf8_graph, p, TRUE) != 0;
1355 }
1356
1357 bool
1358 Perl_is_utf8_print(pTHX_ const U8 *p)
1359 {
1360     if (!is_utf8_char(p))
1361         return FALSE;
1362     if (!PL_utf8_print)
1363         PL_utf8_print = swash_init("utf8", "IsPrint", &PL_sv_undef, 0, 0);
1364     return swash_fetch(PL_utf8_print, p, TRUE) != 0;
1365 }
1366
1367 bool
1368 Perl_is_utf8_punct(pTHX_ const U8 *p)
1369 {
1370     if (!is_utf8_char(p))
1371         return FALSE;
1372     if (!PL_utf8_punct)
1373         PL_utf8_punct = swash_init("utf8", "IsPunct", &PL_sv_undef, 0, 0);
1374     return swash_fetch(PL_utf8_punct, p, TRUE) != 0;
1375 }
1376
1377 bool
1378 Perl_is_utf8_xdigit(pTHX_ const U8 *p)
1379 {
1380     if (!is_utf8_char(p))
1381         return FALSE;
1382     if (!PL_utf8_xdigit)
1383         PL_utf8_xdigit = swash_init("utf8", "IsXDigit", &PL_sv_undef, 0, 0);
1384     return swash_fetch(PL_utf8_xdigit, p, TRUE) != 0;
1385 }
1386
1387 bool
1388 Perl_is_utf8_mark(pTHX_ const U8 *p)
1389 {
1390     if (!is_utf8_char(p))
1391         return FALSE;
1392     if (!PL_utf8_mark)
1393         PL_utf8_mark = swash_init("utf8", "IsM", &PL_sv_undef, 0, 0);
1394     return swash_fetch(PL_utf8_mark, p, TRUE) != 0;
1395 }
1396
1397 /*
1398 =for apidoc A|UV|to_utf8_case|U8 *p|U8* ustrp|STRLEN *lenp|SV **swash|char *normal|char *special
1399
1400 The "p" contains the pointer to the UTF-8 string encoding
1401 the character that is being converted.
1402
1403 The "ustrp" is a pointer to the character buffer to put the
1404 conversion result to.  The "lenp" is a pointer to the length
1405 of the result.
1406
1407 The "swashp" is a pointer to the swash to use.
1408
1409 Both the special and normal mappings are stored lib/unicore/To/Foo.pl,
1410 and loaded by SWASHGET, using lib/utf8_heavy.pl.  The special (usually,
1411 but not always, a multicharacter mapping), is tried first.
1412
1413 The "special" is a string like "utf8::ToSpecLower", which means the
1414 hash %utf8::ToSpecLower.  The access to the hash is through
1415 Perl_to_utf8_case().
1416
1417 The "normal" is a string like "ToLower" which means the swash
1418 %utf8::ToLower.
1419
1420 =cut */
1421
1422 UV
1423 Perl_to_utf8_case(pTHX_ const U8 *p, U8* ustrp, STRLEN *lenp, SV **swashp, const char *normal, const char *special)
1424 {
1425     U8 tmpbuf[UTF8_MAXBYTES_CASE+1];
1426     STRLEN len = 0;
1427
1428     const UV uv0 = utf8_to_uvchr(p, 0);
1429     /* The NATIVE_TO_UNI() and UNI_TO_NATIVE() mappings
1430      * are necessary in EBCDIC, they are redundant no-ops
1431      * in ASCII-ish platforms, and hopefully optimized away. */
1432     const UV uv1 = NATIVE_TO_UNI(uv0);
1433     uvuni_to_utf8(tmpbuf, uv1);
1434
1435     if (!*swashp) /* load on-demand */
1436          *swashp = swash_init("utf8", normal, &PL_sv_undef, 4, 0);
1437
1438     /* The 0xDF is the only special casing Unicode code point below 0x100. */
1439     if (special && (uv1 == 0xDF || uv1 > 0xFF)) {
1440          /* It might be "special" (sometimes, but not always,
1441           * a multicharacter mapping) */
1442          HV *hv;
1443          SV **svp;
1444
1445          if ((hv  = get_hv(special, FALSE)) &&
1446              (svp = hv_fetch(hv, (const char*)tmpbuf, UNISKIP(uv1), FALSE)) &&
1447              (*svp)) {
1448               char *s;
1449
1450               s = SvPV(*svp, len);
1451               if (len == 1)
1452                    len = uvuni_to_utf8(ustrp, NATIVE_TO_UNI(*(U8*)s)) - ustrp;
1453               else {
1454 #ifdef EBCDIC
1455                    /* If we have EBCDIC we need to remap the characters
1456                     * since any characters in the low 256 are Unicode
1457                     * code points, not EBCDIC. */
1458                    U8 *t = (U8*)s, *tend = t + len, *d;
1459                 
1460                    d = tmpbuf;
1461                    if (SvUTF8(*svp)) {
1462                         STRLEN tlen = 0;
1463                         
1464                         while (t < tend) {
1465                              UV c = utf8_to_uvchr(t, &tlen);
1466                              if (tlen > 0) {
1467                                   d = uvchr_to_utf8(d, UNI_TO_NATIVE(c));
1468                                   t += tlen;
1469                              }
1470                              else
1471                                   break;
1472                         }
1473                    }
1474                    else {
1475                         while (t < tend) {
1476                              d = uvchr_to_utf8(d, UNI_TO_NATIVE(*t));
1477                              t++;
1478                         }
1479                    }
1480                    len = d - tmpbuf;
1481                    Copy(tmpbuf, ustrp, len, U8);
1482 #else
1483                    Copy(s, ustrp, len, U8);
1484 #endif
1485               }
1486          }
1487     }
1488
1489     if (!len && *swashp) {
1490          UV uv2 = swash_fetch(*swashp, tmpbuf, TRUE);
1491          
1492          if (uv2) {
1493               /* It was "normal" (a single character mapping). */
1494               UV uv3 = UNI_TO_NATIVE(uv2);
1495               
1496               len = uvchr_to_utf8(ustrp, uv3) - ustrp;
1497          }
1498     }
1499
1500     if (!len) /* Neither: just copy. */
1501          len = uvchr_to_utf8(ustrp, uv0) - ustrp;
1502
1503     if (lenp)
1504          *lenp = len;
1505
1506     return len ? utf8_to_uvchr(ustrp, 0) : 0;
1507 }
1508
1509 /*
1510 =for apidoc A|UV|to_utf8_upper|const U8 *p|U8 *ustrp|STRLEN *lenp
1511
1512 Convert the UTF-8 encoded character at p to its uppercase version and
1513 store that in UTF-8 in ustrp and its length in bytes in lenp.  Note
1514 that the ustrp needs to be at least UTF8_MAXBYTES_CASE+1 bytes since
1515 the uppercase version may be longer than the original character.
1516
1517 The first character of the uppercased version is returned
1518 (but note, as explained above, that there may be more.)
1519
1520 =cut */
1521
1522 UV
1523 Perl_to_utf8_upper(pTHX_ const U8 *p, U8* ustrp, STRLEN *lenp)
1524 {
1525     return Perl_to_utf8_case(aTHX_ p, ustrp, lenp,
1526                              &PL_utf8_toupper, "ToUpper", "utf8::ToSpecUpper");
1527 }
1528
1529 /*
1530 =for apidoc A|UV|to_utf8_title|const U8 *p|U8 *ustrp|STRLEN *lenp
1531
1532 Convert the UTF-8 encoded character at p to its titlecase version and
1533 store that in UTF-8 in ustrp and its length in bytes in lenp.  Note
1534 that the ustrp needs to be at least UTF8_MAXBYTES_CASE+1 bytes since the
1535 titlecase version may be longer than the original character.
1536
1537 The first character of the titlecased version is returned
1538 (but note, as explained above, that there may be more.)
1539
1540 =cut */
1541
1542 UV
1543 Perl_to_utf8_title(pTHX_ const U8 *p, U8* ustrp, STRLEN *lenp)
1544 {
1545     return Perl_to_utf8_case(aTHX_ p, ustrp, lenp,
1546                              &PL_utf8_totitle, "ToTitle", "utf8::ToSpecTitle");
1547 }
1548
1549 /*
1550 =for apidoc A|UV|to_utf8_lower|const U8 *p|U8 *ustrp|STRLEN *lenp
1551
1552 Convert the UTF-8 encoded character at p to its lowercase version and
1553 store that in UTF-8 in ustrp and its length in bytes in lenp.  Note
1554 that the ustrp needs to be at least UTF8_MAXBYTES_CASE+1 bytes since the
1555 lowercase version may be longer than the original character.
1556
1557 The first character of the lowercased version is returned
1558 (but note, as explained above, that there may be more.)
1559
1560 =cut */
1561
1562 UV
1563 Perl_to_utf8_lower(pTHX_ const U8 *p, U8* ustrp, STRLEN *lenp)
1564 {
1565     return Perl_to_utf8_case(aTHX_ p, ustrp, lenp,
1566                              &PL_utf8_tolower, "ToLower", "utf8::ToSpecLower");
1567 }
1568
1569 /*
1570 =for apidoc A|UV|to_utf8_fold|const U8 *p|U8 *ustrp|STRLEN *lenp
1571
1572 Convert the UTF-8 encoded character at p to its foldcase version and
1573 store that in UTF-8 in ustrp and its length in bytes in lenp.  Note
1574 that the ustrp needs to be at least UTF8_MAXBYTES_CASE+1 bytes since the
1575 foldcase version may be longer than the original character (up to
1576 three characters).
1577
1578 The first character of the foldcased version is returned
1579 (but note, as explained above, that there may be more.)
1580
1581 =cut */
1582
1583 UV
1584 Perl_to_utf8_fold(pTHX_ const U8 *p, U8* ustrp, STRLEN *lenp)
1585 {
1586     return Perl_to_utf8_case(aTHX_ p, ustrp, lenp,
1587                              &PL_utf8_tofold, "ToFold", "utf8::ToSpecFold");
1588 }
1589
1590 /* a "swash" is a swatch hash */
1591
1592 SV*
1593 Perl_swash_init(pTHX_ const char* pkg, const char* name, SV *listsv, I32 minbits, I32 none)
1594 {
1595     dVAR;
1596     SV* retval;
1597     SV* tokenbufsv = sv_newmortal();
1598     dSP;
1599     const size_t pkg_len = strlen(pkg);
1600     const size_t name_len = strlen(name);
1601     HV *stash = gv_stashpvn(pkg, pkg_len, FALSE);
1602     SV* errsv_save;
1603
1604     PUSHSTACKi(PERLSI_MAGIC);
1605     ENTER;
1606     SAVEI32(PL_hints);
1607     PL_hints = 0;
1608     save_re_context();
1609     if (!gv_fetchmeth(stash, "SWASHNEW", 8, -1)) {      /* demand load utf8 */
1610         ENTER;
1611         errsv_save = newSVsv(ERRSV);
1612         Perl_load_module(aTHX_ PERL_LOADMOD_NOIMPORT, newSVpvn(pkg,pkg_len),
1613                          Nullsv);
1614         if (!SvTRUE(ERRSV))
1615             sv_setsv(ERRSV, errsv_save);
1616         SvREFCNT_dec(errsv_save);
1617         LEAVE;
1618     }
1619     SPAGAIN;
1620     PUSHMARK(SP);
1621     EXTEND(SP,5);
1622     PUSHs(sv_2mortal(newSVpvn(pkg, pkg_len)));
1623     PUSHs(sv_2mortal(newSVpvn(name, name_len)));
1624     PUSHs(listsv);
1625     PUSHs(sv_2mortal(newSViv(minbits)));
1626     PUSHs(sv_2mortal(newSViv(none)));
1627     PUTBACK;
1628     if (IN_PERL_COMPILETIME) {
1629         /* XXX ought to be handled by lex_start */
1630         SAVEI32(PL_in_my);
1631         PL_in_my = 0;
1632         sv_setpv(tokenbufsv, PL_tokenbuf);
1633     }
1634     errsv_save = newSVsv(ERRSV);
1635     if (call_method("SWASHNEW", G_SCALAR))
1636         retval = newSVsv(*PL_stack_sp--);
1637     else
1638         retval = &PL_sv_undef;
1639     if (!SvTRUE(ERRSV))
1640         sv_setsv(ERRSV, errsv_save);
1641     SvREFCNT_dec(errsv_save);
1642     LEAVE;
1643     POPSTACK;
1644     if (IN_PERL_COMPILETIME) {
1645         STRLEN len;
1646         const char* pv = SvPV(tokenbufsv, len);
1647
1648         Copy(pv, PL_tokenbuf, len+1, char);
1649         PL_curcop->op_private = (U8)(PL_hints & HINT_PRIVATE_MASK);
1650     }
1651     if (!SvROK(retval) || SvTYPE(SvRV(retval)) != SVt_PVHV) {
1652         if (SvPOK(retval))
1653             Perl_croak(aTHX_ "Can't find Unicode property definition \"%"SVf"\"",
1654                        retval);
1655         Perl_croak(aTHX_ "SWASHNEW didn't return an HV ref");
1656     }
1657     return retval;
1658 }
1659
1660
1661 /* This API is wrong for special case conversions since we may need to
1662  * return several Unicode characters for a single Unicode character
1663  * (see lib/unicore/SpecCase.txt) The SWASHGET in lib/utf8_heavy.pl is
1664  * the lower-level routine, and it is similarly broken for returning
1665  * multiple values.  --jhi */
1666 UV
1667 Perl_swash_fetch(pTHX_ SV *sv, const U8 *ptr, bool do_utf8)
1668 {
1669     dVAR;
1670     HV* hv = (HV*)SvRV(sv);
1671     U32 klen;
1672     U32 off;
1673     STRLEN slen;
1674     STRLEN needents;
1675     U8 *tmps = NULL;
1676     U32 bit;
1677     SV *retval;
1678     U8 tmputf8[2];
1679     UV c = NATIVE_TO_ASCII(*ptr);
1680
1681     if (!do_utf8 && !UNI_IS_INVARIANT(c)) {
1682         tmputf8[0] = (U8)UTF8_EIGHT_BIT_HI(c);
1683         tmputf8[1] = (U8)UTF8_EIGHT_BIT_LO(c);
1684         ptr = tmputf8;
1685     }
1686     /* Given a UTF-X encoded char 0xAA..0xYY,0xZZ
1687      * then the "swatch" is a vec() for al the chars which start
1688      * with 0xAA..0xYY
1689      * So the key in the hash (klen) is length of encoded char -1
1690      */
1691     klen = UTF8SKIP(ptr) - 1;
1692     off  = ptr[klen];
1693
1694     if (klen == 0)
1695      {
1696       /* If char in invariant then swatch is for all the invariant chars
1697        * In both UTF-8 and UTF-8-MOD that happens to be UTF_CONTINUATION_MARK
1698        */
1699       needents = UTF_CONTINUATION_MARK;
1700       off      = NATIVE_TO_UTF(ptr[klen]);
1701      }
1702     else
1703      {
1704       /* If char is encoded then swatch is for the prefix */
1705       needents = (1 << UTF_ACCUMULATION_SHIFT);
1706       off      = NATIVE_TO_UTF(ptr[klen]) & UTF_CONTINUATION_MASK;
1707      }
1708
1709     /*
1710      * This single-entry cache saves about 1/3 of the utf8 overhead in test
1711      * suite.  (That is, only 7-8% overall over just a hash cache.  Still,
1712      * it's nothing to sniff at.)  Pity we usually come through at least
1713      * two function calls to get here...
1714      *
1715      * NB: this code assumes that swatches are never modified, once generated!
1716      */
1717
1718     if (hv   == PL_last_swash_hv &&
1719         klen == PL_last_swash_klen &&
1720         (!klen || memEQ((char *)ptr, (char *)PL_last_swash_key, klen)) )
1721     {
1722         tmps = PL_last_swash_tmps;
1723         slen = PL_last_swash_slen;
1724     }
1725     else {
1726         /* Try our second-level swatch cache, kept in a hash. */
1727         SV** svp = hv_fetch(hv, (const char*)ptr, klen, FALSE);
1728
1729         /* If not cached, generate it via utf8::SWASHGET */
1730         if (!svp || !SvPOK(*svp) || !(tmps = (U8*)SvPV(*svp, slen))) {
1731             dSP;
1732             /* We use utf8n_to_uvuni() as we want an index into
1733                Unicode tables, not a native character number.
1734              */
1735             UV code_point = utf8n_to_uvuni(ptr, UTF8_MAXBYTES, 0,
1736                                            ckWARN(WARN_UTF8) ?
1737                                            0 : UTF8_ALLOW_ANY);
1738             SV *errsv_save;
1739             ENTER;
1740             SAVETMPS;
1741             save_re_context();
1742             PUSHSTACKi(PERLSI_MAGIC);
1743             PUSHMARK(SP);
1744             EXTEND(SP,3);
1745             PUSHs((SV*)sv);
1746             /* On EBCDIC & ~(0xA0-1) isn't a useful thing to do */
1747             PUSHs(sv_2mortal(newSViv((klen) ?
1748                                      (code_point & ~(needents - 1)) : 0)));
1749             PUSHs(sv_2mortal(newSViv(needents)));
1750             PUTBACK;
1751             errsv_save = newSVsv(ERRSV);
1752             if (call_method("SWASHGET", G_SCALAR))
1753                 retval = newSVsv(*PL_stack_sp--);
1754             else
1755                 retval = &PL_sv_undef;
1756             if (!SvTRUE(ERRSV))
1757                 sv_setsv(ERRSV, errsv_save);
1758             SvREFCNT_dec(errsv_save);
1759             POPSTACK;
1760             FREETMPS;
1761             LEAVE;
1762             if (IN_PERL_COMPILETIME)
1763                 PL_curcop->op_private = (U8)(PL_hints & HINT_PRIVATE_MASK);
1764
1765             svp = hv_store(hv, (const char *)ptr, klen, retval, 0);
1766
1767             if (!svp || !(tmps = (U8*)SvPV(*svp, slen)) || (slen << 3) < needents)
1768                 Perl_croak(aTHX_ "SWASHGET didn't return result of proper length");
1769         }
1770
1771         PL_last_swash_hv = hv;
1772         PL_last_swash_klen = klen;
1773         PL_last_swash_tmps = tmps;
1774         PL_last_swash_slen = slen;
1775         if (klen)
1776             Copy(ptr, PL_last_swash_key, klen, U8);
1777     }
1778
1779     switch ((int)((slen << 3) / needents)) {
1780     case 1:
1781         bit = 1 << (off & 7);
1782         off >>= 3;
1783         return (tmps[off] & bit) != 0;
1784     case 8:
1785         return tmps[off];
1786     case 16:
1787         off <<= 1;
1788         return (tmps[off] << 8) + tmps[off + 1] ;
1789     case 32:
1790         off <<= 2;
1791         return (tmps[off] << 24) + (tmps[off+1] << 16) + (tmps[off+2] << 8) + tmps[off + 3] ;
1792     }
1793     Perl_croak(aTHX_ "panic: swash_fetch");
1794     return 0;
1795 }
1796
1797
1798 /*
1799 =for apidoc A|U8 *|uvchr_to_utf8|U8 *d|UV uv
1800
1801 Adds the UTF-8 representation of the Native codepoint C<uv> to the end
1802 of the string C<d>; C<d> should be have at least C<UTF8_MAXBYTES+1> free
1803 bytes available. The return value is the pointer to the byte after the
1804 end of the new character. In other words,
1805
1806     d = uvchr_to_utf8(d, uv);
1807
1808 is the recommended wide native character-aware way of saying
1809
1810     *(d++) = uv;
1811
1812 =cut
1813 */
1814
1815 /* On ASCII machines this is normally a macro but we want a
1816    real function in case XS code wants it
1817 */
1818 #undef Perl_uvchr_to_utf8
1819 U8 *
1820 Perl_uvchr_to_utf8(pTHX_ U8 *d, UV uv)
1821 {
1822     return Perl_uvuni_to_utf8_flags(aTHX_ d, NATIVE_TO_UNI(uv), 0);
1823 }
1824
1825 U8 *
1826 Perl_uvchr_to_utf8_flags(pTHX_ U8 *d, UV uv, UV flags)
1827 {
1828     return Perl_uvuni_to_utf8_flags(aTHX_ d, NATIVE_TO_UNI(uv), flags);
1829 }
1830
1831 /*
1832 =for apidoc A|UV|utf8n_to_uvchr|U8 *s|STRLEN curlen|STRLEN *retlen|U32 flags
1833
1834 Returns the native character value of the first character in the string C<s>
1835 which is assumed to be in UTF-8 encoding; C<retlen> will be set to the
1836 length, in bytes, of that character.
1837
1838 Allows length and flags to be passed to low level routine.
1839
1840 =cut
1841 */
1842 /* On ASCII machines this is normally a macro but we want
1843    a real function in case XS code wants it
1844 */
1845 #undef Perl_utf8n_to_uvchr
1846 UV
1847 Perl_utf8n_to_uvchr(pTHX_ const U8 *s, STRLEN curlen, STRLEN *retlen, U32 flags)
1848 {
1849     UV uv = Perl_utf8n_to_uvuni(aTHX_ s, curlen, retlen, flags);
1850     return UNI_TO_NATIVE(uv);
1851 }
1852
1853 /*
1854 =for apidoc A|char *|pv_uni_display|SV *dsv|U8 *spv|STRLEN len|STRLEN pvlim|UV flags
1855
1856 Build to the scalar dsv a displayable version of the string spv,
1857 length len, the displayable version being at most pvlim bytes long
1858 (if longer, the rest is truncated and "..." will be appended).
1859
1860 The flags argument can have UNI_DISPLAY_ISPRINT set to display
1861 isPRINT()able characters as themselves, UNI_DISPLAY_BACKSLASH
1862 to display the \\[nrfta\\] as the backslashed versions (like '\n')
1863 (UNI_DISPLAY_BACKSLASH is preferred over UNI_DISPLAY_ISPRINT for \\).
1864 UNI_DISPLAY_QQ (and its alias UNI_DISPLAY_REGEX) have both
1865 UNI_DISPLAY_BACKSLASH and UNI_DISPLAY_ISPRINT turned on.
1866
1867 The pointer to the PV of the dsv is returned.
1868
1869 =cut */
1870 char *
1871 Perl_pv_uni_display(pTHX_ SV *dsv, const U8 *spv, STRLEN len, STRLEN pvlim, UV flags)
1872 {
1873     int truncated = 0;
1874     const char *s, *e;
1875
1876     sv_setpvn(dsv, "", 0);
1877     for (s = (const char *)spv, e = s + len; s < e; s += UTF8SKIP(s)) {
1878          UV u;
1879           /* This serves double duty as a flag and a character to print after
1880              a \ when flags & UNI_DISPLAY_BACKSLASH is true.
1881           */
1882          char ok = 0;
1883
1884          if (pvlim && SvCUR(dsv) >= pvlim) {
1885               truncated++;
1886               break;
1887          }
1888          u = utf8_to_uvchr((U8*)s, 0);
1889          if (u < 256) {
1890              const unsigned char c = (unsigned char)u & 0xFF;
1891              if (!ok && (flags & UNI_DISPLAY_BACKSLASH)) {
1892                  switch (c) {
1893                  case '\n':
1894                      ok = 'n'; break;
1895                  case '\r':
1896                      ok = 'r'; break;
1897                  case '\t':
1898                      ok = 't'; break;
1899                  case '\f':
1900                      ok = 'f'; break;
1901                  case '\a':
1902                      ok = 'a'; break;
1903                  case '\\':
1904                      ok = '\\'; break;
1905                  default: break;
1906                  }
1907                  if (ok) {
1908                      Perl_sv_catpvf(aTHX_ dsv, "\\%c", ok);
1909                  }
1910              }
1911              /* isPRINT() is the locale-blind version. */
1912              if (!ok && (flags & UNI_DISPLAY_ISPRINT) && isPRINT(c)) {
1913                  Perl_sv_catpvf(aTHX_ dsv, "%c", c);
1914                  ok = 1;
1915              }
1916          }
1917          if (!ok)
1918              Perl_sv_catpvf(aTHX_ dsv, "\\x{%"UVxf"}", u);
1919     }
1920     if (truncated)
1921          sv_catpvn(dsv, "...", 3);
1922     
1923     return SvPVX(dsv);
1924 }
1925
1926 /*
1927 =for apidoc A|char *|sv_uni_display|SV *dsv|SV *ssv|STRLEN pvlim|UV flags
1928
1929 Build to the scalar dsv a displayable version of the scalar sv,
1930 the displayable version being at most pvlim bytes long
1931 (if longer, the rest is truncated and "..." will be appended).
1932
1933 The flags argument is as in pv_uni_display().
1934
1935 The pointer to the PV of the dsv is returned.
1936
1937 =cut */
1938 char *
1939 Perl_sv_uni_display(pTHX_ SV *dsv, SV *ssv, STRLEN pvlim, UV flags)
1940 {
1941      return Perl_pv_uni_display(aTHX_ dsv, (U8*)SvPVX(ssv), SvCUR(ssv),
1942                                 pvlim, flags);
1943 }
1944
1945 /*
1946 =for apidoc A|I32|ibcmp_utf8|const char *s1|char **pe1|register UV l1|bool u1|const char *s2|char **pe2|register UV l2|bool u2
1947
1948 Return true if the strings s1 and s2 differ case-insensitively, false
1949 if not (if they are equal case-insensitively).  If u1 is true, the
1950 string s1 is assumed to be in UTF-8-encoded Unicode.  If u2 is true,
1951 the string s2 is assumed to be in UTF-8-encoded Unicode.  If u1 or u2
1952 are false, the respective string is assumed to be in native 8-bit
1953 encoding.
1954
1955 If the pe1 and pe2 are non-NULL, the scanning pointers will be copied
1956 in there (they will point at the beginning of the I<next> character).
1957 If the pointers behind pe1 or pe2 are non-NULL, they are the end
1958 pointers beyond which scanning will not continue under any
1959 circumstances.  If the byte lengths l1 and l2 are non-zero, s1+l1 and
1960 s2+l2 will be used as goal end pointers that will also stop the scan,
1961 and which qualify towards defining a successful match: all the scans
1962 that define an explicit length must reach their goal pointers for
1963 a match to succeed).
1964
1965 For case-insensitiveness, the "casefolding" of Unicode is used
1966 instead of upper/lowercasing both the characters, see
1967 http://www.unicode.org/unicode/reports/tr21/ (Case Mappings).
1968
1969 =cut */
1970 I32
1971 Perl_ibcmp_utf8(pTHX_ const char *s1, char **pe1, register UV l1, bool u1, const char *s2, char **pe2, register UV l2, bool u2)
1972 {
1973      register const U8 *p1  = (const U8*)s1;
1974      register const U8 *p2  = (const U8*)s2;
1975      register const U8 *f1 = 0, *f2 = 0;
1976      register U8 *e1 = 0, *q1 = 0;
1977      register U8 *e2 = 0, *q2 = 0;
1978      STRLEN n1 = 0, n2 = 0;
1979      U8 foldbuf1[UTF8_MAXBYTES_CASE+1];
1980      U8 foldbuf2[UTF8_MAXBYTES_CASE+1];
1981      U8 natbuf[1+1];
1982      STRLEN foldlen1, foldlen2;
1983      bool match;
1984      
1985      if (pe1)
1986           e1 = *(U8**)pe1;
1987      if (e1 == 0 || (l1 && l1 < (UV)(e1 - (const U8*)s1)))
1988           f1 = (const U8*)s1 + l1;
1989      if (pe2)
1990           e2 = *(U8**)pe2;
1991      if (e2 == 0 || (l2 && l2 < (UV)(e2 - (const U8*)s2)))
1992           f2 = (const U8*)s2 + l2;
1993
1994      if ((e1 == 0 && f1 == 0) || (e2 == 0 && f2 == 0) || (f1 == 0 && f2 == 0))
1995           return 1; /* mismatch; possible infinite loop or false positive */
1996
1997      if (!u1 || !u2)
1998           natbuf[1] = 0; /* Need to terminate the buffer. */
1999
2000      while ((e1 == 0 || p1 < e1) &&
2001             (f1 == 0 || p1 < f1) &&
2002             (e2 == 0 || p2 < e2) &&
2003             (f2 == 0 || p2 < f2)) {
2004           if (n1 == 0) {
2005                if (u1)
2006                     to_utf8_fold(p1, foldbuf1, &foldlen1);
2007                else {
2008                     natbuf[0] = *p1;
2009                     to_utf8_fold(natbuf, foldbuf1, &foldlen1);
2010                }
2011                q1 = foldbuf1;
2012                n1 = foldlen1;
2013           }
2014           if (n2 == 0) {
2015                if (u2)
2016                     to_utf8_fold(p2, foldbuf2, &foldlen2);
2017                else {
2018                     natbuf[0] = *p2;
2019                     to_utf8_fold(natbuf, foldbuf2, &foldlen2);
2020                }
2021                q2 = foldbuf2;
2022                n2 = foldlen2;
2023           }
2024           while (n1 && n2) {
2025                if ( UTF8SKIP(q1) != UTF8SKIP(q2) ||
2026                    (UTF8SKIP(q1) == 1 && *q1 != *q2) ||
2027                     memNE((char*)q1, (char*)q2, UTF8SKIP(q1)) )
2028                    return 1; /* mismatch */
2029                n1 -= UTF8SKIP(q1);
2030                q1 += UTF8SKIP(q1);
2031                n2 -= UTF8SKIP(q2);
2032                q2 += UTF8SKIP(q2);
2033           }
2034           if (n1 == 0)
2035                p1 += u1 ? UTF8SKIP(p1) : 1;
2036           if (n2 == 0)
2037                p2 += u2 ? UTF8SKIP(p2) : 1;
2038
2039      }
2040
2041      /* A match is defined by all the scans that specified
2042       * an explicit length reaching their final goals. */
2043      match = (f1 == 0 || p1 == f1) && (f2 == 0 || p2 == f2);
2044
2045      if (match) {
2046           if (pe1)
2047                *pe1 = (char*)p1;
2048           if (pe2)
2049                *pe2 = (char*)p2;
2050      }
2051
2052      return match ? 0 : 1; /* 0 match, 1 mismatch */
2053 }
2054
2055 /*
2056  * Local variables:
2057  * c-indentation-style: bsd
2058  * c-basic-offset: 4
2059  * indent-tabs-mode: t
2060  * End:
2061  *
2062  * ex: set ts=8 sts=4 sw=4 noet:
2063  */