This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
utf8.c: Revise internal API of swash_init()
[perl5.git] / utf8.c
1 /*    utf8.c
2  *
3  *    Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
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  *     [p.603 of _The Lord of the Rings_, IV/I: "The Taming of Sméagol"]
17  *
18  * 'Well do I understand your speech,' he answered in the same language;
19  * 'yet few strangers do so.  Why then do you not speak in the Common Tongue,
20  *  as is the custom in the West, if you wish to be answered?'
21  *                           --Gandalf, addressing Théoden's door wardens
22  *
23  *     [p.508 of _The Lord of the Rings_, III/vi: "The King of the Golden Hall"]
24  *
25  * ...the travellers perceived that the floor was paved with stones of many
26  * hues; branching runes and strange devices intertwined beneath their feet.
27  *
28  *     [p.512 of _The Lord of the Rings_, III/vi: "The King of the Golden Hall"]
29  */
30
31 #include "EXTERN.h"
32 #define PERL_IN_UTF8_C
33 #include "perl.h"
34 #include "inline_invlist.c"
35
36 #ifndef EBCDIC
37 /* Separate prototypes needed because in ASCII systems these are
38  * usually macros but they still are compiled as code, too. */
39 PERL_CALLCONV UV        Perl_utf8n_to_uvchr(pTHX_ const U8 *s, STRLEN curlen, STRLEN *retlen, U32 flags);
40 PERL_CALLCONV U8*       Perl_uvchr_to_utf8(pTHX_ U8 *d, UV uv);
41 #endif
42
43 static const char unees[] =
44     "Malformed UTF-8 character (unexpected end of string)";
45
46 /*
47 =head1 Unicode Support
48
49 This file contains various utility functions for manipulating UTF8-encoded
50 strings. For the uninitiated, this is a method of representing arbitrary
51 Unicode characters as a variable number of bytes, in such a way that
52 characters in the ASCII range are unmodified, and a zero byte never appears
53 within non-zero characters.
54
55 =cut
56 */
57
58 /*
59 =for apidoc is_ascii_string
60
61 Returns true if the first C<len> bytes of the string C<s> are the same whether
62 or not the string is encoded in UTF-8 (or UTF-EBCDIC on EBCDIC machines).  That
63 is, if they are invariant.  On ASCII-ish machines, only ASCII characters
64 fit this definition, hence the function's name.
65
66 If C<len> is 0, it will be calculated using C<strlen(s)>.  
67
68 See also L</is_utf8_string>(), L</is_utf8_string_loclen>(), and L</is_utf8_string_loc>().
69
70 =cut
71 */
72
73 bool
74 Perl_is_ascii_string(const U8 *s, STRLEN len)
75 {
76     const U8* const send = s + (len ? len : strlen((const char *)s));
77     const U8* x = s;
78
79     PERL_ARGS_ASSERT_IS_ASCII_STRING;
80
81     for (; x < send; ++x) {
82         if (!UTF8_IS_INVARIANT(*x))
83             break;
84     }
85
86     return x == send;
87 }
88
89 /*
90 =for apidoc uvuni_to_utf8_flags
91
92 Adds the UTF-8 representation of the code point C<uv> to the end
93 of the string C<d>; C<d> should have at least C<UTF8_MAXBYTES+1> free
94 bytes available. The return value is the pointer to the byte after the
95 end of the new character. In other words,
96
97     d = uvuni_to_utf8_flags(d, uv, flags);
98
99 or, in most cases,
100
101     d = uvuni_to_utf8(d, uv);
102
103 (which is equivalent to)
104
105     d = uvuni_to_utf8_flags(d, uv, 0);
106
107 This is the recommended Unicode-aware way of saying
108
109     *(d++) = uv;
110
111 This function will convert to UTF-8 (and not warn) even code points that aren't
112 legal Unicode or are problematic, unless C<flags> contains one or more of the
113 following flags:
114
115 If C<uv> is a Unicode surrogate code point and UNICODE_WARN_SURROGATE is set,
116 the function will raise a warning, provided UTF8 warnings are enabled.  If instead
117 UNICODE_DISALLOW_SURROGATE is set, the function will fail and return NULL.
118 If both flags are set, the function will both warn and return NULL.
119
120 The UNICODE_WARN_NONCHAR and UNICODE_DISALLOW_NONCHAR flags correspondingly
121 affect how the function handles a Unicode non-character.  And, likewise for the
122 UNICODE_WARN_SUPER and UNICODE_DISALLOW_SUPER flags, and code points that are
123 above the Unicode maximum of 0x10FFFF.  Code points above 0x7FFF_FFFF (which are
124 even less portable) can be warned and/or disallowed even if other above-Unicode
125 code points are accepted by the UNICODE_WARN_FE_FF and UNICODE_DISALLOW_FE_FF
126 flags.
127
128 And finally, the flag UNICODE_WARN_ILLEGAL_INTERCHANGE selects all four of the
129 above WARN flags; and UNICODE_DISALLOW_ILLEGAL_INTERCHANGE selects all four
130 DISALLOW flags.
131
132
133 =cut
134 */
135
136 U8 *
137 Perl_uvuni_to_utf8_flags(pTHX_ U8 *d, UV uv, UV flags)
138 {
139     PERL_ARGS_ASSERT_UVUNI_TO_UTF8_FLAGS;
140
141     /* The first problematic code point is the first surrogate */
142     if (uv >= UNICODE_SURROGATE_FIRST
143         && ckWARN4_d(WARN_UTF8, WARN_SURROGATE, WARN_NON_UNICODE, WARN_NONCHAR))
144     {
145         if (UNICODE_IS_SURROGATE(uv)) {
146             if (flags & UNICODE_WARN_SURROGATE) {
147                 Perl_ck_warner_d(aTHX_ packWARN(WARN_SURROGATE),
148                                             "UTF-16 surrogate U+%04"UVXf, uv);
149             }
150             if (flags & UNICODE_DISALLOW_SURROGATE) {
151                 return NULL;
152             }
153         }
154         else if (UNICODE_IS_SUPER(uv)) {
155             if (flags & UNICODE_WARN_SUPER
156                 || (UNICODE_IS_FE_FF(uv) && (flags & UNICODE_WARN_FE_FF)))
157             {
158                 Perl_ck_warner_d(aTHX_ packWARN(WARN_NON_UNICODE),
159                           "Code point 0x%04"UVXf" is not Unicode, may not be portable", uv);
160             }
161             if (flags & UNICODE_DISALLOW_SUPER
162                 || (UNICODE_IS_FE_FF(uv) && (flags & UNICODE_DISALLOW_FE_FF)))
163             {
164                 return NULL;
165             }
166         }
167         else if (UNICODE_IS_NONCHAR(uv)) {
168             if (flags & UNICODE_WARN_NONCHAR) {
169                 Perl_ck_warner_d(aTHX_ packWARN(WARN_NONCHAR),
170                  "Unicode non-character U+%04"UVXf" is illegal for open interchange",
171                  uv);
172             }
173             if (flags & UNICODE_DISALLOW_NONCHAR) {
174                 return NULL;
175             }
176         }
177     }
178     if (UNI_IS_INVARIANT(uv)) {
179         *d++ = (U8)UTF_TO_NATIVE(uv);
180         return d;
181     }
182 #if defined(EBCDIC)
183     else {
184         STRLEN len  = UNISKIP(uv);
185         U8 *p = d+len-1;
186         while (p > d) {
187             *p-- = (U8)UTF_TO_NATIVE((uv & UTF_CONTINUATION_MASK) | UTF_CONTINUATION_MARK);
188             uv >>= UTF_ACCUMULATION_SHIFT;
189         }
190         *p = (U8)UTF_TO_NATIVE((uv & UTF_START_MASK(len)) | UTF_START_MARK(len));
191         return d+len;
192     }
193 #else /* Non loop style */
194     if (uv < 0x800) {
195         *d++ = (U8)(( uv >>  6)         | 0xc0);
196         *d++ = (U8)(( uv        & 0x3f) | 0x80);
197         return d;
198     }
199     if (uv < 0x10000) {
200         *d++ = (U8)(( uv >> 12)         | 0xe0);
201         *d++ = (U8)(((uv >>  6) & 0x3f) | 0x80);
202         *d++ = (U8)(( uv        & 0x3f) | 0x80);
203         return d;
204     }
205     if (uv < 0x200000) {
206         *d++ = (U8)(( uv >> 18)         | 0xf0);
207         *d++ = (U8)(((uv >> 12) & 0x3f) | 0x80);
208         *d++ = (U8)(((uv >>  6) & 0x3f) | 0x80);
209         *d++ = (U8)(( uv        & 0x3f) | 0x80);
210         return d;
211     }
212     if (uv < 0x4000000) {
213         *d++ = (U8)(( uv >> 24)         | 0xf8);
214         *d++ = (U8)(((uv >> 18) & 0x3f) | 0x80);
215         *d++ = (U8)(((uv >> 12) & 0x3f) | 0x80);
216         *d++ = (U8)(((uv >>  6) & 0x3f) | 0x80);
217         *d++ = (U8)(( uv        & 0x3f) | 0x80);
218         return d;
219     }
220     if (uv < 0x80000000) {
221         *d++ = (U8)(( uv >> 30)         | 0xfc);
222         *d++ = (U8)(((uv >> 24) & 0x3f) | 0x80);
223         *d++ = (U8)(((uv >> 18) & 0x3f) | 0x80);
224         *d++ = (U8)(((uv >> 12) & 0x3f) | 0x80);
225         *d++ = (U8)(((uv >>  6) & 0x3f) | 0x80);
226         *d++ = (U8)(( uv        & 0x3f) | 0x80);
227         return d;
228     }
229 #ifdef HAS_QUAD
230     if (uv < UTF8_QUAD_MAX)
231 #endif
232     {
233         *d++ =                            0xfe; /* Can't match U+FEFF! */
234         *d++ = (U8)(((uv >> 30) & 0x3f) | 0x80);
235         *d++ = (U8)(((uv >> 24) & 0x3f) | 0x80);
236         *d++ = (U8)(((uv >> 18) & 0x3f) | 0x80);
237         *d++ = (U8)(((uv >> 12) & 0x3f) | 0x80);
238         *d++ = (U8)(((uv >>  6) & 0x3f) | 0x80);
239         *d++ = (U8)(( uv        & 0x3f) | 0x80);
240         return d;
241     }
242 #ifdef HAS_QUAD
243     {
244         *d++ =                            0xff;         /* Can't match U+FFFE! */
245         *d++ =                            0x80;         /* 6 Reserved bits */
246         *d++ = (U8)(((uv >> 60) & 0x0f) | 0x80);        /* 2 Reserved bits */
247         *d++ = (U8)(((uv >> 54) & 0x3f) | 0x80);
248         *d++ = (U8)(((uv >> 48) & 0x3f) | 0x80);
249         *d++ = (U8)(((uv >> 42) & 0x3f) | 0x80);
250         *d++ = (U8)(((uv >> 36) & 0x3f) | 0x80);
251         *d++ = (U8)(((uv >> 30) & 0x3f) | 0x80);
252         *d++ = (U8)(((uv >> 24) & 0x3f) | 0x80);
253         *d++ = (U8)(((uv >> 18) & 0x3f) | 0x80);
254         *d++ = (U8)(((uv >> 12) & 0x3f) | 0x80);
255         *d++ = (U8)(((uv >>  6) & 0x3f) | 0x80);
256         *d++ = (U8)(( uv        & 0x3f) | 0x80);
257         return d;
258     }
259 #endif
260 #endif /* Loop style */
261 }
262
263 /*
264
265 Tests if the first C<len> bytes of string C<s> form a valid UTF-8
266 character.  Note that an INVARIANT (i.e. ASCII) character is a valid
267 UTF-8 character.  The number of bytes in the UTF-8 character
268 will be returned if it is valid, otherwise 0.
269
270 This is the "slow" version as opposed to the "fast" version which is
271 the "unrolled" IS_UTF8_CHAR().  E.g. for t/uni/class.t the speed
272 difference is a factor of 2 to 3.  For lengths (UTF8SKIP(s)) of four
273 or less you should use the IS_UTF8_CHAR(), for lengths of five or more
274 you should use the _slow().  In practice this means that the _slow()
275 will be used very rarely, since the maximum Unicode code point (as of
276 Unicode 4.1) is U+10FFFF, which encodes in UTF-8 to four bytes.  Only
277 the "Perl extended UTF-8" (the infamous 'v-strings') will encode into
278 five bytes or more.
279
280 =cut */
281 STATIC STRLEN
282 S_is_utf8_char_slow(const U8 *s, const STRLEN len)
283 {
284     dTHX;   /* The function called below requires thread context */
285
286     STRLEN actual_len;
287
288     PERL_ARGS_ASSERT_IS_UTF8_CHAR_SLOW;
289
290     utf8n_to_uvuni(s, len, &actual_len, UTF8_CHECK_ONLY);
291
292     return (actual_len == (STRLEN) -1) ? 0 : actual_len;
293 }
294
295 /*
296 =for apidoc is_utf8_char_buf
297
298 Returns the number of bytes that comprise the first UTF-8 encoded character in
299 buffer C<buf>.  C<buf_end> should point to one position beyond the end of the
300 buffer.  0 is returned if C<buf> does not point to a complete, valid UTF-8
301 encoded character.
302
303 Note that an INVARIANT character (i.e. ASCII on non-EBCDIC
304 machines) is a valid UTF-8 character.
305
306 =cut */
307
308 STRLEN
309 Perl_is_utf8_char_buf(const U8 *buf, const U8* buf_end)
310 {
311
312     STRLEN len;
313
314     PERL_ARGS_ASSERT_IS_UTF8_CHAR_BUF;
315
316     if (buf_end <= buf) {
317         return 0;
318     }
319
320     len = buf_end - buf;
321     if (len > UTF8SKIP(buf)) {
322         len = UTF8SKIP(buf);
323     }
324
325 #ifdef IS_UTF8_CHAR
326     if (IS_UTF8_CHAR_FAST(len))
327         return IS_UTF8_CHAR(buf, len) ? len : 0;
328 #endif /* #ifdef IS_UTF8_CHAR */
329     return is_utf8_char_slow(buf, len);
330 }
331
332 /*
333 =for apidoc is_utf8_char
334
335 DEPRECATED!
336
337 Tests if some arbitrary number of bytes begins in a valid UTF-8
338 character.  Note that an INVARIANT (i.e. ASCII on non-EBCDIC machines)
339 character is a valid UTF-8 character.  The actual number of bytes in the UTF-8
340 character will be returned if it is valid, otherwise 0.
341
342 This function is deprecated due to the possibility that malformed input could
343 cause reading beyond the end of the input buffer.  Use L</is_utf8_char_buf>
344 instead.
345
346 =cut */
347
348 STRLEN
349 Perl_is_utf8_char(const U8 *s)
350 {
351     PERL_ARGS_ASSERT_IS_UTF8_CHAR;
352
353     /* Assumes we have enough space, which is why this is deprecated */
354     return is_utf8_char_buf(s, s + UTF8SKIP(s));
355 }
356
357
358 /*
359 =for apidoc is_utf8_string
360
361 Returns true if the first C<len> bytes of string C<s> form a valid
362 UTF-8 string, false otherwise.  If C<len> is 0, it will be calculated
363 using C<strlen(s)> (which means if you use this option, that C<s> has to have a
364 terminating NUL byte).  Note that all characters being ASCII constitute 'a
365 valid UTF-8 string'.
366
367 See also L</is_ascii_string>(), L</is_utf8_string_loclen>(), and L</is_utf8_string_loc>().
368
369 =cut
370 */
371
372 bool
373 Perl_is_utf8_string(const U8 *s, STRLEN len)
374 {
375     const U8* const send = s + (len ? len : strlen((const char *)s));
376     const U8* x = s;
377
378     PERL_ARGS_ASSERT_IS_UTF8_STRING;
379
380     while (x < send) {
381          /* Inline the easy bits of is_utf8_char() here for speed... */
382          if (UTF8_IS_INVARIANT(*x)) {
383             x++;
384          }
385          else if (!UTF8_IS_START(*x))
386              return FALSE;
387          else {
388               /* ... and call is_utf8_char() only if really needed. */
389              const STRLEN c = UTF8SKIP(x);
390              const U8* const next_char_ptr = x + c;
391
392              if (next_char_ptr > send) {
393                  return FALSE;
394              }
395
396              if (IS_UTF8_CHAR_FAST(c)) {
397                  if (!IS_UTF8_CHAR(x, c))
398                      return FALSE;
399              }
400              else if (! is_utf8_char_slow(x, c)) {
401                  return FALSE;
402              }
403              x = next_char_ptr;
404          }
405     }
406
407     return TRUE;
408 }
409
410 /*
411 Implemented as a macro in utf8.h
412
413 =for apidoc is_utf8_string_loc
414
415 Like L</is_utf8_string> but stores the location of the failure (in the
416 case of "utf8ness failure") or the location C<s>+C<len> (in the case of
417 "utf8ness success") in the C<ep>.
418
419 See also L</is_utf8_string_loclen>() and L</is_utf8_string>().
420
421 =for apidoc is_utf8_string_loclen
422
423 Like L</is_utf8_string>() but stores the location of the failure (in the
424 case of "utf8ness failure") or the location C<s>+C<len> (in the case of
425 "utf8ness success") in the C<ep>, and the number of UTF-8
426 encoded characters in the C<el>.
427
428 See also L</is_utf8_string_loc>() and L</is_utf8_string>().
429
430 =cut
431 */
432
433 bool
434 Perl_is_utf8_string_loclen(const U8 *s, STRLEN len, const U8 **ep, STRLEN *el)
435 {
436     const U8* const send = s + (len ? len : strlen((const char *)s));
437     const U8* x = s;
438     STRLEN c;
439     STRLEN outlen = 0;
440
441     PERL_ARGS_ASSERT_IS_UTF8_STRING_LOCLEN;
442
443     while (x < send) {
444          const U8* next_char_ptr;
445
446          /* Inline the easy bits of is_utf8_char() here for speed... */
447          if (UTF8_IS_INVARIANT(*x))
448              next_char_ptr = x + 1;
449          else if (!UTF8_IS_START(*x))
450              goto out;
451          else {
452              /* ... and call is_utf8_char() only if really needed. */
453              c = UTF8SKIP(x);
454              next_char_ptr = c + x;
455              if (next_char_ptr > send) {
456                  goto out;
457              }
458              if (IS_UTF8_CHAR_FAST(c)) {
459                  if (!IS_UTF8_CHAR(x, c))
460                      c = 0;
461              } else
462                  c = is_utf8_char_slow(x, c);
463              if (!c)
464                  goto out;
465          }
466          x = next_char_ptr;
467          outlen++;
468     }
469
470  out:
471     if (el)
472         *el = outlen;
473
474     if (ep)
475         *ep = x;
476     return (x == send);
477 }
478
479 /*
480
481 =for apidoc utf8n_to_uvuni
482
483 Bottom level UTF-8 decode routine.
484 Returns the code point value of the first character in the string C<s>,
485 which is assumed to be in UTF-8 (or UTF-EBCDIC) encoding, and no longer than
486 C<curlen> bytes; C<*retlen> (if C<retlen> isn't NULL) will be set to
487 the length, in bytes, of that character.
488
489 The value of C<flags> determines the behavior when C<s> does not point to a
490 well-formed UTF-8 character.  If C<flags> is 0, when a malformation is found,
491 zero is returned and C<*retlen> is set so that (S<C<s> + C<*retlen>>) is the
492 next possible position in C<s> that could begin a non-malformed character.
493 Also, if UTF-8 warnings haven't been lexically disabled, a warning is raised.
494
495 Various ALLOW flags can be set in C<flags> to allow (and not warn on)
496 individual types of malformations, such as the sequence being overlong (that
497 is, when there is a shorter sequence that can express the same code point;
498 overlong sequences are expressly forbidden in the UTF-8 standard due to
499 potential security issues).  Another malformation example is the first byte of
500 a character not being a legal first byte.  See F<utf8.h> for the list of such
501 flags.  For allowed 0 length strings, this function returns 0; for allowed
502 overlong sequences, the computed code point is returned; for all other allowed
503 malformations, the Unicode REPLACEMENT CHARACTER is returned, as these have no
504 determinable reasonable value.
505
506 The UTF8_CHECK_ONLY flag overrides the behavior when a non-allowed (by other
507 flags) malformation is found.  If this flag is set, the routine assumes that
508 the caller will raise a warning, and this function will silently just set
509 C<retlen> to C<-1> and return zero.
510
511 Certain code points are considered problematic.  These are Unicode surrogates,
512 Unicode non-characters, and code points above the Unicode maximum of 0x10FFFF.
513 By default these are considered regular code points, but certain situations
514 warrant special handling for them.  If C<flags> contains
515 UTF8_DISALLOW_ILLEGAL_INTERCHANGE, all three classes are treated as
516 malformations and handled as such.  The flags UTF8_DISALLOW_SURROGATE,
517 UTF8_DISALLOW_NONCHAR, and UTF8_DISALLOW_SUPER (meaning above the legal Unicode
518 maximum) can be set to disallow these categories individually.
519
520 The flags UTF8_WARN_ILLEGAL_INTERCHANGE, UTF8_WARN_SURROGATE,
521 UTF8_WARN_NONCHAR, and UTF8_WARN_SUPER will cause warning messages to be raised
522 for their respective categories, but otherwise the code points are considered
523 valid (not malformations).  To get a category to both be treated as a
524 malformation and raise a warning, specify both the WARN and DISALLOW flags.
525 (But note that warnings are not raised if lexically disabled nor if
526 UTF8_CHECK_ONLY is also specified.)
527
528 Very large code points (above 0x7FFF_FFFF) are considered more problematic than
529 the others that are above the Unicode legal maximum.  There are several
530 reasons: they requre at least 32 bits to represent them on ASCII platforms, are
531 not representable at all on EBCDIC platforms, and the original UTF-8
532 specification never went above this number (the current 0x10FFFF limit was
533 imposed later).  (The smaller ones, those that fit into 32 bits, are
534 representable by a UV on ASCII platforms, but not by an IV, which means that
535 the number of operations that can be performed on them is quite restricted.)
536 The UTF-8 encoding on ASCII platforms for these large code points begins with a
537 byte containing 0xFE or 0xFF.  The UTF8_DISALLOW_FE_FF flag will cause them to
538 be treated as malformations, while allowing smaller above-Unicode code points.
539 (Of course UTF8_DISALLOW_SUPER will treat all above-Unicode code points,
540 including these, as malformations.) Similarly, UTF8_WARN_FE_FF acts just like
541 the other WARN flags, but applies just to these code points.
542
543 All other code points corresponding to Unicode characters, including private
544 use and those yet to be assigned, are never considered malformed and never
545 warn.
546
547 Most code should use L</utf8_to_uvchr_buf>() rather than call this directly.
548
549 =cut
550 */
551
552 UV
553 Perl_utf8n_to_uvuni(pTHX_ const U8 *s, STRLEN curlen, STRLEN *retlen, U32 flags)
554 {
555     dVAR;
556     const U8 * const s0 = s;
557     U8 overflow_byte = '\0';    /* Save byte in case of overflow */
558     U8 * send;
559     UV uv = *s;
560     STRLEN expectlen;
561     SV* sv = NULL;
562     UV outlier_ret = 0; /* return value when input is in error or problematic
563                          */
564     UV pack_warn = 0;   /* Save result of packWARN() for later */
565     bool unexpected_non_continuation = FALSE;
566     bool overflowed = FALSE;
567     bool do_overlong_test = TRUE;   /* May have to skip this test */
568
569     const char* const malformed_text = "Malformed UTF-8 character";
570
571     PERL_ARGS_ASSERT_UTF8N_TO_UVUNI;
572
573     /* The order of malformation tests here is important.  We should consume as
574      * few bytes as possible in order to not skip any valid character.  This is
575      * required by the Unicode Standard (section 3.9 of Unicode 6.0); see also
576      * http://unicode.org/reports/tr36 for more discussion as to why.  For
577      * example, once we've done a UTF8SKIP, we can tell the expected number of
578      * bytes, and could fail right off the bat if the input parameters indicate
579      * that there are too few available.  But it could be that just that first
580      * byte is garbled, and the intended character occupies fewer bytes.  If we
581      * blindly assumed that the first byte is correct, and skipped based on
582      * that number, we could skip over a valid input character.  So instead, we
583      * always examine the sequence byte-by-byte.
584      *
585      * We also should not consume too few bytes, otherwise someone could inject
586      * things.  For example, an input could be deliberately designed to
587      * overflow, and if this code bailed out immediately upon discovering that,
588      * returning to the caller *retlen pointing to the very next byte (one
589      * which is actually part of of the overflowing sequence), that could look
590      * legitimate to the caller, which could discard the initial partial
591      * sequence and process the rest, inappropriately */
592
593     /* Zero length strings, if allowed, of necessity are zero */
594     if (UNLIKELY(curlen == 0)) {
595         if (retlen) {
596             *retlen = 0;
597         }
598
599         if (flags & UTF8_ALLOW_EMPTY) {
600             return 0;
601         }
602         if (! (flags & UTF8_CHECK_ONLY)) {
603             sv = sv_2mortal(Perl_newSVpvf(aTHX_ "%s (empty string)", malformed_text));
604         }
605         goto malformed;
606     }
607
608     expectlen = UTF8SKIP(s);
609
610     /* A well-formed UTF-8 character, as the vast majority of calls to this
611      * function will be for, has this expected length.  For efficiency, set
612      * things up here to return it.  It will be overriden only in those rare
613      * cases where a malformation is found */
614     if (retlen) {
615         *retlen = expectlen;
616     }
617
618     /* An invariant is trivially well-formed */
619     if (UTF8_IS_INVARIANT(uv)) {
620         return (UV) (NATIVE_TO_UTF(*s));
621     }
622
623     /* A continuation character can't start a valid sequence */
624     if (UNLIKELY(UTF8_IS_CONTINUATION(uv))) {
625         if (flags & UTF8_ALLOW_CONTINUATION) {
626             if (retlen) {
627                 *retlen = 1;
628             }
629             return UNICODE_REPLACEMENT;
630         }
631
632         if (! (flags & UTF8_CHECK_ONLY)) {
633             sv = sv_2mortal(Perl_newSVpvf(aTHX_ "%s (unexpected continuation byte 0x%02x, with no preceding start byte)", malformed_text, *s0));
634         }
635         curlen = 1;
636         goto malformed;
637     }
638
639 #ifdef EBCDIC
640     uv = NATIVE_TO_UTF(uv);
641 #endif
642
643     /* Here is not a continuation byte, nor an invariant.  The only thing left
644      * is a start byte (possibly for an overlong) */
645
646     /* Remove the leading bits that indicate the number of bytes in the
647      * character's whole UTF-8 sequence, leaving just the bits that are part of
648      * the value */
649     uv &= UTF_START_MASK(expectlen);
650
651     /* Now, loop through the remaining bytes in the character's sequence,
652      * accumulating each into the working value as we go.  Be sure to not look
653      * past the end of the input string */
654     send =  (U8*) s0 + ((expectlen <= curlen) ? expectlen : curlen);
655
656     for (s = s0 + 1; s < send; s++) {
657         if (LIKELY(UTF8_IS_CONTINUATION(*s))) {
658 #ifndef EBCDIC  /* Can't overflow in EBCDIC */
659             if (uv & UTF_ACCUMULATION_OVERFLOW_MASK) {
660
661                 /* The original implementors viewed this malformation as more
662                  * serious than the others (though I, khw, don't understand
663                  * why, since other malformations also give very very wrong
664                  * results), so there is no way to turn off checking for it.
665                  * Set a flag, but keep going in the loop, so that we absorb
666                  * the rest of the bytes that comprise the character. */
667                 overflowed = TRUE;
668                 overflow_byte = *s; /* Save for warning message's use */
669             }
670 #endif
671             uv = UTF8_ACCUMULATE(uv, *s);
672         }
673         else {
674             /* Here, found a non-continuation before processing all expected
675              * bytes.  This byte begins a new character, so quit, even if
676              * allowing this malformation. */
677             unexpected_non_continuation = TRUE;
678             break;
679         }
680     } /* End of loop through the character's bytes */
681
682     /* Save how many bytes were actually in the character */
683     curlen = s - s0;
684
685     /* The loop above finds two types of malformations: non-continuation and/or
686      * overflow.  The non-continuation malformation is really a too-short
687      * malformation, as it means that the current character ended before it was
688      * expected to (being terminated prematurely by the beginning of the next
689      * character, whereas in the too-short malformation there just are too few
690      * bytes available to hold the character.  In both cases, the check below
691      * that we have found the expected number of bytes would fail if executed.)
692      * Thus the non-continuation malformation is really unnecessary, being a
693      * subset of the too-short malformation.  But there may be existing
694      * applications that are expecting the non-continuation type, so we retain
695      * it, and return it in preference to the too-short malformation.  (If this
696      * code were being written from scratch, the two types might be collapsed
697      * into one.)  I, khw, am also giving priority to returning the
698      * non-continuation and too-short malformations over overflow when multiple
699      * ones are present.  I don't know of any real reason to prefer one over
700      * the other, except that it seems to me that multiple-byte errors trumps
701      * errors from a single byte */
702     if (UNLIKELY(unexpected_non_continuation)) {
703         if (!(flags & UTF8_ALLOW_NON_CONTINUATION)) {
704             if (! (flags & UTF8_CHECK_ONLY)) {
705                 if (curlen == 1) {
706                     sv = sv_2mortal(Perl_newSVpvf(aTHX_ "%s (unexpected non-continuation byte 0x%02x, immediately after start byte 0x%02x)", malformed_text, *s, *s0));
707                 }
708                 else {
709                     sv = sv_2mortal(Perl_newSVpvf(aTHX_ "%s (unexpected non-continuation byte 0x%02x, %d bytes after start byte 0x%02x, expected %d bytes)", malformed_text, *s, (int) curlen, *s0, (int)expectlen));
710                 }
711             }
712             goto malformed;
713         }
714         uv = UNICODE_REPLACEMENT;
715
716         /* Skip testing for overlongs, as the REPLACEMENT may not be the same
717          * as what the original expectations were. */
718         do_overlong_test = FALSE;
719         if (retlen) {
720             *retlen = curlen;
721         }
722     }
723     else if (UNLIKELY(curlen < expectlen)) {
724         if (! (flags & UTF8_ALLOW_SHORT)) {
725             if (! (flags & UTF8_CHECK_ONLY)) {
726                 sv = sv_2mortal(Perl_newSVpvf(aTHX_ "%s (%d byte%s, need %d, after start byte 0x%02x)", malformed_text, (int)curlen, curlen == 1 ? "" : "s", (int)expectlen, *s0));
727             }
728             goto malformed;
729         }
730         uv = UNICODE_REPLACEMENT;
731         do_overlong_test = FALSE;
732         if (retlen) {
733             *retlen = curlen;
734         }
735     }
736
737 #ifndef EBCDIC  /* EBCDIC allows FE, FF, can't overflow */
738     if ((*s0 & 0xFE) == 0xFE    /* matches both FE, FF */
739         && (flags & (UTF8_WARN_FE_FF|UTF8_DISALLOW_FE_FF)))
740     {
741         /* By adding UTF8_CHECK_ONLY to the test, we avoid unnecessary
742          * generation of the sv, since no warnings are raised under CHECK */
743         if ((flags & (UTF8_WARN_FE_FF|UTF8_CHECK_ONLY)) == UTF8_WARN_FE_FF
744             && ckWARN_d(WARN_UTF8))
745         {
746             /* This message is deliberately not of the same syntax as the other
747              * messages for malformations, for backwards compatibility in the
748              * unlikely event that code is relying on its precise earlier text
749              */
750             sv = sv_2mortal(Perl_newSVpvf(aTHX_ "%s Code point beginning with byte 0x%02X is not Unicode, and not portable", malformed_text, *s0));
751             pack_warn = packWARN(WARN_UTF8);
752         }
753         if (flags & UTF8_DISALLOW_FE_FF) {
754             goto malformed;
755         }
756     }
757     if (UNLIKELY(overflowed)) {
758
759         /* If the first byte is FF, it will overflow a 32-bit word.  If the
760          * first byte is FE, it will overflow a signed 32-bit word.  The
761          * above preserves backward compatibility, since its message was used
762          * in earlier versions of this code in preference to overflow */
763         sv = sv_2mortal(Perl_newSVpvf(aTHX_ "%s (overflow at byte 0x%02x, after start byte 0x%02x)", malformed_text, overflow_byte, *s0));
764         goto malformed;
765     }
766 #endif
767
768     if (do_overlong_test
769         && expectlen > (STRLEN)UNISKIP(uv)
770         && ! (flags & UTF8_ALLOW_LONG))
771     {
772         /* The overlong malformation has lower precedence than the others.
773          * Note that if this malformation is allowed, we return the actual
774          * value, instead of the replacement character.  This is because this
775          * value is actually well-defined. */
776         if (! (flags & UTF8_CHECK_ONLY)) {
777             sv = sv_2mortal(Perl_newSVpvf(aTHX_ "%s (%d byte%s, need %d, after start byte 0x%02x)", malformed_text, (int)expectlen, expectlen == 1 ? "": "s", UNISKIP(uv), *s0));
778         }
779         goto malformed;
780     }
781
782     /* Here, the input is considered to be well-formed , but could be a
783      * problematic code point that is not allowed by the input parameters. */
784     if (uv >= UNICODE_SURROGATE_FIRST /* isn't problematic if < this */
785         && (flags & (UTF8_DISALLOW_ILLEGAL_INTERCHANGE
786                      |UTF8_WARN_ILLEGAL_INTERCHANGE)))
787     {
788         if (UNICODE_IS_SURROGATE(uv)) {
789             if ((flags & (UTF8_WARN_SURROGATE|UTF8_CHECK_ONLY)) == UTF8_WARN_SURROGATE
790                 && ckWARN2_d(WARN_UTF8, WARN_SURROGATE))
791             {
792                 sv = sv_2mortal(Perl_newSVpvf(aTHX_ "UTF-16 surrogate U+%04"UVXf"", uv));
793                 pack_warn = packWARN2(WARN_UTF8, WARN_SURROGATE);
794             }
795             if (flags & UTF8_DISALLOW_SURROGATE) {
796                 goto disallowed;
797             }
798         }
799         else if ((uv > PERL_UNICODE_MAX)) {
800             if ((flags & (UTF8_WARN_SUPER|UTF8_CHECK_ONLY)) == UTF8_WARN_SUPER
801                 && ckWARN2_d(WARN_UTF8, WARN_NON_UNICODE))
802             {
803                 sv = sv_2mortal(Perl_newSVpvf(aTHX_ "Code point 0x%04"UVXf" is not Unicode, may not be portable", uv));
804                 pack_warn = packWARN2(WARN_UTF8, WARN_NON_UNICODE);
805             }
806             if (flags & UTF8_DISALLOW_SUPER) {
807                 goto disallowed;
808             }
809         }
810         else if (UNICODE_IS_NONCHAR(uv)) {
811             if ((flags & (UTF8_WARN_NONCHAR|UTF8_CHECK_ONLY)) == UTF8_WARN_NONCHAR
812                 && ckWARN2_d(WARN_UTF8, WARN_NONCHAR))
813             {
814                 sv = sv_2mortal(Perl_newSVpvf(aTHX_ "Unicode non-character U+%04"UVXf" is illegal for open interchange", uv));
815                 pack_warn = packWARN2(WARN_UTF8, WARN_NONCHAR);
816             }
817             if (flags & UTF8_DISALLOW_NONCHAR) {
818                 goto disallowed;
819             }
820         }
821
822         if (sv) {
823             outlier_ret = uv;
824             goto do_warn;
825         }
826
827         /* Here, this is not considered a malformed character, so drop through
828          * to return it */
829     }
830
831     return uv;
832
833     /* There are three cases which get to beyond this point.  In all 3 cases:
834      * <sv>         if not null points to a string to print as a warning.
835      * <curlen>     is what <*retlen> should be set to if UTF8_CHECK_ONLY isn't
836      *              set.
837      * <outlier_ret> is what return value to use if UTF8_CHECK_ONLY isn't set.
838      *              This is done by initializing it to 0, and changing it only
839      *              for case 1).
840      * The 3 cases are:
841      * 1)   The input is valid but problematic, and to be warned about.  The
842      *      return value is the resultant code point; <*retlen> is set to
843      *      <curlen>, the number of bytes that comprise the code point.
844      *      <pack_warn> contains the result of packWARN() for the warning
845      *      types.  The entry point for this case is the label <do_warn>;
846      * 2)   The input is a valid code point but disallowed by the parameters to
847      *      this function.  The return value is 0.  If UTF8_CHECK_ONLY is set,
848      *      <*relen> is -1; otherwise it is <curlen>, the number of bytes that
849      *      comprise the code point.  <pack_warn> contains the result of
850      *      packWARN() for the warning types.  The entry point for this case is
851      *      the label <disallowed>.
852      * 3)   The input is malformed.  The return value is 0.  If UTF8_CHECK_ONLY
853      *      is set, <*relen> is -1; otherwise it is <curlen>, the number of
854      *      bytes that comprise the malformation.  All such malformations are
855      *      assumed to be warning type <utf8>.  The entry point for this case
856      *      is the label <malformed>.
857      */
858
859 malformed:
860
861     if (sv && ckWARN_d(WARN_UTF8)) {
862         pack_warn = packWARN(WARN_UTF8);
863     }
864
865 disallowed:
866
867     if (flags & UTF8_CHECK_ONLY) {
868         if (retlen)
869             *retlen = ((STRLEN) -1);
870         return 0;
871     }
872
873 do_warn:
874
875     if (pack_warn) {    /* <pack_warn> was initialized to 0, and changed only
876                            if warnings are to be raised. */
877         const char * const string = SvPVX_const(sv);
878
879         if (PL_op)
880             Perl_warner(aTHX_ pack_warn, "%s in %s", string,  OP_DESC(PL_op));
881         else
882             Perl_warner(aTHX_ pack_warn, "%s", string);
883     }
884
885     if (retlen) {
886         *retlen = curlen;
887     }
888
889     return outlier_ret;
890 }
891
892 /*
893 =for apidoc utf8_to_uvchr_buf
894
895 Returns the native code point of the first character in the string C<s> which
896 is assumed to be in UTF-8 encoding; C<send> points to 1 beyond the end of C<s>.
897 C<*retlen> will be set to the length, in bytes, of that character.
898
899 If C<s> does not point to a well-formed UTF-8 character and UTF8 warnings are
900 enabled, zero is returned and C<*retlen> is set (if C<retlen> isn't
901 NULL) to -1.  If those warnings are off, the computed value if well-defined (or
902 the Unicode REPLACEMENT CHARACTER, if not) is silently returned, and C<*retlen>
903 is set (if C<retlen> isn't NULL) so that (S<C<s> + C<*retlen>>) is the
904 next possible position in C<s> that could begin a non-malformed character.
905 See L</utf8n_to_uvuni> for details on when the REPLACEMENT CHARACTER is returned.
906
907 =cut
908 */
909
910
911 UV
912 Perl_utf8_to_uvchr_buf(pTHX_ const U8 *s, const U8 *send, STRLEN *retlen)
913 {
914     PERL_ARGS_ASSERT_UTF8_TO_UVCHR_BUF;
915
916     assert(s < send);
917
918     return utf8n_to_uvchr(s, send - s, retlen,
919                           ckWARN_d(WARN_UTF8) ? 0 : UTF8_ALLOW_ANY);
920 }
921
922 /* Like L</utf8_to_uvchr_buf>(), but should only be called when it is known that
923  * there are no malformations in the input UTF-8 string C<s>.  surrogates,
924  * non-character code points, and non-Unicode code points are allowed */
925
926 UV
927 Perl_valid_utf8_to_uvchr(pTHX_ const U8 *s, STRLEN *retlen)
928 {
929     const UV uv = valid_utf8_to_uvuni(s, retlen);
930
931     PERL_ARGS_ASSERT_VALID_UTF8_TO_UVCHR;
932
933     return UNI_TO_NATIVE(uv);
934 }
935
936 /*
937 =for apidoc utf8_to_uvchr
938
939 DEPRECATED!
940
941 Returns the native code point of the first character in the string C<s>
942 which is assumed to be in UTF-8 encoding; C<retlen> will be set to the
943 length, in bytes, of that character.
944
945 Some, but not all, UTF-8 malformations are detected, and in fact, some
946 malformed input could cause reading beyond the end of the input buffer, which
947 is why this function is deprecated.  Use L</utf8_to_uvchr_buf> instead.
948
949 If C<s> points to one of the detected malformations, and UTF8 warnings are
950 enabled, zero is returned and C<*retlen> is set (if C<retlen> isn't
951 NULL) to -1.  If those warnings are off, the computed value if well-defined (or
952 the Unicode REPLACEMENT CHARACTER, if not) is silently returned, and C<*retlen>
953 is set (if C<retlen> isn't NULL) so that (S<C<s> + C<*retlen>>) is the
954 next possible position in C<s> that could begin a non-malformed character.
955 See L</utf8n_to_uvuni> for details on when the REPLACEMENT CHARACTER is returned.
956
957 =cut
958 */
959
960 UV
961 Perl_utf8_to_uvchr(pTHX_ const U8 *s, STRLEN *retlen)
962 {
963     PERL_ARGS_ASSERT_UTF8_TO_UVCHR;
964
965     return utf8_to_uvchr_buf(s, s + UTF8_MAXBYTES, retlen);
966 }
967
968 /*
969 =for apidoc utf8_to_uvuni_buf
970
971 Returns the Unicode code point of the first character in the string C<s> which
972 is assumed to be in UTF-8 encoding; C<send> points to 1 beyond the end of C<s>.
973 C<retlen> will be set to the length, in bytes, of that character.
974
975 This function should only be used when the returned UV is considered
976 an index into the Unicode semantic tables (e.g. swashes).
977
978 If C<s> does not point to a well-formed UTF-8 character and UTF8 warnings are
979 enabled, zero is returned and C<*retlen> is set (if C<retlen> isn't
980 NULL) to -1.  If those warnings are off, the computed value if well-defined (or
981 the Unicode REPLACEMENT CHARACTER, if not) is silently returned, and C<*retlen>
982 is set (if C<retlen> isn't NULL) so that (S<C<s> + C<*retlen>>) is the
983 next possible position in C<s> that could begin a non-malformed character.
984 See L</utf8n_to_uvuni> for details on when the REPLACEMENT CHARACTER is returned.
985
986 =cut
987 */
988
989 UV
990 Perl_utf8_to_uvuni_buf(pTHX_ const U8 *s, const U8 *send, STRLEN *retlen)
991 {
992     PERL_ARGS_ASSERT_UTF8_TO_UVUNI_BUF;
993
994     assert(send > s);
995
996     /* Call the low level routine asking for checks */
997     return Perl_utf8n_to_uvuni(aTHX_ s, send -s, retlen,
998                                ckWARN_d(WARN_UTF8) ? 0 : UTF8_ALLOW_ANY);
999 }
1000
1001 /* Like L</utf8_to_uvuni_buf>(), but should only be called when it is known that
1002  * there are no malformations in the input UTF-8 string C<s>.  Surrogates,
1003  * non-character code points, and non-Unicode code points are allowed */
1004
1005 UV
1006 Perl_valid_utf8_to_uvuni(pTHX_ const U8 *s, STRLEN *retlen)
1007 {
1008     UV expectlen = UTF8SKIP(s);
1009     const U8* send = s + expectlen;
1010     UV uv = NATIVE_TO_UTF(*s);
1011
1012     PERL_ARGS_ASSERT_VALID_UTF8_TO_UVUNI;
1013
1014     if (retlen) {
1015         *retlen = expectlen;
1016     }
1017
1018     /* An invariant is trivially returned */
1019     if (expectlen == 1) {
1020         return uv;
1021     }
1022
1023     /* Remove the leading bits that indicate the number of bytes, leaving just
1024      * the bits that are part of the value */
1025     uv &= UTF_START_MASK(expectlen);
1026
1027     /* Now, loop through the remaining bytes, accumulating each into the
1028      * working total as we go */
1029     for (++s; s < send; s++) {
1030         uv = UTF8_ACCUMULATE(uv, *s);
1031     }
1032
1033     return uv;
1034 }
1035
1036 /*
1037 =for apidoc utf8_to_uvuni
1038
1039 DEPRECATED!
1040
1041 Returns the Unicode code point of the first character in the string C<s>
1042 which is assumed to be in UTF-8 encoding; C<retlen> will be set to the
1043 length, in bytes, of that character.
1044
1045 This function should only be used when the returned UV is considered
1046 an index into the Unicode semantic tables (e.g. swashes).
1047
1048 Some, but not all, UTF-8 malformations are detected, and in fact, some
1049 malformed input could cause reading beyond the end of the input buffer, which
1050 is why this function is deprecated.  Use L</utf8_to_uvuni_buf> instead.
1051
1052 If C<s> points to one of the detected malformations, and UTF8 warnings are
1053 enabled, zero is returned and C<*retlen> is set (if C<retlen> doesn't point to
1054 NULL) to -1.  If those warnings are off, the computed value if well-defined (or
1055 the Unicode REPLACEMENT CHARACTER, if not) is silently returned, and C<*retlen>
1056 is set (if C<retlen> isn't NULL) so that (S<C<s> + C<*retlen>>) is the
1057 next possible position in C<s> that could begin a non-malformed character.
1058 See L</utf8n_to_uvuni> for details on when the REPLACEMENT CHARACTER is returned.
1059
1060 =cut
1061 */
1062
1063 UV
1064 Perl_utf8_to_uvuni(pTHX_ const U8 *s, STRLEN *retlen)
1065 {
1066     PERL_ARGS_ASSERT_UTF8_TO_UVUNI;
1067
1068     return valid_utf8_to_uvuni(s, retlen);
1069 }
1070
1071 /*
1072 =for apidoc utf8_length
1073
1074 Return the length of the UTF-8 char encoded string C<s> in characters.
1075 Stops at C<e> (inclusive).  If C<e E<lt> s> or if the scan would end
1076 up past C<e>, croaks.
1077
1078 =cut
1079 */
1080
1081 STRLEN
1082 Perl_utf8_length(pTHX_ const U8 *s, const U8 *e)
1083 {
1084     dVAR;
1085     STRLEN len = 0;
1086
1087     PERL_ARGS_ASSERT_UTF8_LENGTH;
1088
1089     /* Note: cannot use UTF8_IS_...() too eagerly here since e.g.
1090      * the bitops (especially ~) can create illegal UTF-8.
1091      * In other words: in Perl UTF-8 is not just for Unicode. */
1092
1093     if (e < s)
1094         goto warn_and_return;
1095     while (s < e) {
1096         if (!UTF8_IS_INVARIANT(*s))
1097             s += UTF8SKIP(s);
1098         else
1099             s++;
1100         len++;
1101     }
1102
1103     if (e != s) {
1104         len--;
1105         warn_and_return:
1106         if (PL_op)
1107             Perl_ck_warner_d(aTHX_ packWARN(WARN_UTF8),
1108                              "%s in %s", unees, OP_DESC(PL_op));
1109         else
1110             Perl_ck_warner_d(aTHX_ packWARN(WARN_UTF8), "%s", unees);
1111     }
1112
1113     return len;
1114 }
1115
1116 /*
1117 =for apidoc utf8_distance
1118
1119 Returns the number of UTF-8 characters between the UTF-8 pointers C<a>
1120 and C<b>.
1121
1122 WARNING: use only if you *know* that the pointers point inside the
1123 same UTF-8 buffer.
1124
1125 =cut
1126 */
1127
1128 IV
1129 Perl_utf8_distance(pTHX_ const U8 *a, const U8 *b)
1130 {
1131     PERL_ARGS_ASSERT_UTF8_DISTANCE;
1132
1133     return (a < b) ? -1 * (IV) utf8_length(a, b) : (IV) utf8_length(b, a);
1134 }
1135
1136 /*
1137 =for apidoc utf8_hop
1138
1139 Return the UTF-8 pointer C<s> displaced by C<off> characters, either
1140 forward or backward.
1141
1142 WARNING: do not use the following unless you *know* C<off> is within
1143 the UTF-8 data pointed to by C<s> *and* that on entry C<s> is aligned
1144 on the first byte of character or just after the last byte of a character.
1145
1146 =cut
1147 */
1148
1149 U8 *
1150 Perl_utf8_hop(pTHX_ const U8 *s, I32 off)
1151 {
1152     PERL_ARGS_ASSERT_UTF8_HOP;
1153
1154     PERL_UNUSED_CONTEXT;
1155     /* Note: cannot use UTF8_IS_...() too eagerly here since e.g
1156      * the bitops (especially ~) can create illegal UTF-8.
1157      * In other words: in Perl UTF-8 is not just for Unicode. */
1158
1159     if (off >= 0) {
1160         while (off--)
1161             s += UTF8SKIP(s);
1162     }
1163     else {
1164         while (off++) {
1165             s--;
1166             while (UTF8_IS_CONTINUATION(*s))
1167                 s--;
1168         }
1169     }
1170     return (U8 *)s;
1171 }
1172
1173 /*
1174 =for apidoc bytes_cmp_utf8
1175
1176 Compares the sequence of characters (stored as octets) in C<b>, C<blen> with the
1177 sequence of characters (stored as UTF-8) in C<u>, C<ulen>. Returns 0 if they are
1178 equal, -1 or -2 if the first string is less than the second string, +1 or +2
1179 if the first string is greater than the second string.
1180
1181 -1 or +1 is returned if the shorter string was identical to the start of the
1182 longer string. -2 or +2 is returned if the was a difference between characters
1183 within the strings.
1184
1185 =cut
1186 */
1187
1188 int
1189 Perl_bytes_cmp_utf8(pTHX_ const U8 *b, STRLEN blen, const U8 *u, STRLEN ulen)
1190 {
1191     const U8 *const bend = b + blen;
1192     const U8 *const uend = u + ulen;
1193
1194     PERL_ARGS_ASSERT_BYTES_CMP_UTF8;
1195
1196     PERL_UNUSED_CONTEXT;
1197
1198     while (b < bend && u < uend) {
1199         U8 c = *u++;
1200         if (!UTF8_IS_INVARIANT(c)) {
1201             if (UTF8_IS_DOWNGRADEABLE_START(c)) {
1202                 if (u < uend) {
1203                     U8 c1 = *u++;
1204                     if (UTF8_IS_CONTINUATION(c1)) {
1205                         c = UNI_TO_NATIVE(TWO_BYTE_UTF8_TO_UNI(c, c1));
1206                     } else {
1207                         Perl_ck_warner_d(aTHX_ packWARN(WARN_UTF8),
1208                                          "Malformed UTF-8 character "
1209                                          "(unexpected non-continuation byte 0x%02x"
1210                                          ", immediately after start byte 0x%02x)"
1211                                          /* Dear diag.t, it's in the pod.  */
1212                                          "%s%s", c1, c,
1213                                          PL_op ? " in " : "",
1214                                          PL_op ? OP_DESC(PL_op) : "");
1215                         return -2;
1216                     }
1217                 } else {
1218                     if (PL_op)
1219                         Perl_ck_warner_d(aTHX_ packWARN(WARN_UTF8),
1220                                          "%s in %s", unees, OP_DESC(PL_op));
1221                     else
1222                         Perl_ck_warner_d(aTHX_ packWARN(WARN_UTF8), "%s", unees);
1223                     return -2; /* Really want to return undef :-)  */
1224                 }
1225             } else {
1226                 return -2;
1227             }
1228         }
1229         if (*b != c) {
1230             return *b < c ? -2 : +2;
1231         }
1232         ++b;
1233     }
1234
1235     if (b == bend && u == uend)
1236         return 0;
1237
1238     return b < bend ? +1 : -1;
1239 }
1240
1241 /*
1242 =for apidoc utf8_to_bytes
1243
1244 Converts a string C<s> of length C<len> from UTF-8 into native byte encoding.
1245 Unlike L</bytes_to_utf8>, this over-writes the original string, and
1246 updates C<len> to contain the new length.
1247 Returns zero on failure, setting C<len> to -1.
1248
1249 If you need a copy of the string, see L</bytes_from_utf8>.
1250
1251 =cut
1252 */
1253
1254 U8 *
1255 Perl_utf8_to_bytes(pTHX_ U8 *s, STRLEN *len)
1256 {
1257     U8 * const save = s;
1258     U8 * const send = s + *len;
1259     U8 *d;
1260
1261     PERL_ARGS_ASSERT_UTF8_TO_BYTES;
1262
1263     /* ensure valid UTF-8 and chars < 256 before updating string */
1264     while (s < send) {
1265         U8 c = *s++;
1266
1267         if (!UTF8_IS_INVARIANT(c) &&
1268             (!UTF8_IS_DOWNGRADEABLE_START(c) || (s >= send)
1269              || !(c = *s++) || !UTF8_IS_CONTINUATION(c))) {
1270             *len = ((STRLEN) -1);
1271             return 0;
1272         }
1273     }
1274
1275     d = s = save;
1276     while (s < send) {
1277         STRLEN ulen;
1278         *d++ = (U8)utf8_to_uvchr_buf(s, send, &ulen);
1279         s += ulen;
1280     }
1281     *d = '\0';
1282     *len = d - save;
1283     return save;
1284 }
1285
1286 /*
1287 =for apidoc bytes_from_utf8
1288
1289 Converts a string C<s> of length C<len> from UTF-8 into native byte encoding.
1290 Unlike L</utf8_to_bytes> but like L</bytes_to_utf8>, returns a pointer to
1291 the newly-created string, and updates C<len> to contain the new
1292 length.  Returns the original string if no conversion occurs, C<len>
1293 is unchanged. Do nothing if C<is_utf8> points to 0. Sets C<is_utf8> to
1294 0 if C<s> is converted or consisted entirely of characters that are invariant
1295 in utf8 (i.e., US-ASCII on non-EBCDIC machines).
1296
1297 =cut
1298 */
1299
1300 U8 *
1301 Perl_bytes_from_utf8(pTHX_ const U8 *s, STRLEN *len, bool *is_utf8)
1302 {
1303     U8 *d;
1304     const U8 *start = s;
1305     const U8 *send;
1306     I32 count = 0;
1307
1308     PERL_ARGS_ASSERT_BYTES_FROM_UTF8;
1309
1310     PERL_UNUSED_CONTEXT;
1311     if (!*is_utf8)
1312         return (U8 *)start;
1313
1314     /* ensure valid UTF-8 and chars < 256 before converting string */
1315     for (send = s + *len; s < send;) {
1316         U8 c = *s++;
1317         if (!UTF8_IS_INVARIANT(c)) {
1318             if (UTF8_IS_DOWNGRADEABLE_START(c) && s < send &&
1319                 (c = *s++) && UTF8_IS_CONTINUATION(c))
1320                 count++;
1321             else
1322                 return (U8 *)start;
1323         }
1324     }
1325
1326     *is_utf8 = FALSE;
1327
1328     Newx(d, (*len) - count + 1, U8);
1329     s = start; start = d;
1330     while (s < send) {
1331         U8 c = *s++;
1332         if (!UTF8_IS_INVARIANT(c)) {
1333             /* Then it is two-byte encoded */
1334             c = UNI_TO_NATIVE(TWO_BYTE_UTF8_TO_UNI(c, *s++));
1335         }
1336         *d++ = c;
1337     }
1338     *d = '\0';
1339     *len = d - start;
1340     return (U8 *)start;
1341 }
1342
1343 /*
1344 =for apidoc bytes_to_utf8
1345
1346 Converts a string C<s> of length C<len> bytes from the native encoding into
1347 UTF-8.
1348 Returns a pointer to the newly-created string, and sets C<len> to
1349 reflect the new length in bytes.
1350
1351 A NUL character will be written after the end of the string.
1352
1353 If you want to convert to UTF-8 from encodings other than
1354 the native (Latin1 or EBCDIC),
1355 see L</sv_recode_to_utf8>().
1356
1357 =cut
1358 */
1359
1360 /* This logic is duplicated in sv_catpvn_flags, so any bug fixes will
1361    likewise need duplication. */
1362
1363 U8*
1364 Perl_bytes_to_utf8(pTHX_ const U8 *s, STRLEN *len)
1365 {
1366     const U8 * const send = s + (*len);
1367     U8 *d;
1368     U8 *dst;
1369
1370     PERL_ARGS_ASSERT_BYTES_TO_UTF8;
1371     PERL_UNUSED_CONTEXT;
1372
1373     Newx(d, (*len) * 2 + 1, U8);
1374     dst = d;
1375
1376     while (s < send) {
1377         const UV uv = NATIVE_TO_ASCII(*s++);
1378         if (UNI_IS_INVARIANT(uv))
1379             *d++ = (U8)UTF_TO_NATIVE(uv);
1380         else {
1381             *d++ = (U8)UTF8_EIGHT_BIT_HI(uv);
1382             *d++ = (U8)UTF8_EIGHT_BIT_LO(uv);
1383         }
1384     }
1385     *d = '\0';
1386     *len = d-dst;
1387     return dst;
1388 }
1389
1390 /*
1391  * Convert native (big-endian) or reversed (little-endian) UTF-16 to UTF-8.
1392  *
1393  * Destination must be pre-extended to 3/2 source.  Do not use in-place.
1394  * We optimize for native, for obvious reasons. */
1395
1396 U8*
1397 Perl_utf16_to_utf8(pTHX_ U8* p, U8* d, I32 bytelen, I32 *newlen)
1398 {
1399     U8* pend;
1400     U8* dstart = d;
1401
1402     PERL_ARGS_ASSERT_UTF16_TO_UTF8;
1403
1404     if (bytelen & 1)
1405         Perl_croak(aTHX_ "panic: utf16_to_utf8: odd bytelen %"UVuf, (UV)bytelen);
1406
1407     pend = p + bytelen;
1408
1409     while (p < pend) {
1410         UV uv = (p[0] << 8) + p[1]; /* UTF-16BE */
1411         p += 2;
1412         if (uv < 0x80) {
1413 #ifdef EBCDIC
1414             *d++ = UNI_TO_NATIVE(uv);
1415 #else
1416             *d++ = (U8)uv;
1417 #endif
1418             continue;
1419         }
1420         if (uv < 0x800) {
1421             *d++ = (U8)(( uv >>  6)         | 0xc0);
1422             *d++ = (U8)(( uv        & 0x3f) | 0x80);
1423             continue;
1424         }
1425         if (uv >= 0xd800 && uv <= 0xdbff) {     /* surrogates */
1426             if (p >= pend) {
1427                 Perl_croak(aTHX_ "Malformed UTF-16 surrogate");
1428             } else {
1429                 UV low = (p[0] << 8) + p[1];
1430                 p += 2;
1431                 if (low < 0xdc00 || low > 0xdfff)
1432                     Perl_croak(aTHX_ "Malformed UTF-16 surrogate");
1433                 uv = ((uv - 0xd800) << 10) + (low - 0xdc00) + 0x10000;
1434             }
1435         } else if (uv >= 0xdc00 && uv <= 0xdfff) {
1436             Perl_croak(aTHX_ "Malformed UTF-16 surrogate");
1437         }
1438         if (uv < 0x10000) {
1439             *d++ = (U8)(( uv >> 12)         | 0xe0);
1440             *d++ = (U8)(((uv >>  6) & 0x3f) | 0x80);
1441             *d++ = (U8)(( uv        & 0x3f) | 0x80);
1442             continue;
1443         }
1444         else {
1445             *d++ = (U8)(( uv >> 18)         | 0xf0);
1446             *d++ = (U8)(((uv >> 12) & 0x3f) | 0x80);
1447             *d++ = (U8)(((uv >>  6) & 0x3f) | 0x80);
1448             *d++ = (U8)(( uv        & 0x3f) | 0x80);
1449             continue;
1450         }
1451     }
1452     *newlen = d - dstart;
1453     return d;
1454 }
1455
1456 /* Note: this one is slightly destructive of the source. */
1457
1458 U8*
1459 Perl_utf16_to_utf8_reversed(pTHX_ U8* p, U8* d, I32 bytelen, I32 *newlen)
1460 {
1461     U8* s = (U8*)p;
1462     U8* const send = s + bytelen;
1463
1464     PERL_ARGS_ASSERT_UTF16_TO_UTF8_REVERSED;
1465
1466     if (bytelen & 1)
1467         Perl_croak(aTHX_ "panic: utf16_to_utf8_reversed: odd bytelen %"UVuf,
1468                    (UV)bytelen);
1469
1470     while (s < send) {
1471         const U8 tmp = s[0];
1472         s[0] = s[1];
1473         s[1] = tmp;
1474         s += 2;
1475     }
1476     return utf16_to_utf8(p, d, bytelen, newlen);
1477 }
1478
1479 /* for now these are all defined (inefficiently) in terms of the utf8 versions.
1480  * Note that the macros in handy.h that call these short-circuit calling them
1481  * for Latin-1 range inputs */
1482
1483 bool
1484 Perl_is_uni_alnum(pTHX_ UV c)
1485 {
1486     U8 tmpbuf[UTF8_MAXBYTES+1];
1487     uvchr_to_utf8(tmpbuf, c);
1488     return is_utf8_alnum(tmpbuf);
1489 }
1490
1491 bool
1492 Perl_is_uni_idfirst(pTHX_ UV c)
1493 {
1494     U8 tmpbuf[UTF8_MAXBYTES+1];
1495     uvchr_to_utf8(tmpbuf, c);
1496     return is_utf8_idfirst(tmpbuf);
1497 }
1498
1499 bool
1500 Perl_is_uni_alpha(pTHX_ UV c)
1501 {
1502     U8 tmpbuf[UTF8_MAXBYTES+1];
1503     uvchr_to_utf8(tmpbuf, c);
1504     return is_utf8_alpha(tmpbuf);
1505 }
1506
1507 bool
1508 Perl_is_uni_ascii(pTHX_ UV c)
1509 {
1510     return isASCII(c);
1511 }
1512
1513 bool
1514 Perl_is_uni_blank(pTHX_ UV c)
1515 {
1516     U8 tmpbuf[UTF8_MAXBYTES+1];
1517     uvchr_to_utf8(tmpbuf, c);
1518     return is_utf8_blank(tmpbuf);
1519 }
1520
1521 bool
1522 Perl_is_uni_space(pTHX_ UV c)
1523 {
1524     U8 tmpbuf[UTF8_MAXBYTES+1];
1525     uvchr_to_utf8(tmpbuf, c);
1526     return is_utf8_space(tmpbuf);
1527 }
1528
1529 bool
1530 Perl_is_uni_digit(pTHX_ UV c)
1531 {
1532     U8 tmpbuf[UTF8_MAXBYTES+1];
1533     uvchr_to_utf8(tmpbuf, c);
1534     return is_utf8_digit(tmpbuf);
1535 }
1536
1537 bool
1538 Perl_is_uni_upper(pTHX_ UV c)
1539 {
1540     U8 tmpbuf[UTF8_MAXBYTES+1];
1541     uvchr_to_utf8(tmpbuf, c);
1542     return is_utf8_upper(tmpbuf);
1543 }
1544
1545 bool
1546 Perl_is_uni_lower(pTHX_ UV c)
1547 {
1548     U8 tmpbuf[UTF8_MAXBYTES+1];
1549     uvchr_to_utf8(tmpbuf, c);
1550     return is_utf8_lower(tmpbuf);
1551 }
1552
1553 bool
1554 Perl_is_uni_cntrl(pTHX_ UV c)
1555 {
1556     return isCNTRL_L1(c);
1557 }
1558
1559 bool
1560 Perl_is_uni_graph(pTHX_ UV c)
1561 {
1562     U8 tmpbuf[UTF8_MAXBYTES+1];
1563     uvchr_to_utf8(tmpbuf, c);
1564     return is_utf8_graph(tmpbuf);
1565 }
1566
1567 bool
1568 Perl_is_uni_print(pTHX_ UV c)
1569 {
1570     U8 tmpbuf[UTF8_MAXBYTES+1];
1571     uvchr_to_utf8(tmpbuf, c);
1572     return is_utf8_print(tmpbuf);
1573 }
1574
1575 bool
1576 Perl_is_uni_punct(pTHX_ UV c)
1577 {
1578     U8 tmpbuf[UTF8_MAXBYTES+1];
1579     uvchr_to_utf8(tmpbuf, c);
1580     return is_utf8_punct(tmpbuf);
1581 }
1582
1583 bool
1584 Perl_is_uni_xdigit(pTHX_ UV c)
1585 {
1586     U8 tmpbuf[UTF8_MAXBYTES_CASE+1];
1587     uvchr_to_utf8(tmpbuf, c);
1588     return is_utf8_xdigit(tmpbuf);
1589 }
1590
1591 UV
1592 Perl__to_upper_title_latin1(pTHX_ const U8 c, U8* p, STRLEN *lenp, const char S_or_s)
1593 {
1594     /* We have the latin1-range values compiled into the core, so just use
1595      * those, converting the result to utf8.  The only difference between upper
1596      * and title case in this range is that LATIN_SMALL_LETTER_SHARP_S is
1597      * either "SS" or "Ss".  Which one to use is passed into the routine in
1598      * 'S_or_s' to avoid a test */
1599
1600     UV converted = toUPPER_LATIN1_MOD(c);
1601
1602     PERL_ARGS_ASSERT__TO_UPPER_TITLE_LATIN1;
1603
1604     assert(S_or_s == 'S' || S_or_s == 's');
1605
1606     if (UNI_IS_INVARIANT(converted)) { /* No difference between the two for
1607                                           characters in this range */
1608         *p = (U8) converted;
1609         *lenp = 1;
1610         return converted;
1611     }
1612
1613     /* toUPPER_LATIN1_MOD gives the correct results except for three outliers,
1614      * which it maps to one of them, so as to only have to have one check for
1615      * it in the main case */
1616     if (UNLIKELY(converted == LATIN_SMALL_LETTER_Y_WITH_DIAERESIS)) {
1617         switch (c) {
1618             case LATIN_SMALL_LETTER_Y_WITH_DIAERESIS:
1619                 converted = LATIN_CAPITAL_LETTER_Y_WITH_DIAERESIS;
1620                 break;
1621             case MICRO_SIGN:
1622                 converted = GREEK_CAPITAL_LETTER_MU;
1623                 break;
1624             case LATIN_SMALL_LETTER_SHARP_S:
1625                 *(p)++ = 'S';
1626                 *p = S_or_s;
1627                 *lenp = 2;
1628                 return 'S';
1629             default:
1630                 Perl_croak(aTHX_ "panic: to_upper_title_latin1 did not expect '%c' to map to '%c'", c, LATIN_SMALL_LETTER_Y_WITH_DIAERESIS);
1631                 assert(0); /* NOTREACHED */
1632         }
1633     }
1634
1635     *(p)++ = UTF8_TWO_BYTE_HI(converted);
1636     *p = UTF8_TWO_BYTE_LO(converted);
1637     *lenp = 2;
1638
1639     return converted;
1640 }
1641
1642 /* Call the function to convert a UTF-8 encoded character to the specified case.
1643  * Note that there may be more than one character in the result.
1644  * INP is a pointer to the first byte of the input character
1645  * OUTP will be set to the first byte of the string of changed characters.  It
1646  *      needs to have space for UTF8_MAXBYTES_CASE+1 bytes
1647  * LENP will be set to the length in bytes of the string of changed characters
1648  *
1649  * The functions return the ordinal of the first character in the string of OUTP */
1650 #define CALL_UPPER_CASE(INP, OUTP, LENP) Perl_to_utf8_case(aTHX_ INP, OUTP, LENP, &PL_utf8_toupper, "ToUc", "utf8::ToSpecUc")
1651 #define CALL_TITLE_CASE(INP, OUTP, LENP) Perl_to_utf8_case(aTHX_ INP, OUTP, LENP, &PL_utf8_totitle, "ToTc", "utf8::ToSpecTc")
1652 #define CALL_LOWER_CASE(INP, OUTP, LENP) Perl_to_utf8_case(aTHX_ INP, OUTP, LENP, &PL_utf8_tolower, "ToLc", "utf8::ToSpecLc")
1653
1654 /* This additionally has the input parameter SPECIALS, which if non-zero will
1655  * cause this to use the SPECIALS hash for folding (meaning get full case
1656  * folding); otherwise, when zero, this implies a simple case fold */
1657 #define CALL_FOLD_CASE(INP, OUTP, LENP, SPECIALS) Perl_to_utf8_case(aTHX_ INP, OUTP, LENP, &PL_utf8_tofold, "ToCf", (SPECIALS) ? "utf8::ToSpecCf" : NULL)
1658
1659 UV
1660 Perl_to_uni_upper(pTHX_ UV c, U8* p, STRLEN *lenp)
1661 {
1662     dVAR;
1663
1664     /* Convert the Unicode character whose ordinal is <c> to its uppercase
1665      * version and store that in UTF-8 in <p> and its length in bytes in <lenp>.
1666      * Note that the <p> needs to be at least UTF8_MAXBYTES_CASE+1 bytes since
1667      * the changed version may be longer than the original character.
1668      *
1669      * The ordinal of the first character of the changed version is returned
1670      * (but note, as explained above, that there may be more.) */
1671
1672     PERL_ARGS_ASSERT_TO_UNI_UPPER;
1673
1674     if (c < 256) {
1675         return _to_upper_title_latin1((U8) c, p, lenp, 'S');
1676     }
1677
1678     uvchr_to_utf8(p, c);
1679     return CALL_UPPER_CASE(p, p, lenp);
1680 }
1681
1682 UV
1683 Perl_to_uni_title(pTHX_ UV c, U8* p, STRLEN *lenp)
1684 {
1685     dVAR;
1686
1687     PERL_ARGS_ASSERT_TO_UNI_TITLE;
1688
1689     if (c < 256) {
1690         return _to_upper_title_latin1((U8) c, p, lenp, 's');
1691     }
1692
1693     uvchr_to_utf8(p, c);
1694     return CALL_TITLE_CASE(p, p, lenp);
1695 }
1696
1697 STATIC U8
1698 S_to_lower_latin1(pTHX_ const U8 c, U8* p, STRLEN *lenp)
1699 {
1700     /* We have the latin1-range values compiled into the core, so just use
1701      * those, converting the result to utf8.  Since the result is always just
1702      * one character, we allow <p> to be NULL */
1703
1704     U8 converted = toLOWER_LATIN1(c);
1705
1706     if (p != NULL) {
1707         if (UNI_IS_INVARIANT(converted)) {
1708             *p = converted;
1709             *lenp = 1;
1710         }
1711         else {
1712             *p = UTF8_TWO_BYTE_HI(converted);
1713             *(p+1) = UTF8_TWO_BYTE_LO(converted);
1714             *lenp = 2;
1715         }
1716     }
1717     return converted;
1718 }
1719
1720 UV
1721 Perl_to_uni_lower(pTHX_ UV c, U8* p, STRLEN *lenp)
1722 {
1723     dVAR;
1724
1725     PERL_ARGS_ASSERT_TO_UNI_LOWER;
1726
1727     if (c < 256) {
1728         return to_lower_latin1((U8) c, p, lenp);
1729     }
1730
1731     uvchr_to_utf8(p, c);
1732     return CALL_LOWER_CASE(p, p, lenp);
1733 }
1734
1735 UV
1736 Perl__to_fold_latin1(pTHX_ const U8 c, U8* p, STRLEN *lenp, const bool flags)
1737 {
1738     /* Corresponds to to_lower_latin1(), <flags> is TRUE if to use full case
1739      * folding */
1740
1741     UV converted;
1742
1743     PERL_ARGS_ASSERT__TO_FOLD_LATIN1;
1744
1745     if (c == MICRO_SIGN) {
1746         converted = GREEK_SMALL_LETTER_MU;
1747     }
1748     else if (flags && c == LATIN_SMALL_LETTER_SHARP_S) {
1749         *(p)++ = 's';
1750         *p = 's';
1751         *lenp = 2;
1752         return 's';
1753     }
1754     else { /* In this range the fold of all other characters is their lower
1755               case */
1756         converted = toLOWER_LATIN1(c);
1757     }
1758
1759     if (UNI_IS_INVARIANT(converted)) {
1760         *p = (U8) converted;
1761         *lenp = 1;
1762     }
1763     else {
1764         *(p)++ = UTF8_TWO_BYTE_HI(converted);
1765         *p = UTF8_TWO_BYTE_LO(converted);
1766         *lenp = 2;
1767     }
1768
1769     return converted;
1770 }
1771
1772 UV
1773 Perl__to_uni_fold_flags(pTHX_ UV c, U8* p, STRLEN *lenp, const U8 flags)
1774 {
1775
1776     /* Not currently externally documented, and subject to change
1777      *  <flags> bits meanings:
1778      *      FOLD_FLAGS_FULL  iff full folding is to be used;
1779      *      FOLD_FLAGS_LOCALE iff in locale
1780      *      FOLD_FLAGS_NOMIX_ASCII iff non-ASCII to ASCII folds are prohibited
1781      */
1782
1783     PERL_ARGS_ASSERT__TO_UNI_FOLD_FLAGS;
1784
1785     if (c < 256) {
1786         UV result = _to_fold_latin1((U8) c, p, lenp,
1787                                cBOOL(((flags & FOLD_FLAGS_FULL)
1788                                    /* If ASCII-safe, don't allow full folding,
1789                                     * as that could include SHARP S => ss;
1790                                     * otherwise there is no crossing of
1791                                     * ascii/non-ascii in the latin1 range */
1792                                    && ! (flags & FOLD_FLAGS_NOMIX_ASCII))));
1793         /* It is illegal for the fold to cross the 255/256 boundary under
1794          * locale; in this case return the original */
1795         return (result > 256 && flags & FOLD_FLAGS_LOCALE)
1796                ? c
1797                : result;
1798     }
1799
1800     /* If no special needs, just use the macro */
1801     if ( ! (flags & (FOLD_FLAGS_LOCALE|FOLD_FLAGS_NOMIX_ASCII))) {
1802         uvchr_to_utf8(p, c);
1803         return CALL_FOLD_CASE(p, p, lenp, flags & FOLD_FLAGS_FULL);
1804     }
1805     else {  /* Otherwise, _to_utf8_fold_flags has the intelligence to deal with
1806                the special flags. */
1807         U8 utf8_c[UTF8_MAXBYTES + 1];
1808         uvchr_to_utf8(utf8_c, c);
1809         return _to_utf8_fold_flags(utf8_c, p, lenp, flags, NULL);
1810     }
1811 }
1812
1813 /* for now these all assume no locale info available for Unicode > 255; and
1814  * the corresponding macros in handy.h (like isALNUM_LC_uvchr) should have been
1815  * called instead, so that these don't get called for < 255 */
1816
1817 bool
1818 Perl_is_uni_alnum_lc(pTHX_ UV c)
1819 {
1820     return is_uni_alnum(c);     /* XXX no locale support yet */
1821 }
1822
1823 bool
1824 Perl_is_uni_idfirst_lc(pTHX_ UV c)
1825 {
1826     return is_uni_idfirst(c);   /* XXX no locale support yet */
1827 }
1828
1829 bool
1830 Perl_is_uni_alpha_lc(pTHX_ UV c)
1831 {
1832     return is_uni_alpha(c);     /* XXX no locale support yet */
1833 }
1834
1835 bool
1836 Perl_is_uni_ascii_lc(pTHX_ UV c)
1837 {
1838     return is_uni_ascii(c);     /* XXX no locale support yet */
1839 }
1840
1841 bool
1842 Perl_is_uni_blank_lc(pTHX_ UV c)
1843 {
1844     return is_uni_blank(c);     /* XXX no locale support yet */
1845 }
1846
1847 bool
1848 Perl_is_uni_space_lc(pTHX_ UV c)
1849 {
1850     return is_uni_space(c);     /* XXX no locale support yet */
1851 }
1852
1853 bool
1854 Perl_is_uni_digit_lc(pTHX_ UV c)
1855 {
1856     return is_uni_digit(c);     /* XXX no locale support yet */
1857 }
1858
1859 bool
1860 Perl_is_uni_upper_lc(pTHX_ UV c)
1861 {
1862     return is_uni_upper(c);     /* XXX no locale support yet */
1863 }
1864
1865 bool
1866 Perl_is_uni_lower_lc(pTHX_ UV c)
1867 {
1868     return is_uni_lower(c);     /* XXX no locale support yet */
1869 }
1870
1871 bool
1872 Perl_is_uni_cntrl_lc(pTHX_ UV c)
1873 {
1874     return is_uni_cntrl(c);     /* XXX no locale support yet */
1875 }
1876
1877 bool
1878 Perl_is_uni_graph_lc(pTHX_ UV c)
1879 {
1880     return is_uni_graph(c);     /* XXX no locale support yet */
1881 }
1882
1883 bool
1884 Perl_is_uni_print_lc(pTHX_ UV c)
1885 {
1886     return is_uni_print(c);     /* XXX no locale support yet */
1887 }
1888
1889 bool
1890 Perl_is_uni_punct_lc(pTHX_ UV c)
1891 {
1892     return is_uni_punct(c);     /* XXX no locale support yet */
1893 }
1894
1895 bool
1896 Perl_is_uni_xdigit_lc(pTHX_ UV c)
1897 {
1898     return is_uni_xdigit(c);    /* XXX no locale support yet */
1899 }
1900
1901 U32
1902 Perl_to_uni_upper_lc(pTHX_ U32 c)
1903 {
1904     /* XXX returns only the first character -- do not use XXX */
1905     /* XXX no locale support yet */
1906     STRLEN len;
1907     U8 tmpbuf[UTF8_MAXBYTES_CASE+1];
1908     return (U32)to_uni_upper(c, tmpbuf, &len);
1909 }
1910
1911 U32
1912 Perl_to_uni_title_lc(pTHX_ U32 c)
1913 {
1914     /* XXX returns only the first character XXX -- do not use XXX */
1915     /* XXX no locale support yet */
1916     STRLEN len;
1917     U8 tmpbuf[UTF8_MAXBYTES_CASE+1];
1918     return (U32)to_uni_title(c, tmpbuf, &len);
1919 }
1920
1921 U32
1922 Perl_to_uni_lower_lc(pTHX_ U32 c)
1923 {
1924     /* XXX returns only the first character -- do not use XXX */
1925     /* XXX no locale support yet */
1926     STRLEN len;
1927     U8 tmpbuf[UTF8_MAXBYTES_CASE+1];
1928     return (U32)to_uni_lower(c, tmpbuf, &len);
1929 }
1930
1931 static bool
1932 S_is_utf8_common(pTHX_ const U8 *const p, SV **swash,
1933                  const char *const swashname)
1934 {
1935     /* returns a boolean giving whether or not the UTF8-encoded character that
1936      * starts at <p> is in the swash indicated by <swashname>.  <swash>
1937      * contains a pointer to where the swash indicated by <swashname>
1938      * is to be stored; which this routine will do, so that future calls will
1939      * look at <*swash> and only generate a swash if it is not null
1940      *
1941      * Note that it is assumed that the buffer length of <p> is enough to
1942      * contain all the bytes that comprise the character.  Thus, <*p> should
1943      * have been checked before this call for mal-formedness enough to assure
1944      * that. */
1945
1946     dVAR;
1947
1948     PERL_ARGS_ASSERT_IS_UTF8_COMMON;
1949
1950     /* The API should have included a length for the UTF-8 character in <p>,
1951      * but it doesn't.  We therefor assume that p has been validated at least
1952      * as far as there being enough bytes available in it to accommodate the
1953      * character without reading beyond the end, and pass that number on to the
1954      * validating routine */
1955     if (!is_utf8_char_buf(p, p + UTF8SKIP(p)))
1956         return FALSE;
1957     if (!*swash)
1958         *swash = swash_init("utf8", swashname, &PL_sv_undef, 1, 0);
1959     return swash_fetch(*swash, p, TRUE) != 0;
1960 }
1961
1962 bool
1963 Perl_is_utf8_alnum(pTHX_ const U8 *p)
1964 {
1965     dVAR;
1966
1967     PERL_ARGS_ASSERT_IS_UTF8_ALNUM;
1968
1969     /* NOTE: "IsWord", not "IsAlnum", since Alnum is a true
1970      * descendant of isalnum(3), in other words, it doesn't
1971      * contain the '_'. --jhi */
1972     return is_utf8_common(p, &PL_utf8_alnum, "IsWord");
1973 }
1974
1975 bool
1976 Perl_is_utf8_idfirst(pTHX_ const U8 *p) /* The naming is historical. */
1977 {
1978     dVAR;
1979
1980     PERL_ARGS_ASSERT_IS_UTF8_IDFIRST;
1981
1982     if (*p == '_')
1983         return TRUE;
1984     /* is_utf8_idstart would be more logical. */
1985     return is_utf8_common(p, &PL_utf8_idstart, "IdStart");
1986 }
1987
1988 bool
1989 Perl_is_utf8_xidfirst(pTHX_ const U8 *p) /* The naming is historical. */
1990 {
1991     dVAR;
1992
1993     PERL_ARGS_ASSERT_IS_UTF8_XIDFIRST;
1994
1995     if (*p == '_')
1996         return TRUE;
1997     /* is_utf8_idstart would be more logical. */
1998     return is_utf8_common(p, &PL_utf8_xidstart, "XIdStart");
1999 }
2000
2001 bool
2002 Perl__is_utf8__perl_idstart(pTHX_ const U8 *p)
2003 {
2004     dVAR;
2005
2006     PERL_ARGS_ASSERT__IS_UTF8__PERL_IDSTART;
2007
2008     return is_utf8_common(p, &PL_utf8_perl_idstart, "_Perl_IDStart");
2009 }
2010
2011 bool
2012 Perl_is_utf8_idcont(pTHX_ const U8 *p)
2013 {
2014     dVAR;
2015
2016     PERL_ARGS_ASSERT_IS_UTF8_IDCONT;
2017
2018     return is_utf8_common(p, &PL_utf8_idcont, "IdContinue");
2019 }
2020
2021 bool
2022 Perl_is_utf8_xidcont(pTHX_ const U8 *p)
2023 {
2024     dVAR;
2025
2026     PERL_ARGS_ASSERT_IS_UTF8_XIDCONT;
2027
2028     return is_utf8_common(p, &PL_utf8_idcont, "XIdContinue");
2029 }
2030
2031 bool
2032 Perl_is_utf8_alpha(pTHX_ const U8 *p)
2033 {
2034     dVAR;
2035
2036     PERL_ARGS_ASSERT_IS_UTF8_ALPHA;
2037
2038     return is_utf8_common(p, &PL_utf8_alpha, "IsAlpha");
2039 }
2040
2041 bool
2042 Perl_is_utf8_ascii(pTHX_ const U8 *p)
2043 {
2044     dVAR;
2045
2046     PERL_ARGS_ASSERT_IS_UTF8_ASCII;
2047
2048     /* ASCII characters are the same whether in utf8 or not.  So the macro
2049      * works on both utf8 and non-utf8 representations. */
2050     return isASCII(*p);
2051 }
2052
2053 bool
2054 Perl_is_utf8_blank(pTHX_ const U8 *p)
2055 {
2056     dVAR;
2057
2058     PERL_ARGS_ASSERT_IS_UTF8_BLANK;
2059
2060     return is_utf8_common(p, &PL_utf8_blank, "XPosixBlank");
2061 }
2062
2063 bool
2064 Perl_is_utf8_space(pTHX_ const U8 *p)
2065 {
2066     dVAR;
2067
2068     PERL_ARGS_ASSERT_IS_UTF8_SPACE;
2069
2070     return is_utf8_common(p, &PL_utf8_space, "IsXPerlSpace");
2071 }
2072
2073 bool
2074 Perl_is_utf8_perl_space(pTHX_ const U8 *p)
2075 {
2076     dVAR;
2077
2078     PERL_ARGS_ASSERT_IS_UTF8_PERL_SPACE;
2079
2080     /* Only true if is an ASCII space-like character, and ASCII is invariant
2081      * under utf8, so can just use the macro */
2082     return isSPACE_A(*p);
2083 }
2084
2085 bool
2086 Perl_is_utf8_perl_word(pTHX_ const U8 *p)
2087 {
2088     dVAR;
2089
2090     PERL_ARGS_ASSERT_IS_UTF8_PERL_WORD;
2091
2092     /* Only true if is an ASCII word character, and ASCII is invariant
2093      * under utf8, so can just use the macro */
2094     return isWORDCHAR_A(*p);
2095 }
2096
2097 bool
2098 Perl_is_utf8_digit(pTHX_ const U8 *p)
2099 {
2100     dVAR;
2101
2102     PERL_ARGS_ASSERT_IS_UTF8_DIGIT;
2103
2104     return is_utf8_common(p, &PL_utf8_digit, "IsDigit");
2105 }
2106
2107 bool
2108 Perl_is_utf8_posix_digit(pTHX_ const U8 *p)
2109 {
2110     dVAR;
2111
2112     PERL_ARGS_ASSERT_IS_UTF8_POSIX_DIGIT;
2113
2114     /* Only true if is an ASCII digit character, and ASCII is invariant
2115      * under utf8, so can just use the macro */
2116     return isDIGIT_A(*p);
2117 }
2118
2119 bool
2120 Perl_is_utf8_upper(pTHX_ const U8 *p)
2121 {
2122     dVAR;
2123
2124     PERL_ARGS_ASSERT_IS_UTF8_UPPER;
2125
2126     return is_utf8_common(p, &PL_utf8_upper, "IsUppercase");
2127 }
2128
2129 bool
2130 Perl_is_utf8_lower(pTHX_ const U8 *p)
2131 {
2132     dVAR;
2133
2134     PERL_ARGS_ASSERT_IS_UTF8_LOWER;
2135
2136     return is_utf8_common(p, &PL_utf8_lower, "IsLowercase");
2137 }
2138
2139 bool
2140 Perl_is_utf8_cntrl(pTHX_ const U8 *p)
2141 {
2142     dVAR;
2143
2144     PERL_ARGS_ASSERT_IS_UTF8_CNTRL;
2145
2146     if (isASCII(*p)) {
2147         return isCNTRL_A(*p);
2148     }
2149
2150     /* All controls are in Latin1 */
2151     if (! UTF8_IS_DOWNGRADEABLE_START(*p)) {
2152         return 0;
2153     }
2154     return isCNTRL_L1(TWO_BYTE_UTF8_TO_UNI(*p, *(p+1)));
2155 }
2156
2157 bool
2158 Perl_is_utf8_graph(pTHX_ const U8 *p)
2159 {
2160     dVAR;
2161
2162     PERL_ARGS_ASSERT_IS_UTF8_GRAPH;
2163
2164     return is_utf8_common(p, &PL_utf8_graph, "IsGraph");
2165 }
2166
2167 bool
2168 Perl_is_utf8_print(pTHX_ const U8 *p)
2169 {
2170     dVAR;
2171
2172     PERL_ARGS_ASSERT_IS_UTF8_PRINT;
2173
2174     return is_utf8_common(p, &PL_utf8_print, "IsPrint");
2175 }
2176
2177 bool
2178 Perl_is_utf8_punct(pTHX_ const U8 *p)
2179 {
2180     dVAR;
2181
2182     PERL_ARGS_ASSERT_IS_UTF8_PUNCT;
2183
2184     return is_utf8_common(p, &PL_utf8_punct, "IsPunct");
2185 }
2186
2187 bool
2188 Perl_is_utf8_xdigit(pTHX_ const U8 *p)
2189 {
2190     dVAR;
2191
2192     PERL_ARGS_ASSERT_IS_UTF8_XDIGIT;
2193
2194     return is_utf8_common(p, &PL_utf8_xdigit, "IsXDigit");
2195 }
2196
2197 bool
2198 Perl_is_utf8_mark(pTHX_ const U8 *p)
2199 {
2200     dVAR;
2201
2202     PERL_ARGS_ASSERT_IS_UTF8_MARK;
2203
2204     return is_utf8_common(p, &PL_utf8_mark, "IsM");
2205 }
2206
2207 bool
2208 Perl_is_utf8_X_begin(pTHX_ const U8 *p)
2209 {
2210     dVAR;
2211
2212     PERL_ARGS_ASSERT_IS_UTF8_X_BEGIN;
2213
2214     return is_utf8_common(p, &PL_utf8_X_begin, "_X_Begin");
2215 }
2216
2217 bool
2218 Perl_is_utf8_X_extend(pTHX_ const U8 *p)
2219 {
2220     dVAR;
2221
2222     PERL_ARGS_ASSERT_IS_UTF8_X_EXTEND;
2223
2224     return is_utf8_common(p, &PL_utf8_X_extend, "_X_Extend");
2225 }
2226
2227 bool
2228 Perl_is_utf8_X_prepend(pTHX_ const U8 *p)
2229 {
2230     dVAR;
2231
2232     PERL_ARGS_ASSERT_IS_UTF8_X_PREPEND;
2233
2234     return is_utf8_common(p, &PL_utf8_X_prepend, "_X_GCB_Prepend");
2235 }
2236
2237 bool
2238 Perl_is_utf8_X_non_hangul(pTHX_ const U8 *p)
2239 {
2240     dVAR;
2241
2242     PERL_ARGS_ASSERT_IS_UTF8_X_NON_HANGUL;
2243
2244     return is_utf8_common(p, &PL_utf8_X_non_hangul, "_X_HST_Not_Applicable");
2245 }
2246
2247 bool
2248 Perl_is_utf8_X_L(pTHX_ const U8 *p)
2249 {
2250     dVAR;
2251
2252     PERL_ARGS_ASSERT_IS_UTF8_X_L;
2253
2254     return is_utf8_common(p, &PL_utf8_X_L, "_X_GCB_L");
2255 }
2256
2257 /* These constants are for finding GCB=LV and GCB=LVT.  These are for the
2258  * pre-composed Hangul syllables, which are all in a contiguous block and
2259  * arranged there in such a way so as to facilitate alorithmic determination of
2260  * their characteristics.  As such, they don't need a swash, but can be
2261  * determined by simple arithmetic.  Almost all are GCB=LVT, but every 28th one
2262  * is a GCB=LV */
2263 #define SBASE 0xAC00    /* Start of block */
2264 #define SCount 11172    /* Length of block */
2265 #define TCount 28
2266
2267 #if 0   /* This routine is not currently used */
2268 bool
2269 Perl_is_utf8_X_LV(pTHX_ const U8 *p)
2270 {
2271     /* Unlike most other similarly named routines here, this does not create a
2272      * swash, so swash_fetch() cannot be used on PL_utf8_X_LV. */
2273
2274     dVAR;
2275
2276     UV cp = valid_utf8_to_uvchr(p, NULL);
2277
2278     PERL_ARGS_ASSERT_IS_UTF8_X_LV;
2279
2280     /* The earliest Unicode releases did not have these precomposed Hangul
2281      * syllables.  Set to point to undef in that case, so will return false on
2282      * every call */
2283     if (! PL_utf8_X_LV) {   /* Set up if this is the first time called */
2284         PL_utf8_X_LV = swash_init("utf8", "_X_GCB_LV", &PL_sv_undef, 1, 0);
2285         if (_invlist_len(_get_swash_invlist(PL_utf8_X_LV)) == 0) {
2286             SvREFCNT_dec(PL_utf8_X_LV);
2287             PL_utf8_X_LV = &PL_sv_undef;
2288         }
2289     }
2290
2291     return (PL_utf8_X_LV != &PL_sv_undef
2292             && cp >= SBASE && cp < SBASE + SCount
2293             && (cp - SBASE) % TCount == 0); /* Only every TCount one is LV */
2294 }
2295 #endif
2296
2297 bool
2298 Perl_is_utf8_X_LVT(pTHX_ const U8 *p)
2299 {
2300     /* Unlike most other similarly named routines here, this does not create a
2301      * swash, so swash_fetch() cannot be used on PL_utf8_X_LVT. */
2302
2303     dVAR;
2304
2305     UV cp = valid_utf8_to_uvchr(p, NULL);
2306
2307     PERL_ARGS_ASSERT_IS_UTF8_X_LVT;
2308
2309     /* The earliest Unicode releases did not have these precomposed Hangul
2310      * syllables.  Set to point to undef in that case, so will return false on
2311      * every call */
2312     if (! PL_utf8_X_LVT) {   /* Set up if this is the first time called */
2313         PL_utf8_X_LVT = swash_init("utf8", "_X_GCB_LVT", &PL_sv_undef, 1, 0);
2314         if (_invlist_len(_get_swash_invlist(PL_utf8_X_LVT)) == 0) {
2315             SvREFCNT_dec(PL_utf8_X_LVT);
2316             PL_utf8_X_LVT = &PL_sv_undef;
2317         }
2318     }
2319
2320     return (PL_utf8_X_LVT != &PL_sv_undef
2321             && cp >= SBASE && cp < SBASE + SCount
2322             && (cp - SBASE) % TCount != 0); /* All but every TCount one is LV */
2323 }
2324
2325 bool
2326 Perl_is_utf8_X_T(pTHX_ const U8 *p)
2327 {
2328     dVAR;
2329
2330     PERL_ARGS_ASSERT_IS_UTF8_X_T;
2331
2332     return is_utf8_common(p, &PL_utf8_X_T, "_X_GCB_T");
2333 }
2334
2335 bool
2336 Perl_is_utf8_X_V(pTHX_ const U8 *p)
2337 {
2338     dVAR;
2339
2340     PERL_ARGS_ASSERT_IS_UTF8_X_V;
2341
2342     return is_utf8_common(p, &PL_utf8_X_V, "_X_GCB_V");
2343 }
2344
2345 bool
2346 Perl_is_utf8_X_LV_LVT_V(pTHX_ const U8 *p)
2347 {
2348     dVAR;
2349
2350     PERL_ARGS_ASSERT_IS_UTF8_X_LV_LVT_V;
2351
2352     return is_utf8_common(p, &PL_utf8_X_LV_LVT_V, "_X_LV_LVT_V");
2353 }
2354
2355 bool
2356 Perl__is_utf8_quotemeta(pTHX_ const U8 *p)
2357 {
2358     /* For exclusive use of pp_quotemeta() */
2359
2360     dVAR;
2361
2362     PERL_ARGS_ASSERT__IS_UTF8_QUOTEMETA;
2363
2364     return is_utf8_common(p, &PL_utf8_quotemeta, "_Perl_Quotemeta");
2365 }
2366
2367 /*
2368 =for apidoc to_utf8_case
2369
2370 The C<p> contains the pointer to the UTF-8 string encoding
2371 the character that is being converted.  This routine assumes that the character
2372 at C<p> is well-formed.
2373
2374 The C<ustrp> is a pointer to the character buffer to put the
2375 conversion result to.  The C<lenp> is a pointer to the length
2376 of the result.
2377
2378 The C<swashp> is a pointer to the swash to use.
2379
2380 Both the special and normal mappings are stored in F<lib/unicore/To/Foo.pl>,
2381 and loaded by SWASHNEW, using F<lib/utf8_heavy.pl>.  The C<special> (usually,
2382 but not always, a multicharacter mapping), is tried first.
2383
2384 The C<special> is a string like "utf8::ToSpecLower", which means the
2385 hash %utf8::ToSpecLower.  The access to the hash is through
2386 Perl_to_utf8_case().
2387
2388 The C<normal> is a string like "ToLower" which means the swash
2389 %utf8::ToLower.
2390
2391 =cut */
2392
2393 UV
2394 Perl_to_utf8_case(pTHX_ const U8 *p, U8* ustrp, STRLEN *lenp,
2395                         SV **swashp, const char *normal, const char *special)
2396 {
2397     dVAR;
2398     U8 tmpbuf[UTF8_MAXBYTES_CASE+1];
2399     STRLEN len = 0;
2400     const UV uv0 = valid_utf8_to_uvchr(p, NULL);
2401     /* The NATIVE_TO_UNI() and UNI_TO_NATIVE() mappings
2402      * are necessary in EBCDIC, they are redundant no-ops
2403      * in ASCII-ish platforms, and hopefully optimized away. */
2404     const UV uv1 = NATIVE_TO_UNI(uv0);
2405
2406     PERL_ARGS_ASSERT_TO_UTF8_CASE;
2407
2408     /* Note that swash_fetch() doesn't output warnings for these because it
2409      * assumes we will */
2410     if (uv1 >= UNICODE_SURROGATE_FIRST) {
2411         if (uv1 <= UNICODE_SURROGATE_LAST) {
2412             if (ckWARN_d(WARN_SURROGATE)) {
2413                 const char* desc = (PL_op) ? OP_DESC(PL_op) : normal;
2414                 Perl_warner(aTHX_ packWARN(WARN_SURROGATE),
2415                     "Operation \"%s\" returns its argument for UTF-16 surrogate U+%04"UVXf"", desc, uv1);
2416             }
2417         }
2418         else if (UNICODE_IS_SUPER(uv1)) {
2419             if (ckWARN_d(WARN_NON_UNICODE)) {
2420                 const char* desc = (PL_op) ? OP_DESC(PL_op) : normal;
2421                 Perl_warner(aTHX_ packWARN(WARN_NON_UNICODE),
2422                     "Operation \"%s\" returns its argument for non-Unicode code point 0x%04"UVXf"", desc, uv1);
2423             }
2424         }
2425
2426         /* Note that non-characters are perfectly legal, so no warning should
2427          * be given */
2428     }
2429
2430     uvuni_to_utf8(tmpbuf, uv1);
2431
2432     if (!*swashp) /* load on-demand */
2433          *swashp = swash_init("utf8", normal, &PL_sv_undef, 4, 0);
2434
2435     if (special) {
2436          /* It might be "special" (sometimes, but not always,
2437           * a multicharacter mapping) */
2438          HV * const hv = get_hv(special, 0);
2439          SV **svp;
2440
2441          if (hv &&
2442              (svp = hv_fetch(hv, (const char*)tmpbuf, UNISKIP(uv1), FALSE)) &&
2443              (*svp)) {
2444              const char *s;
2445
2446               s = SvPV_const(*svp, len);
2447               if (len == 1)
2448                    len = uvuni_to_utf8(ustrp, NATIVE_TO_UNI(*(U8*)s)) - ustrp;
2449               else {
2450 #ifdef EBCDIC
2451                    /* If we have EBCDIC we need to remap the characters
2452                     * since any characters in the low 256 are Unicode
2453                     * code points, not EBCDIC. */
2454                    U8 *t = (U8*)s, *tend = t + len, *d;
2455                 
2456                    d = tmpbuf;
2457                    if (SvUTF8(*svp)) {
2458                         STRLEN tlen = 0;
2459                         
2460                         while (t < tend) {
2461                              const UV c = utf8_to_uvchr_buf(t, tend, &tlen);
2462                              if (tlen > 0) {
2463                                   d = uvchr_to_utf8(d, UNI_TO_NATIVE(c));
2464                                   t += tlen;
2465                              }
2466                              else
2467                                   break;
2468                         }
2469                    }
2470                    else {
2471                         while (t < tend) {
2472                              d = uvchr_to_utf8(d, UNI_TO_NATIVE(*t));
2473                              t++;
2474                         }
2475                    }
2476                    len = d - tmpbuf;
2477                    Copy(tmpbuf, ustrp, len, U8);
2478 #else
2479                    Copy(s, ustrp, len, U8);
2480 #endif
2481               }
2482          }
2483     }
2484
2485     if (!len && *swashp) {
2486         const UV uv2 = swash_fetch(*swashp, tmpbuf, TRUE /* => is utf8 */);
2487
2488          if (uv2) {
2489               /* It was "normal" (a single character mapping). */
2490               const UV uv3 = UNI_TO_NATIVE(uv2);
2491               len = uvchr_to_utf8(ustrp, uv3) - ustrp;
2492          }
2493     }
2494
2495     if (len) {
2496         if (lenp) {
2497             *lenp = len;
2498         }
2499         return valid_utf8_to_uvchr(ustrp, 0);
2500     }
2501
2502     /* Here, there was no mapping defined, which means that the code point maps
2503      * to itself.  Return the inputs */
2504     len = UTF8SKIP(p);
2505     Copy(p, ustrp, len, U8);
2506
2507     if (lenp)
2508          *lenp = len;
2509
2510     return uv0;
2511
2512 }
2513
2514 STATIC UV
2515 S_check_locale_boundary_crossing(pTHX_ const U8* const p, const UV result, U8* const ustrp, STRLEN *lenp)
2516 {
2517     /* This is called when changing the case of a utf8-encoded character above
2518      * the Latin1 range, and the operation is in locale.  If the result
2519      * contains a character that crosses the 255/256 boundary, disallow the
2520      * change, and return the original code point.  See L<perlfunc/lc> for why;
2521      *
2522      * p        points to the original string whose case was changed; assumed
2523      *          by this routine to be well-formed
2524      * result   the code point of the first character in the changed-case string
2525      * ustrp    points to the changed-case string (<result> represents its first char)
2526      * lenp     points to the length of <ustrp> */
2527
2528     UV original;    /* To store the first code point of <p> */
2529
2530     PERL_ARGS_ASSERT_CHECK_LOCALE_BOUNDARY_CROSSING;
2531
2532     assert(! UTF8_IS_INVARIANT(*p) && ! UTF8_IS_DOWNGRADEABLE_START(*p));
2533
2534     /* We know immediately if the first character in the string crosses the
2535      * boundary, so can skip */
2536     if (result > 255) {
2537
2538         /* Look at every character in the result; if any cross the
2539         * boundary, the whole thing is disallowed */
2540         U8* s = ustrp + UTF8SKIP(ustrp);
2541         U8* e = ustrp + *lenp;
2542         while (s < e) {
2543             if (UTF8_IS_INVARIANT(*s) || UTF8_IS_DOWNGRADEABLE_START(*s))
2544             {
2545                 goto bad_crossing;
2546             }
2547             s += UTF8SKIP(s);
2548         }
2549
2550         /* Here, no characters crossed, result is ok as-is */
2551         return result;
2552     }
2553
2554 bad_crossing:
2555
2556     /* Failed, have to return the original */
2557     original = valid_utf8_to_uvchr(p, lenp);
2558     Copy(p, ustrp, *lenp, char);
2559     return original;
2560 }
2561
2562 /*
2563 =for apidoc to_utf8_upper
2564
2565 Convert the UTF-8 encoded character at C<p> to its uppercase version and
2566 store that in UTF-8 in C<ustrp> and its length in bytes in C<lenp>.  Note
2567 that the ustrp needs to be at least UTF8_MAXBYTES_CASE+1 bytes since
2568 the uppercase version may be longer than the original character.
2569
2570 The first character of the uppercased version is returned
2571 (but note, as explained above, that there may be more.)
2572
2573 The character at C<p> is assumed by this routine to be well-formed.
2574
2575 =cut */
2576
2577 /* Not currently externally documented, and subject to change:
2578  * <flags> is set iff locale semantics are to be used for code points < 256
2579  * <tainted_ptr> if non-null, *tainted_ptr will be set TRUE iff locale rules
2580  *               were used in the calculation; otherwise unchanged. */
2581
2582 UV
2583 Perl__to_utf8_upper_flags(pTHX_ const U8 *p, U8* ustrp, STRLEN *lenp, const bool flags, bool* tainted_ptr)
2584 {
2585     dVAR;
2586
2587     UV result;
2588
2589     PERL_ARGS_ASSERT__TO_UTF8_UPPER_FLAGS;
2590
2591     if (UTF8_IS_INVARIANT(*p)) {
2592         if (flags) {
2593             result = toUPPER_LC(*p);
2594         }
2595         else {
2596             return _to_upper_title_latin1(*p, ustrp, lenp, 'S');
2597         }
2598     }
2599     else if UTF8_IS_DOWNGRADEABLE_START(*p) {
2600         if (flags) {
2601             result = toUPPER_LC(TWO_BYTE_UTF8_TO_UNI(*p, *(p+1)));
2602         }
2603         else {
2604             return _to_upper_title_latin1(TWO_BYTE_UTF8_TO_UNI(*p, *(p+1)),
2605                                           ustrp, lenp, 'S');
2606         }
2607     }
2608     else {  /* utf8, ord above 255 */
2609         result = CALL_UPPER_CASE(p, ustrp, lenp);
2610
2611         if (flags) {
2612             result = check_locale_boundary_crossing(p, result, ustrp, lenp);
2613         }
2614         return result;
2615     }
2616
2617     /* Here, used locale rules.  Convert back to utf8 */
2618     if (UTF8_IS_INVARIANT(result)) {
2619         *ustrp = (U8) result;
2620         *lenp = 1;
2621     }
2622     else {
2623         *ustrp = UTF8_EIGHT_BIT_HI(result);
2624         *(ustrp + 1) = UTF8_EIGHT_BIT_LO(result);
2625         *lenp = 2;
2626     }
2627
2628     if (tainted_ptr) {
2629         *tainted_ptr = TRUE;
2630     }
2631     return result;
2632 }
2633
2634 /*
2635 =for apidoc to_utf8_title
2636
2637 Convert the UTF-8 encoded character at C<p> to its titlecase version and
2638 store that in UTF-8 in C<ustrp> and its length in bytes in C<lenp>.  Note
2639 that the C<ustrp> needs to be at least UTF8_MAXBYTES_CASE+1 bytes since the
2640 titlecase version may be longer than the original character.
2641
2642 The first character of the titlecased version is returned
2643 (but note, as explained above, that there may be more.)
2644
2645 The character at C<p> is assumed by this routine to be well-formed.
2646
2647 =cut */
2648
2649 /* Not currently externally documented, and subject to change:
2650  * <flags> is set iff locale semantics are to be used for code points < 256
2651  *         Since titlecase is not defined in POSIX, uppercase is used instead
2652  *         for these/
2653  * <tainted_ptr> if non-null, *tainted_ptr will be set TRUE iff locale rules
2654  *               were used in the calculation; otherwise unchanged. */
2655
2656 UV
2657 Perl__to_utf8_title_flags(pTHX_ const U8 *p, U8* ustrp, STRLEN *lenp, const bool flags, bool* tainted_ptr)
2658 {
2659     dVAR;
2660
2661     UV result;
2662
2663     PERL_ARGS_ASSERT__TO_UTF8_TITLE_FLAGS;
2664
2665     if (UTF8_IS_INVARIANT(*p)) {
2666         if (flags) {
2667             result = toUPPER_LC(*p);
2668         }
2669         else {
2670             return _to_upper_title_latin1(*p, ustrp, lenp, 's');
2671         }
2672     }
2673     else if UTF8_IS_DOWNGRADEABLE_START(*p) {
2674         if (flags) {
2675             result = toUPPER_LC(TWO_BYTE_UTF8_TO_UNI(*p, *(p+1)));
2676         }
2677         else {
2678             return _to_upper_title_latin1(TWO_BYTE_UTF8_TO_UNI(*p, *(p+1)),
2679                                           ustrp, lenp, 's');
2680         }
2681     }
2682     else {  /* utf8, ord above 255 */
2683         result = CALL_TITLE_CASE(p, ustrp, lenp);
2684
2685         if (flags) {
2686             result = check_locale_boundary_crossing(p, result, ustrp, lenp);
2687         }
2688         return result;
2689     }
2690
2691     /* Here, used locale rules.  Convert back to utf8 */
2692     if (UTF8_IS_INVARIANT(result)) {
2693         *ustrp = (U8) result;
2694         *lenp = 1;
2695     }
2696     else {
2697         *ustrp = UTF8_EIGHT_BIT_HI(result);
2698         *(ustrp + 1) = UTF8_EIGHT_BIT_LO(result);
2699         *lenp = 2;
2700     }
2701
2702     if (tainted_ptr) {
2703         *tainted_ptr = TRUE;
2704     }
2705     return result;
2706 }
2707
2708 /*
2709 =for apidoc to_utf8_lower
2710
2711 Convert the UTF-8 encoded character at C<p> to its lowercase version and
2712 store that in UTF-8 in ustrp and its length in bytes in C<lenp>.  Note
2713 that the C<ustrp> needs to be at least UTF8_MAXBYTES_CASE+1 bytes since the
2714 lowercase version may be longer than the original character.
2715
2716 The first character of the lowercased version is returned
2717 (but note, as explained above, that there may be more.)
2718
2719 The character at C<p> is assumed by this routine to be well-formed.
2720
2721 =cut */
2722
2723 /* Not currently externally documented, and subject to change:
2724  * <flags> is set iff locale semantics are to be used for code points < 256
2725  * <tainted_ptr> if non-null, *tainted_ptr will be set TRUE iff locale rules
2726  *               were used in the calculation; otherwise unchanged. */
2727
2728 UV
2729 Perl__to_utf8_lower_flags(pTHX_ const U8 *p, U8* ustrp, STRLEN *lenp, const bool flags, bool* tainted_ptr)
2730 {
2731     UV result;
2732
2733     dVAR;
2734
2735     PERL_ARGS_ASSERT__TO_UTF8_LOWER_FLAGS;
2736
2737     if (UTF8_IS_INVARIANT(*p)) {
2738         if (flags) {
2739             result = toLOWER_LC(*p);
2740         }
2741         else {
2742             return to_lower_latin1(*p, ustrp, lenp);
2743         }
2744     }
2745     else if UTF8_IS_DOWNGRADEABLE_START(*p) {
2746         if (flags) {
2747             result = toLOWER_LC(TWO_BYTE_UTF8_TO_UNI(*p, *(p+1)));
2748         }
2749         else {
2750             return to_lower_latin1(TWO_BYTE_UTF8_TO_UNI(*p, *(p+1)),
2751                                    ustrp, lenp);
2752         }
2753     }
2754     else {  /* utf8, ord above 255 */
2755         result = CALL_LOWER_CASE(p, ustrp, lenp);
2756
2757         if (flags) {
2758             result = check_locale_boundary_crossing(p, result, ustrp, lenp);
2759         }
2760
2761         return result;
2762     }
2763
2764     /* Here, used locale rules.  Convert back to utf8 */
2765     if (UTF8_IS_INVARIANT(result)) {
2766         *ustrp = (U8) result;
2767         *lenp = 1;
2768     }
2769     else {
2770         *ustrp = UTF8_EIGHT_BIT_HI(result);
2771         *(ustrp + 1) = UTF8_EIGHT_BIT_LO(result);
2772         *lenp = 2;
2773     }
2774
2775     if (tainted_ptr) {
2776         *tainted_ptr = TRUE;
2777     }
2778     return result;
2779 }
2780
2781 /*
2782 =for apidoc to_utf8_fold
2783
2784 Convert the UTF-8 encoded character at C<p> to its foldcase version and
2785 store that in UTF-8 in C<ustrp> and its length in bytes in C<lenp>.  Note
2786 that the C<ustrp> needs to be at least UTF8_MAXBYTES_CASE+1 bytes since the
2787 foldcase version may be longer than the original character (up to
2788 three characters).
2789
2790 The first character of the foldcased version is returned
2791 (but note, as explained above, that there may be more.)
2792
2793 The character at C<p> is assumed by this routine to be well-formed.
2794
2795 =cut */
2796
2797 /* Not currently externally documented, and subject to change,
2798  * in <flags>
2799  *      bit FOLD_FLAGS_LOCALE is set iff locale semantics are to be used for code
2800  *                            points < 256.  Since foldcase is not defined in
2801  *                            POSIX, lowercase is used instead
2802  *      bit FOLD_FLAGS_FULL   is set iff full case folds are to be used;
2803  *                            otherwise simple folds
2804  *      bit FOLD_FLAGS_NOMIX_ASCII is set iff folds of non-ASCII to ASCII are
2805  *                            prohibited
2806  * <tainted_ptr> if non-null, *tainted_ptr will be set TRUE iff locale rules
2807  *               were used in the calculation; otherwise unchanged. */
2808
2809 UV
2810 Perl__to_utf8_fold_flags(pTHX_ const U8 *p, U8* ustrp, STRLEN *lenp, U8 flags, bool* tainted_ptr)
2811 {
2812     dVAR;
2813
2814     UV result;
2815
2816     PERL_ARGS_ASSERT__TO_UTF8_FOLD_FLAGS;
2817
2818     /* These are mutually exclusive */
2819     assert (! ((flags & FOLD_FLAGS_LOCALE) && (flags & FOLD_FLAGS_NOMIX_ASCII)));
2820
2821     assert(p != ustrp); /* Otherwise overwrites */
2822
2823     if (UTF8_IS_INVARIANT(*p)) {
2824         if (flags & FOLD_FLAGS_LOCALE) {
2825             result = toLOWER_LC(*p);
2826         }
2827         else {
2828             return _to_fold_latin1(*p, ustrp, lenp,
2829                                    cBOOL(flags & FOLD_FLAGS_FULL));
2830         }
2831     }
2832     else if UTF8_IS_DOWNGRADEABLE_START(*p) {
2833         if (flags & FOLD_FLAGS_LOCALE) {
2834             result = toLOWER_LC(TWO_BYTE_UTF8_TO_UNI(*p, *(p+1)));
2835         }
2836         else {
2837             return _to_fold_latin1(TWO_BYTE_UTF8_TO_UNI(*p, *(p+1)),
2838                                    ustrp, lenp,
2839                                    cBOOL((flags & FOLD_FLAGS_FULL
2840                                        /* If ASCII safe, don't allow full
2841                                         * folding, as that could include SHARP
2842                                         * S => ss; otherwise there is no
2843                                         * crossing of ascii/non-ascii in the
2844                                         * latin1 range */
2845                                        && ! (flags & FOLD_FLAGS_NOMIX_ASCII))));
2846         }
2847     }
2848     else {  /* utf8, ord above 255 */
2849         result = CALL_FOLD_CASE(p, ustrp, lenp, flags & FOLD_FLAGS_FULL);
2850
2851         if ((flags & FOLD_FLAGS_LOCALE)) {
2852             return check_locale_boundary_crossing(p, result, ustrp, lenp);
2853         }
2854         else if (! (flags & FOLD_FLAGS_NOMIX_ASCII)) {
2855             return result;
2856         }
2857         else {
2858             /* This is called when changing the case of a utf8-encoded
2859              * character above the Latin1 range, and the result should not
2860              * contain an ASCII character. */
2861
2862             UV original;    /* To store the first code point of <p> */
2863
2864             /* Look at every character in the result; if any cross the
2865             * boundary, the whole thing is disallowed */
2866             U8* s = ustrp;
2867             U8* e = ustrp + *lenp;
2868             while (s < e) {
2869                 if (isASCII(*s)) {
2870                     /* Crossed, have to return the original */
2871                     original = valid_utf8_to_uvchr(p, lenp);
2872                     Copy(p, ustrp, *lenp, char);
2873                     return original;
2874                 }
2875                 s += UTF8SKIP(s);
2876             }
2877
2878             /* Here, no characters crossed, result is ok as-is */
2879             return result;
2880         }
2881     }
2882
2883     /* Here, used locale rules.  Convert back to utf8 */
2884     if (UTF8_IS_INVARIANT(result)) {
2885         *ustrp = (U8) result;
2886         *lenp = 1;
2887     }
2888     else {
2889         *ustrp = UTF8_EIGHT_BIT_HI(result);
2890         *(ustrp + 1) = UTF8_EIGHT_BIT_LO(result);
2891         *lenp = 2;
2892     }
2893
2894     if (tainted_ptr) {
2895         *tainted_ptr = TRUE;
2896     }
2897     return result;
2898 }
2899
2900 /* Note:
2901  * Returns a "swash" which is a hash described in utf8.c:Perl_swash_fetch().
2902  * C<pkg> is a pointer to a package name for SWASHNEW, should be "utf8".
2903  * For other parameters, see utf8::SWASHNEW in lib/utf8_heavy.pl.
2904  */
2905
2906 SV*
2907 Perl_swash_init(pTHX_ const char* pkg, const char* name, SV *listsv, I32 minbits, I32 none)
2908 {
2909     PERL_ARGS_ASSERT_SWASH_INIT;
2910
2911     /* Returns a copy of a swash initiated by the called function.  This is the
2912      * public interface, and returning a copy prevents others from doing
2913      * mischief on the original */
2914
2915     return newSVsv(_core_swash_init(pkg, name, listsv, minbits, none, FALSE, NULL, NULL));
2916 }
2917
2918 SV*
2919 Perl__core_swash_init(pTHX_ const char* pkg, const char* name, SV *listsv, I32 minbits, I32 none, bool return_if_undef, SV* invlist, U8* const flags_p)
2920 {
2921     /* Initialize and return a swash, creating it if necessary.  It does this
2922      * by calling utf8_heavy.pl in the general case.
2923      *
2924      * This interface should only be used by functions that won't destroy or
2925      * adversely change the swash, as doing so affects all other uses of the
2926      * swash in the program; the general public should use 'Perl_swash_init'
2927      * instead.
2928      *
2929      * pkg  is the name of the package that <name> should be in.
2930      * name is the name of the swash to find.  Typically it is a Unicode
2931      *      property name, including user-defined ones
2932      * listsv is a string to initialize the swash with.  It must be of the form
2933      *      documented as the subroutine return value in
2934      *      L<perlunicode/User-Defined Character Properties>
2935      * minbits is the number of bits required to represent each data element.
2936      *      It is '1' for binary properties.
2937      * none I (khw) do not understand this one, but it is used only in tr///.
2938      * return_if_undef is TRUE if the routine shouldn't croak if it can't find
2939      *      the requested property
2940      * invlist is an inversion list to initialize the swash with (or NULL)
2941      * flags_p if non-NULL is the address of various input and output flag bits
2942      *      to the routine, as follows:  ('I' means is input to the routine;
2943      *      'O' means output from the routine.  Only flags marked O are
2944      *      meaningful on return.)
2945      *  _CORE_SWASH_INIT_USER_DEFINED_PROPERTY indicates if the swash
2946      *      came from a user-defined property.  (I O)
2947      *
2948      * Thus there are three possible inputs to find the swash: <name>,
2949      * <listsv>, and <invlist>.  At least one must be specified.  The result
2950      * will be the union of the specified ones, although <listsv>'s various
2951      * actions can intersect, etc. what <name> gives.
2952      *
2953      * <invlist> is only valid for binary properties */
2954
2955     dVAR;
2956     SV* retval = &PL_sv_undef;
2957     HV* swash_hv = NULL;
2958
2959     assert(listsv != &PL_sv_undef || strNE(name, "") || invlist);
2960     assert(! invlist || minbits == 1);
2961
2962     /* If data was passed in to go out to utf8_heavy to find the swash of, do
2963      * so */
2964     if (listsv != &PL_sv_undef || strNE(name, "")) {
2965         dSP;
2966         const size_t pkg_len = strlen(pkg);
2967         const size_t name_len = strlen(name);
2968         HV * const stash = gv_stashpvn(pkg, pkg_len, 0);
2969         SV* errsv_save;
2970         GV *method;
2971
2972         PERL_ARGS_ASSERT__CORE_SWASH_INIT;
2973
2974         PUSHSTACKi(PERLSI_MAGIC);
2975         ENTER;
2976         SAVEHINTS();
2977         save_re_context();
2978         if (PL_parser && PL_parser->error_count)
2979             SAVEI8(PL_parser->error_count), PL_parser->error_count = 0;
2980         method = gv_fetchmeth(stash, "SWASHNEW", 8, -1);
2981         if (!method) {  /* demand load utf8 */
2982             ENTER;
2983             errsv_save = newSVsv(ERRSV);
2984             /* It is assumed that callers of this routine are not passing in
2985              * any user derived data.  */
2986             /* Need to do this after save_re_context() as it will set
2987              * PL_tainted to 1 while saving $1 etc (see the code after getrx:
2988              * in Perl_magic_get).  Even line to create errsv_save can turn on
2989              * PL_tainted.  */
2990             SAVEBOOL(PL_tainted);
2991             PL_tainted = 0;
2992             Perl_load_module(aTHX_ PERL_LOADMOD_NOIMPORT, newSVpvn(pkg,pkg_len),
2993                              NULL);
2994             if (!SvTRUE(ERRSV))
2995                 sv_setsv(ERRSV, errsv_save);
2996             SvREFCNT_dec(errsv_save);
2997             LEAVE;
2998         }
2999         SPAGAIN;
3000         PUSHMARK(SP);
3001         EXTEND(SP,5);
3002         mPUSHp(pkg, pkg_len);
3003         mPUSHp(name, name_len);
3004         PUSHs(listsv);
3005         mPUSHi(minbits);
3006         mPUSHi(none);
3007         PUTBACK;
3008         errsv_save = newSVsv(ERRSV);
3009         /* If we already have a pointer to the method, no need to use
3010          * call_method() to repeat the lookup.  */
3011         if (method ? call_sv(MUTABLE_SV(method), G_SCALAR)
3012             : call_sv(newSVpvs_flags("SWASHNEW", SVs_TEMP), G_SCALAR | G_METHOD))
3013         {
3014             retval = *PL_stack_sp--;
3015             SvREFCNT_inc(retval);
3016         }
3017         if (!SvTRUE(ERRSV))
3018             sv_setsv(ERRSV, errsv_save);
3019         SvREFCNT_dec(errsv_save);
3020         LEAVE;
3021         POPSTACK;
3022         if (IN_PERL_COMPILETIME) {
3023             CopHINTS_set(PL_curcop, PL_hints);
3024         }
3025         if (!SvROK(retval) || SvTYPE(SvRV(retval)) != SVt_PVHV) {
3026             if (SvPOK(retval))
3027
3028                 /* If caller wants to handle missing properties, let them */
3029                 if (return_if_undef) {
3030                     return NULL;
3031                 }
3032                 Perl_croak(aTHX_
3033                            "Can't find Unicode property definition \"%"SVf"\"",
3034                            SVfARG(retval));
3035             Perl_croak(aTHX_ "SWASHNEW didn't return an HV ref");
3036         }
3037     } /* End of calling the module to find the swash */
3038
3039     /* If this operation fetched a swash, and we will need it later, get it */
3040     if (retval != &PL_sv_undef
3041         && (minbits == 1 || (flags_p
3042                             && ! (*flags_p
3043                                   & _CORE_SWASH_INIT_USER_DEFINED_PROPERTY))))
3044     {
3045         swash_hv = MUTABLE_HV(SvRV(retval));
3046
3047         /* If we don't already know that there is a user-defined component to
3048          * this swash, and the user has indicated they wish to know if there is
3049          * one (by passing <flags_p>), find out */
3050         if (flags_p && ! (*flags_p & _CORE_SWASH_INIT_USER_DEFINED_PROPERTY)) {
3051             SV** user_defined = hv_fetchs(swash_hv, "USER_DEFINED", FALSE);
3052             if (user_defined && SvUV(*user_defined)) {
3053                 *flags_p |= _CORE_SWASH_INIT_USER_DEFINED_PROPERTY;
3054             }
3055         }
3056     }
3057
3058     /* Make sure there is an inversion list for binary properties */
3059     if (minbits == 1) {
3060         SV** swash_invlistsvp = NULL;
3061         SV* swash_invlist = NULL;
3062         bool invlist_in_swash_is_valid = FALSE;
3063
3064         /* If this operation fetched a swash, get its already existing
3065          * inversion list, or create one for it */
3066
3067         if (swash_hv) {
3068             swash_invlistsvp = hv_fetchs(swash_hv, "I", FALSE);
3069             if (swash_invlistsvp) {
3070                 swash_invlist = *swash_invlistsvp;
3071                 invlist_in_swash_is_valid = TRUE;
3072             }
3073             else {
3074                 swash_invlist = _swash_to_invlist(retval);
3075             }
3076         }
3077
3078         /* If an inversion list was passed in, have to include it */
3079         if (invlist) {
3080
3081             /* Any fetched swash will by now have an inversion list in it;
3082              * otherwise <swash_invlist>  will be NULL, indicating that we
3083              * didn't fetch a swash */
3084             if (swash_invlist) {
3085
3086                 /* Add the passed-in inversion list, which invalidates the one
3087                  * already stored in the swash */
3088                 invlist_in_swash_is_valid = FALSE;
3089                 _invlist_union(invlist, swash_invlist, &swash_invlist);
3090             }
3091             else {
3092
3093                 /* Here, there is no swash already.  Set up a minimal one */
3094                 swash_hv = newHV();
3095                 retval = newRV_inc(MUTABLE_SV(swash_hv));
3096                 swash_invlist = invlist;
3097             }
3098         }
3099
3100         /* Here, we have computed the union of all the passed-in data.  It may
3101          * be that there was an inversion list in the swash which didn't get
3102          * touched; otherwise save the one computed one */
3103         if (! invlist_in_swash_is_valid) {
3104             if (! hv_stores(MUTABLE_HV(SvRV(retval)), "INVLIST", swash_invlist))
3105             {
3106                 Perl_croak(aTHX_ "panic: hv_store() unexpectedly failed");
3107             }
3108         }
3109     }
3110
3111     return retval;
3112 }
3113
3114
3115 /* This API is wrong for special case conversions since we may need to
3116  * return several Unicode characters for a single Unicode character
3117  * (see lib/unicore/SpecCase.txt) The SWASHGET in lib/utf8_heavy.pl is
3118  * the lower-level routine, and it is similarly broken for returning
3119  * multiple values.  --jhi
3120  * For those, you should use to_utf8_case() instead */
3121 /* Now SWASHGET is recasted into S_swatch_get in this file. */
3122
3123 /* Note:
3124  * Returns the value of property/mapping C<swash> for the first character
3125  * of the string C<ptr>. If C<do_utf8> is true, the string C<ptr> is
3126  * assumed to be in utf8. If C<do_utf8> is false, the string C<ptr> is
3127  * assumed to be in native 8-bit encoding. Caches the swatch in C<swash>.
3128  *
3129  * A "swash" is a hash which contains initially the keys/values set up by
3130  * SWASHNEW.  The purpose is to be able to completely represent a Unicode
3131  * property for all possible code points.  Things are stored in a compact form
3132  * (see utf8_heavy.pl) so that calculation is required to find the actual
3133  * property value for a given code point.  As code points are looked up, new
3134  * key/value pairs are added to the hash, so that the calculation doesn't have
3135  * to ever be re-done.  Further, each calculation is done, not just for the
3136  * desired one, but for a whole block of code points adjacent to that one.
3137  * For binary properties on ASCII machines, the block is usually for 64 code
3138  * points, starting with a code point evenly divisible by 64.  Thus if the
3139  * property value for code point 257 is requested, the code goes out and
3140  * calculates the property values for all 64 code points between 256 and 319,
3141  * and stores these as a single 64-bit long bit vector, called a "swatch",
3142  * under the key for code point 256.  The key is the UTF-8 encoding for code
3143  * point 256, minus the final byte.  Thus, if the length of the UTF-8 encoding
3144  * for a code point is 13 bytes, the key will be 12 bytes long.  If the value
3145  * for code point 258 is then requested, this code realizes that it would be
3146  * stored under the key for 256, and would find that value and extract the
3147  * relevant bit, offset from 256.
3148  *
3149  * Non-binary properties are stored in as many bits as necessary to represent
3150  * their values (32 currently, though the code is more general than that), not
3151  * as single bits, but the principal is the same: the value for each key is a
3152  * vector that encompasses the property values for all code points whose UTF-8
3153  * representations are represented by the key.  That is, for all code points
3154  * whose UTF-8 representations are length N bytes, and the key is the first N-1
3155  * bytes of that.
3156  */
3157 UV
3158 Perl_swash_fetch(pTHX_ SV *swash, const U8 *ptr, bool do_utf8)
3159 {
3160     dVAR;
3161     HV *const hv = MUTABLE_HV(SvRV(swash));
3162     U32 klen;
3163     U32 off;
3164     STRLEN slen;
3165     STRLEN needents;
3166     const U8 *tmps = NULL;
3167     U32 bit;
3168     SV *swatch;
3169     U8 tmputf8[2];
3170     const UV c = NATIVE_TO_ASCII(*ptr);
3171
3172     PERL_ARGS_ASSERT_SWASH_FETCH;
3173
3174     /* Convert to utf8 if not already */
3175     if (!do_utf8 && !UNI_IS_INVARIANT(c)) {
3176         tmputf8[0] = (U8)UTF8_EIGHT_BIT_HI(c);
3177         tmputf8[1] = (U8)UTF8_EIGHT_BIT_LO(c);
3178         ptr = tmputf8;
3179     }
3180     /* Given a UTF-X encoded char 0xAA..0xYY,0xZZ
3181      * then the "swatch" is a vec() for all the chars which start
3182      * with 0xAA..0xYY
3183      * So the key in the hash (klen) is length of encoded char -1
3184      */
3185     klen = UTF8SKIP(ptr) - 1;
3186     off  = ptr[klen];
3187
3188     if (klen == 0) {
3189       /* If char is invariant then swatch is for all the invariant chars
3190        * In both UTF-8 and UTF-8-MOD that happens to be UTF_CONTINUATION_MARK
3191        */
3192         needents = UTF_CONTINUATION_MARK;
3193         off      = NATIVE_TO_UTF(ptr[klen]);
3194     }
3195     else {
3196       /* If char is encoded then swatch is for the prefix */
3197         needents = (1 << UTF_ACCUMULATION_SHIFT);
3198         off      = NATIVE_TO_UTF(ptr[klen]) & UTF_CONTINUATION_MASK;
3199     }
3200
3201     /*
3202      * This single-entry cache saves about 1/3 of the utf8 overhead in test
3203      * suite.  (That is, only 7-8% overall over just a hash cache.  Still,
3204      * it's nothing to sniff at.)  Pity we usually come through at least
3205      * two function calls to get here...
3206      *
3207      * NB: this code assumes that swatches are never modified, once generated!
3208      */
3209
3210     if (hv   == PL_last_swash_hv &&
3211         klen == PL_last_swash_klen &&
3212         (!klen || memEQ((char *)ptr, (char *)PL_last_swash_key, klen)) )
3213     {
3214         tmps = PL_last_swash_tmps;
3215         slen = PL_last_swash_slen;
3216     }
3217     else {
3218         /* Try our second-level swatch cache, kept in a hash. */
3219         SV** svp = hv_fetch(hv, (const char*)ptr, klen, FALSE);
3220
3221         /* If not cached, generate it via swatch_get */
3222         if (!svp || !SvPOK(*svp)
3223                  || !(tmps = (const U8*)SvPV_const(*svp, slen))) {
3224             /* We use utf8n_to_uvuni() as we want an index into
3225                Unicode tables, not a native character number.
3226              */
3227             const UV code_point = utf8n_to_uvuni(ptr, UTF8_MAXBYTES, 0,
3228                                            ckWARN(WARN_UTF8) ?
3229                                            0 : UTF8_ALLOW_ANY);
3230             swatch = swatch_get(swash,
3231                     /* On EBCDIC & ~(0xA0-1) isn't a useful thing to do */
3232                                 (klen) ? (code_point & ~((UV)needents - 1)) : 0,
3233                                 needents);
3234
3235             if (IN_PERL_COMPILETIME)
3236                 CopHINTS_set(PL_curcop, PL_hints);
3237
3238             svp = hv_store(hv, (const char *)ptr, klen, swatch, 0);
3239
3240             if (!svp || !(tmps = (U8*)SvPV(*svp, slen))
3241                      || (slen << 3) < needents)
3242                 Perl_croak(aTHX_ "panic: swash_fetch got improper swatch, "
3243                            "svp=%p, tmps=%p, slen=%"UVuf", needents=%"UVuf,
3244                            svp, tmps, (UV)slen, (UV)needents);
3245         }
3246
3247         PL_last_swash_hv = hv;
3248         assert(klen <= sizeof(PL_last_swash_key));
3249         PL_last_swash_klen = (U8)klen;
3250         /* FIXME change interpvar.h?  */
3251         PL_last_swash_tmps = (U8 *) tmps;
3252         PL_last_swash_slen = slen;
3253         if (klen)
3254             Copy(ptr, PL_last_swash_key, klen, U8);
3255     }
3256
3257     switch ((int)((slen << 3) / needents)) {
3258     case 1:
3259         bit = 1 << (off & 7);
3260         off >>= 3;
3261         return (tmps[off] & bit) != 0;
3262     case 8:
3263         return tmps[off];
3264     case 16:
3265         off <<= 1;
3266         return (tmps[off] << 8) + tmps[off + 1] ;
3267     case 32:
3268         off <<= 2;
3269         return (tmps[off] << 24) + (tmps[off+1] << 16) + (tmps[off+2] << 8) + tmps[off + 3] ;
3270     }
3271     Perl_croak(aTHX_ "panic: swash_fetch got swatch of unexpected bit width, "
3272                "slen=%"UVuf", needents=%"UVuf, (UV)slen, (UV)needents);
3273     NORETURN_FUNCTION_END;
3274 }
3275
3276 /* Read a single line of the main body of the swash input text.  These are of
3277  * the form:
3278  * 0053 0056    0073
3279  * where each number is hex.  The first two numbers form the minimum and
3280  * maximum of a range, and the third is the value associated with the range.
3281  * Not all swashes should have a third number
3282  *
3283  * On input: l    points to the beginning of the line to be examined; it points
3284  *                to somewhere in the string of the whole input text, and is
3285  *                terminated by a \n or the null string terminator.
3286  *           lend   points to the null terminator of that string
3287  *           wants_value    is non-zero if the swash expects a third number
3288  *           typestr is the name of the swash's mapping, like 'ToLower'
3289  * On output: *min, *max, and *val are set to the values read from the line.
3290  *            returns a pointer just beyond the line examined.  If there was no
3291  *            valid min number on the line, returns lend+1
3292  */
3293
3294 STATIC U8*
3295 S_swash_scan_list_line(pTHX_ U8* l, U8* const lend, UV* min, UV* max, UV* val,
3296                              const bool wants_value, const U8* const typestr)
3297 {
3298     const int  typeto  = typestr[0] == 'T' && typestr[1] == 'o';
3299     STRLEN numlen;          /* Length of the number */
3300     I32 flags = PERL_SCAN_SILENT_ILLDIGIT
3301                 | PERL_SCAN_DISALLOW_PREFIX
3302                 | PERL_SCAN_SILENT_NON_PORTABLE;
3303
3304     /* nl points to the next \n in the scan */
3305     U8* const nl = (U8*)memchr(l, '\n', lend - l);
3306
3307     /* Get the first number on the line: the range minimum */
3308     numlen = lend - l;
3309     *min = grok_hex((char *)l, &numlen, &flags, NULL);
3310     if (numlen)     /* If found a hex number, position past it */
3311         l += numlen;
3312     else if (nl) {          /* Else, go handle next line, if any */
3313         return nl + 1;  /* 1 is length of "\n" */
3314     }
3315     else {              /* Else, no next line */
3316         return lend + 1;        /* to LIST's end at which \n is not found */
3317     }
3318
3319     /* The max range value follows, separated by a BLANK */
3320     if (isBLANK(*l)) {
3321         ++l;
3322         flags = PERL_SCAN_SILENT_ILLDIGIT
3323                 | PERL_SCAN_DISALLOW_PREFIX
3324                 | PERL_SCAN_SILENT_NON_PORTABLE;
3325         numlen = lend - l;
3326         *max = grok_hex((char *)l, &numlen, &flags, NULL);
3327         if (numlen)
3328             l += numlen;
3329         else    /* If no value here, it is a single element range */
3330             *max = *min;
3331
3332         /* Non-binary tables have a third entry: what the first element of the
3333          * range maps to */
3334         if (wants_value) {
3335             if (isBLANK(*l)) {
3336                 ++l;
3337
3338                 /* The ToLc, etc table mappings are not in hex, and must be
3339                  * corrected by adding the code point to them */
3340                 if (typeto) {
3341                     char *after_strtol = (char *) lend;
3342                     *val = Strtol((char *)l, &after_strtol, 10);
3343                     l = (U8 *) after_strtol;
3344                 }
3345                 else { /* Other tables are in hex, and are the correct result
3346                           without tweaking */
3347                     flags = PERL_SCAN_SILENT_ILLDIGIT
3348                         | PERL_SCAN_DISALLOW_PREFIX
3349                         | PERL_SCAN_SILENT_NON_PORTABLE;
3350                     numlen = lend - l;
3351                     *val = grok_hex((char *)l, &numlen, &flags, NULL);
3352                     if (numlen)
3353                         l += numlen;
3354                     else
3355                         *val = 0;
3356                 }
3357             }
3358             else {
3359                 *val = 0;
3360                 if (typeto) {
3361                     /* diag_listed_as: To%s: illegal mapping '%s' */
3362                     Perl_croak(aTHX_ "%s: illegal mapping '%s'",
3363                                      typestr, l);
3364                 }
3365             }
3366         }
3367         else
3368             *val = 0; /* bits == 1, then any val should be ignored */
3369     }
3370     else { /* Nothing following range min, should be single element with no
3371               mapping expected */
3372         *max = *min;
3373         if (wants_value) {
3374             *val = 0;
3375             if (typeto) {
3376                 /* diag_listed_as: To%s: illegal mapping '%s' */
3377                 Perl_croak(aTHX_ "%s: illegal mapping '%s'", typestr, l);
3378             }
3379         }
3380         else
3381             *val = 0; /* bits == 1, then val should be ignored */
3382     }
3383
3384     /* Position to next line if any, or EOF */
3385     if (nl)
3386         l = nl + 1;
3387     else
3388         l = lend;
3389
3390     return l;
3391 }
3392
3393 /* Note:
3394  * Returns a swatch (a bit vector string) for a code point sequence
3395  * that starts from the value C<start> and comprises the number C<span>.
3396  * A C<swash> must be an object created by SWASHNEW (see lib/utf8_heavy.pl).
3397  * Should be used via swash_fetch, which will cache the swatch in C<swash>.
3398  */
3399 STATIC SV*
3400 S_swatch_get(pTHX_ SV* swash, UV start, UV span)
3401 {
3402     SV *swatch;
3403     U8 *l, *lend, *x, *xend, *s, *send;
3404     STRLEN lcur, xcur, scur;
3405     HV *const hv = MUTABLE_HV(SvRV(swash));
3406     SV** const invlistsvp = hv_fetchs(hv, "INVLIST", FALSE);
3407
3408     SV** listsvp = NULL; /* The string containing the main body of the table */
3409     SV** extssvp = NULL;
3410     SV** invert_it_svp = NULL;
3411     U8* typestr = NULL;
3412     STRLEN bits;
3413     STRLEN octets; /* if bits == 1, then octets == 0 */
3414     UV  none;
3415     UV  end = start + span;
3416
3417     if (invlistsvp == NULL) {
3418         SV** const bitssvp = hv_fetchs(hv, "BITS", FALSE);
3419         SV** const nonesvp = hv_fetchs(hv, "NONE", FALSE);
3420         SV** const typesvp = hv_fetchs(hv, "TYPE", FALSE);
3421         extssvp = hv_fetchs(hv, "EXTRAS", FALSE);
3422         listsvp = hv_fetchs(hv, "LIST", FALSE);
3423         invert_it_svp = hv_fetchs(hv, "INVERT_IT", FALSE);
3424
3425         bits  = SvUV(*bitssvp);
3426         none  = SvUV(*nonesvp);
3427         typestr = (U8*)SvPV_nolen(*typesvp);
3428     }
3429     else {
3430         bits = 1;
3431         none = 0;
3432     }
3433     octets = bits >> 3; /* if bits == 1, then octets == 0 */
3434
3435     PERL_ARGS_ASSERT_SWATCH_GET;
3436
3437     if (bits != 1 && bits != 8 && bits != 16 && bits != 32) {
3438         Perl_croak(aTHX_ "panic: swatch_get doesn't expect bits %"UVuf,
3439                                                  (UV)bits);
3440     }
3441
3442     /* If overflowed, use the max possible */
3443     if (end < start) {
3444         end = UV_MAX;
3445         span = end - start;
3446     }
3447
3448     /* create and initialize $swatch */
3449     scur   = octets ? (span * octets) : (span + 7) / 8;
3450     swatch = newSV(scur);
3451     SvPOK_on(swatch);
3452     s = (U8*)SvPVX(swatch);
3453     if (octets && none) {
3454         const U8* const e = s + scur;
3455         while (s < e) {
3456             if (bits == 8)
3457                 *s++ = (U8)(none & 0xff);
3458             else if (bits == 16) {
3459                 *s++ = (U8)((none >>  8) & 0xff);
3460                 *s++ = (U8)( none        & 0xff);
3461             }
3462             else if (bits == 32) {
3463                 *s++ = (U8)((none >> 24) & 0xff);
3464                 *s++ = (U8)((none >> 16) & 0xff);
3465                 *s++ = (U8)((none >>  8) & 0xff);
3466                 *s++ = (U8)( none        & 0xff);
3467             }
3468         }
3469         *s = '\0';
3470     }
3471     else {
3472         (void)memzero((U8*)s, scur + 1);
3473     }
3474     SvCUR_set(swatch, scur);
3475     s = (U8*)SvPVX(swatch);
3476
3477     if (invlistsvp) {   /* If has an inversion list set up use that */
3478         _invlist_populate_swatch(*invlistsvp, start, end, s);
3479         return swatch;
3480     }
3481
3482     /* read $swash->{LIST} */
3483     l = (U8*)SvPV(*listsvp, lcur);
3484     lend = l + lcur;
3485     while (l < lend) {
3486         UV min, max, val, upper;
3487         l = S_swash_scan_list_line(aTHX_ l, lend, &min, &max, &val,
3488                                          cBOOL(octets), typestr);
3489         if (l > lend) {
3490             break;
3491         }
3492
3493         /* If looking for something beyond this range, go try the next one */
3494         if (max < start)
3495             continue;
3496
3497         /* <end> is generally 1 beyond where we want to set things, but at the
3498          * platform's infinity, where we can't go any higher, we want to
3499          * include the code point at <end> */
3500         upper = (max < end)
3501                 ? max
3502                 : (max != UV_MAX || end != UV_MAX)
3503                   ? end - 1
3504                   : end;
3505
3506         if (octets) {
3507             UV key;
3508             if (min < start) {
3509                 if (!none || val < none) {
3510                     val += start - min;
3511                 }
3512                 min = start;
3513             }
3514             for (key = min; key <= upper; key++) {
3515                 STRLEN offset;
3516                 /* offset must be non-negative (start <= min <= key < end) */
3517                 offset = octets * (key - start);
3518                 if (bits == 8)
3519                     s[offset] = (U8)(val & 0xff);
3520                 else if (bits == 16) {
3521                     s[offset    ] = (U8)((val >>  8) & 0xff);
3522                     s[offset + 1] = (U8)( val        & 0xff);
3523                 }
3524                 else if (bits == 32) {
3525                     s[offset    ] = (U8)((val >> 24) & 0xff);
3526                     s[offset + 1] = (U8)((val >> 16) & 0xff);
3527                     s[offset + 2] = (U8)((val >>  8) & 0xff);
3528                     s[offset + 3] = (U8)( val        & 0xff);
3529                 }
3530
3531                 if (!none || val < none)
3532                     ++val;
3533             }
3534         }
3535         else { /* bits == 1, then val should be ignored */
3536             UV key;
3537             if (min < start)
3538                 min = start;
3539
3540             for (key = min; key <= upper; key++) {
3541                 const STRLEN offset = (STRLEN)(key - start);
3542                 s[offset >> 3] |= 1 << (offset & 7);
3543             }
3544         }
3545     } /* while */
3546
3547     /* Invert if the data says it should be.  Assumes that bits == 1 */
3548     if (invert_it_svp && SvUV(*invert_it_svp)) {
3549
3550         /* Unicode properties should come with all bits above PERL_UNICODE_MAX
3551          * be 0, and their inversion should also be 0, as we don't succeed any
3552          * Unicode property matches for non-Unicode code points */
3553         if (start <= PERL_UNICODE_MAX) {
3554
3555             /* The code below assumes that we never cross the
3556              * Unicode/above-Unicode boundary in a range, as otherwise we would
3557              * have to figure out where to stop flipping the bits.  Since this
3558              * boundary is divisible by a large power of 2, and swatches comes
3559              * in small powers of 2, this should be a valid assumption */
3560             assert(start + span - 1 <= PERL_UNICODE_MAX);
3561
3562             send = s + scur;
3563             while (s < send) {
3564                 *s = ~(*s);
3565                 s++;
3566             }
3567         }
3568     }
3569
3570     /* read $swash->{EXTRAS}
3571      * This code also copied to swash_to_invlist() below */
3572     x = (U8*)SvPV(*extssvp, xcur);
3573     xend = x + xcur;
3574     while (x < xend) {
3575         STRLEN namelen;
3576         U8 *namestr;
3577         SV** othersvp;
3578         HV* otherhv;
3579         STRLEN otherbits;
3580         SV **otherbitssvp, *other;
3581         U8 *s, *o, *nl;
3582         STRLEN slen, olen;
3583
3584         const U8 opc = *x++;
3585         if (opc == '\n')
3586             continue;
3587
3588         nl = (U8*)memchr(x, '\n', xend - x);
3589
3590         if (opc != '-' && opc != '+' && opc != '!' && opc != '&') {
3591             if (nl) {
3592                 x = nl + 1; /* 1 is length of "\n" */
3593                 continue;
3594             }
3595             else {
3596                 x = xend; /* to EXTRAS' end at which \n is not found */
3597                 break;
3598             }
3599         }
3600
3601         namestr = x;
3602         if (nl) {
3603             namelen = nl - namestr;
3604             x = nl + 1;
3605         }
3606         else {
3607             namelen = xend - namestr;
3608             x = xend;
3609         }
3610
3611         othersvp = hv_fetch(hv, (char *)namestr, namelen, FALSE);
3612         otherhv = MUTABLE_HV(SvRV(*othersvp));
3613         otherbitssvp = hv_fetchs(otherhv, "BITS", FALSE);
3614         otherbits = (STRLEN)SvUV(*otherbitssvp);
3615         if (bits < otherbits)
3616             Perl_croak(aTHX_ "panic: swatch_get found swatch size mismatch, "
3617                        "bits=%"UVuf", otherbits=%"UVuf, (UV)bits, (UV)otherbits);
3618
3619         /* The "other" swatch must be destroyed after. */
3620         other = swatch_get(*othersvp, start, span);
3621         o = (U8*)SvPV(other, olen);
3622
3623         if (!olen)
3624             Perl_croak(aTHX_ "panic: swatch_get got improper swatch");
3625
3626         s = (U8*)SvPV(swatch, slen);
3627         if (bits == 1 && otherbits == 1) {
3628             if (slen != olen)
3629                 Perl_croak(aTHX_ "panic: swatch_get found swatch length "
3630                            "mismatch, slen=%"UVuf", olen=%"UVuf,
3631                            (UV)slen, (UV)olen);
3632
3633             switch (opc) {
3634             case '+':
3635                 while (slen--)
3636                     *s++ |= *o++;
3637                 break;
3638             case '!':
3639                 while (slen--)
3640                     *s++ |= ~*o++;
3641                 break;
3642             case '-':
3643                 while (slen--)
3644                     *s++ &= ~*o++;
3645                 break;
3646             case '&':
3647                 while (slen--)
3648                     *s++ &= *o++;
3649                 break;
3650             default:
3651                 break;
3652             }
3653         }
3654         else {
3655             STRLEN otheroctets = otherbits >> 3;
3656             STRLEN offset = 0;
3657             U8* const send = s + slen;
3658
3659             while (s < send) {
3660                 UV otherval = 0;
3661
3662                 if (otherbits == 1) {
3663                     otherval = (o[offset >> 3] >> (offset & 7)) & 1;
3664                     ++offset;
3665                 }
3666                 else {
3667                     STRLEN vlen = otheroctets;
3668                     otherval = *o++;
3669                     while (--vlen) {
3670                         otherval <<= 8;
3671                         otherval |= *o++;
3672                     }
3673                 }
3674
3675                 if (opc == '+' && otherval)
3676                     NOOP;   /* replace with otherval */
3677                 else if (opc == '!' && !otherval)
3678                     otherval = 1;
3679                 else if (opc == '-' && otherval)
3680                     otherval = 0;
3681                 else if (opc == '&' && !otherval)
3682                     otherval = 0;
3683                 else {
3684                     s += octets; /* no replacement */
3685                     continue;
3686                 }
3687
3688                 if (bits == 8)
3689                     *s++ = (U8)( otherval & 0xff);
3690                 else if (bits == 16) {
3691                     *s++ = (U8)((otherval >>  8) & 0xff);
3692                     *s++ = (U8)( otherval        & 0xff);
3693                 }
3694                 else if (bits == 32) {
3695                     *s++ = (U8)((otherval >> 24) & 0xff);
3696                     *s++ = (U8)((otherval >> 16) & 0xff);
3697                     *s++ = (U8)((otherval >>  8) & 0xff);
3698                     *s++ = (U8)( otherval        & 0xff);
3699                 }
3700             }
3701         }
3702         sv_free(other); /* through with it! */
3703     } /* while */
3704     return swatch;
3705 }
3706
3707 HV*
3708 Perl__swash_inversion_hash(pTHX_ SV* const swash)
3709 {
3710
3711    /* Subject to change or removal.  For use only in one place in regcomp.c.
3712     * Can't be used on a property that is subject to user override, as it
3713     * relies on the value of SPECIALS in the swash which would be set by
3714     * utf8_heavy.pl to the hash in the non-overriden file, and hence is not set
3715     * for overridden properties
3716     *
3717     * Returns a hash which is the inversion and closure of a swash mapping.
3718     * For example, consider the input lines:
3719     * 004B              006B
3720     * 004C              006C
3721     * 212A              006B
3722     *
3723     * The returned hash would have two keys, the utf8 for 006B and the utf8 for
3724     * 006C.  The value for each key is an array.  For 006C, the array would
3725     * have a two elements, the utf8 for itself, and for 004C.  For 006B, there
3726     * would be three elements in its array, the utf8 for 006B, 004B and 212A.
3727     *
3728     * Essentially, for any code point, it gives all the code points that map to
3729     * it, or the list of 'froms' for that point.
3730     *
3731     * Currently it ignores any additions or deletions from other swashes,
3732     * looking at just the main body of the swash, and if there are SPECIALS
3733     * in the swash, at that hash
3734     *
3735     * The specials hash can be extra code points, and most likely consists of
3736     * maps from single code points to multiple ones (each expressed as a string
3737     * of utf8 characters).   This function currently returns only 1-1 mappings.
3738     * However consider this possible input in the specials hash:
3739     * "\xEF\xAC\x85" => "\x{0073}\x{0074}",         # U+FB05 => 0073 0074
3740     * "\xEF\xAC\x86" => "\x{0073}\x{0074}",         # U+FB06 => 0073 0074
3741     *
3742     * Both FB05 and FB06 map to the same multi-char sequence, which we don't
3743     * currently handle.  But it also means that FB05 and FB06 are equivalent in
3744     * a 1-1 mapping which we should handle, and this relationship may not be in
3745     * the main table.  Therefore this function examines all the multi-char
3746     * sequences and adds the 1-1 mappings that come out of that.  */
3747
3748     U8 *l, *lend;
3749     STRLEN lcur;
3750     HV *const hv = MUTABLE_HV(SvRV(swash));
3751
3752     /* The string containing the main body of the table */
3753     SV** const listsvp = hv_fetchs(hv, "LIST", FALSE);
3754
3755     SV** const typesvp = hv_fetchs(hv, "TYPE", FALSE);
3756     SV** const bitssvp = hv_fetchs(hv, "BITS", FALSE);
3757     SV** const nonesvp = hv_fetchs(hv, "NONE", FALSE);
3758     /*SV** const extssvp = hv_fetchs(hv, "EXTRAS", FALSE);*/
3759     const U8* const typestr = (U8*)SvPV_nolen(*typesvp);
3760     const STRLEN bits  = SvUV(*bitssvp);
3761     const STRLEN octets = bits >> 3; /* if bits == 1, then octets == 0 */
3762     const UV     none  = SvUV(*nonesvp);
3763     SV **specials_p = hv_fetchs(hv, "SPECIALS", 0);
3764
3765     HV* ret = newHV();
3766
3767     PERL_ARGS_ASSERT__SWASH_INVERSION_HASH;
3768
3769     /* Must have at least 8 bits to get the mappings */
3770     if (bits != 8 && bits != 16 && bits != 32) {
3771         Perl_croak(aTHX_ "panic: swash_inversion_hash doesn't expect bits %"UVuf,
3772                                                  (UV)bits);
3773     }
3774
3775     if (specials_p) { /* It might be "special" (sometimes, but not always, a
3776                         mapping to more than one character */
3777
3778         /* Construct an inverse mapping hash for the specials */
3779         HV * const specials_hv = MUTABLE_HV(SvRV(*specials_p));
3780         HV * specials_inverse = newHV();
3781         char *char_from; /* the lhs of the map */
3782         I32 from_len;   /* its byte length */
3783         char *char_to;  /* the rhs of the map */
3784         I32 to_len;     /* its byte length */
3785         SV *sv_to;      /* and in a sv */
3786         AV* from_list;  /* list of things that map to each 'to' */
3787
3788         hv_iterinit(specials_hv);
3789
3790         /* The keys are the characters (in utf8) that map to the corresponding
3791          * utf8 string value.  Iterate through the list creating the inverse
3792          * list. */
3793         while ((sv_to = hv_iternextsv(specials_hv, &char_from, &from_len))) {
3794             SV** listp;
3795             if (! SvPOK(sv_to)) {
3796                 Perl_croak(aTHX_ "panic: value returned from hv_iternextsv() "
3797                            "unexpectedly is not a string, flags=%lu",
3798                            (unsigned long)SvFLAGS(sv_to));
3799             }
3800             /*DEBUG_U(PerlIO_printf(Perl_debug_log, "Found mapping from %"UVXf", First char of to is %"UVXf"\n", valid_utf8_to_uvchr((U8*) char_from, 0), valid_utf8_to_uvchr((U8*) SvPVX(sv_to), 0)));*/
3801
3802             /* Each key in the inverse list is a mapped-to value, and the key's
3803              * hash value is a list of the strings (each in utf8) that map to
3804              * it.  Those strings are all one character long */
3805             if ((listp = hv_fetch(specials_inverse,
3806                                     SvPVX(sv_to),
3807                                     SvCUR(sv_to), 0)))
3808             {
3809                 from_list = (AV*) *listp;
3810             }
3811             else { /* No entry yet for it: create one */
3812                 from_list = newAV();
3813                 if (! hv_store(specials_inverse,
3814                                 SvPVX(sv_to),
3815                                 SvCUR(sv_to),
3816                                 (SV*) from_list, 0))
3817                 {
3818                     Perl_croak(aTHX_ "panic: hv_store() unexpectedly failed");
3819                 }
3820             }
3821
3822             /* Here have the list associated with this 'to' (perhaps newly
3823              * created and empty).  Just add to it.  Note that we ASSUME that
3824              * the input is guaranteed to not have duplications, so we don't
3825              * check for that.  Duplications just slow down execution time. */
3826             av_push(from_list, newSVpvn_utf8(char_from, from_len, TRUE));
3827         }
3828
3829         /* Here, 'specials_inverse' contains the inverse mapping.  Go through
3830          * it looking for cases like the FB05/FB06 examples above.  There would
3831          * be an entry in the hash like
3832         *       'st' => [ FB05, FB06 ]
3833         * In this example we will create two lists that get stored in the
3834         * returned hash, 'ret':
3835         *       FB05 => [ FB05, FB06 ]
3836         *       FB06 => [ FB05, FB06 ]
3837         *
3838         * Note that there is nothing to do if the array only has one element.
3839         * (In the normal 1-1 case handled below, we don't have to worry about
3840         * two lists, as everything gets tied to the single list that is
3841         * generated for the single character 'to'.  But here, we are omitting
3842         * that list, ('st' in the example), so must have multiple lists.) */
3843         while ((from_list = (AV *) hv_iternextsv(specials_inverse,
3844                                                  &char_to, &to_len)))
3845         {
3846             if (av_len(from_list) > 0) {
3847                 int i;
3848
3849                 /* We iterate over all combinations of i,j to place each code
3850                  * point on each list */
3851                 for (i = 0; i <= av_len(from_list); i++) {
3852                     int j;
3853                     AV* i_list = newAV();
3854                     SV** entryp = av_fetch(from_list, i, FALSE);
3855                     if (entryp == NULL) {
3856                         Perl_croak(aTHX_ "panic: av_fetch() unexpectedly failed");
3857                     }
3858                     if (hv_fetch(ret, SvPVX(*entryp), SvCUR(*entryp), FALSE)) {
3859                         Perl_croak(aTHX_ "panic: unexpected entry for %s", SvPVX(*entryp));
3860                     }
3861                     if (! hv_store(ret, SvPVX(*entryp), SvCUR(*entryp),
3862                                    (SV*) i_list, FALSE))
3863                     {
3864                         Perl_croak(aTHX_ "panic: hv_store() unexpectedly failed");
3865                     }
3866
3867                     /* For debugging: UV u = valid_utf8_to_uvchr((U8*) SvPVX(*entryp), 0);*/
3868                     for (j = 0; j <= av_len(from_list); j++) {
3869                         entryp = av_fetch(from_list, j, FALSE);
3870                         if (entryp == NULL) {
3871                             Perl_croak(aTHX_ "panic: av_fetch() unexpectedly failed");
3872                         }
3873
3874                         /* When i==j this adds itself to the list */
3875                         av_push(i_list, newSVuv(utf8_to_uvchr_buf(
3876                                         (U8*) SvPVX(*entryp),
3877                                         (U8*) SvPVX(*entryp) + SvCUR(*entryp),
3878                                         0)));
3879                         /*DEBUG_U(PerlIO_printf(Perl_debug_log, "%s: %d: Adding %"UVXf" to list for %"UVXf"\n", __FILE__, __LINE__, valid_utf8_to_uvchr((U8*) SvPVX(*entryp), 0), u));*/
3880                     }
3881                 }
3882             }
3883         }
3884         SvREFCNT_dec(specials_inverse); /* done with it */
3885     } /* End of specials */
3886
3887     /* read $swash->{LIST} */
3888     l = (U8*)SvPV(*listsvp, lcur);
3889     lend = l + lcur;
3890
3891     /* Go through each input line */
3892     while (l < lend) {
3893         UV min, max, val;
3894         UV inverse;
3895         l = S_swash_scan_list_line(aTHX_ l, lend, &min, &max, &val,
3896                                          cBOOL(octets), typestr);
3897         if (l > lend) {
3898             break;
3899         }
3900
3901         /* Each element in the range is to be inverted */
3902         for (inverse = min; inverse <= max; inverse++) {
3903             AV* list;
3904             SV** listp;
3905             IV i;
3906             bool found_key = FALSE;
3907             bool found_inverse = FALSE;
3908
3909             /* The key is the inverse mapping */
3910             char key[UTF8_MAXBYTES+1];
3911             char* key_end = (char *) uvuni_to_utf8((U8*) key, val);
3912             STRLEN key_len = key_end - key;
3913
3914             /* Get the list for the map */
3915             if ((listp = hv_fetch(ret, key, key_len, FALSE))) {
3916                 list = (AV*) *listp;
3917             }
3918             else { /* No entry yet for it: create one */
3919                 list = newAV();
3920                 if (! hv_store(ret, key, key_len, (SV*) list, FALSE)) {
3921                     Perl_croak(aTHX_ "panic: hv_store() unexpectedly failed");
3922                 }
3923             }
3924
3925             /* Look through list to see if this inverse mapping already is
3926              * listed, or if there is a mapping to itself already */
3927             for (i = 0; i <= av_len(list); i++) {
3928                 SV** entryp = av_fetch(list, i, FALSE);
3929                 SV* entry;
3930                 if (entryp == NULL) {
3931                     Perl_croak(aTHX_ "panic: av_fetch() unexpectedly failed");
3932                 }
3933                 entry = *entryp;
3934                 /*DEBUG_U(PerlIO_printf(Perl_debug_log, "list for %"UVXf" contains %"UVXf"\n", val, SvUV(entry)));*/
3935                 if (SvUV(entry) == val) {
3936                     found_key = TRUE;
3937                 }
3938                 if (SvUV(entry) == inverse) {
3939                     found_inverse = TRUE;
3940                 }
3941
3942                 /* No need to continue searching if found everything we are
3943                  * looking for */
3944                 if (found_key && found_inverse) {
3945                     break;
3946                 }
3947             }
3948
3949             /* Make sure there is a mapping to itself on the list */
3950             if (! found_key) {
3951                 av_push(list, newSVuv(val));
3952                 /*DEBUG_U(PerlIO_printf(Perl_debug_log, "%s: %d: Adding %"UVXf" to list for %"UVXf"\n", __FILE__, __LINE__, val, val));*/
3953             }
3954
3955
3956             /* Simply add the value to the list */
3957             if (! found_inverse) {
3958                 av_push(list, newSVuv(inverse));
3959                 /*DEBUG_U(PerlIO_printf(Perl_debug_log, "%s: %d: Adding %"UVXf" to list for %"UVXf"\n", __FILE__, __LINE__, inverse, val));*/
3960             }
3961
3962             /* swatch_get() increments the value of val for each element in the
3963              * range.  That makes more compact tables possible.  You can
3964              * express the capitalization, for example, of all consecutive
3965              * letters with a single line: 0061\t007A\t0041 This maps 0061 to
3966              * 0041, 0062 to 0042, etc.  I (khw) have never understood 'none',
3967              * and it's not documented; it appears to be used only in
3968              * implementing tr//; I copied the semantics from swatch_get(), just
3969              * in case */
3970             if (!none || val < none) {
3971                 ++val;
3972             }
3973         }
3974     }
3975
3976     return ret;
3977 }
3978
3979 SV*
3980 Perl__swash_to_invlist(pTHX_ SV* const swash)
3981 {
3982
3983    /* Subject to change or removal.  For use only in one place in regcomp.c */
3984
3985     U8 *l, *lend;
3986     char *loc;
3987     STRLEN lcur;
3988     HV *const hv = MUTABLE_HV(SvRV(swash));
3989     UV elements = 0;    /* Number of elements in the inversion list */
3990     U8 empty[] = "";
3991
3992     /* The string containing the main body of the table */
3993     SV** const listsvp = hv_fetchs(hv, "LIST", FALSE);
3994     SV** const typesvp = hv_fetchs(hv, "TYPE", FALSE);
3995     SV** const bitssvp = hv_fetchs(hv, "BITS", FALSE);
3996     SV** const extssvp = hv_fetchs(hv, "EXTRAS", FALSE);
3997     SV** const invert_it_svp = hv_fetchs(hv, "INVERT_IT", FALSE);
3998
3999     const U8* const typestr = (U8*)SvPV_nolen(*typesvp);
4000     const STRLEN bits  = SvUV(*bitssvp);
4001     const STRLEN octets = bits >> 3; /* if bits == 1, then octets == 0 */
4002     U8 *x, *xend;
4003     STRLEN xcur;
4004
4005     SV* invlist;
4006
4007     PERL_ARGS_ASSERT__SWASH_TO_INVLIST;
4008
4009     /* read $swash->{LIST} */
4010     if (SvPOK(*listsvp)) {
4011         l = (U8*)SvPV(*listsvp, lcur);
4012     }
4013     else {
4014         /* LIST legitimately doesn't contain a string during compilation phases
4015          * of Perl itself, before the Unicode tables are generated.  In this
4016          * case, just fake things up by creating an empty list */
4017         l = empty;
4018         lcur = 0;
4019     }
4020     loc = (char *) l;
4021     lend = l + lcur;
4022
4023     /* Scan the input to count the number of lines to preallocate array size
4024      * based on worst possible case, which is each line in the input creates 2
4025      * elements in the inversion list: 1) the beginning of a range in the list;
4026      * 2) the beginning of a range not in the list.  */
4027     while ((loc = (strchr(loc, '\n'))) != NULL) {
4028         elements += 2;
4029         loc++;
4030     }
4031
4032     /* If the ending is somehow corrupt and isn't a new line, add another
4033      * element for the final range that isn't in the inversion list */
4034     if (! (*lend == '\n'
4035         || (*lend == '\0' && (lcur == 0 || *(lend - 1) == '\n'))))
4036     {
4037         elements++;
4038     }
4039
4040     invlist = _new_invlist(elements);
4041
4042     /* Now go through the input again, adding each range to the list */
4043     while (l < lend) {
4044         UV start, end;
4045         UV val;         /* Not used by this function */
4046
4047         l = S_swash_scan_list_line(aTHX_ l, lend, &start, &end, &val,
4048                                          cBOOL(octets), typestr);
4049
4050         if (l > lend) {
4051             break;
4052         }
4053
4054         invlist = _add_range_to_invlist(invlist, start, end);
4055     }
4056
4057     /* Invert if the data says it should be */
4058     if (invert_it_svp && SvUV(*invert_it_svp)) {
4059         _invlist_invert_prop(invlist);
4060     }
4061
4062     /* This code is copied from swatch_get()
4063      * read $swash->{EXTRAS} */
4064     x = (U8*)SvPV(*extssvp, xcur);
4065     xend = x + xcur;
4066     while (x < xend) {
4067         STRLEN namelen;
4068         U8 *namestr;
4069         SV** othersvp;
4070         HV* otherhv;
4071         STRLEN otherbits;
4072         SV **otherbitssvp, *other;
4073         U8 *nl;
4074
4075         const U8 opc = *x++;
4076         if (opc == '\n')
4077             continue;
4078
4079         nl = (U8*)memchr(x, '\n', xend - x);
4080
4081         if (opc != '-' && opc != '+' && opc != '!' && opc != '&') {
4082             if (nl) {
4083                 x = nl + 1; /* 1 is length of "\n" */
4084                 continue;
4085             }
4086             else {
4087                 x = xend; /* to EXTRAS' end at which \n is not found */
4088                 break;
4089             }
4090         }
4091
4092         namestr = x;
4093         if (nl) {
4094             namelen = nl - namestr;
4095             x = nl + 1;
4096         }
4097         else {
4098             namelen = xend - namestr;
4099             x = xend;
4100         }
4101
4102         othersvp = hv_fetch(hv, (char *)namestr, namelen, FALSE);
4103         otherhv = MUTABLE_HV(SvRV(*othersvp));
4104         otherbitssvp = hv_fetchs(otherhv, "BITS", FALSE);
4105         otherbits = (STRLEN)SvUV(*otherbitssvp);
4106
4107         if (bits != otherbits || bits != 1) {
4108             Perl_croak(aTHX_ "panic: _swash_to_invlist only operates on boolean "
4109                        "properties, bits=%"UVuf", otherbits=%"UVuf,
4110                        (UV)bits, (UV)otherbits);
4111         }
4112
4113         /* The "other" swatch must be destroyed after. */
4114         other = _swash_to_invlist((SV *)*othersvp);
4115
4116         /* End of code copied from swatch_get() */
4117         switch (opc) {
4118         case '+':
4119             _invlist_union(invlist, other, &invlist);
4120             break;
4121         case '!':
4122             _invlist_invert(other);
4123             _invlist_union(invlist, other, &invlist);
4124             break;
4125         case '-':
4126             _invlist_subtract(invlist, other, &invlist);
4127             break;
4128         case '&':
4129             _invlist_intersection(invlist, other, &invlist);
4130             break;
4131         default:
4132             break;
4133         }
4134         sv_free(other); /* through with it! */
4135     }
4136
4137     return invlist;
4138 }
4139
4140 SV*
4141 Perl__get_swash_invlist(pTHX_ SV* const swash)
4142 {
4143     SV** ptr = hv_fetchs(MUTABLE_HV(SvRV(swash)), "INVLIST", FALSE);
4144
4145     PERL_ARGS_ASSERT__GET_SWASH_INVLIST;
4146
4147     if (! ptr) {
4148         return NULL;
4149     }
4150
4151     return *ptr;
4152 }
4153
4154 /*
4155 =for apidoc uvchr_to_utf8
4156
4157 Adds the UTF-8 representation of the Native code point C<uv> to the end
4158 of the string C<d>; C<d> should have at least C<UTF8_MAXBYTES+1> free
4159 bytes available. The return value is the pointer to the byte after the
4160 end of the new character. In other words,
4161
4162     d = uvchr_to_utf8(d, uv);
4163
4164 is the recommended wide native character-aware way of saying
4165
4166     *(d++) = uv;
4167
4168 =cut
4169 */
4170
4171 /* On ASCII machines this is normally a macro but we want a
4172    real function in case XS code wants it
4173 */
4174 U8 *
4175 Perl_uvchr_to_utf8(pTHX_ U8 *d, UV uv)
4176 {
4177     PERL_ARGS_ASSERT_UVCHR_TO_UTF8;
4178
4179     return Perl_uvuni_to_utf8_flags(aTHX_ d, NATIVE_TO_UNI(uv), 0);
4180 }
4181
4182 U8 *
4183 Perl_uvchr_to_utf8_flags(pTHX_ U8 *d, UV uv, UV flags)
4184 {
4185     PERL_ARGS_ASSERT_UVCHR_TO_UTF8_FLAGS;
4186
4187     return Perl_uvuni_to_utf8_flags(aTHX_ d, NATIVE_TO_UNI(uv), flags);
4188 }
4189
4190 /*
4191 =for apidoc utf8n_to_uvchr
4192
4193 Returns the native character value of the first character in the string
4194 C<s>
4195 which is assumed to be in UTF-8 encoding; C<retlen> will be set to the
4196 length, in bytes, of that character.
4197
4198 C<length> and C<flags> are the same as L</utf8n_to_uvuni>().
4199
4200 =cut
4201 */
4202 /* On ASCII machines this is normally a macro but we want
4203    a real function in case XS code wants it
4204 */
4205 UV
4206 Perl_utf8n_to_uvchr(pTHX_ const U8 *s, STRLEN curlen, STRLEN *retlen,
4207 U32 flags)
4208 {
4209     const UV uv = Perl_utf8n_to_uvuni(aTHX_ s, curlen, retlen, flags);
4210
4211     PERL_ARGS_ASSERT_UTF8N_TO_UVCHR;
4212
4213     return UNI_TO_NATIVE(uv);
4214 }
4215
4216 bool
4217 Perl_check_utf8_print(pTHX_ register const U8* s, const STRLEN len)
4218 {
4219     /* May change: warns if surrogates, non-character code points, or
4220      * non-Unicode code points are in s which has length len bytes.  Returns
4221      * TRUE if none found; FALSE otherwise.  The only other validity check is
4222      * to make sure that this won't exceed the string's length */
4223
4224     const U8* const e = s + len;
4225     bool ok = TRUE;
4226
4227     PERL_ARGS_ASSERT_CHECK_UTF8_PRINT;
4228
4229     while (s < e) {
4230         if (UTF8SKIP(s) > len) {
4231             Perl_ck_warner_d(aTHX_ packWARN(WARN_UTF8),
4232                            "%s in %s", unees, PL_op ? OP_DESC(PL_op) : "print");
4233             return FALSE;
4234         }
4235         if (UNLIKELY(*s >= UTF8_FIRST_PROBLEMATIC_CODE_POINT_FIRST_BYTE)) {
4236             STRLEN char_len;
4237             if (UTF8_IS_SUPER(s)) {
4238                 if (ckWARN_d(WARN_NON_UNICODE)) {
4239                     UV uv = utf8_to_uvchr_buf(s, e, &char_len);
4240                     Perl_warner(aTHX_ packWARN(WARN_NON_UNICODE),
4241                         "Code point 0x%04"UVXf" is not Unicode, may not be portable", uv);
4242                     ok = FALSE;
4243                 }
4244             }
4245             else if (UTF8_IS_SURROGATE(s)) {
4246                 if (ckWARN_d(WARN_SURROGATE)) {
4247                     UV uv = utf8_to_uvchr_buf(s, e, &char_len);
4248                     Perl_warner(aTHX_ packWARN(WARN_SURROGATE),
4249                         "Unicode surrogate U+%04"UVXf" is illegal in UTF-8", uv);
4250                     ok = FALSE;
4251                 }
4252             }
4253             else if
4254                 ((UTF8_IS_NONCHAR_GIVEN_THAT_NON_SUPER_AND_GE_PROBLEMATIC(s))
4255                  && (ckWARN_d(WARN_NONCHAR)))
4256             {
4257                 UV uv = utf8_to_uvchr_buf(s, e, &char_len);
4258                 Perl_warner(aTHX_ packWARN(WARN_NONCHAR),
4259                     "Unicode non-character U+%04"UVXf" is illegal for open interchange", uv);
4260                 ok = FALSE;
4261             }
4262         }
4263         s += UTF8SKIP(s);
4264     }
4265
4266     return ok;
4267 }
4268
4269 /*
4270 =for apidoc pv_uni_display
4271
4272 Build to the scalar C<dsv> a displayable version of the string C<spv>,
4273 length C<len>, the displayable version being at most C<pvlim> bytes long
4274 (if longer, the rest is truncated and "..." will be appended).
4275
4276 The C<flags> argument can have UNI_DISPLAY_ISPRINT set to display
4277 isPRINT()able characters as themselves, UNI_DISPLAY_BACKSLASH
4278 to display the \\[nrfta\\] as the backslashed versions (like '\n')
4279 (UNI_DISPLAY_BACKSLASH is preferred over UNI_DISPLAY_ISPRINT for \\).
4280 UNI_DISPLAY_QQ (and its alias UNI_DISPLAY_REGEX) have both
4281 UNI_DISPLAY_BACKSLASH and UNI_DISPLAY_ISPRINT turned on.
4282
4283 The pointer to the PV of the C<dsv> is returned.
4284
4285 =cut */
4286 char *
4287 Perl_pv_uni_display(pTHX_ SV *dsv, const U8 *spv, STRLEN len, STRLEN pvlim, UV flags)
4288 {
4289     int truncated = 0;
4290     const char *s, *e;
4291
4292     PERL_ARGS_ASSERT_PV_UNI_DISPLAY;
4293
4294     sv_setpvs(dsv, "");
4295     SvUTF8_off(dsv);
4296     for (s = (const char *)spv, e = s + len; s < e; s += UTF8SKIP(s)) {
4297          UV u;
4298           /* This serves double duty as a flag and a character to print after
4299              a \ when flags & UNI_DISPLAY_BACKSLASH is true.
4300           */
4301          char ok = 0;
4302
4303          if (pvlim && SvCUR(dsv) >= pvlim) {
4304               truncated++;
4305               break;
4306          }
4307          u = utf8_to_uvchr_buf((U8*)s, (U8*)e, 0);
4308          if (u < 256) {
4309              const unsigned char c = (unsigned char)u & 0xFF;
4310              if (flags & UNI_DISPLAY_BACKSLASH) {
4311                  switch (c) {
4312                  case '\n':
4313                      ok = 'n'; break;
4314                  case '\r':
4315                      ok = 'r'; break;
4316                  case '\t':
4317                      ok = 't'; break;
4318                  case '\f':
4319                      ok = 'f'; break;
4320                  case '\a':
4321                      ok = 'a'; break;
4322                  case '\\':
4323                      ok = '\\'; break;
4324                  default: break;
4325                  }
4326                  if (ok) {
4327                      const char string = ok;
4328                      sv_catpvs(dsv, "\\");
4329                      sv_catpvn(dsv, &string, 1);
4330                  }
4331              }
4332              /* isPRINT() is the locale-blind version. */
4333              if (!ok && (flags & UNI_DISPLAY_ISPRINT) && isPRINT(c)) {
4334                  const char string = c;
4335                  sv_catpvn(dsv, &string, 1);
4336                  ok = 1;
4337              }
4338          }
4339          if (!ok)
4340              Perl_sv_catpvf(aTHX_ dsv, "\\x{%"UVxf"}", u);
4341     }
4342     if (truncated)
4343          sv_catpvs(dsv, "...");
4344
4345     return SvPVX(dsv);
4346 }
4347
4348 /*
4349 =for apidoc sv_uni_display
4350
4351 Build to the scalar C<dsv> a displayable version of the scalar C<sv>,
4352 the displayable version being at most C<pvlim> bytes long
4353 (if longer, the rest is truncated and "..." will be appended).
4354
4355 The C<flags> argument is as in L</pv_uni_display>().
4356
4357 The pointer to the PV of the C<dsv> is returned.
4358
4359 =cut
4360 */
4361 char *
4362 Perl_sv_uni_display(pTHX_ SV *dsv, SV *ssv, STRLEN pvlim, UV flags)
4363 {
4364     PERL_ARGS_ASSERT_SV_UNI_DISPLAY;
4365
4366      return Perl_pv_uni_display(aTHX_ dsv, (const U8*)SvPVX_const(ssv),
4367                                 SvCUR(ssv), pvlim, flags);
4368 }
4369
4370 /*
4371 =for apidoc foldEQ_utf8
4372
4373 Returns true if the leading portions of the strings C<s1> and C<s2> (either or both
4374 of which may be in UTF-8) are the same case-insensitively; false otherwise.
4375 How far into the strings to compare is determined by other input parameters.
4376
4377 If C<u1> is true, the string C<s1> is assumed to be in UTF-8-encoded Unicode;
4378 otherwise it is assumed to be in native 8-bit encoding.  Correspondingly for C<u2>
4379 with respect to C<s2>.
4380
4381 If the byte length C<l1> is non-zero, it says how far into C<s1> to check for fold
4382 equality.  In other words, C<s1>+C<l1> will be used as a goal to reach.  The
4383 scan will not be considered to be a match unless the goal is reached, and
4384 scanning won't continue past that goal.  Correspondingly for C<l2> with respect to
4385 C<s2>.
4386
4387 If C<pe1> is non-NULL and the pointer it points to is not NULL, that pointer is
4388 considered an end pointer beyond which scanning of C<s1> will not continue under
4389 any circumstances.  This means that if both C<l1> and C<pe1> are specified, and
4390 C<pe1>
4391 is less than C<s1>+C<l1>, the match will never be successful because it can
4392 never
4393 get as far as its goal (and in fact is asserted against).  Correspondingly for
4394 C<pe2> with respect to C<s2>.
4395
4396 At least one of C<s1> and C<s2> must have a goal (at least one of C<l1> and
4397 C<l2> must be non-zero), and if both do, both have to be
4398 reached for a successful match.   Also, if the fold of a character is multiple
4399 characters, all of them must be matched (see tr21 reference below for
4400 'folding').
4401
4402 Upon a successful match, if C<pe1> is non-NULL,
4403 it will be set to point to the beginning of the I<next> character of C<s1>
4404 beyond what was matched.  Correspondingly for C<pe2> and C<s2>.
4405
4406 For case-insensitiveness, the "casefolding" of Unicode is used
4407 instead of upper/lowercasing both the characters, see
4408 L<http://www.unicode.org/unicode/reports/tr21/> (Case Mappings).
4409
4410 =cut */
4411
4412 /* A flags parameter has been added which may change, and hence isn't
4413  * externally documented.  Currently it is:
4414  *  0 for as-documented above
4415  *  FOLDEQ_UTF8_NOMIX_ASCII meaning that if a non-ASCII character folds to an
4416                             ASCII one, to not match
4417  *  FOLDEQ_UTF8_LOCALE      meaning that locale rules are to be used for code
4418  *                          points below 256; unicode rules for above 255; and
4419  *                          folds that cross those boundaries are disallowed,
4420  *                          like the NOMIX_ASCII option
4421  *  FOLDEQ_S1_ALREADY_FOLDED s1 has already been folded before calling this
4422  *                           routine.  This allows that step to be skipped.
4423  *  FOLDEQ_S2_ALREADY_FOLDED   Similarly.
4424  */
4425 I32
4426 Perl_foldEQ_utf8_flags(pTHX_ const char *s1, char **pe1, register UV l1, bool u1, const char *s2, char **pe2, register UV l2, bool u2, U32 flags)
4427 {
4428     dVAR;
4429     const U8 *p1  = (const U8*)s1; /* Point to current char */
4430     const U8 *p2  = (const U8*)s2;
4431     const U8 *g1 = NULL;       /* goal for s1 */
4432     const U8 *g2 = NULL;
4433     const U8 *e1 = NULL;       /* Don't scan s1 past this */
4434     U8 *f1 = NULL;             /* Point to current folded */
4435     const U8 *e2 = NULL;
4436     U8 *f2 = NULL;
4437     STRLEN n1 = 0, n2 = 0;              /* Number of bytes in current char */
4438     U8 foldbuf1[UTF8_MAXBYTES_CASE+1];
4439     U8 foldbuf2[UTF8_MAXBYTES_CASE+1];
4440
4441     PERL_ARGS_ASSERT_FOLDEQ_UTF8_FLAGS;
4442
4443     /* The algorithm requires that input with the flags on the first line of
4444      * the assert not be pre-folded. */
4445     assert( ! ((flags & (FOLDEQ_UTF8_NOMIX_ASCII | FOLDEQ_UTF8_LOCALE))
4446         && (flags & (FOLDEQ_S1_ALREADY_FOLDED | FOLDEQ_S2_ALREADY_FOLDED))));
4447
4448     if (pe1) {
4449         e1 = *(U8**)pe1;
4450     }
4451
4452     if (l1) {
4453         g1 = (const U8*)s1 + l1;
4454     }
4455
4456     if (pe2) {
4457         e2 = *(U8**)pe2;
4458     }
4459
4460     if (l2) {
4461         g2 = (const U8*)s2 + l2;
4462     }
4463
4464     /* Must have at least one goal */
4465     assert(g1 || g2);
4466
4467     if (g1) {
4468
4469         /* Will never match if goal is out-of-bounds */
4470         assert(! e1  || e1 >= g1);
4471
4472         /* Here, there isn't an end pointer, or it is beyond the goal.  We
4473         * only go as far as the goal */
4474         e1 = g1;
4475     }
4476     else {
4477         assert(e1);    /* Must have an end for looking at s1 */
4478     }
4479
4480     /* Same for goal for s2 */
4481     if (g2) {
4482         assert(! e2  || e2 >= g2);
4483         e2 = g2;
4484     }
4485     else {
4486         assert(e2);
4487     }
4488
4489     /* If both operands are already folded, we could just do a memEQ on the
4490      * whole strings at once, but it would be better if the caller realized
4491      * this and didn't even call us */
4492
4493     /* Look through both strings, a character at a time */
4494     while (p1 < e1 && p2 < e2) {
4495
4496         /* If at the beginning of a new character in s1, get its fold to use
4497          * and the length of the fold.  (exception: locale rules just get the
4498          * character to a single byte) */
4499         if (n1 == 0) {
4500             if (flags & FOLDEQ_S1_ALREADY_FOLDED) {
4501                 f1 = (U8 *) p1;
4502                 n1 = UTF8SKIP(f1);
4503             }
4504
4505             else {
4506                 /* If in locale matching, we use two sets of rules, depending
4507                  * on if the code point is above or below 255.  Here, we test
4508                  * for and handle locale rules */
4509                 if ((flags & FOLDEQ_UTF8_LOCALE)
4510                     && (! u1 || UTF8_IS_INVARIANT(*p1)
4511                         || UTF8_IS_DOWNGRADEABLE_START(*p1)))
4512                 {
4513                     /* There is no mixing of code points above and below 255. */
4514                     if (u2 && (! UTF8_IS_INVARIANT(*p2)
4515                         && ! UTF8_IS_DOWNGRADEABLE_START(*p2)))
4516                     {
4517                         return 0;
4518                     }
4519
4520                     /* We handle locale rules by converting, if necessary, the
4521                      * code point to a single byte. */
4522                     if (! u1 || UTF8_IS_INVARIANT(*p1)) {
4523                         *foldbuf1 = *p1;
4524                     }
4525                     else {
4526                         *foldbuf1 = TWO_BYTE_UTF8_TO_UNI(*p1, *(p1 + 1));
4527                     }
4528                     n1 = 1;
4529                 }
4530                 else if (isASCII(*p1)) {    /* Note, that here won't be both
4531                                                ASCII and using locale rules */
4532
4533                     /* If trying to mix non- with ASCII, and not supposed to,
4534                      * fail */
4535                     if ((flags & FOLDEQ_UTF8_NOMIX_ASCII) && ! isASCII(*p2)) {
4536                         return 0;
4537                     }
4538                     n1 = 1;
4539                     *foldbuf1 = toLOWER(*p1);   /* Folds in the ASCII range are
4540                                                    just lowercased */
4541                 }
4542                 else if (u1) {
4543                     to_utf8_fold(p1, foldbuf1, &n1);
4544                 }
4545                 else {  /* Not utf8, get utf8 fold */
4546                     to_uni_fold(NATIVE_TO_UNI(*p1), foldbuf1, &n1);
4547                 }
4548                 f1 = foldbuf1;
4549             }
4550         }
4551
4552         if (n2 == 0) {    /* Same for s2 */
4553             if (flags & FOLDEQ_S2_ALREADY_FOLDED) {
4554                 f2 = (U8 *) p2;
4555                 n2 = UTF8SKIP(f2);
4556             }
4557             else {
4558                 if ((flags & FOLDEQ_UTF8_LOCALE)
4559                     && (! u2 || UTF8_IS_INVARIANT(*p2) || UTF8_IS_DOWNGRADEABLE_START(*p2)))
4560                 {
4561                     /* Here, the next char in s2 is < 256.  We've already
4562                      * worked on s1, and if it isn't also < 256, can't match */
4563                     if (u1 && (! UTF8_IS_INVARIANT(*p1)
4564                         && ! UTF8_IS_DOWNGRADEABLE_START(*p1)))
4565                     {
4566                         return 0;
4567                     }
4568                     if (! u2 || UTF8_IS_INVARIANT(*p2)) {
4569                         *foldbuf2 = *p2;
4570                     }
4571                     else {
4572                         *foldbuf2 = TWO_BYTE_UTF8_TO_UNI(*p2, *(p2 + 1));
4573                     }
4574
4575                     /* Use another function to handle locale rules.  We've made
4576                      * sure that both characters to compare are single bytes */
4577                     if (! foldEQ_locale((char *) f1, (char *) foldbuf2, 1)) {
4578                         return 0;
4579                     }
4580                     n1 = n2 = 0;
4581                 }
4582                 else if (isASCII(*p2)) {
4583                     if ((flags & FOLDEQ_UTF8_NOMIX_ASCII) && ! isASCII(*p1)) {
4584                         return 0;
4585                     }
4586                     n2 = 1;
4587                     *foldbuf2 = toLOWER(*p2);
4588                 }
4589                 else if (u2) {
4590                     to_utf8_fold(p2, foldbuf2, &n2);
4591                 }
4592                 else {
4593                     to_uni_fold(NATIVE_TO_UNI(*p2), foldbuf2, &n2);
4594                 }
4595                 f2 = foldbuf2;
4596             }
4597         }
4598
4599         /* Here f1 and f2 point to the beginning of the strings to compare.
4600          * These strings are the folds of the next character from each input
4601          * string, stored in utf8. */
4602
4603         /* While there is more to look for in both folds, see if they
4604         * continue to match */
4605         while (n1 && n2) {
4606             U8 fold_length = UTF8SKIP(f1);
4607             if (fold_length != UTF8SKIP(f2)
4608                 || (fold_length == 1 && *f1 != *f2) /* Short circuit memNE
4609                                                        function call for single
4610                                                        byte */
4611                 || memNE((char*)f1, (char*)f2, fold_length))
4612             {
4613                 return 0; /* mismatch */
4614             }
4615
4616             /* Here, they matched, advance past them */
4617             n1 -= fold_length;
4618             f1 += fold_length;
4619             n2 -= fold_length;
4620             f2 += fold_length;
4621         }
4622
4623         /* When reach the end of any fold, advance the input past it */
4624         if (n1 == 0) {
4625             p1 += u1 ? UTF8SKIP(p1) : 1;
4626         }
4627         if (n2 == 0) {
4628             p2 += u2 ? UTF8SKIP(p2) : 1;
4629         }
4630     } /* End of loop through both strings */
4631
4632     /* A match is defined by each scan that specified an explicit length
4633     * reaching its final goal, and the other not having matched a partial
4634     * character (which can happen when the fold of a character is more than one
4635     * character). */
4636     if (! ((g1 == 0 || p1 == g1) && (g2 == 0 || p2 == g2)) || n1 || n2) {
4637         return 0;
4638     }
4639
4640     /* Successful match.  Set output pointers */
4641     if (pe1) {
4642         *pe1 = (char*)p1;
4643     }
4644     if (pe2) {
4645         *pe2 = (char*)p2;
4646     }
4647     return 1;
4648 }
4649
4650 /*
4651  * Local variables:
4652  * c-indentation-style: bsd
4653  * c-basic-offset: 4
4654  * indent-tabs-mode: nil
4655  * End:
4656  *
4657  * ex: set ts=8 sts=4 sw=4 et:
4658  */