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