LCOV - code coverage report
Current view: top level - lib - pr29.c (source / functions) Hit Total Coverage
Test: GNU Libidn Lines: 35 35 100.0 %
Date: 2020-07-22 17:53:13 Functions: 6 6 100.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* pr29.h --- Detect strings that are non-idempotent under NFKC in Unicode 3.2.
       2             :    Copyright (C) 2004-2020 Simon Josefsson
       3             : 
       4             :    This file is part of GNU Libidn.
       5             : 
       6             :    GNU Libidn is free software: you can redistribute it and/or
       7             :    modify it under the terms of either:
       8             : 
       9             :      * the GNU Lesser General Public License as published by the Free
      10             :        Software Foundation; either version 3 of the License, or (at
      11             :        your option) any later version.
      12             : 
      13             :    or
      14             : 
      15             :      * the GNU General Public License as published by the Free
      16             :        Software Foundation; either version 2 of the License, or (at
      17             :        your option) any later version.
      18             : 
      19             :    or both in parallel, as here.
      20             : 
      21             :    GNU Libidn is distributed in the hope that it will be useful,
      22             :    but WITHOUT ANY WARRANTY; without even the implied warranty of
      23             :    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      24             :    General Public License for more details.
      25             : 
      26             :    You should have received copies of the GNU General Public License and
      27             :    the GNU Lesser General Public License along with this program.  If
      28             :    not, see <http://www.gnu.org/licenses/>. */
      29             : 
      30             : #include <config.h>
      31             : 
      32             : #include "pr29.h"
      33             : 
      34             : /* Get stringprep_utf8_to_ucs4. */
      35             : #include <stringprep.h>
      36             : 
      37             : /*
      38             :  * The tables used in this file was extracted by Simon Josefsson from
      39             :  * pr-29.html and DerivedCombiningClass-3.2.0.txt, as published by
      40             :  * Unicode Inc., for the GNU Libidn project.
      41             :  *
      42             :  */
      43             : 
      44             : /* These are the characters with non-zero combination class, extracted
      45             :    from DerivedCombiningClass-3.2.0.txt. */
      46             : static uint32_t nzcc[] = {
      47             :   /* 1 # Mn   [5] COMBINING TILDE OVERLAY..
      48             :    *                    ..COMBINING LONG SOLIDUS OVERLAY */
      49             :   0x0334,
      50             :   0x0335,
      51             :   0x0336,
      52             :   0x0337,
      53             :   0x0338,
      54             :   /* 1 # Mn   [2] COMBINING LONG VERTICAL LINE OVERLAY..
      55             :    *                    ..COMBINING SHORT VERTICAL LINE OVERLAY */
      56             :   0x20D2,
      57             :   0x20D3,
      58             :   /* 1 # Mn   [3] COMBINING RING OVERLAY..
      59             :    *                    ..COMBINING ANTICLOCKWISE RING OVERLAY */
      60             :   0x20D8,
      61             :   0x20D9,
      62             :   0x20DA,
      63             :   /* 1 # Mn   [2] COMBINING REVERSE SOLIDUS OVERLAY..
      64             :    *                    ..COMBINING DOUBLE VERTICAL STROKE OVERLAY */
      65             :   0x20E5,
      66             :   0x20E6,
      67             :   /* 1 # Mn       COMBINING LEFTWARDS ARROW OVERLAY */
      68             :   0x20EA,
      69             :   /* 1 # Mn   [3] MUSICAL SYMBOL COMBINING TREMOLO-1..
      70             :    *                    ..MUSICAL SYMBOL COMBINING TREMOLO-3 */
      71             :   0x1D167,
      72             :   0x1D168,
      73             :   0x1D169,
      74             :   /* 7 # Mn       DEVANAGARI SIGN NUKTA */
      75             :   0x093C,
      76             :   /* 7 # Mn       BENGALI SIGN NUKTA */
      77             :   0x09BC,
      78             :   /* 7 # Mn       GURMUKHI SIGN NUKTA */
      79             :   0x0A3C,
      80             :   /* 7 # Mn       GUJARATI SIGN NUKTA */
      81             :   0x0ABC,
      82             :   /* 7 # Mn       ORIYA SIGN NUKTA */
      83             :   0x0B3C,
      84             :   /* 7 # Mn       MYANMAR SIGN DOT BELOW */
      85             :   0x1037,
      86             :   /* 8 # Mn   [2] COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..
      87             :    *                    ..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK */
      88             :   0x3099,
      89             :   0x309A,
      90             :   /* 9 # Mn       DEVANAGARI SIGN VIRAMA */
      91             :   0x094D,
      92             :   /* 9 # Mn       BENGALI SIGN VIRAMA */
      93             :   0x09CD,
      94             :   /* 9 # Mn       GURMUKHI SIGN VIRAMA */
      95             :   0x0A4D,
      96             :   /* 9 # Mn       GUJARATI SIGN VIRAMA */
      97             :   0x0ACD,
      98             :   /* 9 # Mn       ORIYA SIGN VIRAMA */
      99             :   0x0B4D,
     100             :   /* 9 # Mn       TAMIL SIGN VIRAMA */
     101             :   0x0BCD,
     102             :   /* 9 # Mn       TELUGU SIGN VIRAMA */
     103             :   0x0C4D,
     104             :   /* 9 # Mn       KANNADA SIGN VIRAMA */
     105             :   0x0CCD,
     106             :   /* 9 # Mn       MALAYALAM SIGN VIRAMA */
     107             :   0x0D4D,
     108             :   /* 9 # Mn       SINHALA SIGN AL-LAKUNA */
     109             :   0x0DCA,
     110             :   /* 9 # Mn       THAI CHARACTER PHINTHU */
     111             :   0x0E3A,
     112             :   /* 9 # Mn       TIBETAN MARK HALANTA */
     113             :   0x0F84,
     114             :   /* 9 # Mn       MYANMAR SIGN VIRAMA */
     115             :   0x1039,
     116             :   /* 9 # Mn       TAGALOG SIGN VIRAMA */
     117             :   0x1714,
     118             :   /* 9 # Mn       HANUNOO SIGN PAMUDPOD */
     119             :   0x1734,
     120             :   /* 9 # Mn       KHMER SIGN COENG */
     121             :   0x17D2,
     122             :   /* 10 # Mn       HEBREW POINT SHEVA */
     123             :   0x05B0,
     124             :   /* 11 # Mn       HEBREW POINT HATAF SEGOL */
     125             :   0x05B1,
     126             :   /* 12 # Mn       HEBREW POINT HATAF PATAH */
     127             :   0x05B2,
     128             :   /* 13 # Mn       HEBREW POINT HATAF QAMATS */
     129             :   0x05B3,
     130             :   /* 14 # Mn       HEBREW POINT HIRIQ */
     131             :   0x05B4,
     132             :   /* 15 # Mn       HEBREW POINT TSERE */
     133             :   0x05B5,
     134             :   /* 16 # Mn       HEBREW POINT SEGOL */
     135             :   0x05B6,
     136             :   /* 17 # Mn       HEBREW POINT PATAH */
     137             :   0x05B7,
     138             :   /* 18 # Mn       HEBREW POINT QAMATS */
     139             :   0x05B8,
     140             :   /* 19 # Mn       HEBREW POINT HOLAM */
     141             :   0x05B9,
     142             :   /* 20 # Mn       HEBREW POINT QUBUTS */
     143             :   0x05BB,
     144             :   /* 21 # Mn       HEBREW POINT DAGESH OR MAPIQ */
     145             :   0x05BC,
     146             :   /* 22 # Mn       HEBREW POINT METEG */
     147             :   0x05BD,
     148             :   /* 23 # Mn       HEBREW POINT RAFE */
     149             :   0x05BF,
     150             :   /* 24 # Mn       HEBREW POINT SHIN DOT */
     151             :   0x05C1,
     152             :   /* 25 # Mn       HEBREW POINT SIN DOT */
     153             :   0x05C2,
     154             :   /* 26 # Mn       HEBREW POINT JUDEO-SPANISH VARIKA */
     155             :   0xFB1E,
     156             :   /* 27 # Mn       ARABIC FATHATAN */
     157             :   0x064B,
     158             :   /* 28 # Mn       ARABIC DAMMATAN */
     159             :   0x064C,
     160             :   /* 29 # Mn       ARABIC KASRATAN */
     161             :   0x064D,
     162             :   /* 30 # Mn       ARABIC FATHA */
     163             :   0x064E,
     164             :   /* 31 # Mn       ARABIC DAMMA */
     165             :   0x064F,
     166             :   /* 32 # Mn       ARABIC KASRA */
     167             :   0x0650,
     168             :   /* 33 # Mn       ARABIC SHADDA */
     169             :   0x0651,
     170             :   /* 34 # Mn       ARABIC SUKUN */
     171             :   0x0652,
     172             :   /* 35 # Mn       ARABIC LETTER SUPERSCRIPT ALEF */
     173             :   0x0670,
     174             :   /* 36 # Mn       SYRIAC LETTER SUPERSCRIPT ALAPH */
     175             :   0x0711,
     176             :   /* 84 # Mn       TELUGU LENGTH MARK */
     177             :   0x0C55,
     178             :   /* 91 # Mn       TELUGU AI LENGTH MARK */
     179             :   0x0C56,
     180             :   /* 103 # Mn   [2] THAI CHARACTER SARA U..
     181             :    *                    ..THAI CHARACTER SARA UU */
     182             :   0x0E38,
     183             :   0x0E39,
     184             :   /* 107 # Mn   [4] THAI CHARACTER MAI EK..
     185             :    *                    ..THAI CHARACTER MAI CHATTAWA */
     186             :   0x0E48,
     187             :   0x0E49,
     188             :   0x0E4A,
     189             :   0x04EB,
     190             :   /* 118 # Mn   [2] LAO VOWEL SIGN U..
     191             :    *                    ..LAO VOWEL SIGN UU */
     192             :   0x0EB8,
     193             :   0x0EB9,
     194             :   /* 122 # Mn   [4] LAO TONE MAI EK..
     195             :    *                    ..LAO TONE MAI CATAWA */
     196             :   0x0EC8,
     197             :   0x0EC9,
     198             :   0x0ECA,
     199             :   0x0ECB,
     200             :   /* 129 # Mn       TIBETAN VOWEL SIGN AA */
     201             :   0x0F71,
     202             :   /* 130 # Mn       TIBETAN VOWEL SIGN I */
     203             :   0x0F72,
     204             :   /* 130 # Mn   [4] TIBETAN VOWEL SIGN E..
     205             :    *                    ..TIBETAN VOWEL SIGN OO */
     206             :   0x0F7A,
     207             :   0x0F7B,
     208             :   0x0F7C,
     209             :   0x0F7D,
     210             :   /* 130 # Mn       TIBETAN VOWEL SIGN REVERSED I */
     211             :   0x0F80,
     212             :   /* 132 # Mn       TIBETAN VOWEL SIGN U */
     213             :   0x0F74,
     214             :   /* 202 # Mn   [2] COMBINING PALATALIZED HOOK BELOW..
     215             :    *                    ..COMBINING RETROFLEX HOOK BELOW */
     216             :   0x0321,
     217             :   0x0322,
     218             :   /* 202 # Mn   [2] COMBINING CEDILLA..
     219             :    *                    ..COMBINING OGONEK */
     220             :   0x0327,
     221             :   0x0328,
     222             :   /* 216 # Mn       COMBINING HORN */
     223             :   0x031B,
     224             :   /* 216 # Mn       TIBETAN MARK TSA -PHRU */
     225             :   0x0F39,
     226             :   /* 216 # Mc   [2] MUSICAL SYMBOL COMBINING STEM..
     227             :    *                    ..MUSICAL SYMBOL COMBINING SPRECHGESANG STEM */
     228             :   0x1D165,
     229             :   0x1D166,
     230             :   /* 216 # Mc   [5] MUSICAL SYMBOL COMBINING FLAG-1..
     231             :    *                    ..MUSICAL SYMBOL COMBINING FLAG-5 */
     232             :   0x1D16E,
     233             :   0x1D16F,
     234             :   0x1D170,
     235             :   0x1D171,
     236             :   0x1D172,
     237             :   /* 218 # Mn       IDEOGRAPHIC LEVEL TONE MARK */
     238             :   0x302A,
     239             :   /* 220 # Mn   [4] COMBINING GRAVE ACCENT BELOW..
     240             :    *                    ..COMBINING RIGHT TACK BELOW */
     241             :   0x0316,
     242             :   0x0317,
     243             :   0x0318,
     244             :   0x0319,
     245             :   /* 220 # Mn   [5] COMBINING LEFT HALF RING BELOW..
     246             :    *                    ..COMBINING MINUS SIGN BELOW */
     247             :   0x031C,
     248             :   0x031D,
     249             :   0x031E,
     250             :   0x031F,
     251             :   0x0320,
     252             :   /* 220 # Mn   [4] COMBINING DOT BELOW..
     253             :    *                    ..COMBINING COMMA BELOW */
     254             :   0x0323,
     255             :   0x0324,
     256             :   0x0325,
     257             :   0x0326,
     258             :   /* 220 # Mn  [11] COMBINING VERTICAL LINE BELOW..
     259             :    *                    ..COMBINING DOUBLE LOW LINE */
     260             :   0x0329,
     261             :   0x032A,
     262             :   0x032B,
     263             :   0x032C,
     264             :   0x032D,
     265             :   0x032E,
     266             :   0x032F,
     267             :   0x0330,
     268             :   0x0331,
     269             :   0x0332,
     270             :   0x0333,
     271             :   /* 220 # Mn   [4] COMBINING RIGHT HALF RING BELOW..
     272             :    *                    ..COMBINING SEAGULL BELOW */
     273             :   0x0339,
     274             :   0x033A,
     275             :   0x033B,
     276             :   0x033C,
     277             :   /* 220 # Mn   [3] COMBINING EQUALS SIGN BELOW..
     278             :    *                    ..COMBINING LEFT ANGLE BELOW */
     279             :   0x0347,
     280             :   0x0348,
     281             :   0x0349,
     282             :   /* 220 # Mn   [2] COMBINING LEFT RIGHT ARROW BELOW..
     283             :    *                    ..COMBINING UPWARDS ARROW BELOW */
     284             :   0x034D,
     285             :   0x034E,
     286             :   /* 220 # Mn       HEBREW ACCENT ETNAHTA */
     287             :   0x0591,
     288             :   /* 220 # Mn       HEBREW ACCENT TIPEHA */
     289             :   0x0596,
     290             :   /* 220 # Mn       HEBREW ACCENT TEVIR */
     291             :   0x059B,
     292             :   /* 220 # Mn   [5] HEBREW ACCENT MUNAH..
     293             :    *                    ..HEBREW ACCENT DARGA */
     294             :   0x05A3,
     295             :   0x05A4,
     296             :   0x05A5,
     297             :   0x05A6,
     298             :   0x05A7,
     299             :   /* 220 # Mn       HEBREW ACCENT YERAH BEN YOMO */
     300             :   0x05AA,
     301             :   /* 220 # Mn       ARABIC HAMZA BELOW */
     302             :   0x0655,
     303             :   /* 220 # Mn       ARABIC SMALL LOW SEEN */
     304             :   0x06E3,
     305             :   /* 220 # Mn       ARABIC EMPTY CENTRE LOW STOP */
     306             :   0x06EA,
     307             :   /* 220 # Mn       ARABIC SMALL LOW MEEM */
     308             :   0x06ED,
     309             :   /* 220 # Mn       SYRIAC PTHAHA BELOW */
     310             :   0x0731,
     311             :   /* 220 # Mn       SYRIAC ZQAPHA BELOW */
     312             :   0x0734,
     313             :   /* 220 # Mn   [3] SYRIAC RBASA BELOW..
     314             :    *                    ..SYRIAC DOTTED ZLAMA ANGULAR */
     315             :   0x0737,
     316             :   0x0738,
     317             :   0x0739,
     318             :   /* 220 # Mn   [2] SYRIAC HBASA BELOW..
     319             :    *                    ..SYRIAC HBASA-ESASA DOTTED */
     320             :   0x073B,
     321             :   0x073C,
     322             :   /* 220 # Mn       SYRIAC ESASA BELOW */
     323             :   0x073E,
     324             :   /* 220 # Mn       SYRIAC RUKKAKHA */
     325             :   0x0742,
     326             :   /* 220 # Mn       SYRIAC TWO VERTICAL DOTS BELOW */
     327             :   0x0744,
     328             :   /* 220 # Mn       SYRIAC THREE DOTS BELOW */
     329             :   0x0746,
     330             :   /* 220 # Mn       SYRIAC OBLIQUE LINE BELOW */
     331             :   0x0748,
     332             :   /* 220 # Mn       DEVANAGARI STRESS SIGN ANUDATTA */
     333             :   0x0952,
     334             :   /* 220 # Mn   [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..
     335             :    *                    ..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS */
     336             :   0x0F18,
     337             :   0x0F19,
     338             :   /* 220 # Mn       TIBETAN MARK NGAS BZUNG NYI ZLA */
     339             :   0x0F35,
     340             :   /* 220 # Mn       TIBETAN MARK NGAS BZUNG SGOR RTAGS */
     341             :   0x0F37,
     342             :   /* 220 # Mn       TIBETAN SYMBOL PADMA GDAN */
     343             :   0x0FC6,
     344             :   /* 220 # Mn       COMBINING TRIPLE UNDERDOT */
     345             :   0x20E8,
     346             :   /* 220 # Mn   [8] MUSICAL SYMBOL COMBINING ACCENT..
     347             :    *                    ..MUSICAL SYMBOL COMBINING LOURE */
     348             :   0x1D17B,
     349             :   0x1D17C,
     350             :   0x1D17D,
     351             :   0x1D17E,
     352             :   0x1D17F,
     353             :   0x1D180,
     354             :   0x1D181,
     355             :   0x1D182,
     356             :   /* 220 # Mn   [2] MUSICAL SYMBOL COMBINING DOUBLE TONGUE..
     357             :    *                    ..MUSICAL SYMBOL COMBINING TRIPLE TONGUE */
     358             :   0x1D18A,
     359             :   0x1D18B,
     360             :   /* 222 # Mn       HEBREW ACCENT YETIV */
     361             :   0x059A,
     362             :   /* 222 # Mn       HEBREW ACCENT DEHI */
     363             :   0x05AD,
     364             :   /* 222 # Mn       IDEOGRAPHIC ENTERING TONE MARK */
     365             :   0x302D,
     366             :   /* 224 # Mn   [2] HANGUL SINGLE DOT TONE MARK..
     367             :    *                    ..HANGUL DOUBLE DOT TONE MARK */
     368             :   0x302E,
     369             :   0x302F,
     370             :   /* 226 # Mc       MUSICAL SYMBOL COMBINING AUGMENTATION DOT */
     371             :   0x1D16D,
     372             :   /* 228 # Mn       HEBREW ACCENT ZINOR */
     373             :   0x05AE,
     374             :   /* 228 # Mn       MONGOLIAN LETTER ALI GALI DAGALGA */
     375             :   0x18A9,
     376             :   /* 228 # Mn       IDEOGRAPHIC RISING TONE MARK */
     377             :   0x302B,
     378             :   /* 230 # Mn  [21] COMBINING GRAVE ACCENT..
     379             :    *                    ..COMBINING REVERSED COMMA ABOVE */
     380             :   0x0300,
     381             :   0x0301,
     382             :   0x0302,
     383             :   0x0303,
     384             :   0x0304,
     385             :   0x0305,
     386             :   0x0306,
     387             :   0x0307,
     388             :   0x0308,
     389             :   0x0309,
     390             :   0x030A,
     391             :   0x030B,
     392             :   0x030C,
     393             :   0x030D,
     394             :   0x030E,
     395             :   0x030F,
     396             :   0x0310,
     397             :   0x0311,
     398             :   0x0312,
     399             :   0x0313,
     400             :   0x0314,
     401             :   /* 230 # Mn   [8] COMBINING X ABOVE..
     402             :    *                    ..COMBINING GREEK DIALYTIKA TONOS */
     403             :   0x033D,
     404             :   0x033E,
     405             :   0x033F,
     406             :   0x0340,
     407             :   0x0341,
     408             :   0x0342,
     409             :   0x0343,
     410             :   0x0344,
     411             :   /* 230 # Mn       COMBINING BRIDGE ABOVE */
     412             :   0x0346,
     413             :   /* 230 # Mn   [3] COMBINING NOT TILDE ABOVE..
     414             :    *                    ..COMBINING ALMOST EQUAL TO ABOVE */
     415             :   0x034A,
     416             :   0x034B,
     417             :   0x034C,
     418             :   /* 230 # Mn  [13] COMBINING LATIN SMALL LETTER A..
     419             :    *                    ..COMBINING LATIN SMALL LETTER X */
     420             :   0x0363,
     421             :   0x0364,
     422             :   0x0365,
     423             :   0x0366,
     424             :   0x0367,
     425             :   0x0368,
     426             :   0x0369,
     427             :   0x036A,
     428             :   0x036B,
     429             :   0x036C,
     430             :   0x036D,
     431             :   0x036E,
     432             :   0x036F,
     433             :   /* 230 # Mn   [4] COMBINING CYRILLIC TITLO..
     434             :    *                    ..COMBINING CYRILLIC PSILI PNEUMATA */
     435             :   0x0483,
     436             :   0x0484,
     437             :   0x0485,
     438             :   0x0486,
     439             :   /* 230 # Mn   [4] HEBREW ACCENT SEGOL..
     440             :    *                    ..HEBREW ACCENT ZAQEF GADOL */
     441             :   0x0592,
     442             :   0x0593,
     443             :   0x0594,
     444             :   0x0595,
     445             :   /* 230 # Mn   [3] HEBREW ACCENT REVIA..
     446             :    *                    ..HEBREW ACCENT PASHTA */
     447             :   0x0597,
     448             :   0x0598,
     449             :   0x0599,
     450             :   /* 230 # Mn   [6] HEBREW ACCENT GERESH..
     451             :    *                    ..HEBREW ACCENT PAZER */
     452             :   0x059C,
     453             :   0x059D,
     454             :   0x059E,
     455             :   0x059F,
     456             :   0x05A0,
     457             :   0x05A1,
     458             :   /* 230 # Mn   [2] HEBREW ACCENT QADMA..
     459             :    *                    ..HEBREW ACCENT TELISHA QETANA */
     460             :   0x05A8,
     461             :   0x05A9,
     462             :   /* 230 # Mn   [2] HEBREW ACCENT OLE..
     463             :    *                    ..HEBREW ACCENT ILUY */
     464             :   0x05AB,
     465             :   0x05AC,
     466             :   /* 230 # Mn       HEBREW MARK MASORA CIRCLE */
     467             :   0x05AF,
     468             :   /* 230 # Mn       HEBREW MARK UPPER DOT */
     469             :   0x05C4,
     470             :   /* 230 # Mn   [2] ARABIC MADDAH ABOVE..
     471             :    *                    ..ARABIC HAMZA ABOVE */
     472             :   0x0653,
     473             :   0x0654,
     474             :   /* 230 # Mn   [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..
     475             :    *                    ..ARABIC SMALL HIGH SEEN */
     476             :   0x06D6,
     477             :   0x06D7,
     478             :   0x06D8,
     479             :   0x06D9,
     480             :   0x06DA,
     481             :   0x06DB,
     482             :   0x06DC,
     483             :   /* 230 # Mn   [4] ARABIC SMALL HIGH ROUNDED ZERO..
     484             :    *                    ..ARABIC SMALL HIGH MEEM ISOLATED FORM */
     485             :   0x06DF,
     486             :   0x06E0,
     487             :   0x06E1,
     488             :   0x06E2,
     489             :   /* 230 # Mn       ARABIC SMALL HIGH MADDA */
     490             :   0x06E4,
     491             :   /* 230 # Mn   [2] ARABIC SMALL HIGH YEH..
     492             :    *                    ..ARABIC SMALL HIGH NOON */
     493             :   0x06E7,
     494             :   0x06E8,
     495             :   /* 230 # Mn   [2] ARABIC EMPTY CENTRE HIGH STOP..
     496             :    *                    ..ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE */
     497             :   0x06EB,
     498             :   0x06EC,
     499             :   /* 230 # Mn       SYRIAC PTHAHA ABOVE */
     500             :   0x0730,
     501             :   /* 230 # Mn   [2] SYRIAC PTHAHA DOTTED..
     502             :    *                    ..SYRIAC ZQAPHA ABOVE */
     503             :   0x0732,
     504             :   0x0733,
     505             :   /* 230 # Mn   [2] SYRIAC ZQAPHA DOTTED..
     506             :    *                    ..SYRIAC RBASA ABOVE */
     507             :   0x0735,
     508             :   0x0736,
     509             :   /* 230 # Mn       SYRIAC HBASA ABOVE */
     510             :   0x073A,
     511             :   /* 230 # Mn       SYRIAC ESASA ABOVE */
     512             :   0x073D,
     513             :   /* 230 # Mn   [3] SYRIAC RWAHA..
     514             :    *                    ..SYRIAC QUSHSHAYA */
     515             :   0x073F,
     516             :   0x0740,
     517             :   0x0741,
     518             :   /* 230 # Mn       SYRIAC TWO VERTICAL DOTS ABOVE */
     519             :   0x0743,
     520             :   /* 230 # Mn       SYRIAC THREE DOTS ABOVE */
     521             :   0x0745,
     522             :   /* 230 # Mn       SYRIAC OBLIQUE LINE ABOVE */
     523             :   0x0747,
     524             :   /* 230 # Mn   [2] SYRIAC MUSIC..
     525             :    *                    ..SYRIAC BARREKH */
     526             :   0x0749,
     527             :   0x074A,
     528             :   /* 230 # Mn       DEVANAGARI STRESS SIGN UDATTA */
     529             :   0x0951,
     530             :   /* 230 # Mn   [2] DEVANAGARI GRAVE ACCENT..
     531             :    *                    ..DEVANAGARI ACUTE ACCENT */
     532             :   0x0953,
     533             :   0x0954,
     534             :   /* 230 # Mn   [2] TIBETAN SIGN NYI ZLA NAA DA..
     535             :    *                    ..TIBETAN SIGN SNA LDAN */
     536             :   0x0F82,
     537             :   0x0F83,
     538             :   /* 230 # Mn   [2] TIBETAN SIGN LCI RTAGS..
     539             :    *                    ..TIBETAN SIGN YANG RTAGS */
     540             :   0x0F86,
     541             :   0x0F87,
     542             :   /* 230 # Mn   [2] COMBINING LEFT HARPOON ABOVE..
     543             :    *                    ..COMBINING RIGHT HARPOON ABOVE */
     544             :   0x20D0,
     545             :   0x20D1,
     546             :   /* 230 # Mn   [4] COMBINING ANTICLOCKWISE ARROW ABOVE..
     547             :    *                    ..COMBINING RIGHT ARROW ABOVE */
     548             :   0x20D4,
     549             :   0x20D5,
     550             :   0x20D6,
     551             :   0x20D7,
     552             :   /* 230 # Mn   [2] COMBINING THREE DOTS ABOVE..
     553             :    *                    ..COMBINING FOUR DOTS ABOVE */
     554             :   0x20DB,
     555             :   0x20DC,
     556             :   /* 230 # Mn       COMBINING LEFT RIGHT ARROW ABOVE */
     557             :   0x20E1,
     558             :   /* 230 # Mn       COMBINING ANNUITY SYMBOL */
     559             :   0x20E7,
     560             :   /* 230 # Mn       COMBINING WIDE BRIDGE ABOVE */
     561             :   0x20E9,
     562             :   /* 230 # Mn   [4] COMBINING LIGATURE LEFT HALF..
     563             :    *                    ..COMBINING DOUBLE TILDE RIGHT HALF */
     564             :   0xFE20,
     565             :   0xFE21,
     566             :   0xFE22,
     567             :   0xFE23,
     568             :   /* 230 # Mn   [5] MUSICAL SYMBOL COMBINING DOIT..
     569             :    *                    ..MUSICAL SYMBOL COMBINING BEND */
     570             :   0x1D185,
     571             :   0x1D186,
     572             :   0x1D187,
     573             :   0x1D188,
     574             :   0x1D189,
     575             :   /* 230 # Mn   [4] MUSICAL SYMBOL COMBINING DOWN BOW..
     576             :    *                    ..MUSICAL SYMBOL COMBINING SNAP PIZZICATO */
     577             :   0x1D1AA,
     578             :   0x1D1AB,
     579             :   0x1D1AC,
     580             :   0x1D1AD,
     581             :   /* 232 # Mn       COMBINING COMMA ABOVE RIGHT */
     582             :   0x0315,
     583             :   /* 232 # Mn       COMBINING LEFT ANGLE ABOVE */
     584             :   0x031A,
     585             :   /* 232 # Mn       IDEOGRAPHIC DEPARTING TONE MARK */
     586             :   0x302C,
     587             :   /* 233 # Mn       COMBINING DOUBLE RIGHTWARDS ARROW BELOW */
     588             :   0x0362,
     589             :   /* 234 # Mn   [2] COMBINING DOUBLE TILDE..
     590             :    *                    ..COMBINING DOUBLE INVERTED BREVE */
     591             :   0x0360,
     592             :   0x0361,
     593             :   /* 240 # Mn       COMBINING GREEK YPOGEGRAMMENI */
     594             :   0x0345,
     595             :   0
     596             : };
     597             : 
     598             : /*
     599             :  * 09C7 BENGALI VOWEL SIGN E    09BE BENGALI VOWEL SIGN AA or
     600             :  *                              09D7 BENGALI AU LENGTH MARK
     601             :  */
     602             : 
     603             : static const uint32_t pr29_1_1[] = {
     604             :   0x09C7, 0
     605             : };
     606             : 
     607             : static const uint32_t pr29_1_2[] = {
     608             :   0x09BE, 0x09D7, 0
     609             : };
     610             : 
     611             : /*
     612             :  * 0B47 ORIYA VOWEL SIGN E      0B3E ORIYA VOWEL SIGN AA or
     613             :  *                              0B56 ORIYA AI LENGTH MARK or
     614             :  *                              0B57 ORIYA AU LENGTH MARK
     615             :  */
     616             : 
     617             : static const uint32_t pr29_2_1[] = {
     618             :   0x0B47, 0
     619             : };
     620             : 
     621             : static const uint32_t pr29_2_2[] = {
     622             :   0x0B3E, 0x0B56, 0x0B57, 0
     623             : };
     624             : 
     625             : /*
     626             :  * 0BC6 TAMIL VOWEL SIGN E      0BBE TAMIL VOWEL SIGN AA or
     627             :  *                              0BD7 TAMIL AU LENGTH MARK
     628             :  */
     629             : 
     630             : static const uint32_t pr29_3_1[] = {
     631             :   0x0BC6, 0
     632             : };
     633             : 
     634             : static const uint32_t pr29_3_2[] = {
     635             :   0x0BBE, 0x0BD7, 0
     636             : };
     637             : 
     638             : /*
     639             :  * 0BC7 TAMIL VOWEL SIGN EE     0BBE TAMIL VOWEL SIGN AA
     640             :  */
     641             : 
     642             : static const uint32_t pr29_4_1[] = {
     643             :   0x0BC7, 0
     644             : };
     645             : 
     646             : static const uint32_t pr29_4_2[] = {
     647             :   0x0BBE, 0
     648             : };
     649             : 
     650             : /*
     651             :  * 0B92 TAMIL LETTER O          0BD7 TAMIL AU LENGTH MARK
     652             :  */
     653             : 
     654             : static const uint32_t pr29_5_1[] = {
     655             :   0x0B92, 0
     656             : };
     657             : 
     658             : static const uint32_t pr29_5_2[] = {
     659             :   0x0BD7, 0
     660             : };
     661             : 
     662             : /*
     663             :  * 0CC6 KANNADA VOWEL SIGN E    0CC2 KANNADA VOWEL SIGN UU or
     664             :  *                              0CD5 KANNADA LENGTH MARK or
     665             :  *                              0CD6 KANNADA AI LENGTH MARK
     666             :  */
     667             : 
     668             : static const uint32_t pr29_6_1[] = {
     669             :   0x0CC6, 0
     670             : };
     671             : 
     672             : static const uint32_t pr29_6_2[] = {
     673             :   0x0CC2, 0xCD5, 0xCD6, 0
     674             : };
     675             : 
     676             : /*
     677             :  * 0CBF KANNADA VOWEL SIGN I or
     678             :  * 0CCA KANNADA VOWEL SIGN O    0CD5 KANNADA LENGTH MARK
     679             :  */
     680             : 
     681             : static const uint32_t pr29_7_1[] = {
     682             :   0x0CBF, 0xCCA, 0
     683             : };
     684             : 
     685             : static const uint32_t pr29_7_2[] = {
     686             :   0x0CD5, 0
     687             : };
     688             : 
     689             : /*
     690             :  * 0D47 MALAYALAM VOWEL SIGN EE         0D3E MALAYALAM VOWEL SIGN AA
     691             :  */
     692             : 
     693             : static const uint32_t pr29_8_1[] = {
     694             :   0x0D47, 0
     695             : };
     696             : 
     697             : static const uint32_t pr29_8_2[] = {
     698             :   0x0D3E, 0
     699             : };
     700             : 
     701             : /*
     702             :  * 0D46 MALAYALAM VOWEL SIGN E          0D3E MALAYALAM VOWEL SIGN AA or
     703             :  *                                      0D57 MALAYALAM AU LENGTH MARK
     704             :  */
     705             : 
     706             : static const uint32_t pr29_9_1[] = {
     707             :   0x0D46, 0
     708             : };
     709             : 
     710             : static const uint32_t pr29_9_2[] = {
     711             :   0x0D3E, 0x0D57, 0
     712             : };
     713             : 
     714             : /*
     715             :  * 1025 MYANMAR LETTER U                102E MYANMAR VOWEL SIGN II
     716             :  */
     717             : 
     718             : static const uint32_t pr29_10_1[] = {
     719             :   0x1025, 0
     720             : };
     721             : 
     722             : static const uint32_t pr29_10_2[] = {
     723             :   0x102E, 0
     724             : };
     725             : 
     726             : /*
     727             :  * 0DD9 SINHALA VOWEL SIGN KOMBUVA      0DCF SINHALA VOWEL SIGN AELA-PILLA or
     728             :  *                                      0DDF SINHALA VOWEL SIGN GAYANUKITTA
     729             :  */
     730             : 
     731             : static const uint32_t pr29_11_1[] = {
     732             :   0x0DD9, 0
     733             : };
     734             : 
     735             : static const uint32_t pr29_11_2[] = {
     736             :   0x0DCF, 0x0DDF, 0
     737             : };
     738             : 
     739             : /*
     740             :  * 1100..1112 HANGUL CHOSEONG KIYEOK..HIEUH [19 instances]
     741             :  *                              1161..1175 HANGUL JUNGSEONG A..I [21 instances]
     742             :  */
     743             : 
     744             : static const uint32_t pr29_12_1[] = {
     745             :   0x1100, 0x1101, 0x1102, 0x1103, 0x1104, 0x1105, 0x1106, 0x1107,
     746             :   0x1108, 0x1109, 0x110A, 0x110B, 0x110C, 0x110D, 0x110E, 0x110F,
     747             :   0x1110, 0x1111, 0x1112, 0
     748             : };
     749             : 
     750             : static const uint32_t pr29_12_2[] = {
     751             :   0x1161, 0x1162, 0x1163, 0x1164, 0x1165, 0x1166, 0x1167, 0x1168,
     752             :   0x1169, 0x116A, 0x116B, 0x116C, 0x116D, 0x116E, 0x116F, 0x1170,
     753             :   0x1171, 0x1172, 0x1173, 0x1174, 0x1175, 0
     754             : };
     755             : 
     756             : 
     757             : /*
     758             :  * [:HangulSyllableType=LV:]
     759             :  *                     11A8..11C2 HANGUL JONGSEONG KIYEOK..HIEUH [27 instances]
     760             :  */
     761             : 
     762             : static const uint32_t pr29_13_1[] = {
     763             :   0xAC00,                       /* LV # Lo       HANGUL SYLLABLE GA     */
     764             :   0xAC1C,                       /* LV # Lo       HANGUL SYLLABLE GAE    */
     765             :   0xAC38,                       /* LV # Lo       HANGUL SYLLABLE GYA    */
     766             :   0xAC54,                       /* LV # Lo       HANGUL SYLLABLE GYAE   */
     767             :   0xAC70,                       /* LV # Lo       HANGUL SYLLABLE GEO    */
     768             :   0xAC8C,                       /* LV # Lo       HANGUL SYLLABLE GE     */
     769             :   0xACA8,                       /* LV # Lo       HANGUL SYLLABLE GYEO   */
     770             :   0xACC4,                       /* LV # Lo       HANGUL SYLLABLE GYE    */
     771             :   0xACE0,                       /* LV # Lo       HANGUL SYLLABLE GO     */
     772             :   0xACFC,                       /* LV # Lo       HANGUL SYLLABLE GWA    */
     773             :   0xAD18,                       /* LV # Lo       HANGUL SYLLABLE GWAE   */
     774             :   0xAD34,                       /* LV # Lo       HANGUL SYLLABLE GOE    */
     775             :   0xAD50,                       /* LV # Lo       HANGUL SYLLABLE GYO    */
     776             :   0xAD6C,                       /* LV # Lo       HANGUL SYLLABLE GU     */
     777             :   0xAD88,                       /* LV # Lo       HANGUL SYLLABLE GWEO   */
     778             :   0xADA4,                       /* LV # Lo       HANGUL SYLLABLE GWE    */
     779             :   0xADC0,                       /* LV # Lo       HANGUL SYLLABLE GWI    */
     780             :   0xADDC,                       /* LV # Lo       HANGUL SYLLABLE GYU    */
     781             :   0xADF8,                       /* LV # Lo       HANGUL SYLLABLE GEU    */
     782             :   0xAE14,                       /* LV # Lo       HANGUL SYLLABLE GYI    */
     783             :   0xAE30,                       /* LV # Lo       HANGUL SYLLABLE GI     */
     784             :   0xAE4C,                       /* LV # Lo       HANGUL SYLLABLE GGA    */
     785             :   0xAE68,                       /* LV # Lo       HANGUL SYLLABLE GGAE   */
     786             :   0xAE84,                       /* LV # Lo       HANGUL SYLLABLE GGYA   */
     787             :   0xAEA0,                       /* LV # Lo       HANGUL SYLLABLE GGYAE  */
     788             :   0xAEBC,                       /* LV # Lo       HANGUL SYLLABLE GGEO   */
     789             :   0xAED8,                       /* LV # Lo       HANGUL SYLLABLE GGE    */
     790             :   0xAEF4,                       /* LV # Lo       HANGUL SYLLABLE GGYEO  */
     791             :   0xAF10,                       /* LV # Lo       HANGUL SYLLABLE GGYE   */
     792             :   0xAF2C,                       /* LV # Lo       HANGUL SYLLABLE GGO    */
     793             :   0xAF48,                       /* LV # Lo       HANGUL SYLLABLE GGWA   */
     794             :   0xAF64,                       /* LV # Lo       HANGUL SYLLABLE GGWAE  */
     795             :   0xAF80,                       /* LV # Lo       HANGUL SYLLABLE GGOE   */
     796             :   0xAF9C,                       /* LV # Lo       HANGUL SYLLABLE GGYO   */
     797             :   0xAFB8,                       /* LV # Lo       HANGUL SYLLABLE GGU    */
     798             :   0xAFD4,                       /* LV # Lo       HANGUL SYLLABLE GGWEO  */
     799             :   0xAFF0,                       /* LV # Lo       HANGUL SYLLABLE GGWE   */
     800             :   0xB00C,                       /* LV # Lo       HANGUL SYLLABLE GGWI   */
     801             :   0xB028,                       /* LV # Lo       HANGUL SYLLABLE GGYU   */
     802             :   0xB044,                       /* LV # Lo       HANGUL SYLLABLE GGEU   */
     803             :   0xB060,                       /* LV # Lo       HANGUL SYLLABLE GGYI   */
     804             :   0xB07C,                       /* LV # Lo       HANGUL SYLLABLE GGI    */
     805             :   0xB098,                       /* LV # Lo       HANGUL SYLLABLE NA     */
     806             :   0xB0B4,                       /* LV # Lo       HANGUL SYLLABLE NAE    */
     807             :   0xB0D0,                       /* LV # Lo       HANGUL SYLLABLE NYA    */
     808             :   0xB0EC,                       /* LV # Lo       HANGUL SYLLABLE NYAE   */
     809             :   0xB108,                       /* LV # Lo       HANGUL SYLLABLE NEO    */
     810             :   0xB124,                       /* LV # Lo       HANGUL SYLLABLE NE     */
     811             :   0xB140,                       /* LV # Lo       HANGUL SYLLABLE NYEO   */
     812             :   0xB15C,                       /* LV # Lo       HANGUL SYLLABLE NYE    */
     813             :   0xB178,                       /* LV # Lo       HANGUL SYLLABLE NO     */
     814             :   0xB194,                       /* LV # Lo       HANGUL SYLLABLE NWA    */
     815             :   0xB1B0,                       /* LV # Lo       HANGUL SYLLABLE NWAE   */
     816             :   0xB1CC,                       /* LV # Lo       HANGUL SYLLABLE NOE    */
     817             :   0xB1E8,                       /* LV # Lo       HANGUL SYLLABLE NYO    */
     818             :   0xB204,                       /* LV # Lo       HANGUL SYLLABLE NU     */
     819             :   0xB220,                       /* LV # Lo       HANGUL SYLLABLE NWEO   */
     820             :   0xB23C,                       /* LV # Lo       HANGUL SYLLABLE NWE    */
     821             :   0xB258,                       /* LV # Lo       HANGUL SYLLABLE NWI    */
     822             :   0xB274,                       /* LV # Lo       HANGUL SYLLABLE NYU    */
     823             :   0xB290,                       /* LV # Lo       HANGUL SYLLABLE NEU    */
     824             :   0xB2AC,                       /* LV # Lo       HANGUL SYLLABLE NYI    */
     825             :   0xB2C8,                       /* LV # Lo       HANGUL SYLLABLE NI     */
     826             :   0xB2E4,                       /* LV # Lo       HANGUL SYLLABLE DA     */
     827             :   0xB300,                       /* LV # Lo       HANGUL SYLLABLE DAE    */
     828             :   0xB31C,                       /* LV # Lo       HANGUL SYLLABLE DYA    */
     829             :   0xB338,                       /* LV # Lo       HANGUL SYLLABLE DYAE   */
     830             :   0xB354,                       /* LV # Lo       HANGUL SYLLABLE DEO    */
     831             :   0xB370,                       /* LV # Lo       HANGUL SYLLABLE DE     */
     832             :   0xB38C,                       /* LV # Lo       HANGUL SYLLABLE DYEO   */
     833             :   0xB3A8,                       /* LV # Lo       HANGUL SYLLABLE DYE    */
     834             :   0xB3C4,                       /* LV # Lo       HANGUL SYLLABLE DO     */
     835             :   0xB3E0,                       /* LV # Lo       HANGUL SYLLABLE DWA    */
     836             :   0xB3FC,                       /* LV # Lo       HANGUL SYLLABLE DWAE   */
     837             :   0xB418,                       /* LV # Lo       HANGUL SYLLABLE DOE    */
     838             :   0xB434,                       /* LV # Lo       HANGUL SYLLABLE DYO    */
     839             :   0xB450,                       /* LV # Lo       HANGUL SYLLABLE DU     */
     840             :   0xB46C,                       /* LV # Lo       HANGUL SYLLABLE DWEO   */
     841             :   0xB488,                       /* LV # Lo       HANGUL SYLLABLE DWE    */
     842             :   0xB4A4,                       /* LV # Lo       HANGUL SYLLABLE DWI    */
     843             :   0xB4C0,                       /* LV # Lo       HANGUL SYLLABLE DYU    */
     844             :   0xB4DC,                       /* LV # Lo       HANGUL SYLLABLE DEU    */
     845             :   0xB4F8,                       /* LV # Lo       HANGUL SYLLABLE DYI    */
     846             :   0xB514,                       /* LV # Lo       HANGUL SYLLABLE DI     */
     847             :   0xB530,                       /* LV # Lo       HANGUL SYLLABLE DDA    */
     848             :   0xB54C,                       /* LV # Lo       HANGUL SYLLABLE DDAE   */
     849             :   0xB568,                       /* LV # Lo       HANGUL SYLLABLE DDYA   */
     850             :   0xB584,                       /* LV # Lo       HANGUL SYLLABLE DDYAE  */
     851             :   0xB5A0,                       /* LV # Lo       HANGUL SYLLABLE DDEO   */
     852             :   0xB5BC,                       /* LV # Lo       HANGUL SYLLABLE DDE    */
     853             :   0xB5D8,                       /* LV # Lo       HANGUL SYLLABLE DDYEO  */
     854             :   0xB5F4,                       /* LV # Lo       HANGUL SYLLABLE DDYE   */
     855             :   0xB610,                       /* LV # Lo       HANGUL SYLLABLE DDO    */
     856             :   0xB62C,                       /* LV # Lo       HANGUL SYLLABLE DDWA   */
     857             :   0xB648,                       /* LV # Lo       HANGUL SYLLABLE DDWAE  */
     858             :   0xB664,                       /* LV # Lo       HANGUL SYLLABLE DDOE   */
     859             :   0xB680,                       /* LV # Lo       HANGUL SYLLABLE DDYO   */
     860             :   0xB69C,                       /* LV # Lo       HANGUL SYLLABLE DDU    */
     861             :   0xB6B8,                       /* LV # Lo       HANGUL SYLLABLE DDWEO  */
     862             :   0xB6D4,                       /* LV # Lo       HANGUL SYLLABLE DDWE   */
     863             :   0xB6F0,                       /* LV # Lo       HANGUL SYLLABLE DDWI   */
     864             :   0xB70C,                       /* LV # Lo       HANGUL SYLLABLE DDYU   */
     865             :   0xB728,                       /* LV # Lo       HANGUL SYLLABLE DDEU   */
     866             :   0xB744,                       /* LV # Lo       HANGUL SYLLABLE DDYI   */
     867             :   0xB760,                       /* LV # Lo       HANGUL SYLLABLE DDI    */
     868             :   0xB77C,                       /* LV # Lo       HANGUL SYLLABLE RA     */
     869             :   0xB798,                       /* LV # Lo       HANGUL SYLLABLE RAE    */
     870             :   0xB7B4,                       /* LV # Lo       HANGUL SYLLABLE RYA    */
     871             :   0xB7D0,                       /* LV # Lo       HANGUL SYLLABLE RYAE   */
     872             :   0xB7EC,                       /* LV # Lo       HANGUL SYLLABLE REO    */
     873             :   0xB808,                       /* LV # Lo       HANGUL SYLLABLE RE     */
     874             :   0xB824,                       /* LV # Lo       HANGUL SYLLABLE RYEO   */
     875             :   0xB840,                       /* LV # Lo       HANGUL SYLLABLE RYE    */
     876             :   0xB85C,                       /* LV # Lo       HANGUL SYLLABLE RO     */
     877             :   0xB878,                       /* LV # Lo       HANGUL SYLLABLE RWA    */
     878             :   0xB894,                       /* LV # Lo       HANGUL SYLLABLE RWAE   */
     879             :   0xB8B0,                       /* LV # Lo       HANGUL SYLLABLE ROE    */
     880             :   0xB8CC,                       /* LV # Lo       HANGUL SYLLABLE RYO    */
     881             :   0xB8E8,                       /* LV # Lo       HANGUL SYLLABLE RU     */
     882             :   0xB904,                       /* LV # Lo       HANGUL SYLLABLE RWEO   */
     883             :   0xB920,                       /* LV # Lo       HANGUL SYLLABLE RWE    */
     884             :   0xB93C,                       /* LV # Lo       HANGUL SYLLABLE RWI    */
     885             :   0xB958,                       /* LV # Lo       HANGUL SYLLABLE RYU    */
     886             :   0xB974,                       /* LV # Lo       HANGUL SYLLABLE REU    */
     887             :   0xB990,                       /* LV # Lo       HANGUL SYLLABLE RYI    */
     888             :   0xB9AC,                       /* LV # Lo       HANGUL SYLLABLE RI     */
     889             :   0xB9C8,                       /* LV # Lo       HANGUL SYLLABLE MA     */
     890             :   0xB9E4,                       /* LV # Lo       HANGUL SYLLABLE MAE    */
     891             :   0xBA00,                       /* LV # Lo       HANGUL SYLLABLE MYA    */
     892             :   0xBA1C,                       /* LV # Lo       HANGUL SYLLABLE MYAE   */
     893             :   0xBA38,                       /* LV # Lo       HANGUL SYLLABLE MEO    */
     894             :   0xBA54,                       /* LV # Lo       HANGUL SYLLABLE ME     */
     895             :   0xBA70,                       /* LV # Lo       HANGUL SYLLABLE MYEO   */
     896             :   0xBA8C,                       /* LV # Lo       HANGUL SYLLABLE MYE    */
     897             :   0xBAA8,                       /* LV # Lo       HANGUL SYLLABLE MO     */
     898             :   0xBAC4,                       /* LV # Lo       HANGUL SYLLABLE MWA    */
     899             :   0xBAE0,                       /* LV # Lo       HANGUL SYLLABLE MWAE   */
     900             :   0xBAFC,                       /* LV # Lo       HANGUL SYLLABLE MOE    */
     901             :   0xBB18,                       /* LV # Lo       HANGUL SYLLABLE MYO    */
     902             :   0xBB34,                       /* LV # Lo       HANGUL SYLLABLE MU     */
     903             :   0xBB50,                       /* LV # Lo       HANGUL SYLLABLE MWEO   */
     904             :   0xBB6C,                       /* LV # Lo       HANGUL SYLLABLE MWE    */
     905             :   0xBB88,                       /* LV # Lo       HANGUL SYLLABLE MWI    */
     906             :   0xBBA4,                       /* LV # Lo       HANGUL SYLLABLE MYU    */
     907             :   0xBBC0,                       /* LV # Lo       HANGUL SYLLABLE MEU    */
     908             :   0xBBDC,                       /* LV # Lo       HANGUL SYLLABLE MYI    */
     909             :   0xBBF8,                       /* LV # Lo       HANGUL SYLLABLE MI     */
     910             :   0xBC14,                       /* LV # Lo       HANGUL SYLLABLE BA     */
     911             :   0xBC30,                       /* LV # Lo       HANGUL SYLLABLE BAE    */
     912             :   0xBC4C,                       /* LV # Lo       HANGUL SYLLABLE BYA    */
     913             :   0xBC68,                       /* LV # Lo       HANGUL SYLLABLE BYAE   */
     914             :   0xBC84,                       /* LV # Lo       HANGUL SYLLABLE BEO    */
     915             :   0xBCA0,                       /* LV # Lo       HANGUL SYLLABLE BE     */
     916             :   0xBCBC,                       /* LV # Lo       HANGUL SYLLABLE BYEO   */
     917             :   0xBCD8,                       /* LV # Lo       HANGUL SYLLABLE BYE    */
     918             :   0xBCF4,                       /* LV # Lo       HANGUL SYLLABLE BO     */
     919             :   0xBD10,                       /* LV # Lo       HANGUL SYLLABLE BWA    */
     920             :   0xBD2C,                       /* LV # Lo       HANGUL SYLLABLE BWAE   */
     921             :   0xBD48,                       /* LV # Lo       HANGUL SYLLABLE BOE    */
     922             :   0xBD64,                       /* LV # Lo       HANGUL SYLLABLE BYO    */
     923             :   0xBD80,                       /* LV # Lo       HANGUL SYLLABLE BU     */
     924             :   0xBD9C,                       /* LV # Lo       HANGUL SYLLABLE BWEO   */
     925             :   0xBDB8,                       /* LV # Lo       HANGUL SYLLABLE BWE    */
     926             :   0xBDD4,                       /* LV # Lo       HANGUL SYLLABLE BWI    */
     927             :   0xBDF0,                       /* LV # Lo       HANGUL SYLLABLE BYU    */
     928             :   0xBE0C,                       /* LV # Lo       HANGUL SYLLABLE BEU    */
     929             :   0xBE28,                       /* LV # Lo       HANGUL SYLLABLE BYI    */
     930             :   0xBE44,                       /* LV # Lo       HANGUL SYLLABLE BI     */
     931             :   0xBE60,                       /* LV # Lo       HANGUL SYLLABLE BBA    */
     932             :   0xBE7C,                       /* LV # Lo       HANGUL SYLLABLE BBAE   */
     933             :   0xBE98,                       /* LV # Lo       HANGUL SYLLABLE BBYA   */
     934             :   0xBEB4,                       /* LV # Lo       HANGUL SYLLABLE BBYAE  */
     935             :   0xBED0,                       /* LV # Lo       HANGUL SYLLABLE BBEO   */
     936             :   0xBEEC,                       /* LV # Lo       HANGUL SYLLABLE BBE    */
     937             :   0xBF08,                       /* LV # Lo       HANGUL SYLLABLE BBYEO  */
     938             :   0xBF24,                       /* LV # Lo       HANGUL SYLLABLE BBYE   */
     939             :   0xBF40,                       /* LV # Lo       HANGUL SYLLABLE BBO    */
     940             :   0xBF5C,                       /* LV # Lo       HANGUL SYLLABLE BBWA   */
     941             :   0xBF78,                       /* LV # Lo       HANGUL SYLLABLE BBWAE  */
     942             :   0xBF94,                       /* LV # Lo       HANGUL SYLLABLE BBOE   */
     943             :   0xBFB0,                       /* LV # Lo       HANGUL SYLLABLE BBYO   */
     944             :   0xBFCC,                       /* LV # Lo       HANGUL SYLLABLE BBU    */
     945             :   0xBFE8,                       /* LV # Lo       HANGUL SYLLABLE BBWEO  */
     946             :   0xC004,                       /* LV # Lo       HANGUL SYLLABLE BBWE   */
     947             :   0xC020,                       /* LV # Lo       HANGUL SYLLABLE BBWI   */
     948             :   0xC03C,                       /* LV # Lo       HANGUL SYLLABLE BBYU   */
     949             :   0xC058,                       /* LV # Lo       HANGUL SYLLABLE BBEU   */
     950             :   0xC074,                       /* LV # Lo       HANGUL SYLLABLE BBYI   */
     951             :   0xC090,                       /* LV # Lo       HANGUL SYLLABLE BBI    */
     952             :   0xC0AC,                       /* LV # Lo       HANGUL SYLLABLE SA     */
     953             :   0xC0C8,                       /* LV # Lo       HANGUL SYLLABLE SAE    */
     954             :   0xC0E4,                       /* LV # Lo       HANGUL SYLLABLE SYA    */
     955             :   0xC100,                       /* LV # Lo       HANGUL SYLLABLE SYAE   */
     956             :   0xC11C,                       /* LV # Lo       HANGUL SYLLABLE SEO    */
     957             :   0xC138,                       /* LV # Lo       HANGUL SYLLABLE SE     */
     958             :   0xC154,                       /* LV # Lo       HANGUL SYLLABLE SYEO   */
     959             :   0xC170,                       /* LV # Lo       HANGUL SYLLABLE SYE    */
     960             :   0xC18C,                       /* LV # Lo       HANGUL SYLLABLE SO     */
     961             :   0xC1A8,                       /* LV # Lo       HANGUL SYLLABLE SWA    */
     962             :   0xC1C4,                       /* LV # Lo       HANGUL SYLLABLE SWAE   */
     963             :   0xC1E0,                       /* LV # Lo       HANGUL SYLLABLE SOE    */
     964             :   0xC1FC,                       /* LV # Lo       HANGUL SYLLABLE SYO    */
     965             :   0xC218,                       /* LV # Lo       HANGUL SYLLABLE SU     */
     966             :   0xC234,                       /* LV # Lo       HANGUL SYLLABLE SWEO   */
     967             :   0xC250,                       /* LV # Lo       HANGUL SYLLABLE SWE    */
     968             :   0xC26C,                       /* LV # Lo       HANGUL SYLLABLE SWI    */
     969             :   0xC288,                       /* LV # Lo       HANGUL SYLLABLE SYU    */
     970             :   0xC2A4,                       /* LV # Lo       HANGUL SYLLABLE SEU    */
     971             :   0xC2C0,                       /* LV # Lo       HANGUL SYLLABLE SYI    */
     972             :   0xC2DC,                       /* LV # Lo       HANGUL SYLLABLE SI     */
     973             :   0xC2F8,                       /* LV # Lo       HANGUL SYLLABLE SSA    */
     974             :   0xC314,                       /* LV # Lo       HANGUL SYLLABLE SSAE   */
     975             :   0xC330,                       /* LV # Lo       HANGUL SYLLABLE SSYA   */
     976             :   0xC34C,                       /* LV # Lo       HANGUL SYLLABLE SSYAE  */
     977             :   0xC368,                       /* LV # Lo       HANGUL SYLLABLE SSEO   */
     978             :   0xC384,                       /* LV # Lo       HANGUL SYLLABLE SSE    */
     979             :   0xC3A0,                       /* LV # Lo       HANGUL SYLLABLE SSYEO  */
     980             :   0xC3BC,                       /* LV # Lo       HANGUL SYLLABLE SSYE   */
     981             :   0xC3D8,                       /* LV # Lo       HANGUL SYLLABLE SSO    */
     982             :   0xC3F4,                       /* LV # Lo       HANGUL SYLLABLE SSWA   */
     983             :   0xC410,                       /* LV # Lo       HANGUL SYLLABLE SSWAE  */
     984             :   0xC42C,                       /* LV # Lo       HANGUL SYLLABLE SSOE   */
     985             :   0xC448,                       /* LV # Lo       HANGUL SYLLABLE SSYO   */
     986             :   0xC464,                       /* LV # Lo       HANGUL SYLLABLE SSU    */
     987             :   0xC480,                       /* LV # Lo       HANGUL SYLLABLE SSWEO  */
     988             :   0xC49C,                       /* LV # Lo       HANGUL SYLLABLE SSWE   */
     989             :   0xC4B8,                       /* LV # Lo       HANGUL SYLLABLE SSWI   */
     990             :   0xC4D4,                       /* LV # Lo       HANGUL SYLLABLE SSYU   */
     991             :   0xC4F0,                       /* LV # Lo       HANGUL SYLLABLE SSEU   */
     992             :   0xC50C,                       /* LV # Lo       HANGUL SYLLABLE SSYI   */
     993             :   0xC528,                       /* LV # Lo       HANGUL SYLLABLE SSI    */
     994             :   0xC544,                       /* LV # Lo       HANGUL SYLLABLE A      */
     995             :   0xC560,                       /* LV # Lo       HANGUL SYLLABLE AE     */
     996             :   0xC57C,                       /* LV # Lo       HANGUL SYLLABLE YA     */
     997             :   0xC598,                       /* LV # Lo       HANGUL SYLLABLE YAE    */
     998             :   0xC5B4,                       /* LV # Lo       HANGUL SYLLABLE EO     */
     999             :   0xC5D0,                       /* LV # Lo       HANGUL SYLLABLE E      */
    1000             :   0xC5EC,                       /* LV # Lo       HANGUL SYLLABLE YEO    */
    1001             :   0xC608,                       /* LV # Lo       HANGUL SYLLABLE YE     */
    1002             :   0xC624,                       /* LV # Lo       HANGUL SYLLABLE O      */
    1003             :   0xC640,                       /* LV # Lo       HANGUL SYLLABLE WA     */
    1004             :   0xC65C,                       /* LV # Lo       HANGUL SYLLABLE WAE    */
    1005             :   0xC678,                       /* LV # Lo       HANGUL SYLLABLE OE     */
    1006             :   0xC694,                       /* LV # Lo       HANGUL SYLLABLE YO     */
    1007             :   0xC6B0,                       /* LV # Lo       HANGUL SYLLABLE U      */
    1008             :   0xC6CC,                       /* LV # Lo       HANGUL SYLLABLE WEO    */
    1009             :   0xC6E8,                       /* LV # Lo       HANGUL SYLLABLE WE     */
    1010             :   0xC704,                       /* LV # Lo       HANGUL SYLLABLE WI     */
    1011             :   0xC720,                       /* LV # Lo       HANGUL SYLLABLE YU     */
    1012             :   0xC73C,                       /* LV # Lo       HANGUL SYLLABLE EU     */
    1013             :   0xC758,                       /* LV # Lo       HANGUL SYLLABLE YI     */
    1014             :   0xC774,                       /* LV # Lo       HANGUL SYLLABLE I      */
    1015             :   0xC790,                       /* LV # Lo       HANGUL SYLLABLE JA     */
    1016             :   0xC7AC,                       /* LV # Lo       HANGUL SYLLABLE JAE    */
    1017             :   0xC7C8,                       /* LV # Lo       HANGUL SYLLABLE JYA    */
    1018             :   0xC7E4,                       /* LV # Lo       HANGUL SYLLABLE JYAE   */
    1019             :   0xC800,                       /* LV # Lo       HANGUL SYLLABLE JEO    */
    1020             :   0xC81C,                       /* LV # Lo       HANGUL SYLLABLE JE     */
    1021             :   0xC838,                       /* LV # Lo       HANGUL SYLLABLE JYEO   */
    1022             :   0xC854,                       /* LV # Lo       HANGUL SYLLABLE JYE    */
    1023             :   0xC870,                       /* LV # Lo       HANGUL SYLLABLE JO     */
    1024             :   0xC88C,                       /* LV # Lo       HANGUL SYLLABLE JWA    */
    1025             :   0xC8A8,                       /* LV # Lo       HANGUL SYLLABLE JWAE   */
    1026             :   0xC8C4,                       /* LV # Lo       HANGUL SYLLABLE JOE    */
    1027             :   0xC8E0,                       /* LV # Lo       HANGUL SYLLABLE JYO    */
    1028             :   0xC8FC,                       /* LV # Lo       HANGUL SYLLABLE JU     */
    1029             :   0xC918,                       /* LV # Lo       HANGUL SYLLABLE JWEO   */
    1030             :   0xC934,                       /* LV # Lo       HANGUL SYLLABLE JWE    */
    1031             :   0xC950,                       /* LV # Lo       HANGUL SYLLABLE JWI    */
    1032             :   0xC96C,                       /* LV # Lo       HANGUL SYLLABLE JYU    */
    1033             :   0xC988,                       /* LV # Lo       HANGUL SYLLABLE JEU    */
    1034             :   0xC9A4,                       /* LV # Lo       HANGUL SYLLABLE JYI    */
    1035             :   0xC9C0,                       /* LV # Lo       HANGUL SYLLABLE JI     */
    1036             :   0xC9DC,                       /* LV # Lo       HANGUL SYLLABLE JJA    */
    1037             :   0xC9F8,                       /* LV # Lo       HANGUL SYLLABLE JJAE   */
    1038             :   0xCA14,                       /* LV # Lo       HANGUL SYLLABLE JJYA   */
    1039             :   0xCA30,                       /* LV # Lo       HANGUL SYLLABLE JJYAE  */
    1040             :   0xCA4C,                       /* LV # Lo       HANGUL SYLLABLE JJEO   */
    1041             :   0xCA68,                       /* LV # Lo       HANGUL SYLLABLE JJE    */
    1042             :   0xCA84,                       /* LV # Lo       HANGUL SYLLABLE JJYEO  */
    1043             :   0xCAA0,                       /* LV # Lo       HANGUL SYLLABLE JJYE   */
    1044             :   0xCABC,                       /* LV # Lo       HANGUL SYLLABLE JJO    */
    1045             :   0xCAD8,                       /* LV # Lo       HANGUL SYLLABLE JJWA   */
    1046             :   0xCAF4,                       /* LV # Lo       HANGUL SYLLABLE JJWAE  */
    1047             :   0xCB10,                       /* LV # Lo       HANGUL SYLLABLE JJOE   */
    1048             :   0xCB2C,                       /* LV # Lo       HANGUL SYLLABLE JJYO   */
    1049             :   0xCB48,                       /* LV # Lo       HANGUL SYLLABLE JJU    */
    1050             :   0xCB64,                       /* LV # Lo       HANGUL SYLLABLE JJWEO  */
    1051             :   0xCB80,                       /* LV # Lo       HANGUL SYLLABLE JJWE   */
    1052             :   0xCB9C,                       /* LV # Lo       HANGUL SYLLABLE JJWI   */
    1053             :   0xCBB8,                       /* LV # Lo       HANGUL SYLLABLE JJYU   */
    1054             :   0xCBD4,                       /* LV # Lo       HANGUL SYLLABLE JJEU   */
    1055             :   0xCBF0,                       /* LV # Lo       HANGUL SYLLABLE JJYI   */
    1056             :   0xCC0C,                       /* LV # Lo       HANGUL SYLLABLE JJI    */
    1057             :   0xCC28,                       /* LV # Lo       HANGUL SYLLABLE CA     */
    1058             :   0xCC44,                       /* LV # Lo       HANGUL SYLLABLE CAE    */
    1059             :   0xCC60,                       /* LV # Lo       HANGUL SYLLABLE CYA    */
    1060             :   0xCC7C,                       /* LV # Lo       HANGUL SYLLABLE CYAE   */
    1061             :   0xCC98,                       /* LV # Lo       HANGUL SYLLABLE CEO    */
    1062             :   0xCCB4,                       /* LV # Lo       HANGUL SYLLABLE CE     */
    1063             :   0xCCD0,                       /* LV # Lo       HANGUL SYLLABLE CYEO   */
    1064             :   0xCCEC,                       /* LV # Lo       HANGUL SYLLABLE CYE    */
    1065             :   0xCD08,                       /* LV # Lo       HANGUL SYLLABLE CO     */
    1066             :   0xCD24,                       /* LV # Lo       HANGUL SYLLABLE CWA    */
    1067             :   0xCD40,                       /* LV # Lo       HANGUL SYLLABLE CWAE   */
    1068             :   0xCD5C,                       /* LV # Lo       HANGUL SYLLABLE COE    */
    1069             :   0xCD78,                       /* LV # Lo       HANGUL SYLLABLE CYO    */
    1070             :   0xCD94,                       /* LV # Lo       HANGUL SYLLABLE CU     */
    1071             :   0xCDB0,                       /* LV # Lo       HANGUL SYLLABLE CWEO   */
    1072             :   0xCDCC,                       /* LV # Lo       HANGUL SYLLABLE CWE    */
    1073             :   0xCDE8,                       /* LV # Lo       HANGUL SYLLABLE CWI    */
    1074             :   0xCE04,                       /* LV # Lo       HANGUL SYLLABLE CYU    */
    1075             :   0xCE20,                       /* LV # Lo       HANGUL SYLLABLE CEU    */
    1076             :   0xCE3C,                       /* LV # Lo       HANGUL SYLLABLE CYI    */
    1077             :   0xCE58,                       /* LV # Lo       HANGUL SYLLABLE CI     */
    1078             :   0xCE74,                       /* LV # Lo       HANGUL SYLLABLE KA     */
    1079             :   0xCE90,                       /* LV # Lo       HANGUL SYLLABLE KAE    */
    1080             :   0xCEAC,                       /* LV # Lo       HANGUL SYLLABLE KYA    */
    1081             :   0xCEC8,                       /* LV # Lo       HANGUL SYLLABLE KYAE   */
    1082             :   0xCEE4,                       /* LV # Lo       HANGUL SYLLABLE KEO    */
    1083             :   0xCF00,                       /* LV # Lo       HANGUL SYLLABLE KE     */
    1084             :   0xCF1C,                       /* LV # Lo       HANGUL SYLLABLE KYEO   */
    1085             :   0xCF38,                       /* LV # Lo       HANGUL SYLLABLE KYE    */
    1086             :   0xCF54,                       /* LV # Lo       HANGUL SYLLABLE KO     */
    1087             :   0xCF70,                       /* LV # Lo       HANGUL SYLLABLE KWA    */
    1088             :   0xCF8C,                       /* LV # Lo       HANGUL SYLLABLE KWAE   */
    1089             :   0xCFA8,                       /* LV # Lo       HANGUL SYLLABLE KOE    */
    1090             :   0xCFC4,                       /* LV # Lo       HANGUL SYLLABLE KYO    */
    1091             :   0xCFE0,                       /* LV # Lo       HANGUL SYLLABLE KU     */
    1092             :   0xCFFC,                       /* LV # Lo       HANGUL SYLLABLE KWEO   */
    1093             :   0xD018,                       /* LV # Lo       HANGUL SYLLABLE KWE    */
    1094             :   0xD034,                       /* LV # Lo       HANGUL SYLLABLE KWI    */
    1095             :   0xD050,                       /* LV # Lo       HANGUL SYLLABLE KYU    */
    1096             :   0xD06C,                       /* LV # Lo       HANGUL SYLLABLE KEU    */
    1097             :   0xD088,                       /* LV # Lo       HANGUL SYLLABLE KYI    */
    1098             :   0xD0A4,                       /* LV # Lo       HANGUL SYLLABLE KI     */
    1099             :   0xD0C0,                       /* LV # Lo       HANGUL SYLLABLE TA     */
    1100             :   0xD0DC,                       /* LV # Lo       HANGUL SYLLABLE TAE    */
    1101             :   0xD0F8,                       /* LV # Lo       HANGUL SYLLABLE TYA    */
    1102             :   0xD114,                       /* LV # Lo       HANGUL SYLLABLE TYAE   */
    1103             :   0xD130,                       /* LV # Lo       HANGUL SYLLABLE TEO    */
    1104             :   0xD14C,                       /* LV # Lo       HANGUL SYLLABLE TE     */
    1105             :   0xD168,                       /* LV # Lo       HANGUL SYLLABLE TYEO   */
    1106             :   0xD184,                       /* LV # Lo       HANGUL SYLLABLE TYE    */
    1107             :   0xD1A0,                       /* LV # Lo       HANGUL SYLLABLE TO     */
    1108             :   0xD1BC,                       /* LV # Lo       HANGUL SYLLABLE TWA    */
    1109             :   0xD1D8,                       /* LV # Lo       HANGUL SYLLABLE TWAE   */
    1110             :   0xD1F4,                       /* LV # Lo       HANGUL SYLLABLE TOE    */
    1111             :   0xD210,                       /* LV # Lo       HANGUL SYLLABLE TYO    */
    1112             :   0xD22C,                       /* LV # Lo       HANGUL SYLLABLE TU     */
    1113             :   0xD248,                       /* LV # Lo       HANGUL SYLLABLE TWEO   */
    1114             :   0xD264,                       /* LV # Lo       HANGUL SYLLABLE TWE    */
    1115             :   0xD280,                       /* LV # Lo       HANGUL SYLLABLE TWI    */
    1116             :   0xD29C,                       /* LV # Lo       HANGUL SYLLABLE TYU    */
    1117             :   0xD2B8,                       /* LV # Lo       HANGUL SYLLABLE TEU    */
    1118             :   0xD2D4,                       /* LV # Lo       HANGUL SYLLABLE TYI    */
    1119             :   0xD2F0,                       /* LV # Lo       HANGUL SYLLABLE TI     */
    1120             :   0xD30C,                       /* LV # Lo       HANGUL SYLLABLE PA     */
    1121             :   0xD328,                       /* LV # Lo       HANGUL SYLLABLE PAE    */
    1122             :   0xD344,                       /* LV # Lo       HANGUL SYLLABLE PYA    */
    1123             :   0xD360,                       /* LV # Lo       HANGUL SYLLABLE PYAE   */
    1124             :   0xD37C,                       /* LV # Lo       HANGUL SYLLABLE PEO    */
    1125             :   0xD398,                       /* LV # Lo       HANGUL SYLLABLE PE     */
    1126             :   0xD3B4,                       /* LV # Lo       HANGUL SYLLABLE PYEO   */
    1127             :   0xD3D0,                       /* LV # Lo       HANGUL SYLLABLE PYE    */
    1128             :   0xD3EC,                       /* LV # Lo       HANGUL SYLLABLE PO     */
    1129             :   0xD408,                       /* LV # Lo       HANGUL SYLLABLE PWA    */
    1130             :   0xD424,                       /* LV # Lo       HANGUL SYLLABLE PWAE   */
    1131             :   0xD440,                       /* LV # Lo       HANGUL SYLLABLE POE    */
    1132             :   0xD45C,                       /* LV # Lo       HANGUL SYLLABLE PYO    */
    1133             :   0xD478,                       /* LV # Lo       HANGUL SYLLABLE PU     */
    1134             :   0xD494,                       /* LV # Lo       HANGUL SYLLABLE PWEO   */
    1135             :   0xD4B0,                       /* LV # Lo       HANGUL SYLLABLE PWE    */
    1136             :   0xD4CC,                       /* LV # Lo       HANGUL SYLLABLE PWI    */
    1137             :   0xD4E8,                       /* LV # Lo       HANGUL SYLLABLE PYU    */
    1138             :   0xD504,                       /* LV # Lo       HANGUL SYLLABLE PEU    */
    1139             :   0xD520,                       /* LV # Lo       HANGUL SYLLABLE PYI    */
    1140             :   0xD53C,                       /* LV # Lo       HANGUL SYLLABLE PI     */
    1141             :   0xD558,                       /* LV # Lo       HANGUL SYLLABLE HA     */
    1142             :   0xD574,                       /* LV # Lo       HANGUL SYLLABLE HAE    */
    1143             :   0xD590,                       /* LV # Lo       HANGUL SYLLABLE HYA    */
    1144             :   0xD5AC,                       /* LV # Lo       HANGUL SYLLABLE HYAE   */
    1145             :   0xD5C8,                       /* LV # Lo       HANGUL SYLLABLE HEO    */
    1146             :   0xD5E4,                       /* LV # Lo       HANGUL SYLLABLE HE     */
    1147             :   0xD600,                       /* LV # Lo       HANGUL SYLLABLE HYEO   */
    1148             :   0xD61C,                       /* LV # Lo       HANGUL SYLLABLE HYE    */
    1149             :   0xD638,                       /* LV # Lo       HANGUL SYLLABLE HO     */
    1150             :   0xD654,                       /* LV # Lo       HANGUL SYLLABLE HWA    */
    1151             :   0xD670,                       /* LV # Lo       HANGUL SYLLABLE HWAE   */
    1152             :   0xD68C,                       /* LV # Lo       HANGUL SYLLABLE HOE    */
    1153             :   0xD6A8,                       /* LV # Lo       HANGUL SYLLABLE HYO    */
    1154             :   0xD6C4,                       /* LV # Lo       HANGUL SYLLABLE HU     */
    1155             :   0xD6E0,                       /* LV # Lo       HANGUL SYLLABLE HWEO   */
    1156             :   0xD6FC,                       /* LV # Lo       HANGUL SYLLABLE HWE    */
    1157             :   0xD718,                       /* LV # Lo       HANGUL SYLLABLE HWI    */
    1158             :   0xD734,                       /* LV # Lo       HANGUL SYLLABLE HYU    */
    1159             :   0xD750,                       /* LV # Lo       HANGUL SYLLABLE HEU    */
    1160             :   0xD76C,                       /* LV # Lo       HANGUL SYLLABLE HYI    */
    1161             :   0xD788,                       /* LV # Lo       HANGUL SYLLABLE HI     */
    1162             :   0
    1163             : };
    1164             : 
    1165             : static const uint32_t pr29_13_2[] = {
    1166             :   0x11A8, 0x11A9, 0x11AA, 0x11AB, 0x11AC, 0x11AD, 0x11AE, 0x11AF,
    1167             :   0x11B0, 0x11B1, 0x11B2, 0x11B3, 0x11B4, 0x11B5, 0x11B6, 0x11B7,
    1168             :   0x11B8, 0x11B9, 0x11BA, 0x11BB, 0x11BC, 0x11BD, 0x11BE, 0x11BF,
    1169             :   0x11C0, 0x11C1, 0x11C2, 0
    1170             : };
    1171             : 
    1172             : typedef struct
    1173             : {
    1174             :   const uint32_t *first;
    1175             :   const uint32_t *last;
    1176             : } Pr29;
    1177             : 
    1178             : static const Pr29 pr29[] = {
    1179             :   {&pr29_1_1[0], &pr29_1_2[0]},
    1180             :   {&pr29_2_1[0], &pr29_2_2[0]},
    1181             :   {&pr29_3_1[0], &pr29_3_2[0]},
    1182             :   {&pr29_4_1[0], &pr29_4_2[0]},
    1183             :   {&pr29_5_1[0], &pr29_5_2[0]},
    1184             :   {&pr29_6_1[0], &pr29_6_2[0]},
    1185             :   {&pr29_7_1[0], &pr29_7_2[0]},
    1186             :   {&pr29_8_1[0], &pr29_8_2[0]},
    1187             :   {&pr29_9_1[0], &pr29_9_2[0]},
    1188             :   {&pr29_10_1[0], &pr29_10_2[0]},
    1189             :   {&pr29_11_1[0], &pr29_11_2[0]},
    1190             :   {&pr29_12_1[0], &pr29_12_2[0]},
    1191             :   {&pr29_13_1[0], &pr29_13_2[0]},
    1192             :   {NULL, NULL}
    1193             : };
    1194             : 
    1195             : static size_t
    1196       19710 : first_column (uint32_t c)
    1197             : {
    1198             :   size_t i, j;
    1199             : 
    1200      275475 :   for (i = 0; pr29[i].first; i++)
    1201     8686276 :     for (j = 0; pr29[i].first[j]; j++)
    1202     8430511 :       if (c == pr29[i].first[j])
    1203         389 :         return i + 1;
    1204             : 
    1205       19321 :   return 0;
    1206             : }
    1207             : 
    1208             : static int
    1209       59873 : in_last_column_row (uint32_t c, size_t row)
    1210             : {
    1211             :   size_t i;
    1212             : 
    1213     1676056 :   for (i = 0; pr29[row - 1].last[i]; i++)
    1214     1616193 :     if (c == pr29[row - 1].last[i])
    1215          10 :       return 1;
    1216             : 
    1217       59863 :   return 0;
    1218             : }
    1219             : 
    1220             : static size_t
    1221       46986 : combinationclass (uint32_t c)
    1222             : {
    1223             :   size_t i;
    1224             : 
    1225    15283186 :   for (i = 0; nzcc[i]; i++)
    1226    15236914 :     if (c == nzcc[i])
    1227         714 :       return i + 1;
    1228             : 
    1229       46272 :   return 0;
    1230             : }
    1231             : 
    1232             : /**
    1233             :  * pr29_4:
    1234             :  * @in: input array with unicode code points.
    1235             :  * @len: length of input array with unicode code points.
    1236             :  *
    1237             :  * Check the input to see if it may be normalized into different
    1238             :  * strings by different NFKC implementations, due to an anomaly in the
    1239             :  * NFKC specifications.
    1240             :  *
    1241             :  * Return value: Returns the #Pr29_rc value %PR29_SUCCESS on success,
    1242             :  *   and %PR29_PROBLEM if the input sequence is a "problem sequence"
    1243             :  *   (i.e., may be normalized into different strings by different
    1244             :  *   implementations).
    1245             :  **/
    1246             : int
    1247         301 : pr29_4 (const uint32_t * in, size_t len)
    1248             : {
    1249             :   size_t i, j, k, row;
    1250             : 
    1251             :   /*
    1252             :    * The problem sequence are of the form:
    1253             :    *
    1254             :    *      first_character  intervening_character+ last_character
    1255             :    *
    1256             :    * where the first_character and last_character come from the same
    1257             :    * row in the following table, and there is at least one
    1258             :    * intervening_character with non-zero Canonical Combining
    1259             :    * Class. (The '+' above means one or more occurrences.)
    1260             :    *
    1261             :    */
    1262             : 
    1263       20001 :   for (i = 0; i < len; i++)
    1264       19710 :     if ((row = first_column (in[i])) > 0)
    1265       47365 :       for (j = i + 1; j < len; j++)
    1266       46986 :         if (combinationclass (in[j]))
    1267       60577 :           for (k = j + 1; k < len; k++)
    1268       59873 :             if (in_last_column_row (in[k], row))
    1269          10 :               return PR29_PROBLEM;
    1270             : 
    1271         291 :   return PR29_SUCCESS;
    1272             : }
    1273             : 
    1274             : /**
    1275             :  * pr29_4z:
    1276             :  * @in: zero terminated array of Unicode code points.
    1277             :  *
    1278             :  * Check the input to see if it may be normalized into different
    1279             :  * strings by different NFKC implementations, due to an anomaly in the
    1280             :  * NFKC specifications.
    1281             :  *
    1282             :  * Return value: Returns the #Pr29_rc value %PR29_SUCCESS on success,
    1283             :  *   and %PR29_PROBLEM if the input sequence is a "problem sequence"
    1284             :  *   (i.e., may be normalized into different strings by different
    1285             :  *   implementations).
    1286             :  **/
    1287             : int
    1288         292 : pr29_4z (const uint32_t * in)
    1289             : {
    1290             :   size_t len;
    1291             : 
    1292       20016 :   for (len = 0; in[len]; len++)
    1293             :     ;
    1294             : 
    1295         292 :   return pr29_4 (in, len);
    1296             : }
    1297             : 
    1298             : /**
    1299             :  * pr29_8z:
    1300             :  * @in: zero terminated input UTF-8 string.
    1301             :  *
    1302             :  * Check the input to see if it may be normalized into different
    1303             :  * strings by different NFKC implementations, due to an anomaly in the
    1304             :  * NFKC specifications.
    1305             :  *
    1306             :  * Return value: Returns the #Pr29_rc value %PR29_SUCCESS on success,
    1307             :  *   and %PR29_PROBLEM if the input sequence is a "problem sequence"
    1308             :  *   (i.e., may be normalized into different strings by different
    1309             :  *   implementations), or %PR29_STRINGPREP_ERROR if there was a
    1310             :  *   problem converting the string from UTF-8 to UCS-4.
    1311             :  **/
    1312             : int
    1313         373 : pr29_8z (const char *in)
    1314             : {
    1315             :   uint32_t *p;
    1316             :   int rc;
    1317             : 
    1318         373 :   p = stringprep_utf8_to_ucs4 (in, -1, NULL);
    1319         373 :   if (!p)
    1320          90 :     return PR29_STRINGPREP_ERROR;
    1321             : 
    1322         283 :   rc = pr29_4z (p);
    1323             : 
    1324         283 :   free (p);
    1325             : 
    1326         283 :   return rc;
    1327             : }
    1328             : 
    1329             : /**
    1330             :  * Pr29_rc:
    1331             :  * @PR29_SUCCESS: Successful operation.  This value is guaranteed to
    1332             :  *   always be zero, the remaining ones are only guaranteed to hold
    1333             :  *   non-zero values, for logical comparison purposes.
    1334             :  * @PR29_PROBLEM: A problem sequence was encountered.
    1335             :  * @PR29_STRINGPREP_ERROR: The character set conversion failed (only
    1336             :  *   for pr29_8z()).
    1337             :  *
    1338             :  * Enumerated return codes for pr29_4(), pr29_4z(), pr29_8z().  The
    1339             :  * value 0 is guaranteed to always correspond to success.
    1340             :  */

Generated by: LCOV version 1.13