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