This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
regcharclass.h: multi-folds: Add some unfoldeds
authorKarl Williamson <khw@cpan.org>
Thu, 26 Mar 2020 21:59:50 +0000 (15:59 -0600)
committerKarl Williamson <khw@cpan.org>
Fri, 16 Oct 2020 13:01:41 +0000 (07:01 -0600)
Prior to this commit, the generated macros for dealing with multi-char
folds in UTF-8 strings only recognized completely folded strings.  This
commit changes that to add the uppercase for characters in the Latin1
range.  Hopefully an example will clarify.

The fold for U+0130: LATIN CAPITAL LETTER I WITH DOT ABOVE is 'i'
followed by U+0307: COMBINING DOT ABOVE.  But since we are doing /i
matching, an 'I' followed by U+307 should also match.  This commit
changes the macros to know this.  Before this, if the fold were entirely
ASCII, the macros would know all the possible combinations.  This commit
extends that to all code points < 256.  (Since there are no folds to the
upper latin1 range), that really means all code points below 128.  But
making it general means it wouldn't have to be revised if a fold were
ever added to the upper half range.)

The reason to make this change is that it makes some future code less
complicated.  And it adds very little complexity to the generated
macros; less than the code it will save.  I originally thought it would
be more complext than it now turns out to be.  Much of that is because
the infrastructure has advanced since that decision.

I couldn't find any current places that this change will allow to be
simplified.  There could be if the macros were extended to do this on
all code points, not just the low ones.  I tried that, but the generated
macros were at least 400 lines longer than before.  That does add
significant complexity, so I backed that out.

regcharclass.h
regcomp.c
regen/regcharclass_multi_char_folds.pl

index 3e57184..8e5311a 100644 (file)
 */
 /*** GENERATED CODE ***/
 #define is_MULTI_CHAR_FOLD_utf8_safe_part0(s,e)                             \
-( ( 'a' == ((const U8*)s)[0] ) ?                                            \
-       ( ( ( 0xCA == ((const U8*)s)[1] ) && ( 0xBE == ((const U8*)s)[2] ) ) ? 3 : 0 )\
-    : ( 'f' == ((const U8*)s)[0] ) ?                                        \
-       ( ( 'f' == ((const U8*)s)[1] ) ?                                    \
-           ( ( 'i' == ((const U8*)s)[2] || 'l' == ((const U8*)s)[2] ) ? 3 : 2 )\
-       : ( 'i' == ((const U8*)s)[1] || 'l' == ((const U8*)s)[1] ) ? 2 : 0 )\
-    : ( 'h' == ((const U8*)s)[0] ) ?                                        \
+( ( ( 0xCA == ((const U8*)s)[1] ) && ( 0xBE == ((const U8*)s)[2] ) ) ? 3 : 0 )
+
+
+/*** GENERATED CODE ***/
+#define is_MULTI_CHAR_FOLD_utf8_safe_part1(s,e)                             \
+( ( ( ((const U8*)s)[0] & 0xDF ) == 'F' ) ?                                 \
+       ( ( ( ((const U8*)s)[1] & 0xDF ) == 'F' ) ?                         \
+           ( ( ( ( ((const U8*)s)[2] & 0xDF ) == 'I' ) || ( ( ((const U8*)s)[2] & 0xDF ) == 'L' ) ) ? 3 : 2 )\
+       : ( ( ( ((const U8*)s)[1] & 0xDF ) == 'I' ) || ( ( ((const U8*)s)[1] & 0xDF ) == 'L' ) ) ? 2 : 0 )\
+    : ( ( ((const U8*)s)[0] & 0xDF ) == 'H' ) ?                             \
        ( ( ( 0xCC == ((const U8*)s)[1] ) && ( 0xB1 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
-    : ( 'i' == ((const U8*)s)[0] ) ?                                        \
+    : ( ( ((const U8*)s)[0] & 0xDF ) == 'I' ) ?                             \
        ( ( ( 0xCC == ((const U8*)s)[1] ) && ( 0x87 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
-    : ( 'j' == ((const U8*)s)[0] ) ?                                        \
+    : ( ( ((const U8*)s)[0] & 0xDF ) == 'J' ) ?                             \
        ( ( ( 0xCC == ((const U8*)s)[1] ) && ( 0x8C == ((const U8*)s)[2] ) ) ? 3 : 0 )\
-    : ( 's' == ((const U8*)s)[0] ) ?                                        \
-       ( ( inRANGE(((const U8*)s)[1], 's', 't') ) ? 2 : 0 )                \
-    : ( 't' == ((const U8*)s)[0] ) ?                                        \
+    : ( ( ((const U8*)s)[0] & 0xDF ) == 'S' ) ?                             \
+       ( ( inRANGE(((const U8*)s)[1], 'S', 'T') || inRANGE(((const U8*)s)[1], 's', 't') ) ? 2 : 0 )\
+    : ( ( ((const U8*)s)[0] & 0xDF ) == 'T' ) ?                             \
        ( ( ( 0xCC == ((const U8*)s)[1] ) && ( 0x88 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
-    : ( 'w' == ((const U8*)s)[0] || 'y' == ((const U8*)s)[0] ) ?            \
+    : ( ( ( ((const U8*)s)[0] & 0xDF ) == 'W' ) || ( ( ((const U8*)s)[0] & 0xDF ) == 'Y' ) ) ?\
        ( ( ( 0xCC == ((const U8*)s)[1] ) && ( 0x8A == ((const U8*)s)[2] ) ) ? 3 : 0 )\
     : ( 0xC5 == ((const U8*)s)[0] ) ?                                       \
        ( ( ( ( 0xBF == ((const U8*)s)[1] ) && ( 0xC5 == ((const U8*)s)[2] ) ) && ( 0xBF == ((const U8*)s)[3] ) ) ? 4 : 0 )\
     : ( 0xCA == ((const U8*)s)[0] ) ?                                       \
-       ( ( ( 0xBC == ((const U8*)s)[1] ) && ( 'n' == ((const U8*)s)[2] ) ) ? 3 : 0 )\
+       ( ( ( 0xBC == ((const U8*)s)[1] ) && ( ( ((const U8*)s)[2] & 0xDF ) == 'N' ) ) ? 3 : 0 )\
     : ( 0xCE == ((const U8*)s)[0] ) ?                                       \
        ( ( ( ((const U8*)s)[1] & 0xFD ) == 0xAC ) ?                        \
            ( ( ( 0xCE == ((const U8*)s)[2] ) && ( 0xB9 == ((const U8*)s)[3] ) ) ? 4 : 0 )\
        : ( 0xB1 == ((const U8*)s)[1] || 0xB7 == ((const U8*)s)[1] ) ?      \
            ( ( 0xCD == ((const U8*)s)[2] ) ?                               \
-               ( ( 0x82 == ((const U8*)s)[3] ) ? 4 : 0 )                   \
+               ( ( 0x82 == ((const U8*)s)[3] ) ?                           \
+                   ( ( ( 0xCE == ((const U8*)s)[4] ) && ( 0xB9 == ((const U8*)s)[5] ) ) ? 6 : 4 )\
+               : 0 )                                                       \
            : ( ( 0xCE == ((const U8*)s)[2] ) && ( 0xB9 == ((const U8*)s)[3] ) ) ? 4 : 0 )\
-       : ( ( ( 0xB9 == ((const U8*)s)[1] ) && ( 0xCD == ((const U8*)s)[2] ) ) && ( 0x82 == ((const U8*)s)[3] ) ) ? 4 : 0 )\
+       : ( 0xB9 == ((const U8*)s)[1] ) ?                                   \
+           ( ( 0xCC == ((const U8*)s)[2] ) ?                               \
+               ( ( 0x88 == ((const U8*)s)[3] ) ?                           \
+                   ( ( 0xCC == ((const U8*)s)[4] ) ?                       \
+                       ( ( inRANGE(((const U8*)s)[5], 0x80, 0x81) ) ? 6 : 0 )\
+                   : ( ( 0xCD == ((const U8*)s)[4] ) && ( 0x82 == ((const U8*)s)[5] ) ) ? 6 : 0 )\
+               : 0 )                                                       \
+           : ( ( 0xCD == ((const U8*)s)[2] ) && ( 0x82 == ((const U8*)s)[3] ) ) ? 4 : 0 )\
+       : 0 )                                                               \
     : ( 0xCF == ((const U8*)s)[0] ) ?                                       \
        ( ( 0x81 == ((const U8*)s)[1] ) ?                                   \
            ( ( ( 0xCC == ((const U8*)s)[2] ) && ( 0x93 == ((const U8*)s)[3] ) ) ? 4 : 0 )\
        : ( 0x85 == ((const U8*)s)[1] ) ?                                   \
            ( ( 0xCC == ((const U8*)s)[2] ) ?                               \
-               ( ( 0x93 == ((const U8*)s)[3] ) ? 4 : 0 )                   \
+               ( ( 0x88 == ((const U8*)s)[3] ) ?                           \
+                   ( ( 0xCC == ((const U8*)s)[4] ) ?                       \
+                       ( ( inRANGE(((const U8*)s)[5], 0x80, 0x81) ) ? 6 : 0 )\
+                   : ( ( 0xCD == ((const U8*)s)[4] ) && ( 0x82 == ((const U8*)s)[5] ) ) ? 6 : 0 )\
+               : ( 0x93 == ((const U8*)s)[3] ) ?                           \
+                   ( ( 0xCC == ((const U8*)s)[4] ) ?                       \
+                       ( ( inRANGE(((const U8*)s)[5], 0x80, 0x81) ) ? 6 : 4 )\
+                   : ( ( 0xCD == ((const U8*)s)[4] ) && ( 0x82 == ((const U8*)s)[5] ) ) ? 6 : 4 )\
+               : 0 )                                                       \
            : ( ( 0xCD == ((const U8*)s)[2] ) && ( 0x82 == ((const U8*)s)[3] ) ) ? 4 : 0 )\
        : ( 0x89 == ((const U8*)s)[1] ) ?                                   \
            ( ( 0xCD == ((const U8*)s)[2] ) ?                               \
-               ( ( 0x82 == ((const U8*)s)[3] ) ? 4 : 0 )                   \
+               ( ( 0x82 == ((const U8*)s)[3] ) ?                           \
+                   ( ( ( 0xCE == ((const U8*)s)[4] ) && ( 0xB9 == ((const U8*)s)[5] ) ) ? 6 : 4 )\
+               : 0 )                                                       \
            : ( ( 0xCE == ((const U8*)s)[2] ) && ( 0xB9 == ((const U8*)s)[3] ) ) ? 4 : 0 )\
        : ( ( ( 0x8E == ((const U8*)s)[1] ) && ( 0xCE == ((const U8*)s)[2] ) ) && ( 0xB9 == ((const U8*)s)[3] ) ) ? 4 : 0 )\
     : ( 0xD5 == ((const U8*)s)[0] ) ?                                       \
 
 
 /*** GENERATED CODE ***/
-#define is_MULTI_CHAR_FOLD_utf8_safe_part1(s,e)                             \
-( ((e)-(s) > 3) ?                                                           \
-    ( ( 'a' == ((const U8*)s)[0] ) ?                                        \
+#define is_MULTI_CHAR_FOLD_utf8_safe_part2(s,e)                             \
+( ( ( ((const U8*)s)[0] & 0xDF ) == 'A' ) ?                                 \
        ( ( ( 0xCA == ((const U8*)s)[1] ) && ( 0xBE == ((const U8*)s)[2] ) ) ? 3 : 0 )\
-    : ( 'f' == ((const U8*)s)[0] ) ?                                        \
-       ( ( 'f' == ((const U8*)s)[1] ) ?                                    \
-           ( ( 'i' == ((const U8*)s)[2] || 'l' == ((const U8*)s)[2] ) ? 3 : 2 )\
-       : ( 'i' == ((const U8*)s)[1] || 'l' == ((const U8*)s)[1] ) ? 2 : 0 )\
-    : ( 'h' == ((const U8*)s)[0] ) ?                                        \
+    : ( ( ((const U8*)s)[0] & 0xDF ) == 'F' ) ?                             \
+       ( ( ( ((const U8*)s)[1] & 0xDF ) == 'F' ) ?                         \
+           ( ( ( ( ((const U8*)s)[2] & 0xDF ) == 'I' ) || ( ( ((const U8*)s)[2] & 0xDF ) == 'L' ) ) ? 3 : 2 )\
+       : ( ( ( ((const U8*)s)[1] & 0xDF ) == 'I' ) || ( ( ((const U8*)s)[1] & 0xDF ) == 'L' ) ) ? 2 : 0 )\
+    : ( ( ((const U8*)s)[0] & 0xDF ) == 'H' ) ?                             \
        ( ( ( 0xCC == ((const U8*)s)[1] ) && ( 0xB1 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
-    : ( 'i' == ((const U8*)s)[0] ) ?                                        \
+    : ( ( ((const U8*)s)[0] & 0xDF ) == 'I' ) ?                             \
        ( ( ( 0xCC == ((const U8*)s)[1] ) && ( 0x87 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
-    : ( 'j' == ((const U8*)s)[0] ) ?                                        \
+    : ( ( ((const U8*)s)[0] & 0xDF ) == 'J' ) ?                             \
        ( ( ( 0xCC == ((const U8*)s)[1] ) && ( 0x8C == ((const U8*)s)[2] ) ) ? 3 : 0 )\
-    : ( 's' == ((const U8*)s)[0] ) ?                                        \
-       ( ( inRANGE(((const U8*)s)[1], 's', 't') ) ? 2 : 0 )                \
-    : ( 't' == ((const U8*)s)[0] ) ?                                        \
+    : ( ( ((const U8*)s)[0] & 0xDF ) == 'S' ) ?                             \
+       ( ( inRANGE(((const U8*)s)[1], 'S', 'T') || inRANGE(((const U8*)s)[1], 's', 't') ) ? 2 : 0 )\
+    : ( ( ((const U8*)s)[0] & 0xDF ) == 'T' ) ?                             \
        ( ( ( 0xCC == ((const U8*)s)[1] ) && ( 0x88 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
-    : ( 'w' == ((const U8*)s)[0] || 'y' == ((const U8*)s)[0] ) ?            \
+    : ( ( ( ((const U8*)s)[0] & 0xDF ) == 'W' ) || ( ( ((const U8*)s)[0] & 0xDF ) == 'Y' ) ) ?\
        ( ( ( 0xCC == ((const U8*)s)[1] ) && ( 0x8A == ((const U8*)s)[2] ) ) ? 3 : 0 )\
     : ( 0xC5 == ((const U8*)s)[0] ) ?                                       \
        ( ( ( ( 0xBF == ((const U8*)s)[1] ) && ( 0xC5 == ((const U8*)s)[2] ) ) && ( 0xBF == ((const U8*)s)[3] ) ) ? 4 : 0 )\
     : ( 0xCA == ((const U8*)s)[0] ) ?                                       \
-       ( ( ( 0xBC == ((const U8*)s)[1] ) && ( 'n' == ((const U8*)s)[2] ) ) ? 3 : 0 )\
+       ( ( ( 0xBC == ((const U8*)s)[1] ) && ( ( ((const U8*)s)[2] & 0xDF ) == 'N' ) ) ? 3 : 0 )\
     : ( 0xCE == ((const U8*)s)[0] ) ?                                       \
        ( ( ( ((const U8*)s)[1] & 0xFD ) == 0xAC ) ?                        \
            ( ( ( 0xCE == ((const U8*)s)[2] ) && ( 0xB9 == ((const U8*)s)[3] ) ) ? 4 : 0 )\
        : ( 0xB4 == ((const U8*)s)[1] ) ?                                   \
            ( ( ( 0xD5 == ((const U8*)s)[2] ) && ( ( ( ((const U8*)s)[3] & 0xF7 ) == 0xA5 ) || ((const U8*)s)[3] == 0xAB || ((const U8*)s)[3] == 0xB6 ) ) ? 4 : 0 )\
        : ( ( ( 0xBE == ((const U8*)s)[1] ) && ( 0xD5 == ((const U8*)s)[2] ) ) && ( 0xB6 == ((const U8*)s)[3] ) ) ? 4 : 0 )\
-    : 0 )                                                                   \
-: ((e)-(s) > 2) ?                                                           \
-    ( ( 'a' == ((const U8*)s)[0] ) ?                                        \
+    : 0 )
+
+
+/*** GENERATED CODE ***/
+#define is_MULTI_CHAR_FOLD_utf8_safe_part3(s,e)                             \
+( ((e)-(s) > 2) ?                                                           \
+    ( ( ( ((const U8*)s)[0] & 0xDF ) == 'A' ) ?                             \
        ( ( ( 0xCA == ((const U8*)s)[1] ) && ( 0xBE == ((const U8*)s)[2] ) ) ? 3 : 0 )\
-    : ( 'f' == ((const U8*)s)[0] ) ?                                        \
-       ( ( 'f' == ((const U8*)s)[1] ) ?                                    \
-           ( ( 'i' == ((const U8*)s)[2] || 'l' == ((const U8*)s)[2] ) ? 3 : 2 )\
-       : ( 'i' == ((const U8*)s)[1] || 'l' == ((const U8*)s)[1] ) ? 2 : 0 )\
-    : ( 'h' == ((const U8*)s)[0] ) ?                                        \
+    : ( ( ((const U8*)s)[0] & 0xDF ) == 'F' ) ?                             \
+       ( ( ( ((const U8*)s)[1] & 0xDF ) == 'F' ) ?                         \
+           ( ( ( ( ((const U8*)s)[2] & 0xDF ) == 'I' ) || ( ( ((const U8*)s)[2] & 0xDF ) == 'L' ) ) ? 3 : 2 )\
+       : ( ( ( ((const U8*)s)[1] & 0xDF ) == 'I' ) || ( ( ((const U8*)s)[1] & 0xDF ) == 'L' ) ) ? 2 : 0 )\
+    : ( ( ((const U8*)s)[0] & 0xDF ) == 'H' ) ?                             \
        ( ( ( 0xCC == ((const U8*)s)[1] ) && ( 0xB1 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
-    : ( 'i' == ((const U8*)s)[0] ) ?                                        \
+    : ( ( ((const U8*)s)[0] & 0xDF ) == 'I' ) ?                             \
        ( ( ( 0xCC == ((const U8*)s)[1] ) && ( 0x87 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
-    : ( 'j' == ((const U8*)s)[0] ) ?                                        \
+    : ( ( ((const U8*)s)[0] & 0xDF ) == 'J' ) ?                             \
        ( ( ( 0xCC == ((const U8*)s)[1] ) && ( 0x8C == ((const U8*)s)[2] ) ) ? 3 : 0 )\
-    : ( 's' == ((const U8*)s)[0] ) ?                                        \
-       ( ( inRANGE(((const U8*)s)[1], 's', 't') ) ? 2 : 0 )                \
-    : ( 't' == ((const U8*)s)[0] ) ?                                        \
+    : ( ( ((const U8*)s)[0] & 0xDF ) == 'S' ) ?                             \
+       ( ( inRANGE(((const U8*)s)[1], 'S', 'T') || inRANGE(((const U8*)s)[1], 's', 't') ) ? 2 : 0 )\
+    : ( ( ((const U8*)s)[0] & 0xDF ) == 'T' ) ?                             \
        ( ( ( 0xCC == ((const U8*)s)[1] ) && ( 0x88 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
-    : ( 'w' == ((const U8*)s)[0] || 'y' == ((const U8*)s)[0] ) ?            \
+    : ( ( ( ((const U8*)s)[0] & 0xDF ) == 'W' ) || ( ( ((const U8*)s)[0] & 0xDF ) == 'Y' ) ) ?\
        ( ( ( 0xCC == ((const U8*)s)[1] ) && ( 0x8A == ((const U8*)s)[2] ) ) ? 3 : 0 )\
-    : ( ( ( 0xCA == ((const U8*)s)[0] ) && ( 0xBC == ((const U8*)s)[1] ) ) && ( 'n' == ((const U8*)s)[2] ) ) ? 3 : 0 )\
+    : ( ( ( 0xCA == ((const U8*)s)[0] ) && ( 0xBC == ((const U8*)s)[1] ) ) && ( ( ((const U8*)s)[2] & 0xDF ) == 'N' ) ) ? 3 : 0 )\
 : ((e)-(s) > 1) ?                                                           \
-    ( ( 'f' == ((const U8*)s)[0] ) ?                                        \
-       ( ( 'f' == ((const U8*)s)[1] || 'i' == ((const U8*)s)[1] || 'l' == ((const U8*)s)[1] ) ? 2 : 0 )\
-    : ( ( 's' == ((const U8*)s)[0] ) && ( inRANGE(((const U8*)s)[1], 's', 't') ) ) ? 2 : 0 )\
+    ( ( ( ((const U8*)s)[0] & 0xDF ) == 'F' ) ?                             \
+       ( ( ( ( ((const U8*)s)[1] & 0xDF ) == 'F' ) || ( ( ((const U8*)s)[1] & 0xDF ) == 'I' ) || ( ( ((const U8*)s)[1] & 0xDF ) == 'L' ) ) ? 2 : 0 )\
+    : ( ( ( ((const U8*)s)[0] & 0xDF ) == 'S' ) && ( inRANGE(((const U8*)s)[1], 'S', 'T') || inRANGE(((const U8*)s)[1], 's', 't') ) ) ? 2 : 0 )\
 : 0 )
 
 
 /*** GENERATED CODE ***/
 #define is_MULTI_CHAR_FOLD_utf8_safe(s,e)                                   \
 ( ((e)-(s) > 5) ?                                                           \
-    ( ( 'a' == ((const U8*)s)[0] ) ?                                        \
+    ( ( ( ((const U8*)s)[0] & 0xDF ) == 'A' ) ? is_MULTI_CHAR_FOLD_utf8_safe_part0(s,e) : is_MULTI_CHAR_FOLD_utf8_safe_part1(s,e) )\
+: ((e)-(s) > 4) ?                                                           \
+    ( ( ( ((const U8*)s)[0] & 0xDF ) == 'A' ) ?                             \
        ( ( ( 0xCA == ((const U8*)s)[1] ) && ( 0xBE == ((const U8*)s)[2] ) ) ? 3 : 0 )\
-    : ( 'f' == ((const U8*)s)[0] ) ?                                        \
-       ( ( 'f' == ((const U8*)s)[1] ) ?                                    \
-           ( ( 'i' == ((const U8*)s)[2] || 'l' == ((const U8*)s)[2] ) ? 3 : 2 )\
-       : ( 'i' == ((const U8*)s)[1] || 'l' == ((const U8*)s)[1] ) ? 2 : 0 )\
-    : ( 'h' == ((const U8*)s)[0] ) ?                                        \
+    : ( ( ((const U8*)s)[0] & 0xDF ) == 'F' ) ?                             \
+       ( ( ( ((const U8*)s)[1] & 0xDF ) == 'F' ) ?                         \
+           ( ( ( ( ((const U8*)s)[2] & 0xDF ) == 'I' ) || ( ( ((const U8*)s)[2] & 0xDF ) == 'L' ) ) ? 3 : 2 )\
+       : ( ( ( ((const U8*)s)[1] & 0xDF ) == 'I' ) || ( ( ((const U8*)s)[1] & 0xDF ) == 'L' ) ) ? 2 : 0 )\
+    : ( ( ((const U8*)s)[0] & 0xDF ) == 'H' ) ?                             \
        ( ( ( 0xCC == ((const U8*)s)[1] ) && ( 0xB1 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
-    : ( 'i' == ((const U8*)s)[0] ) ?                                        \
+    : ( ( ((const U8*)s)[0] & 0xDF ) == 'I' ) ?                             \
        ( ( ( 0xCC == ((const U8*)s)[1] ) && ( 0x87 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
-    : ( 'j' == ((const U8*)s)[0] ) ?                                        \
+    : ( ( ((const U8*)s)[0] & 0xDF ) == 'J' ) ?                             \
        ( ( ( 0xCC == ((const U8*)s)[1] ) && ( 0x8C == ((const U8*)s)[2] ) ) ? 3 : 0 )\
-    : ( 's' == ((const U8*)s)[0] ) ?                                        \
-       ( ( inRANGE(((const U8*)s)[1], 's', 't') ) ? 2 : 0 )                \
-    : ( 't' == ((const U8*)s)[0] ) ?                                        \
+    : ( ( ((const U8*)s)[0] & 0xDF ) == 'S' ) ?                             \
+       ( ( inRANGE(((const U8*)s)[1], 'S', 'T') || inRANGE(((const U8*)s)[1], 's', 't') ) ? 2 : 0 )\
+    : ( ( ((const U8*)s)[0] & 0xDF ) == 'T' ) ?                             \
        ( ( ( 0xCC == ((const U8*)s)[1] ) && ( 0x88 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
-    : ( 'w' == ((const U8*)s)[0] || 'y' == ((const U8*)s)[0] ) ?            \
+    : ( ( ( ((const U8*)s)[0] & 0xDF ) == 'W' ) || ( ( ((const U8*)s)[0] & 0xDF ) == 'Y' ) ) ?\
        ( ( ( 0xCC == ((const U8*)s)[1] ) && ( 0x8A == ((const U8*)s)[2] ) ) ? 3 : 0 )\
     : ( 0xC5 == ((const U8*)s)[0] ) ?                                       \
        ( ( ( ( 0xBF == ((const U8*)s)[1] ) && ( 0xC5 == ((const U8*)s)[2] ) ) && ( 0xBF == ((const U8*)s)[3] ) ) ? 4 : 0 )\
     : ( 0xCA == ((const U8*)s)[0] ) ?                                       \
-       ( ( ( 0xBC == ((const U8*)s)[1] ) && ( 'n' == ((const U8*)s)[2] ) ) ? 3 : 0 )\
+       ( ( ( 0xBC == ((const U8*)s)[1] ) && ( ( ((const U8*)s)[2] & 0xDF ) == 'N' ) ) ? 3 : 0 )\
     : ( 0xCE == ((const U8*)s)[0] ) ?                                       \
        ( ( ( ((const U8*)s)[1] & 0xFD ) == 0xAC ) ?                        \
            ( ( ( 0xCE == ((const U8*)s)[2] ) && ( 0xB9 == ((const U8*)s)[3] ) ) ? 4 : 0 )\
        : ( 0xB1 == ((const U8*)s)[1] || 0xB7 == ((const U8*)s)[1] ) ?      \
            ( ( 0xCD == ((const U8*)s)[2] ) ?                               \
-               ( ( 0x82 == ((const U8*)s)[3] ) ?                           \
-                   ( ( ( 0xCE == ((const U8*)s)[4] ) && ( 0xB9 == ((const U8*)s)[5] ) ) ? 6 : 4 )\
-               : 0 )                                                       \
+               ( ( 0x82 == ((const U8*)s)[3] ) ? 4 : 0 )                   \
            : ( ( 0xCE == ((const U8*)s)[2] ) && ( 0xB9 == ((const U8*)s)[3] ) ) ? 4 : 0 )\
-       : ( 0xB9 == ((const U8*)s)[1] ) ?                                   \
-           ( ( 0xCC == ((const U8*)s)[2] ) ?                               \
-               ( ( 0x88 == ((const U8*)s)[3] ) ?                           \
-                   ( ( 0xCC == ((const U8*)s)[4] ) ?                       \
-                       ( ( inRANGE(((const U8*)s)[5], 0x80, 0x81) ) ? 6 : 0 )\
-                   : ( ( 0xCD == ((const U8*)s)[4] ) && ( 0x82 == ((const U8*)s)[5] ) ) ? 6 : 0 )\
-               : 0 )                                                       \
-           : ( ( 0xCD == ((const U8*)s)[2] ) && ( 0x82 == ((const U8*)s)[3] ) ) ? 4 : 0 )\
-       : 0 )                                                               \
+       : ( ( ( 0xB9 == ((const U8*)s)[1] ) && ( 0xCD == ((const U8*)s)[2] ) ) && ( 0x82 == ((const U8*)s)[3] ) ) ? 4 : 0 )\
     : ( 0xCF == ((const U8*)s)[0] ) ?                                       \
        ( ( 0x81 == ((const U8*)s)[1] ) ?                                   \
            ( ( ( 0xCC == ((const U8*)s)[2] ) && ( 0x93 == ((const U8*)s)[3] ) ) ? 4 : 0 )\
        : ( 0x85 == ((const U8*)s)[1] ) ?                                   \
            ( ( 0xCC == ((const U8*)s)[2] ) ?                               \
-               ( ( 0x88 == ((const U8*)s)[3] ) ?                           \
-                   ( ( 0xCC == ((const U8*)s)[4] ) ?                       \
-                       ( ( inRANGE(((const U8*)s)[5], 0x80, 0x81) ) ? 6 : 0 )\
-                   : ( ( 0xCD == ((const U8*)s)[4] ) && ( 0x82 == ((const U8*)s)[5] ) ) ? 6 : 0 )\
-               : ( 0x93 == ((const U8*)s)[3] ) ?                           \
-                   ( ( 0xCC == ((const U8*)s)[4] ) ?                       \
-                       ( ( inRANGE(((const U8*)s)[5], 0x80, 0x81) ) ? 6 : 4 )\
-                   : ( ( 0xCD == ((const U8*)s)[4] ) && ( 0x82 == ((const U8*)s)[5] ) ) ? 6 : 4 )\
-               : 0 )                                                       \
+               ( ( 0x93 == ((const U8*)s)[3] ) ? 4 : 0 )                   \
            : ( ( 0xCD == ((const U8*)s)[2] ) && ( 0x82 == ((const U8*)s)[3] ) ) ? 4 : 0 )\
        : ( 0x89 == ((const U8*)s)[1] ) ?                                   \
            ( ( 0xCD == ((const U8*)s)[2] ) ?                               \
-               ( ( 0x82 == ((const U8*)s)[3] ) ?                           \
-                   ( ( ( 0xCE == ((const U8*)s)[4] ) && ( 0xB9 == ((const U8*)s)[5] ) ) ? 6 : 4 )\
-               : 0 )                                                       \
+               ( ( 0x82 == ((const U8*)s)[3] ) ? 4 : 0 )                   \
            : ( ( 0xCE == ((const U8*)s)[2] ) && ( 0xB9 == ((const U8*)s)[3] ) ) ? 4 : 0 )\
        : ( ( ( 0x8E == ((const U8*)s)[1] ) && ( 0xCE == ((const U8*)s)[2] ) ) && ( 0xB9 == ((const U8*)s)[3] ) ) ? 4 : 0 )\
     : ( 0xD5 == ((const U8*)s)[0] ) ?                                       \
            ( ( ( ( ( ((const U8*)s)[2] & 0xD8 ) == 0x80 ) && ( 0xCE == ((const U8*)s)[3] ) ) && ( 0xB9 == ((const U8*)s)[4] ) ) ? 5 : 0 )\
        : ( ( ( ( 0xBD == ((const U8*)s)[1] ) && ( ( ( ((const U8*)s)[2] & 0xF8 ) == 0xA0 ) || ( ( ((const U8*)s)[2] & 0xFB ) == 0xB0 ) || ((const U8*)s)[2] == 0xBC ) ) && ( 0xCE == ((const U8*)s)[3] ) ) && ( 0xB9 == ((const U8*)s)[4] ) ) ? 5 : 0 )\
     : 0 )                                                                   \
-: ((e)-(s) > 4) ? is_MULTI_CHAR_FOLD_utf8_safe_part0(s,e) : is_MULTI_CHAR_FOLD_utf8_safe_part1(s,e) )
+: ((e)-(s) > 3) ? is_MULTI_CHAR_FOLD_utf8_safe_part2(s,e) : is_MULTI_CHAR_FOLD_utf8_safe_part3(s,e) )
 
 /*
        MULTI_CHAR_FOLD: multi-char strings that are folded to by a single character
 /*** GENERATED CODE ***/
 #define is_THREE_CHAR_FOLD_utf8_safe(s,e)                                   \
 ( ((e)-(s) > 5) ?                                                           \
-    ( ( 'f' == ((const U8*)s)[0] ) ?                                        \
-       ( ( ( 'f' == ((const U8*)s)[1] ) && ( 'i' == ((const U8*)s)[2] || 'l' == ((const U8*)s)[2] ) ) ? 3 : 0 )\
+    ( ( ( ((const U8*)s)[0] & 0xDF ) == 'F' ) ?                             \
+       ( ( ( ( ((const U8*)s)[1] & 0xDF ) == 'F' ) && ( ( ( ((const U8*)s)[2] & 0xDF ) == 'I' ) || ( ( ((const U8*)s)[2] & 0xDF ) == 'L' ) ) ) ? 3 : 0 )\
     : ( 0xCE == ((const U8*)s)[0] ) ?                                       \
        ( ( 0xB1 == ((const U8*)s)[1] || 0xB7 == ((const U8*)s)[1] ) ?      \
            ( ( ( ( ( 0xCD == ((const U8*)s)[2] ) && ( 0x82 == ((const U8*)s)[3] ) ) && ( 0xCE == ((const U8*)s)[4] ) ) && ( 0xB9 == ((const U8*)s)[5] ) ) ? 6 : 0 )\
                    : ( ( 0xCD == ((const U8*)s)[4] ) && ( 0x82 == ((const U8*)s)[5] ) ) ? 6 : 0 ) : 0 )\
        : ( ( ( ( ( 0x89 == ((const U8*)s)[1] ) && ( 0xCD == ((const U8*)s)[2] ) ) && ( 0x82 == ((const U8*)s)[3] ) ) && ( 0xCE == ((const U8*)s)[4] ) ) && ( 0xB9 == ((const U8*)s)[5] ) ) ? 6 : 0 )\
     : 0 )                                                                   \
-: ( ( ( ((e)-(s) > 2) && ( 'f' == ((const U8*)s)[0] ) ) && ( 'f' == ((const U8*)s)[1] ) ) && ( 'i' == ((const U8*)s)[2] || 'l' == ((const U8*)s)[2] ) ) ? 3 : 0 )
+: ( ( ( ((e)-(s) > 2) && ( ( ((const U8*)s)[0] & 0xDF ) == 'F' ) ) && ( ( ((const U8*)s)[1] & 0xDF ) == 'F' ) ) && ( ( ( ((const U8*)s)[2] & 0xDF ) == 'I' ) || ( ( ((const U8*)s)[2] & 0xDF ) == 'L' ) ) ) ? 3 : 0 )
 
 /*
        THREE_CHAR_FOLD: A three-character multi-char fold
 /*** GENERATED CODE ***/
 #define is_THREE_CHAR_FOLD_HEAD_utf8_safe(s,e)                              \
 ( ((e)-(s) > 3) ?                                                           \
-    ( ( 'a' == ((const U8*)s)[0] || inRANGE(((const U8*)s)[0], 'h', 'j') || inRANGE(((const U8*)s)[0], 's', 't') || 'w' == ((const U8*)s)[0] || 'y' == ((const U8*)s)[0] ) ? 1\
-    : ( 'f' == ((const U8*)s)[0] ) ?                                        \
-       ( ( 'f' == ((const U8*)s)[1] ) ? 2 : 1 )                            \
+    ( ( ( ( ((const U8*)s)[0] & 0xDF ) == 'A' ) || ( ( ((const U8*)s)[0] & 0xDE ) == 'H' ) || ( ( ((const U8*)s)[0] & 0xDF ) == 'J' ) || ( ( ((const U8*)s)[0] & 0xDB ) == 'S' ) || ( ( ((const U8*)s)[0] & 0xDF ) == 'T' ) || ( ( ((const U8*)s)[0] & 0xDF ) == 'Y' ) ) ? 1\
+    : ( ( ((const U8*)s)[0] & 0xDF ) == 'F' ) ?                             \
+       ( ( ( ((const U8*)s)[1] & 0xDF ) == 'F' ) ? 2 : 1 )                 \
     : ( 0xCA == ((const U8*)s)[0] ) ?                                       \
        ( ( 0xBC == ((const U8*)s)[1] ) ? 2 : 0 )                           \
     : ( 0xCE == ((const U8*)s)[0] ) ?                                       \
        : ( ( 0xBD == ((const U8*)s)[1] ) && ( ( ( ((const U8*)s)[2] & 0xF8 ) == 0xA0 ) || ( ( ((const U8*)s)[2] & 0xFB ) == 0xB0 ) || ((const U8*)s)[2] == 0xBC ) ) ? 3 : 0 )\
     : 0 )                                                                   \
 : ((e)-(s) > 2) ?                                                           \
-    ( ( 'a' == ((const U8*)s)[0] || inRANGE(((const U8*)s)[0], 'h', 'j') || inRANGE(((const U8*)s)[0], 's', 't') || 'w' == ((const U8*)s)[0] || 'y' == ((const U8*)s)[0] ) ? 1\
-    : ( 'f' == ((const U8*)s)[0] ) ?                                        \
-       ( ( 'f' == ((const U8*)s)[1] ) ? 2 : 1 )                            \
+    ( ( ( ( ((const U8*)s)[0] & 0xDF ) == 'A' ) || ( ( ((const U8*)s)[0] & 0xDE ) == 'H' ) || ( ( ((const U8*)s)[0] & 0xDF ) == 'J' ) || ( ( ((const U8*)s)[0] & 0xDB ) == 'S' ) || ( ( ((const U8*)s)[0] & 0xDF ) == 'T' ) || ( ( ((const U8*)s)[0] & 0xDF ) == 'Y' ) ) ? 1\
+    : ( ( ((const U8*)s)[0] & 0xDF ) == 'F' ) ?                             \
+       ( ( ( ((const U8*)s)[1] & 0xDF ) == 'F' ) ? 2 : 1 )                 \
     : ( 0xCA == ((const U8*)s)[0] ) ?                                       \
        ( ( 0xBC == ((const U8*)s)[1] ) ? 2 : 0 )                           \
     : ( 0xCE == ((const U8*)s)[0] ) ?                                       \
        : ( ( 0xBD == ((const U8*)s)[1] ) && ( ( ( ((const U8*)s)[2] & 0xF8 ) == 0xA0 ) || ( ( ((const U8*)s)[2] & 0xFB ) == 0xB0 ) || ((const U8*)s)[2] == 0xBC ) ) ? 3 : 0 )\
     : 0 )                                                                   \
 : ((e)-(s) > 1) ?                                                           \
-    ( ( 'a' == ((const U8*)s)[0] || inRANGE(((const U8*)s)[0], 'h', 'j') || inRANGE(((const U8*)s)[0], 's', 't') || 'w' == ((const U8*)s)[0] || 'y' == ((const U8*)s)[0] ) ? 1\
-    : ( 'f' == ((const U8*)s)[0] ) ?                                        \
-       ( ( 'f' == ((const U8*)s)[1] ) ? 2 : 1 )                            \
+    ( ( ( ( ((const U8*)s)[0] & 0xDF ) == 'A' ) || ( ( ((const U8*)s)[0] & 0xDE ) == 'H' ) || ( ( ((const U8*)s)[0] & 0xDF ) == 'J' ) || ( ( ((const U8*)s)[0] & 0xDB ) == 'S' ) || ( ( ((const U8*)s)[0] & 0xDF ) == 'T' ) || ( ( ((const U8*)s)[0] & 0xDF ) == 'Y' ) ) ? 1\
+    : ( ( ((const U8*)s)[0] & 0xDF ) == 'F' ) ?                             \
+       ( ( ( ((const U8*)s)[1] & 0xDF ) == 'F' ) ? 2 : 1 )                 \
     : ( 0xCA == ((const U8*)s)[0] ) ?                                       \
        ( ( 0xBC == ((const U8*)s)[1] ) ? 2 : 0 )                           \
     : ( 0xCE == ((const U8*)s)[0] ) ?                                       \
        ( ( ( ( ((const U8*)s)[1] & 0xFB ) == 0x81 ) || ((const U8*)s)[1] == 0x89 || ((const U8*)s)[1] == 0x8E ) ? 2 : 0 )\
     : ( ( 0xD5 == ((const U8*)s)[0] ) && ( 0xA5 == ((const U8*)s)[1] || 0xB4 == ((const U8*)s)[1] || 0xBE == ((const U8*)s)[1] ) ) ? 2 : 0 )\
 : ((e)-(s) > 0) ?                                                           \
-    ( 'a' == ((const U8*)s)[0] || 'f' == ((const U8*)s)[0] || inRANGE(((const U8*)s)[0], 'h', 'j') || inRANGE(((const U8*)s)[0], 's', 't') || 'w' == ((const U8*)s)[0] || 'y' == ((const U8*)s)[0] )\
+    ( ( ( ((const U8*)s)[0] & 0xDF ) == 'A' ) || ( ( ((const U8*)s)[0] & 0xDF ) == 'F' ) || ( ( ((const U8*)s)[0] & 0xDE ) == 'H' ) || ( ( ((const U8*)s)[0] & 0xDF ) == 'J' ) || ( ( ((const U8*)s)[0] & 0xDB ) == 'S' ) || ( ( ((const U8*)s)[0] & 0xDF ) == 'T' ) || ( ( ((const U8*)s)[0] & 0xDF ) == 'Y' ) )\
 : 0 )
 
 /*
 */
 /*** GENERATED CODE ***/
 #define is_MULTI_CHAR_FOLD_utf8_safe_part0(s,e)                             \
-( ( 'f' == ((const U8*)s)[1] ) ?                                            \
-           ( ( 'i' == ((const U8*)s)[2] || 'l' == ((const U8*)s)[2] ) ? 3 : 2 )\
-       : ( 'i' == ((const U8*)s)[1] || 'l' == ((const U8*)s)[1] ) ? 2 : 0 )
+( ( ( ((const U8*)s)[1] & 0xBF ) == 'f' ) ?                                 \
+           ( ( ( ( ((const U8*)s)[2] & 0xBF ) == 'i' ) || ( ( ((const U8*)s)[2] & 0xBF ) == 'l' ) ) ? 3 : 2 )\
+       : ( ( ( ((const U8*)s)[1] & 0xBF ) == 'i' ) || ( ( ((const U8*)s)[1] & 0xBF ) == 'l' ) ) ? 2 : 0 )
 
 
 /*** GENERATED CODE ***/
 #define is_MULTI_CHAR_FOLD_utf8_safe_part1(s,e)                             \
-( ( 'h' == ((const U8*)s)[0] ) ?                                            \
+( ( ( ((const U8*)s)[0] & 0xBF ) == 'h' ) ?                                 \
        ( ( ( 0xB0 == ((const U8*)s)[1] ) && ( 0x58 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
-    : ( 'i' == ((const U8*)s)[0] ) ?                                        \
+    : ( ( ((const U8*)s)[0] & 0xBF ) == 'i' ) ?                             \
        ( ( ( 0xAF == ((const U8*)s)[1] ) && ( 0x48 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
     : ( 0x8F == ((const U8*)s)[0] ) ?                                       \
        ( ( ( ( 0x73 == ((const U8*)s)[1] ) && ( 0x8F == ((const U8*)s)[2] ) ) && ( 0x73 == ((const U8*)s)[3] ) ) ? 4 : 0 )\
-    : ( 'j' == ((const U8*)s)[0] ) ?                                        \
+    : ( ( ((const U8*)s)[0] & 0xBF ) == 'j' ) ?                             \
        ( ( ( 0xAF == ((const U8*)s)[1] ) && ( 0x53 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
-    : ( 's' == ((const U8*)s)[0] ) ?                                        \
-       ( ( inRANGE(((const U8*)s)[1], 's', 't') ) ? 2 : 0 )                \
-    : ( 't' == ((const U8*)s)[0] ) ?                                        \
+    : ( ( ((const U8*)s)[0] & 0xBF ) == 's' ) ?                             \
+       ( ( ( ((const U8*)s)[1] & 0xBE ) == 's' ) ? 2 : 0 )                 \
+    : ( ( ((const U8*)s)[0] & 0xBF ) == 't' ) ?                             \
        ( ( ( 0xAF == ((const U8*)s)[1] ) && ( 0x49 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
-    : ( 'w' == ((const U8*)s)[0] || 'y' == ((const U8*)s)[0] ) ?            \
+    : ( ( ( ((const U8*)s)[0] & 0xBF ) == 'w' ) || ( ( ((const U8*)s)[0] & 0xBF ) == 'y' ) ) ?\
        ( ( ( 0xAF == ((const U8*)s)[1] ) && ( 0x51 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
     : ( 0xAB == ((const U8*)s)[0] ) ?                                       \
-       ( ( ( 0x70 == ((const U8*)s)[1] ) && ( 'n' == ((const U8*)s)[2] ) ) ? 3 : 0 )\
+       ( ( ( 0x70 == ((const U8*)s)[1] ) && ( ( ((const U8*)s)[2] & 0xBF ) == 'n' ) ) ? 3 : 0 )\
     : ( 0xB4 == ((const U8*)s)[0] ) ?                                       \
        ( ( 0x53 == ((const U8*)s)[1] || 0x55 == ((const U8*)s)[1] ) ?      \
            ( ( ( 0xB4 == ((const U8*)s)[2] ) && ( 0x68 == ((const U8*)s)[3] ) ) ? 4 : 0 )\
 
 /*** GENERATED CODE ***/
 #define is_MULTI_CHAR_FOLD_utf8_safe_part2(s,e)                             \
-( ( 'a' == ((const U8*)s)[0] ) ?                                            \
+( ( ( ((const U8*)s)[0] & 0xBF ) == 'a' ) ?                                 \
        ( ( ( 0xAB == ((const U8*)s)[1] ) && ( 0x72 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
-    : ( 'f' == ((const U8*)s)[0] ) ?                                        \
-       ( ( 'f' == ((const U8*)s)[1] ) ?                                    \
-           ( ( 'i' == ((const U8*)s)[2] || 'l' == ((const U8*)s)[2] ) ? 3 : 2 )\
-       : ( 'i' == ((const U8*)s)[1] || 'l' == ((const U8*)s)[1] ) ? 2 : 0 )\
-    : ( 'h' == ((const U8*)s)[0] ) ?                                        \
+    : ( ( ((const U8*)s)[0] & 0xBF ) == 'f' ) ?                             \
+       ( ( ( ((const U8*)s)[1] & 0xBF ) == 'f' ) ?                         \
+           ( ( ( ( ((const U8*)s)[2] & 0xBF ) == 'i' ) || ( ( ((const U8*)s)[2] & 0xBF ) == 'l' ) ) ? 3 : 2 )\
+       : ( ( ( ((const U8*)s)[1] & 0xBF ) == 'i' ) || ( ( ((const U8*)s)[1] & 0xBF ) == 'l' ) ) ? 2 : 0 )\
+    : ( ( ((const U8*)s)[0] & 0xBF ) == 'h' ) ?                             \
        ( ( ( 0xB0 == ((const U8*)s)[1] ) && ( 0x58 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
-    : ( 'i' == ((const U8*)s)[0] ) ?                                        \
+    : ( ( ((const U8*)s)[0] & 0xBF ) == 'i' ) ?                             \
        ( ( ( 0xAF == ((const U8*)s)[1] ) && ( 0x48 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
     : ( 0x8F == ((const U8*)s)[0] ) ?                                       \
        ( ( ( ( 0x73 == ((const U8*)s)[1] ) && ( 0x8F == ((const U8*)s)[2] ) ) && ( 0x73 == ((const U8*)s)[3] ) ) ? 4 : 0 )\
-    : ( 'j' == ((const U8*)s)[0] ) ?                                        \
+    : ( ( ((const U8*)s)[0] & 0xBF ) == 'j' ) ?                             \
        ( ( ( 0xAF == ((const U8*)s)[1] ) && ( 0x53 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
-    : ( 's' == ((const U8*)s)[0] ) ?                                        \
-       ( ( inRANGE(((const U8*)s)[1], 's', 't') ) ? 2 : 0 )                \
-    : ( 't' == ((const U8*)s)[0] ) ?                                        \
+    : ( ( ((const U8*)s)[0] & 0xBF ) == 's' ) ?                             \
+       ( ( ( ((const U8*)s)[1] & 0xBE ) == 's' ) ? 2 : 0 )                 \
+    : ( ( ((const U8*)s)[0] & 0xBF ) == 't' ) ?                             \
        ( ( ( 0xAF == ((const U8*)s)[1] ) && ( 0x49 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
-    : ( 'w' == ((const U8*)s)[0] || 'y' == ((const U8*)s)[0] ) ?            \
+    : ( ( ( ((const U8*)s)[0] & 0xBF ) == 'w' ) || ( ( ((const U8*)s)[0] & 0xBF ) == 'y' ) ) ?\
        ( ( ( 0xAF == ((const U8*)s)[1] ) && ( 0x51 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
     : ( 0xAB == ((const U8*)s)[0] ) ?                                       \
-       ( ( ( 0x70 == ((const U8*)s)[1] ) && ( 'n' == ((const U8*)s)[2] ) ) ? 3 : 0 )\
+       ( ( ( 0x70 == ((const U8*)s)[1] ) && ( ( ((const U8*)s)[2] & 0xBF ) == 'n' ) ) ? 3 : 0 )\
     : ( 0xB4 == ((const U8*)s)[0] ) ?                                       \
        ( ( 0x53 == ((const U8*)s)[1] || 0x55 == ((const U8*)s)[1] ) ?      \
            ( ( ( 0xB4 == ((const U8*)s)[2] ) && ( 0x68 == ((const U8*)s)[3] ) ) ? 4 : 0 )\
 /*** GENERATED CODE ***/
 #define is_MULTI_CHAR_FOLD_utf8_safe_part3(s,e)                             \
 ( ((e)-(s) > 3) ?                                                           \
-    ( ( 'a' == ((const U8*)s)[0] ) ?                                        \
+    ( ( ( ((const U8*)s)[0] & 0xBF ) == 'a' ) ?                             \
        ( ( ( 0xAB == ((const U8*)s)[1] ) && ( 0x72 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
-    : ( 'f' == ((const U8*)s)[0] ) ?                                        \
-       ( ( 'f' == ((const U8*)s)[1] ) ?                                    \
-           ( ( 'i' == ((const U8*)s)[2] || 'l' == ((const U8*)s)[2] ) ? 3 : 2 )\
-       : ( 'i' == ((const U8*)s)[1] || 'l' == ((const U8*)s)[1] ) ? 2 : 0 )\
-    : ( 'h' == ((const U8*)s)[0] ) ?                                        \
+    : ( ( ((const U8*)s)[0] & 0xBF ) == 'f' ) ?                             \
+       ( ( ( ((const U8*)s)[1] & 0xBF ) == 'f' ) ?                         \
+           ( ( ( ( ((const U8*)s)[2] & 0xBF ) == 'i' ) || ( ( ((const U8*)s)[2] & 0xBF ) == 'l' ) ) ? 3 : 2 )\
+       : ( ( ( ((const U8*)s)[1] & 0xBF ) == 'i' ) || ( ( ((const U8*)s)[1] & 0xBF ) == 'l' ) ) ? 2 : 0 )\
+    : ( ( ((const U8*)s)[0] & 0xBF ) == 'h' ) ?                             \
        ( ( ( 0xB0 == ((const U8*)s)[1] ) && ( 0x58 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
-    : ( 'i' == ((const U8*)s)[0] ) ?                                        \
+    : ( ( ((const U8*)s)[0] & 0xBF ) == 'i' ) ?                             \
        ( ( ( 0xAF == ((const U8*)s)[1] ) && ( 0x48 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
     : ( 0x8F == ((const U8*)s)[0] ) ?                                       \
        ( ( ( ( 0x73 == ((const U8*)s)[1] ) && ( 0x8F == ((const U8*)s)[2] ) ) && ( 0x73 == ((const U8*)s)[3] ) ) ? 4 : 0 )\
-    : ( 'j' == ((const U8*)s)[0] ) ?                                        \
+    : ( ( ((const U8*)s)[0] & 0xBF ) == 'j' ) ?                             \
        ( ( ( 0xAF == ((const U8*)s)[1] ) && ( 0x53 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
-    : ( 's' == ((const U8*)s)[0] ) ?                                        \
-       ( ( inRANGE(((const U8*)s)[1], 's', 't') ) ? 2 : 0 )                \
-    : ( 't' == ((const U8*)s)[0] ) ?                                        \
+    : ( ( ((const U8*)s)[0] & 0xBF ) == 's' ) ?                             \
+       ( ( ( ((const U8*)s)[1] & 0xBE ) == 's' ) ? 2 : 0 )                 \
+    : ( ( ((const U8*)s)[0] & 0xBF ) == 't' ) ?                             \
        ( ( ( 0xAF == ((const U8*)s)[1] ) && ( 0x49 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
-    : ( 'w' == ((const U8*)s)[0] || 'y' == ((const U8*)s)[0] ) ?            \
+    : ( ( ( ((const U8*)s)[0] & 0xBF ) == 'w' ) || ( ( ((const U8*)s)[0] & 0xBF ) == 'y' ) ) ?\
        ( ( ( 0xAF == ((const U8*)s)[1] ) && ( 0x51 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
     : ( 0xAB == ((const U8*)s)[0] ) ?                                       \
-       ( ( ( 0x70 == ((const U8*)s)[1] ) && ( 'n' == ((const U8*)s)[2] ) ) ? 3 : 0 )\
+       ( ( ( 0x70 == ((const U8*)s)[1] ) && ( ( ((const U8*)s)[2] & 0xBF ) == 'n' ) ) ? 3 : 0 )\
     : ( 0xB4 == ((const U8*)s)[0] ) ?                                       \
        ( ( 0x53 == ((const U8*)s)[1] || 0x55 == ((const U8*)s)[1] ) ?      \
            ( ( ( 0xB4 == ((const U8*)s)[2] ) && ( 0x68 == ((const U8*)s)[3] ) ) ? 4 : 0 )\
        : ( ( ( 0x55 == ((const U8*)s)[1] ) && ( 0xB4 == ((const U8*)s)[2] ) ) && ( 0x68 == ((const U8*)s)[3] ) ) ? 4 : 0 )\
     : 0 )                                                                   \
 : ((e)-(s) > 2) ?                                                           \
-    ( ( 'a' == ((const U8*)s)[0] ) ?                                        \
+    ( ( ( ((const U8*)s)[0] & 0xBF ) == 'a' ) ?                             \
        ( ( ( 0xAB == ((const U8*)s)[1] ) && ( 0x72 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
-    : ( 'f' == ((const U8*)s)[0] ) ?                                        \
-       ( ( 'f' == ((const U8*)s)[1] ) ?                                    \
-           ( ( 'i' == ((const U8*)s)[2] || 'l' == ((const U8*)s)[2] ) ? 3 : 2 )\
-       : ( 'i' == ((const U8*)s)[1] || 'l' == ((const U8*)s)[1] ) ? 2 : 0 )\
-    : ( 'h' == ((const U8*)s)[0] ) ?                                        \
+    : ( ( ((const U8*)s)[0] & 0xBF ) == 'f' ) ?                             \
+       ( ( ( ((const U8*)s)[1] & 0xBF ) == 'f' ) ?                         \
+           ( ( ( ( ((const U8*)s)[2] & 0xBF ) == 'i' ) || ( ( ((const U8*)s)[2] & 0xBF ) == 'l' ) ) ? 3 : 2 )\
+       : ( ( ( ((const U8*)s)[1] & 0xBF ) == 'i' ) || ( ( ((const U8*)s)[1] & 0xBF ) == 'l' ) ) ? 2 : 0 )\
+    : ( ( ((const U8*)s)[0] & 0xBF ) == 'h' ) ?                             \
        ( ( ( 0xB0 == ((const U8*)s)[1] ) && ( 0x58 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
-    : ( 'i' == ((const U8*)s)[0] ) ?                                        \
+    : ( ( ((const U8*)s)[0] & 0xBF ) == 'i' ) ?                             \
        ( ( ( 0xAF == ((const U8*)s)[1] ) && ( 0x48 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
-    : ( 'j' == ((const U8*)s)[0] ) ?                                        \
+    : ( ( ((const U8*)s)[0] & 0xBF ) == 'j' ) ?                             \
        ( ( ( 0xAF == ((const U8*)s)[1] ) && ( 0x53 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
-    : ( 's' == ((const U8*)s)[0] ) ?                                        \
-       ( ( inRANGE(((const U8*)s)[1], 's', 't') ) ? 2 : 0 )                \
-    : ( 't' == ((const U8*)s)[0] ) ?                                        \
+    : ( ( ((const U8*)s)[0] & 0xBF ) == 's' ) ?                             \
+       ( ( ( ((const U8*)s)[1] & 0xBE ) == 's' ) ? 2 : 0 )                 \
+    : ( ( ((const U8*)s)[0] & 0xBF ) == 't' ) ?                             \
        ( ( ( 0xAF == ((const U8*)s)[1] ) && ( 0x49 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
-    : ( 'w' == ((const U8*)s)[0] || 'y' == ((const U8*)s)[0] ) ?            \
+    : ( ( ( ((const U8*)s)[0] & 0xBF ) == 'w' ) || ( ( ((const U8*)s)[0] & 0xBF ) == 'y' ) ) ?\
        ( ( ( 0xAF == ((const U8*)s)[1] ) && ( 0x51 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
-    : ( ( ( 0xAB == ((const U8*)s)[0] ) && ( 0x70 == ((const U8*)s)[1] ) ) && ( 'n' == ((const U8*)s)[2] ) ) ? 3 : 0 )\
+    : ( ( ( 0xAB == ((const U8*)s)[0] ) && ( 0x70 == ((const U8*)s)[1] ) ) && ( ( ((const U8*)s)[2] & 0xBF ) == 'n' ) ) ? 3 : 0 )\
 : ((e)-(s) > 1) ?                                                           \
-    ( ( 'f' == ((const U8*)s)[0] ) ?                                        \
-       ( ( 'f' == ((const U8*)s)[1] || 'i' == ((const U8*)s)[1] || 'l' == ((const U8*)s)[1] ) ? 2 : 0 )\
-    : ( ( 's' == ((const U8*)s)[0] ) && ( inRANGE(((const U8*)s)[1], 's', 't') ) ) ? 2 : 0 )\
+    ( ( ( ((const U8*)s)[0] & 0xBF ) == 'f' ) ?                             \
+       ( ( ( ( ((const U8*)s)[1] & 0xBF ) == 'f' ) || ( ( ((const U8*)s)[1] & 0xBF ) == 'i' ) || ( ( ((const U8*)s)[1] & 0xBF ) == 'l' ) ) ? 2 : 0 )\
+    : ( ( ( ((const U8*)s)[0] & 0xBF ) == 's' ) && ( ( ((const U8*)s)[1] & 0xBE ) == 's' ) ) ? 2 : 0 )\
 : 0 )
 
 
 /*** GENERATED CODE ***/
 #define is_MULTI_CHAR_FOLD_utf8_safe(s,e)                                   \
 ( ((e)-(s) > 5) ?                                                           \
-    ( ( 'a' == ((const U8*)s)[0] ) ?                                        \
+    ( ( ( ((const U8*)s)[0] & 0xBF ) == 'a' ) ?                             \
        ( ( ( 0xAB == ((const U8*)s)[1] ) && ( 0x72 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
-    : ( 'f' == ((const U8*)s)[0] ) ? is_MULTI_CHAR_FOLD_utf8_safe_part0(s,e) : is_MULTI_CHAR_FOLD_utf8_safe_part1(s,e) )\
+    : ( ( ((const U8*)s)[0] & 0xBF ) == 'f' ) ? is_MULTI_CHAR_FOLD_utf8_safe_part0(s,e) : is_MULTI_CHAR_FOLD_utf8_safe_part1(s,e) )\
 : ((e)-(s) > 4) ? is_MULTI_CHAR_FOLD_utf8_safe_part2(s,e) : is_MULTI_CHAR_FOLD_utf8_safe_part3(s,e) )
 
 /*
 /*** GENERATED CODE ***/
 #define is_THREE_CHAR_FOLD_utf8_safe(s,e)                                   \
 ( ((e)-(s) > 5) ?                                                           \
-    ( ( 'f' == ((const U8*)s)[0] ) ?                                        \
-       ( ( ( 'f' == ((const U8*)s)[1] ) && ( 'i' == ((const U8*)s)[2] || 'l' == ((const U8*)s)[2] ) ) ? 3 : 0 )\
+    ( ( ( ((const U8*)s)[0] & 0xBF ) == 'f' ) ?                             \
+       ( ( ( ( ((const U8*)s)[1] & 0xBF ) == 'f' ) && ( ( ( ((const U8*)s)[2] & 0xBF ) == 'i' ) || ( ( ((const U8*)s)[2] & 0xBF ) == 'l' ) ) ) ? 3 : 0 )\
     : ( 0xB4 == ((const U8*)s)[0] ) ?                                       \
        ( ( 0x58 == ((const U8*)s)[1] || 0x66 == ((const U8*)s)[1] ) ?      \
            ( ( ( ( ( 0xB1 == ((const U8*)s)[2] ) && ( 0x43 == ((const U8*)s)[3] ) ) && ( 0xB4 == ((const U8*)s)[4] ) ) && ( 0x68 == ((const U8*)s)[5] ) ) ? 6 : 0 )\
                    : ( ( 0xB1 == ((const U8*)s)[4] ) && ( 0x43 == ((const U8*)s)[5] ) ) ? 6 : 0 ) : 0 )\
        : ( ( ( ( ( 0x4A == ((const U8*)s)[1] ) && ( 0xB1 == ((const U8*)s)[2] ) ) && ( 0x43 == ((const U8*)s)[3] ) ) && ( 0xB4 == ((const U8*)s)[4] ) ) && ( 0x68 == ((const U8*)s)[5] ) ) ? 6 : 0 )\
     : 0 )                                                                   \
-: ( ( ( ((e)-(s) > 2) && ( 'f' == ((const U8*)s)[0] ) ) && ( 'f' == ((const U8*)s)[1] ) ) && ( 'i' == ((const U8*)s)[2] || 'l' == ((const U8*)s)[2] ) ) ? 3 : 0 )
+: ( ( ( ((e)-(s) > 2) && ( ( ((const U8*)s)[0] & 0xBF ) == 'f' ) ) && ( ( ((const U8*)s)[1] & 0xBF ) == 'f' ) ) && ( ( ( ((const U8*)s)[2] & 0xBF ) == 'i' ) || ( ( ((const U8*)s)[2] & 0xBF ) == 'l' ) ) ) ? 3 : 0 )
 
 /*
        THREE_CHAR_FOLD: A three-character multi-char fold
 /*** GENERATED CODE ***/
 #define is_THREE_CHAR_FOLD_HEAD_utf8_safe(s,e)                              \
 ( ((e)-(s) > 3) ?                                                           \
-    ( ( ( ( ((const U8*)s)[0] & 0xEF ) == 'a' ) || ( ( ((const U8*)s)[0] & 0xFE ) == 'h' ) || ( ( ((const U8*)s)[0] & 0xFE ) == 's' ) || ((const U8*)s)[0] == 'w' || ((const U8*)s)[0] == 'y' ) ? 1\
-    : ( 'f' == ((const U8*)s)[0] ) ?                                        \
-       ( ( 'f' == ((const U8*)s)[1] ) ? 2 : 1 )                            \
+    ( ( ( ( ((const U8*)s)[0] & 0xAF ) == 'a' ) || ( ( ((const U8*)s)[0] & 0xBE ) == 'h' ) || ( ( ((const U8*)s)[0] & 0xBE ) == 's' ) || ( ( ((const U8*)s)[0] & 0xBF ) == 'w' ) || ( ( ((const U8*)s)[0] & 0xBF ) == 'y' ) ) ? 1\
+    : ( ( ((const U8*)s)[0] & 0xBF ) == 'f' ) ?                             \
+       ( ( ( ((const U8*)s)[1] & 0xBF ) == 'f' ) ? 2 : 1 )                 \
     : ( 0xAB == ((const U8*)s)[0] ) ?                                       \
        ( ( 0x70 == ((const U8*)s)[1] ) ? 2 : 0 )                           \
     : ( 0xB4 == ((const U8*)s)[0] ) ?                                       \
        : ( ( 0x6A == ((const U8*)s)[1] ) && ( inRANGE(((const U8*)s)[2], 0x41, 0x48) || 0x57 == ((const U8*)s)[2] || 0x63 == ((const U8*)s)[2] || 0x70 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
     : 0 )                                                                   \
 : ((e)-(s) > 2) ?                                                           \
-    ( ( ( ( ((const U8*)s)[0] & 0xEF ) == 'a' ) || ( ( ((const U8*)s)[0] & 0xFE ) == 'h' ) || ( ( ((const U8*)s)[0] & 0xFE ) == 's' ) || ((const U8*)s)[0] == 'w' || ((const U8*)s)[0] == 'y' ) ? 1\
-    : ( 'f' == ((const U8*)s)[0] ) ?                                        \
-       ( ( 'f' == ((const U8*)s)[1] ) ? 2 : 1 )                            \
+    ( ( ( ( ((const U8*)s)[0] & 0xAF ) == 'a' ) || ( ( ((const U8*)s)[0] & 0xBE ) == 'h' ) || ( ( ((const U8*)s)[0] & 0xBE ) == 's' ) || ( ( ((const U8*)s)[0] & 0xBF ) == 'w' ) || ( ( ((const U8*)s)[0] & 0xBF ) == 'y' ) ) ? 1\
+    : ( ( ((const U8*)s)[0] & 0xBF ) == 'f' ) ?                             \
+       ( ( ( ((const U8*)s)[1] & 0xBF ) == 'f' ) ? 2 : 1 )                 \
     : ( 0xAB == ((const U8*)s)[0] ) ?                                       \
        ( ( 0x70 == ((const U8*)s)[1] ) ? 2 : 0 )                           \
     : ( 0xB4 == ((const U8*)s)[0] ) ?                                       \
        : ( ( 0x6A == ((const U8*)s)[1] ) && ( inRANGE(((const U8*)s)[2], 0x41, 0x48) || 0x57 == ((const U8*)s)[2] || 0x63 == ((const U8*)s)[2] || 0x70 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
     : 0 )                                                                   \
 : ((e)-(s) > 1) ?                                                           \
-    ( ( ( ( ((const U8*)s)[0] & 0xEF ) == 'a' ) || ( ( ((const U8*)s)[0] & 0xFE ) == 'h' ) || ( ( ((const U8*)s)[0] & 0xFE ) == 's' ) || ((const U8*)s)[0] == 'w' || ((const U8*)s)[0] == 'y' ) ? 1\
-    : ( 'f' == ((const U8*)s)[0] ) ?                                        \
-       ( ( 'f' == ((const U8*)s)[1] ) ? 2 : 1 )                            \
+    ( ( ( ( ((const U8*)s)[0] & 0xAF ) == 'a' ) || ( ( ((const U8*)s)[0] & 0xBE ) == 'h' ) || ( ( ((const U8*)s)[0] & 0xBE ) == 's' ) || ( ( ((const U8*)s)[0] & 0xBF ) == 'w' ) || ( ( ((const U8*)s)[0] & 0xBF ) == 'y' ) ) ? 1\
+    : ( ( ((const U8*)s)[0] & 0xBF ) == 'f' ) ?                             \
+       ( ( ( ((const U8*)s)[1] & 0xBF ) == 'f' ) ? 2 : 1 )                 \
     : ( 0xAB == ((const U8*)s)[0] ) ?                                       \
        ( ( 0x70 == ((const U8*)s)[1] ) ? 2 : 0 )                           \
     : ( 0xB4 == ((const U8*)s)[0] ) ?                                       \
        ( ( 0x53 == ((const U8*)s)[1] || 0x55 == ((const U8*)s)[1] || 0x58 == ((const U8*)s)[1] || 0x66 == ((const U8*)s)[1] || 0x68 == ((const U8*)s)[1] ) ? 2 : 0 )\
     : ( ( 0xB5 == ((const U8*)s)[0] ) && ( ( ( ((const U8*)s)[1] & 0xFB ) == 0x42 ) || ((const U8*)s)[1] == 0x4A || ((const U8*)s)[1] == 0x55 ) ) ? 2 : 0 )\
 : ((e)-(s) > 0) ?                                                           \
-    ( ( ( ((const U8*)s)[0] & 0xEF ) == 'a' ) || ( ( ((const U8*)s)[0] & 0xDF ) == 'f' ) || ( ( ((const U8*)s)[0] & 0xFE ) == 'h' ) || ( ( ((const U8*)s)[0] & 0xFE ) == 's' ) || ((const U8*)s)[0] == 'y' )\
+    ( ( ( ((const U8*)s)[0] & 0xAF ) == 'a' ) || ( ( ((const U8*)s)[0] & 0x9F ) == 'f' ) || ( ( ((const U8*)s)[0] & 0xBE ) == 'h' ) || ( ( ((const U8*)s)[0] & 0xBE ) == 's' ) || ( ( ((const U8*)s)[0] & 0xBF ) == 'y' ) )\
 : 0 )
 
 /*
 */
 /*** GENERATED CODE ***/
 #define is_MULTI_CHAR_FOLD_utf8_safe_part0(s,e)                             \
-( ( 'f' == ((const U8*)s)[1] ) ?                                            \
-           ( ( 'i' == ((const U8*)s)[2] || 'l' == ((const U8*)s)[2] ) ? 3 : 2 )\
-       : ( 'i' == ((const U8*)s)[1] || 'l' == ((const U8*)s)[1] ) ? 2 : 0 )
+( ( ( ((const U8*)s)[1] & 0xBF ) == 'f' ) ?                                 \
+           ( ( ( ( ((const U8*)s)[2] & 0xBF ) == 'i' ) || ( ( ((const U8*)s)[2] & 0xBF ) == 'l' ) ) ? 3 : 2 )\
+       : ( ( ( ((const U8*)s)[1] & 0xBF ) == 'i' ) || ( ( ((const U8*)s)[1] & 0xBF ) == 'l' ) ) ? 2 : 0 )
 
 
 /*** GENERATED CODE ***/
 #define is_MULTI_CHAR_FOLD_utf8_safe_part1(s,e)                             \
-( ( 'h' == ((const U8*)s)[0] ) ?                                            \
+( ( ( ((const U8*)s)[0] & 0xBF ) == 'h' ) ?                                 \
        ( ( ( 0xAE == ((const U8*)s)[1] ) && ( 0x58 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
-    : ( 'i' == ((const U8*)s)[0] ) ?                                        \
+    : ( ( ((const U8*)s)[0] & 0xBF ) == 'i' ) ?                             \
        ( ( ( 0xAD == ((const U8*)s)[1] ) && ( 0x48 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
     : ( 0x8E == ((const U8*)s)[0] ) ?                                       \
        ( ( ( ( 0x72 == ((const U8*)s)[1] ) && ( 0x8E == ((const U8*)s)[2] ) ) && ( 0x72 == ((const U8*)s)[3] ) ) ? 4 : 0 )\
-    : ( 'j' == ((const U8*)s)[0] ) ?                                        \
+    : ( ( ((const U8*)s)[0] & 0xBF ) == 'j' ) ?                             \
        ( ( ( 0xAD == ((const U8*)s)[1] ) && ( 0x53 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
-    : ( 's' == ((const U8*)s)[0] ) ?                                        \
-       ( ( inRANGE(((const U8*)s)[1], 's', 't') ) ? 2 : 0 )                \
-    : ( 't' == ((const U8*)s)[0] ) ?                                        \
+    : ( ( ((const U8*)s)[0] & 0xBF ) == 's' ) ?                             \
+       ( ( ( ((const U8*)s)[1] & 0xBE ) == 's' ) ? 2 : 0 )                 \
+    : ( ( ((const U8*)s)[0] & 0xBF ) == 't' ) ?                             \
        ( ( ( 0xAD == ((const U8*)s)[1] ) && ( 0x49 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
-    : ( 'w' == ((const U8*)s)[0] || 'y' == ((const U8*)s)[0] ) ?            \
+    : ( ( ( ((const U8*)s)[0] & 0xBF ) == 'w' ) || ( ( ((const U8*)s)[0] & 0xBF ) == 'y' ) ) ?\
        ( ( ( 0xAD == ((const U8*)s)[1] ) && ( 0x51 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
     : ( 0xAA == ((const U8*)s)[0] ) ?                                       \
-       ( ( ( 0x6A == ((const U8*)s)[1] ) && ( 'n' == ((const U8*)s)[2] ) ) ? 3 : 0 )\
+       ( ( ( 0x6A == ((const U8*)s)[1] ) && ( ( ((const U8*)s)[2] & 0xBF ) == 'n' ) ) ? 3 : 0 )\
     : ( 0xB3 == ((const U8*)s)[0] ) ?                                       \
        ( ( 0x53 == ((const U8*)s)[1] || 0x55 == ((const U8*)s)[1] ) ?      \
            ( ( ( 0xB3 == ((const U8*)s)[2] ) && ( 0x67 == ((const U8*)s)[3] ) ) ? 4 : 0 )\
 
 /*** GENERATED CODE ***/
 #define is_MULTI_CHAR_FOLD_utf8_safe_part2(s,e)                             \
-( ( 'a' == ((const U8*)s)[0] ) ?                                            \
+( ( ( ((const U8*)s)[0] & 0xBF ) == 'a' ) ?                                 \
        ( ( ( 0xAA == ((const U8*)s)[1] ) && ( 0x71 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
-    : ( 'f' == ((const U8*)s)[0] ) ?                                        \
-       ( ( 'f' == ((const U8*)s)[1] ) ?                                    \
-           ( ( 'i' == ((const U8*)s)[2] || 'l' == ((const U8*)s)[2] ) ? 3 : 2 )\
-       : ( 'i' == ((const U8*)s)[1] || 'l' == ((const U8*)s)[1] ) ? 2 : 0 )\
-    : ( 'h' == ((const U8*)s)[0] ) ?                                        \
+    : ( ( ((const U8*)s)[0] & 0xBF ) == 'f' ) ?                             \
+       ( ( ( ((const U8*)s)[1] & 0xBF ) == 'f' ) ?                         \
+           ( ( ( ( ((const U8*)s)[2] & 0xBF ) == 'i' ) || ( ( ((const U8*)s)[2] & 0xBF ) == 'l' ) ) ? 3 : 2 )\
+       : ( ( ( ((const U8*)s)[1] & 0xBF ) == 'i' ) || ( ( ((const U8*)s)[1] & 0xBF ) == 'l' ) ) ? 2 : 0 )\
+    : ( ( ((const U8*)s)[0] & 0xBF ) == 'h' ) ?                             \
        ( ( ( 0xAE == ((const U8*)s)[1] ) && ( 0x58 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
-    : ( 'i' == ((const U8*)s)[0] ) ?                                        \
+    : ( ( ((const U8*)s)[0] & 0xBF ) == 'i' ) ?                             \
        ( ( ( 0xAD == ((const U8*)s)[1] ) && ( 0x48 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
     : ( 0x8E == ((const U8*)s)[0] ) ?                                       \
        ( ( ( ( 0x72 == ((const U8*)s)[1] ) && ( 0x8E == ((const U8*)s)[2] ) ) && ( 0x72 == ((const U8*)s)[3] ) ) ? 4 : 0 )\
-    : ( 'j' == ((const U8*)s)[0] ) ?                                        \
+    : ( ( ((const U8*)s)[0] & 0xBF ) == 'j' ) ?                             \
        ( ( ( 0xAD == ((const U8*)s)[1] ) && ( 0x53 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
-    : ( 's' == ((const U8*)s)[0] ) ?                                        \
-       ( ( inRANGE(((const U8*)s)[1], 's', 't') ) ? 2 : 0 )                \
-    : ( 't' == ((const U8*)s)[0] ) ?                                        \
+    : ( ( ((const U8*)s)[0] & 0xBF ) == 's' ) ?                             \
+       ( ( ( ((const U8*)s)[1] & 0xBE ) == 's' ) ? 2 : 0 )                 \
+    : ( ( ((const U8*)s)[0] & 0xBF ) == 't' ) ?                             \
        ( ( ( 0xAD == ((const U8*)s)[1] ) && ( 0x49 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
-    : ( 'w' == ((const U8*)s)[0] || 'y' == ((const U8*)s)[0] ) ?            \
+    : ( ( ( ((const U8*)s)[0] & 0xBF ) == 'w' ) || ( ( ((const U8*)s)[0] & 0xBF ) == 'y' ) ) ?\
        ( ( ( 0xAD == ((const U8*)s)[1] ) && ( 0x51 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
     : ( 0xAA == ((const U8*)s)[0] ) ?                                       \
-       ( ( ( 0x6A == ((const U8*)s)[1] ) && ( 'n' == ((const U8*)s)[2] ) ) ? 3 : 0 )\
+       ( ( ( 0x6A == ((const U8*)s)[1] ) && ( ( ((const U8*)s)[2] & 0xBF ) == 'n' ) ) ? 3 : 0 )\
     : ( 0xB3 == ((const U8*)s)[0] ) ?                                       \
        ( ( 0x53 == ((const U8*)s)[1] || 0x55 == ((const U8*)s)[1] ) ?      \
            ( ( ( 0xB3 == ((const U8*)s)[2] ) && ( 0x67 == ((const U8*)s)[3] ) ) ? 4 : 0 )\
 /*** GENERATED CODE ***/
 #define is_MULTI_CHAR_FOLD_utf8_safe_part3(s,e)                             \
 ( ((e)-(s) > 3) ?                                                           \
-    ( ( 'a' == ((const U8*)s)[0] ) ?                                        \
+    ( ( ( ((const U8*)s)[0] & 0xBF ) == 'a' ) ?                             \
        ( ( ( 0xAA == ((const U8*)s)[1] ) && ( 0x71 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
-    : ( 'f' == ((const U8*)s)[0] ) ?                                        \
-       ( ( 'f' == ((const U8*)s)[1] ) ?                                    \
-           ( ( 'i' == ((const U8*)s)[2] || 'l' == ((const U8*)s)[2] ) ? 3 : 2 )\
-       : ( 'i' == ((const U8*)s)[1] || 'l' == ((const U8*)s)[1] ) ? 2 : 0 )\
-    : ( 'h' == ((const U8*)s)[0] ) ?                                        \
+    : ( ( ((const U8*)s)[0] & 0xBF ) == 'f' ) ?                             \
+       ( ( ( ((const U8*)s)[1] & 0xBF ) == 'f' ) ?                         \
+           ( ( ( ( ((const U8*)s)[2] & 0xBF ) == 'i' ) || ( ( ((const U8*)s)[2] & 0xBF ) == 'l' ) ) ? 3 : 2 )\
+       : ( ( ( ((const U8*)s)[1] & 0xBF ) == 'i' ) || ( ( ((const U8*)s)[1] & 0xBF ) == 'l' ) ) ? 2 : 0 )\
+    : ( ( ((const U8*)s)[0] & 0xBF ) == 'h' ) ?                             \
        ( ( ( 0xAE == ((const U8*)s)[1] ) && ( 0x58 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
-    : ( 'i' == ((const U8*)s)[0] ) ?                                        \
+    : ( ( ((const U8*)s)[0] & 0xBF ) == 'i' ) ?                             \
        ( ( ( 0xAD == ((const U8*)s)[1] ) && ( 0x48 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
     : ( 0x8E == ((const U8*)s)[0] ) ?                                       \
        ( ( ( ( 0x72 == ((const U8*)s)[1] ) && ( 0x8E == ((const U8*)s)[2] ) ) && ( 0x72 == ((const U8*)s)[3] ) ) ? 4 : 0 )\
-    : ( 'j' == ((const U8*)s)[0] ) ?                                        \
+    : ( ( ((const U8*)s)[0] & 0xBF ) == 'j' ) ?                             \
        ( ( ( 0xAD == ((const U8*)s)[1] ) && ( 0x53 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
-    : ( 's' == ((const U8*)s)[0] ) ?                                        \
-       ( ( inRANGE(((const U8*)s)[1], 's', 't') ) ? 2 : 0 )                \
-    : ( 't' == ((const U8*)s)[0] ) ?                                        \
+    : ( ( ((const U8*)s)[0] & 0xBF ) == 's' ) ?                             \
+       ( ( ( ((const U8*)s)[1] & 0xBE ) == 's' ) ? 2 : 0 )                 \
+    : ( ( ((const U8*)s)[0] & 0xBF ) == 't' ) ?                             \
        ( ( ( 0xAD == ((const U8*)s)[1] ) && ( 0x49 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
-    : ( 'w' == ((const U8*)s)[0] || 'y' == ((const U8*)s)[0] ) ?            \
+    : ( ( ( ((const U8*)s)[0] & 0xBF ) == 'w' ) || ( ( ((const U8*)s)[0] & 0xBF ) == 'y' ) ) ?\
        ( ( ( 0xAD == ((const U8*)s)[1] ) && ( 0x51 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
     : ( 0xAA == ((const U8*)s)[0] ) ?                                       \
-       ( ( ( 0x6A == ((const U8*)s)[1] ) && ( 'n' == ((const U8*)s)[2] ) ) ? 3 : 0 )\
+       ( ( ( 0x6A == ((const U8*)s)[1] ) && ( ( ((const U8*)s)[2] & 0xBF ) == 'n' ) ) ? 3 : 0 )\
     : ( 0xB3 == ((const U8*)s)[0] ) ?                                       \
        ( ( 0x53 == ((const U8*)s)[1] || 0x55 == ((const U8*)s)[1] ) ?      \
            ( ( ( 0xB3 == ((const U8*)s)[2] ) && ( 0x67 == ((const U8*)s)[3] ) ) ? 4 : 0 )\
        : ( ( ( 0x55 == ((const U8*)s)[1] ) && ( 0xB3 == ((const U8*)s)[2] ) ) && ( 0x67 == ((const U8*)s)[3] ) ) ? 4 : 0 )\
     : 0 )                                                                   \
 : ((e)-(s) > 2) ?                                                           \
-    ( ( 'a' == ((const U8*)s)[0] ) ?                                        \
+    ( ( ( ((const U8*)s)[0] & 0xBF ) == 'a' ) ?                             \
        ( ( ( 0xAA == ((const U8*)s)[1] ) && ( 0x71 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
-    : ( 'f' == ((const U8*)s)[0] ) ?                                        \
-       ( ( 'f' == ((const U8*)s)[1] ) ?                                    \
-           ( ( 'i' == ((const U8*)s)[2] || 'l' == ((const U8*)s)[2] ) ? 3 : 2 )\
-       : ( 'i' == ((const U8*)s)[1] || 'l' == ((const U8*)s)[1] ) ? 2 : 0 )\
-    : ( 'h' == ((const U8*)s)[0] ) ?                                        \
+    : ( ( ((const U8*)s)[0] & 0xBF ) == 'f' ) ?                             \
+       ( ( ( ((const U8*)s)[1] & 0xBF ) == 'f' ) ?                         \
+           ( ( ( ( ((const U8*)s)[2] & 0xBF ) == 'i' ) || ( ( ((const U8*)s)[2] & 0xBF ) == 'l' ) ) ? 3 : 2 )\
+       : ( ( ( ((const U8*)s)[1] & 0xBF ) == 'i' ) || ( ( ((const U8*)s)[1] & 0xBF ) == 'l' ) ) ? 2 : 0 )\
+    : ( ( ((const U8*)s)[0] & 0xBF ) == 'h' ) ?                             \
        ( ( ( 0xAE == ((const U8*)s)[1] ) && ( 0x58 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
-    : ( 'i' == ((const U8*)s)[0] ) ?                                        \
+    : ( ( ((const U8*)s)[0] & 0xBF ) == 'i' ) ?                             \
        ( ( ( 0xAD == ((const U8*)s)[1] ) && ( 0x48 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
-    : ( 'j' == ((const U8*)s)[0] ) ?                                        \
+    : ( ( ((const U8*)s)[0] & 0xBF ) == 'j' ) ?                             \
        ( ( ( 0xAD == ((const U8*)s)[1] ) && ( 0x53 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
-    : ( 's' == ((const U8*)s)[0] ) ?                                        \
-       ( ( inRANGE(((const U8*)s)[1], 's', 't') ) ? 2 : 0 )                \
-    : ( 't' == ((const U8*)s)[0] ) ?                                        \
+    : ( ( ((const U8*)s)[0] & 0xBF ) == 's' ) ?                             \
+       ( ( ( ((const U8*)s)[1] & 0xBE ) == 's' ) ? 2 : 0 )                 \
+    : ( ( ((const U8*)s)[0] & 0xBF ) == 't' ) ?                             \
        ( ( ( 0xAD == ((const U8*)s)[1] ) && ( 0x49 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
-    : ( 'w' == ((const U8*)s)[0] || 'y' == ((const U8*)s)[0] ) ?            \
+    : ( ( ( ((const U8*)s)[0] & 0xBF ) == 'w' ) || ( ( ((const U8*)s)[0] & 0xBF ) == 'y' ) ) ?\
        ( ( ( 0xAD == ((const U8*)s)[1] ) && ( 0x51 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
-    : ( ( ( 0xAA == ((const U8*)s)[0] ) && ( 0x6A == ((const U8*)s)[1] ) ) && ( 'n' == ((const U8*)s)[2] ) ) ? 3 : 0 )\
+    : ( ( ( 0xAA == ((const U8*)s)[0] ) && ( 0x6A == ((const U8*)s)[1] ) ) && ( ( ((const U8*)s)[2] & 0xBF ) == 'n' ) ) ? 3 : 0 )\
 : ((e)-(s) > 1) ?                                                           \
-    ( ( 'f' == ((const U8*)s)[0] ) ?                                        \
-       ( ( 'f' == ((const U8*)s)[1] || 'i' == ((const U8*)s)[1] || 'l' == ((const U8*)s)[1] ) ? 2 : 0 )\
-    : ( ( 's' == ((const U8*)s)[0] ) && ( inRANGE(((const U8*)s)[1], 's', 't') ) ) ? 2 : 0 )\
+    ( ( ( ((const U8*)s)[0] & 0xBF ) == 'f' ) ?                             \
+       ( ( ( ( ((const U8*)s)[1] & 0xBF ) == 'f' ) || ( ( ((const U8*)s)[1] & 0xBF ) == 'i' ) || ( ( ((const U8*)s)[1] & 0xBF ) == 'l' ) ) ? 2 : 0 )\
+    : ( ( ( ((const U8*)s)[0] & 0xBF ) == 's' ) && ( ( ((const U8*)s)[1] & 0xBE ) == 's' ) ) ? 2 : 0 )\
 : 0 )
 
 
 /*** GENERATED CODE ***/
 #define is_MULTI_CHAR_FOLD_utf8_safe(s,e)                                   \
 ( ((e)-(s) > 5) ?                                                           \
-    ( ( 'a' == ((const U8*)s)[0] ) ?                                        \
+    ( ( ( ((const U8*)s)[0] & 0xBF ) == 'a' ) ?                             \
        ( ( ( 0xAA == ((const U8*)s)[1] ) && ( 0x71 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
-    : ( 'f' == ((const U8*)s)[0] ) ? is_MULTI_CHAR_FOLD_utf8_safe_part0(s,e) : is_MULTI_CHAR_FOLD_utf8_safe_part1(s,e) )\
+    : ( ( ((const U8*)s)[0] & 0xBF ) == 'f' ) ? is_MULTI_CHAR_FOLD_utf8_safe_part0(s,e) : is_MULTI_CHAR_FOLD_utf8_safe_part1(s,e) )\
 : ((e)-(s) > 4) ? is_MULTI_CHAR_FOLD_utf8_safe_part2(s,e) : is_MULTI_CHAR_FOLD_utf8_safe_part3(s,e) )
 
 /*
 /*** GENERATED CODE ***/
 #define is_THREE_CHAR_FOLD_utf8_safe(s,e)                                   \
 ( ((e)-(s) > 5) ?                                                           \
-    ( ( 'f' == ((const U8*)s)[0] ) ?                                        \
-       ( ( ( 'f' == ((const U8*)s)[1] ) && ( 'i' == ((const U8*)s)[2] || 'l' == ((const U8*)s)[2] ) ) ? 3 : 0 )\
+    ( ( ( ((const U8*)s)[0] & 0xBF ) == 'f' ) ?                             \
+       ( ( ( ( ((const U8*)s)[1] & 0xBF ) == 'f' ) && ( ( ( ((const U8*)s)[2] & 0xBF ) == 'i' ) || ( ( ((const U8*)s)[2] & 0xBF ) == 'l' ) ) ) ? 3 : 0 )\
     : ( 0xB3 == ((const U8*)s)[0] ) ?                                       \
        ( ( 0x58 == ((const U8*)s)[1] || 0x65 == ((const U8*)s)[1] ) ?      \
            ( ( ( ( ( 0xAF == ((const U8*)s)[2] ) && ( 0x43 == ((const U8*)s)[3] ) ) && ( 0xB3 == ((const U8*)s)[4] ) ) && ( 0x67 == ((const U8*)s)[5] ) ) ? 6 : 0 )\
                    : ( ( 0xAF == ((const U8*)s)[4] ) && ( 0x43 == ((const U8*)s)[5] ) ) ? 6 : 0 ) : 0 )\
        : ( ( ( ( ( 0x4A == ((const U8*)s)[1] ) && ( 0xAF == ((const U8*)s)[2] ) ) && ( 0x43 == ((const U8*)s)[3] ) ) && ( 0xB3 == ((const U8*)s)[4] ) ) && ( 0x67 == ((const U8*)s)[5] ) ) ? 6 : 0 )\
     : 0 )                                                                   \
-: ( ( ( ((e)-(s) > 2) && ( 'f' == ((const U8*)s)[0] ) ) && ( 'f' == ((const U8*)s)[1] ) ) && ( 'i' == ((const U8*)s)[2] || 'l' == ((const U8*)s)[2] ) ) ? 3 : 0 )
+: ( ( ( ((e)-(s) > 2) && ( ( ((const U8*)s)[0] & 0xBF ) == 'f' ) ) && ( ( ((const U8*)s)[1] & 0xBF ) == 'f' ) ) && ( ( ( ((const U8*)s)[2] & 0xBF ) == 'i' ) || ( ( ((const U8*)s)[2] & 0xBF ) == 'l' ) ) ) ? 3 : 0 )
 
 /*
        THREE_CHAR_FOLD: A three-character multi-char fold
 /*** GENERATED CODE ***/
 #define is_THREE_CHAR_FOLD_HEAD_utf8_safe(s,e)                              \
 ( ((e)-(s) > 3) ?                                                           \
-    ( ( ( ( ((const U8*)s)[0] & 0xEF ) == 'a' ) || ( ( ((const U8*)s)[0] & 0xFE ) == 'h' ) || ( ( ((const U8*)s)[0] & 0xFE ) == 's' ) || ((const U8*)s)[0] == 'w' || ((const U8*)s)[0] == 'y' ) ? 1\
-    : ( 'f' == ((const U8*)s)[0] ) ?                                        \
-       ( ( 'f' == ((const U8*)s)[1] ) ? 2 : 1 )                            \
+    ( ( ( ( ((const U8*)s)[0] & 0xAF ) == 'a' ) || ( ( ((const U8*)s)[0] & 0xBE ) == 'h' ) || ( ( ((const U8*)s)[0] & 0xBE ) == 's' ) || ( ( ((const U8*)s)[0] & 0xBF ) == 'w' ) || ( ( ((const U8*)s)[0] & 0xBF ) == 'y' ) ) ? 1\
+    : ( ( ((const U8*)s)[0] & 0xBF ) == 'f' ) ?                             \
+       ( ( ( ((const U8*)s)[1] & 0xBF ) == 'f' ) ? 2 : 1 )                 \
     : ( 0xAA == ((const U8*)s)[0] ) ?                                       \
        ( ( 0x6A == ((const U8*)s)[1] ) ? 2 : 0 )                           \
     : ( 0xB3 == ((const U8*)s)[0] ) ?                                       \
        : ( ( 0x69 == ((const U8*)s)[1] ) && ( inRANGE(((const U8*)s)[2], 0x41, 0x48) || 0x57 == ((const U8*)s)[2] || 0x62 == ((const U8*)s)[2] || 0x6A == ((const U8*)s)[2] ) ) ? 3 : 0 )\
     : 0 )                                                                   \
 : ((e)-(s) > 2) ?                                                           \
-    ( ( ( ( ((const U8*)s)[0] & 0xEF ) == 'a' ) || ( ( ((const U8*)s)[0] & 0xFE ) == 'h' ) || ( ( ((const U8*)s)[0] & 0xFE ) == 's' ) || ((const U8*)s)[0] == 'w' || ((const U8*)s)[0] == 'y' ) ? 1\
-    : ( 'f' == ((const U8*)s)[0] ) ?                                        \
-       ( ( 'f' == ((const U8*)s)[1] ) ? 2 : 1 )                            \
+    ( ( ( ( ((const U8*)s)[0] & 0xAF ) == 'a' ) || ( ( ((const U8*)s)[0] & 0xBE ) == 'h' ) || ( ( ((const U8*)s)[0] & 0xBE ) == 's' ) || ( ( ((const U8*)s)[0] & 0xBF ) == 'w' ) || ( ( ((const U8*)s)[0] & 0xBF ) == 'y' ) ) ? 1\
+    : ( ( ((const U8*)s)[0] & 0xBF ) == 'f' ) ?                             \
+       ( ( ( ((const U8*)s)[1] & 0xBF ) == 'f' ) ? 2 : 1 )                 \
     : ( 0xAA == ((const U8*)s)[0] ) ?                                       \
        ( ( 0x6A == ((const U8*)s)[1] ) ? 2 : 0 )                           \
     : ( 0xB3 == ((const U8*)s)[0] ) ?                                       \
        : ( ( 0x69 == ((const U8*)s)[1] ) && ( inRANGE(((const U8*)s)[2], 0x41, 0x48) || 0x57 == ((const U8*)s)[2] || 0x62 == ((const U8*)s)[2] || 0x6A == ((const U8*)s)[2] ) ) ? 3 : 0 )\
     : 0 )                                                                   \
 : ((e)-(s) > 1) ?                                                           \
-    ( ( ( ( ((const U8*)s)[0] & 0xEF ) == 'a' ) || ( ( ((const U8*)s)[0] & 0xFE ) == 'h' ) || ( ( ((const U8*)s)[0] & 0xFE ) == 's' ) || ((const U8*)s)[0] == 'w' || ((const U8*)s)[0] == 'y' ) ? 1\
-    : ( 'f' == ((const U8*)s)[0] ) ?                                        \
-       ( ( 'f' == ((const U8*)s)[1] ) ? 2 : 1 )                            \
+    ( ( ( ( ((const U8*)s)[0] & 0xAF ) == 'a' ) || ( ( ((const U8*)s)[0] & 0xBE ) == 'h' ) || ( ( ((const U8*)s)[0] & 0xBE ) == 's' ) || ( ( ((const U8*)s)[0] & 0xBF ) == 'w' ) || ( ( ((const U8*)s)[0] & 0xBF ) == 'y' ) ) ? 1\
+    : ( ( ((const U8*)s)[0] & 0xBF ) == 'f' ) ?                             \
+       ( ( ( ((const U8*)s)[1] & 0xBF ) == 'f' ) ? 2 : 1 )                 \
     : ( 0xAA == ((const U8*)s)[0] ) ?                                       \
        ( ( 0x6A == ((const U8*)s)[1] ) ? 2 : 0 )                           \
     : ( 0xB3 == ((const U8*)s)[0] ) ?                                       \
        ( ( ((const U8*)s)[1] == 0x53 || ((const U8*)s)[1] == 0x55 || ((const U8*)s)[1] == 0x58 || ( ( ((const U8*)s)[1] & 0xFD ) == 0x65 ) ) ? 2 : 0 )\
     : ( ( 0xB4 == ((const U8*)s)[0] ) && ( ( ( ((const U8*)s)[1] & 0xFB ) == 0x42 ) || ((const U8*)s)[1] == 0x4A || ((const U8*)s)[1] == 0x55 ) ) ? 2 : 0 )\
 : ((e)-(s) > 0) ?                                                           \
-    ( ( ( ((const U8*)s)[0] & 0xEF ) == 'a' ) || ( ( ((const U8*)s)[0] & 0xDF ) == 'f' ) || ( ( ((const U8*)s)[0] & 0xFE ) == 'h' ) || ( ( ((const U8*)s)[0] & 0xFE ) == 's' ) || ((const U8*)s)[0] == 'y' )\
+    ( ( ( ((const U8*)s)[0] & 0xAF ) == 'a' ) || ( ( ((const U8*)s)[0] & 0x9F ) == 'f' ) || ( ( ((const U8*)s)[0] & 0xBE ) == 'h' ) || ( ( ((const U8*)s)[0] & 0xBE ) == 's' ) || ( ( ((const U8*)s)[0] & 0xBF ) == 'y' ) )\
 : 0 )
 
 /*
  * 50b85a67451145545a65cea370dab8d3444fbfe07e9c34cef560c5b7da9d3eef lib/unicore/version
  * 2680b9254eb236c5c090f11b149605043e8c8433661b96efc4a42fb4709342a5 regen/charset_translations.pl
  * e44d836c4a344d535e81585842da1e85bbc24f2f67f4f3e7e3ec32b16262f856 regen/regcharclass.pl
- * b549b9989c6987563dad8f8ad6b984c8026cdc283d60ea34457959c5d4b4ade0 regen/regcharclass_multi_char_folds.pl
+ * 830295a68856e7c31bea527a47b780011700e9a362494bf34a000c3d81fc9694 regen/regcharclass_multi_char_folds.pl
  * ex: set ro: */
index 43f6b88..8b90579 100644 (file)
--- a/regcomp.c
+++ b/regcomp.c
@@ -2941,11 +2941,9 @@ S_make_trie(pTHX_ RExC_state_t *pRExC_state, regnode *startbranch,
                 /* See if *uc is the beginning of a multi-character fold.  If
                  * so, we decrement the length remaining to look at, to account
                  * for the current character this iteration.  (We can use 'uc'
-                 * instead of the fold returned by TRIE_READ_CHAR because for
-                 * non-UTF, the latin1_safe macro is smart enough to account
-                 * for all the unfolded characters, and because for UTF, the
-                 * string will already have been folded earlier in the
-                 * compilation process */
+                 * instead of the fold returned by TRIE_READ_CHAR because the
+                 * macro is smart enough to account for any unfolded
+                 * characters. */
                 if (UTF) {
                     if ((foldlen = is_MULTI_CHAR_FOLD_utf8_safe(uc, e))) {
                         foldlen -= UTF8SKIP(uc);
@@ -10725,12 +10723,8 @@ S_make_exactf_invlist(pTHX_ RExC_state_t *pRExC_state, regnode *node)
          * the folded string to be just past any possible multi-char
          * fold.
          *
-         * Unlike the non-UTF-8 case, the macro for determining if a
-         * string is a multi-char fold requires all the characters to
-         * already be folded.  This is because of all the complications
-         * if not.  Note that they are folded anyway, except in EXACTFL
-         * nodes.  Like the non-UTF case above, we punt if the node
-         * begins with a multi-char fold  */
+         * Like the non-UTF case above, we punt if the node begins with a
+         * multi-char fold  */
 
         if (is_MULTI_CHAR_FOLD_utf8_safe(s, e)) {
             invlist = _add_range_to_invlist(invlist, 0, UV_MAX);
index a54b05c..ce8e8fe 100644 (file)
@@ -111,27 +111,26 @@ sub multi_char_folds ($$) {
         # Skip if something else already has this fold
         next if grep { $_ eq $fold } @output_folds;
 
-        if ($type eq 'u') {
-            push @output_folds, $fold;
-        }   # Skip if wants only all-ascii folds, and there is a non-ascii
-        elsif (! grep { chr($_) =~ /[^[:ascii:]]/ } @folds) {
 
             # If the fold is to a cased letter, replace the entry with an
             # array which also includes its upper case.
             my $this_fold_ref = \@folds;
             for my $j (0 .. @$this_fold_ref - 1) {
                 my $this_ord = $this_fold_ref->[$j];
-                if (chr($this_ord) =~ /\p{Cased}/) {
+                undef $this_fold_ref->[$j];
+
+                if ($this_ord < 256 && chr($this_ord) =~ /\p{Cased}/) {
                     my $uc = ord(uc(chr($this_ord)));
-                    undef $this_fold_ref->[$j];
                     @{$this_fold_ref->[$j]} = ( $this_ord, $uc);
                 }
+                else {
+                    @{$this_fold_ref->[$j]} = ( $this_ord );
+                }
             }
 
             # Then generate all combinations of upper/lower case of the fold.
             push @output_folds, gen_combinations($this_fold_ref);
 
-        }
     }
 
     # \x17F is the small LONG S, which folds to 's'.  Both Capital and small