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