libidn  1.25
pr29.c
Go to the documentation of this file.
00001 /* pr29.h --- Detect strings that are non-idempotent under NFKC in Unicode 3.2.
00002    Copyright (C) 2004-2012 Simon Josefsson
00003 
00004    This file is part of GNU Libidn.
00005 
00006    GNU Libidn is free software: you can redistribute it and/or
00007    modify it under the terms of either:
00008 
00009      * the GNU Lesser General Public License as published by the Free
00010        Software Foundation; either version 3 of the License, or (at
00011        your option) any later version.
00012 
00013    or
00014 
00015      * the GNU General Public License as published by the Free
00016        Software Foundation; either version 2 of the License, or (at
00017        your option) any later version.
00018 
00019    or both in parallel, as here.
00020 
00021    GNU Libidn is distributed in the hope that it will be useful,
00022    but WITHOUT ANY WARRANTY; without even the implied warranty of
00023    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00024    General Public License for more details.
00025 
00026    You should have received copies of the GNU General Public License and
00027    the GNU Lesser General Public License along with this program.  If
00028    not, see <http://www.gnu.org/licenses/>. */
00029 
00030 #include <config.h>
00031 
00032 #include "pr29.h"
00033 
00034 /* Get stringprep_utf8_to_ucs4. */
00035 #include <stringprep.h>
00036 
00037 /*
00038  * The tables used in this file was extracted by Simon Josefsson from
00039  * pr-29.html and DerivedCombiningClass-3.2.0.txt, as published by
00040  * Unicode Inc., for the GNU Libidn project.
00041  *
00042  */
00043 
00044 /* These are the characters with non-zero combination class, extracted
00045    from DerivedCombiningClass-3.2.0.txt. */
00046 static uint32_t nzcc[] = {
00047   /* 1 # Mn   [5] COMBINING TILDE OVERLAY..
00048    *                    ..COMBINING LONG SOLIDUS OVERLAY */
00049   0x0334,
00050   0x0335,
00051   0x0336,
00052   0x0337,
00053   0x0338,
00054   /* 1 # Mn   [2] COMBINING LONG VERTICAL LINE OVERLAY..
00055    *                    ..COMBINING SHORT VERTICAL LINE OVERLAY */
00056   0x20D2,
00057   0x20D3,
00058   /* 1 # Mn   [3] COMBINING RING OVERLAY..
00059    *                    ..COMBINING ANTICLOCKWISE RING OVERLAY */
00060   0x20D8,
00061   0x20D9,
00062   0x20DA,
00063   /* 1 # Mn   [2] COMBINING REVERSE SOLIDUS OVERLAY..
00064    *                    ..COMBINING DOUBLE VERTICAL STROKE OVERLAY */
00065   0x20E5,
00066   0x20E6,
00067   /* 1 # Mn       COMBINING LEFTWARDS ARROW OVERLAY */
00068   0x20EA,
00069   /* 1 # Mn   [3] MUSICAL SYMBOL COMBINING TREMOLO-1..
00070    *                    ..MUSICAL SYMBOL COMBINING TREMOLO-3 */
00071   0x1D167,
00072   0x1D168,
00073   0x1D169,
00074   /* 7 # Mn       DEVANAGARI SIGN NUKTA */
00075   0x093C,
00076   /* 7 # Mn       BENGALI SIGN NUKTA */
00077   0x09BC,
00078   /* 7 # Mn       GURMUKHI SIGN NUKTA */
00079   0x0A3C,
00080   /* 7 # Mn       GUJARATI SIGN NUKTA */
00081   0x0ABC,
00082   /* 7 # Mn       ORIYA SIGN NUKTA */
00083   0x0B3C,
00084   /* 7 # Mn       MYANMAR SIGN DOT BELOW */
00085   0x1037,
00086   /* 8 # Mn   [2] COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..
00087    *                    ..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK */
00088   0x3099,
00089   0x309A,
00090   /* 9 # Mn       DEVANAGARI SIGN VIRAMA */
00091   0x094D,
00092   /* 9 # Mn       BENGALI SIGN VIRAMA */
00093   0x09CD,
00094   /* 9 # Mn       GURMUKHI SIGN VIRAMA */
00095   0x0A4D,
00096   /* 9 # Mn       GUJARATI SIGN VIRAMA */
00097   0x0ACD,
00098   /* 9 # Mn       ORIYA SIGN VIRAMA */
00099   0x0B4D,
00100   /* 9 # Mn       TAMIL SIGN VIRAMA */
00101   0x0BCD,
00102   /* 9 # Mn       TELUGU SIGN VIRAMA */
00103   0x0C4D,
00104   /* 9 # Mn       KANNADA SIGN VIRAMA */
00105   0x0CCD,
00106   /* 9 # Mn       MALAYALAM SIGN VIRAMA */
00107   0x0D4D,
00108   /* 9 # Mn       SINHALA SIGN AL-LAKUNA */
00109   0x0DCA,
00110   /* 9 # Mn       THAI CHARACTER PHINTHU */
00111   0x0E3A,
00112   /* 9 # Mn       TIBETAN MARK HALANTA */
00113   0x0F84,
00114   /* 9 # Mn       MYANMAR SIGN VIRAMA */
00115   0x1039,
00116   /* 9 # Mn       TAGALOG SIGN VIRAMA */
00117   0x1714,
00118   /* 9 # Mn       HANUNOO SIGN PAMUDPOD */
00119   0x1734,
00120   /* 9 # Mn       KHMER SIGN COENG */
00121   0x17D2,
00122   /* 10 # Mn       HEBREW POINT SHEVA */
00123   0x05B0,
00124   /* 11 # Mn       HEBREW POINT HATAF SEGOL */
00125   0x05B1,
00126   /* 12 # Mn       HEBREW POINT HATAF PATAH */
00127   0x05B2,
00128   /* 13 # Mn       HEBREW POINT HATAF QAMATS */
00129   0x05B3,
00130   /* 14 # Mn       HEBREW POINT HIRIQ */
00131   0x05B4,
00132   /* 15 # Mn       HEBREW POINT TSERE */
00133   0x05B5,
00134   /* 16 # Mn       HEBREW POINT SEGOL */
00135   0x05B6,
00136   /* 17 # Mn       HEBREW POINT PATAH */
00137   0x05B7,
00138   /* 18 # Mn       HEBREW POINT QAMATS */
00139   0x05B8,
00140   /* 19 # Mn       HEBREW POINT HOLAM */
00141   0x05B9,
00142   /* 20 # Mn       HEBREW POINT QUBUTS */
00143   0x05BB,
00144   /* 21 # Mn       HEBREW POINT DAGESH OR MAPIQ */
00145   0x05BC,
00146   /* 22 # Mn       HEBREW POINT METEG */
00147   0x05BD,
00148   /* 23 # Mn       HEBREW POINT RAFE */
00149   0x05BF,
00150   /* 24 # Mn       HEBREW POINT SHIN DOT */
00151   0x05C1,
00152   /* 25 # Mn       HEBREW POINT SIN DOT */
00153   0x05C2,
00154   /* 26 # Mn       HEBREW POINT JUDEO-SPANISH VARIKA */
00155   0xFB1E,
00156   /* 27 # Mn       ARABIC FATHATAN */
00157   0x064B,
00158   /* 28 # Mn       ARABIC DAMMATAN */
00159   0x064C,
00160   /* 29 # Mn       ARABIC KASRATAN */
00161   0x064D,
00162   /* 30 # Mn       ARABIC FATHA */
00163   0x064E,
00164   /* 31 # Mn       ARABIC DAMMA */
00165   0x064F,
00166   /* 32 # Mn       ARABIC KASRA */
00167   0x0650,
00168   /* 33 # Mn       ARABIC SHADDA */
00169   0x0651,
00170   /* 34 # Mn       ARABIC SUKUN */
00171   0x0652,
00172   /* 35 # Mn       ARABIC LETTER SUPERSCRIPT ALEF */
00173   0x0670,
00174   /* 36 # Mn       SYRIAC LETTER SUPERSCRIPT ALAPH */
00175   0x0711,
00176   /* 84 # Mn       TELUGU LENGTH MARK */
00177   0x0C55,
00178   /* 91 # Mn       TELUGU AI LENGTH MARK */
00179   0x0C56,
00180   /* 103 # Mn   [2] THAI CHARACTER SARA U..
00181    *                    ..THAI CHARACTER SARA UU */
00182   0x0E38,
00183   0x0E39,
00184   /* 107 # Mn   [4] THAI CHARACTER MAI EK..
00185    *                    ..THAI CHARACTER MAI CHATTAWA */
00186   0x0E48,
00187   0x0E49,
00188   0x0E4A,
00189   0x04EB,
00190   /* 118 # Mn   [2] LAO VOWEL SIGN U..
00191    *                    ..LAO VOWEL SIGN UU */
00192   0x0EB8,
00193   0x0EB9,
00194   /* 122 # Mn   [4] LAO TONE MAI EK..
00195    *                    ..LAO TONE MAI CATAWA */
00196   0x0EC8,
00197   0x0EC9,
00198   0x0ECA,
00199   0x0ECB,
00200   /* 129 # Mn       TIBETAN VOWEL SIGN AA */
00201   0x0F71,
00202   /* 130 # Mn       TIBETAN VOWEL SIGN I */
00203   0x0F72,
00204   /* 130 # Mn   [4] TIBETAN VOWEL SIGN E..
00205    *                    ..TIBETAN VOWEL SIGN OO */
00206   0x0F7A,
00207   0x0F7B,
00208   0x0F7C,
00209   0x0F7D,
00210   /* 130 # Mn       TIBETAN VOWEL SIGN REVERSED I */
00211   0x0F80,
00212   /* 132 # Mn       TIBETAN VOWEL SIGN U */
00213   0x0F74,
00214   /* 202 # Mn   [2] COMBINING PALATALIZED HOOK BELOW..
00215    *                    ..COMBINING RETROFLEX HOOK BELOW */
00216   0x0321,
00217   0x0322,
00218   /* 202 # Mn   [2] COMBINING CEDILLA..
00219    *                    ..COMBINING OGONEK */
00220   0x0327,
00221   0x0328,
00222   /* 216 # Mn       COMBINING HORN */
00223   0x031B,
00224   /* 216 # Mn       TIBETAN MARK TSA -PHRU */
00225   0x0F39,
00226   /* 216 # Mc   [2] MUSICAL SYMBOL COMBINING STEM..
00227    *                    ..MUSICAL SYMBOL COMBINING SPRECHGESANG STEM */
00228   0x1D165,
00229   0x1D166,
00230   /* 216 # Mc   [5] MUSICAL SYMBOL COMBINING FLAG-1..
00231    *                    ..MUSICAL SYMBOL COMBINING FLAG-5 */
00232   0x1D16E,
00233   0x1D16F,
00234   0x1D170,
00235   0x1D171,
00236   0x1D172,
00237   /* 218 # Mn       IDEOGRAPHIC LEVEL TONE MARK */
00238   0x302A,
00239   /* 220 # Mn   [4] COMBINING GRAVE ACCENT BELOW..
00240    *                    ..COMBINING RIGHT TACK BELOW */
00241   0x0316,
00242   0x0317,
00243   0x0318,
00244   0x0319,
00245   /* 220 # Mn   [5] COMBINING LEFT HALF RING BELOW..
00246    *                    ..COMBINING MINUS SIGN BELOW */
00247   0x031C,
00248   0x031D,
00249   0x031E,
00250   0x031F,
00251   0x0320,
00252   /* 220 # Mn   [4] COMBINING DOT BELOW..
00253    *                    ..COMBINING COMMA BELOW */
00254   0x0323,
00255   0x0324,
00256   0x0325,
00257   0x0326,
00258   /* 220 # Mn  [11] COMBINING VERTICAL LINE BELOW..
00259    *                    ..COMBINING DOUBLE LOW LINE */
00260   0x0329,
00261   0x032A,
00262   0x032B,
00263   0x032C,
00264   0x032D,
00265   0x032E,
00266   0x032F,
00267   0x0330,
00268   0x0331,
00269   0x0332,
00270   0x0333,
00271   /* 220 # Mn   [4] COMBINING RIGHT HALF RING BELOW..
00272    *                    ..COMBINING SEAGULL BELOW */
00273   0x0339,
00274   0x033A,
00275   0x033B,
00276   0x033C,
00277   /* 220 # Mn   [3] COMBINING EQUALS SIGN BELOW..
00278    *                    ..COMBINING LEFT ANGLE BELOW */
00279   0x0347,
00280   0x0348,
00281   0x0349,
00282   /* 220 # Mn   [2] COMBINING LEFT RIGHT ARROW BELOW..
00283    *                    ..COMBINING UPWARDS ARROW BELOW */
00284   0x034D,
00285   0x034E,
00286   /* 220 # Mn       HEBREW ACCENT ETNAHTA */
00287   0x0591,
00288   /* 220 # Mn       HEBREW ACCENT TIPEHA */
00289   0x0596,
00290   /* 220 # Mn       HEBREW ACCENT TEVIR */
00291   0x059B,
00292   /* 220 # Mn   [5] HEBREW ACCENT MUNAH..
00293    *                    ..HEBREW ACCENT DARGA */
00294   0x05A3,
00295   0x05A4,
00296   0x05A5,
00297   0x05A6,
00298   0x05A7,
00299   /* 220 # Mn       HEBREW ACCENT YERAH BEN YOMO */
00300   0x05AA,
00301   /* 220 # Mn       ARABIC HAMZA BELOW */
00302   0x0655,
00303   /* 220 # Mn       ARABIC SMALL LOW SEEN */
00304   0x06E3,
00305   /* 220 # Mn       ARABIC EMPTY CENTRE LOW STOP */
00306   0x06EA,
00307   /* 220 # Mn       ARABIC SMALL LOW MEEM */
00308   0x06ED,
00309   /* 220 # Mn       SYRIAC PTHAHA BELOW */
00310   0x0731,
00311   /* 220 # Mn       SYRIAC ZQAPHA BELOW */
00312   0x0734,
00313   /* 220 # Mn   [3] SYRIAC RBASA BELOW..
00314    *                    ..SYRIAC DOTTED ZLAMA ANGULAR */
00315   0x0737,
00316   0x0738,
00317   0x0739,
00318   /* 220 # Mn   [2] SYRIAC HBASA BELOW..
00319    *                    ..SYRIAC HBASA-ESASA DOTTED */
00320   0x073B,
00321   0x073C,
00322   /* 220 # Mn       SYRIAC ESASA BELOW */
00323   0x073E,
00324   /* 220 # Mn       SYRIAC RUKKAKHA */
00325   0x0742,
00326   /* 220 # Mn       SYRIAC TWO VERTICAL DOTS BELOW */
00327   0x0744,
00328   /* 220 # Mn       SYRIAC THREE DOTS BELOW */
00329   0x0746,
00330   /* 220 # Mn       SYRIAC OBLIQUE LINE BELOW */
00331   0x0748,
00332   /* 220 # Mn       DEVANAGARI STRESS SIGN ANUDATTA */
00333   0x0952,
00334   /* 220 # Mn   [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..
00335    *                    ..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS */
00336   0x0F18,
00337   0x0F19,
00338   /* 220 # Mn       TIBETAN MARK NGAS BZUNG NYI ZLA */
00339   0x0F35,
00340   /* 220 # Mn       TIBETAN MARK NGAS BZUNG SGOR RTAGS */
00341   0x0F37,
00342   /* 220 # Mn       TIBETAN SYMBOL PADMA GDAN */
00343   0x0FC6,
00344   /* 220 # Mn       COMBINING TRIPLE UNDERDOT */
00345   0x20E8,
00346   /* 220 # Mn   [8] MUSICAL SYMBOL COMBINING ACCENT..
00347    *                    ..MUSICAL SYMBOL COMBINING LOURE */
00348   0x1D17B,
00349   0x1D17C,
00350   0x1D17D,
00351   0x1D17E,
00352   0x1D17F,
00353   0x1D180,
00354   0x1D181,
00355   0x1D182,
00356   /* 220 # Mn   [2] MUSICAL SYMBOL COMBINING DOUBLE TONGUE..
00357    *                    ..MUSICAL SYMBOL COMBINING TRIPLE TONGUE */
00358   0x1D18A,
00359   0x1D18B,
00360   /* 222 # Mn       HEBREW ACCENT YETIV */
00361   0x059A,
00362   /* 222 # Mn       HEBREW ACCENT DEHI */
00363   0x05AD,
00364   /* 222 # Mn       IDEOGRAPHIC ENTERING TONE MARK */
00365   0x302D,
00366   /* 224 # Mn   [2] HANGUL SINGLE DOT TONE MARK..
00367    *                    ..HANGUL DOUBLE DOT TONE MARK */
00368   0x302E,
00369   0x302F,
00370   /* 226 # Mc       MUSICAL SYMBOL COMBINING AUGMENTATION DOT */
00371   0x1D16D,
00372   /* 228 # Mn       HEBREW ACCENT ZINOR */
00373   0x05AE,
00374   /* 228 # Mn       MONGOLIAN LETTER ALI GALI DAGALGA */
00375   0x18A9,
00376   /* 228 # Mn       IDEOGRAPHIC RISING TONE MARK */
00377   0x302B,
00378   /* 230 # Mn  [21] COMBINING GRAVE ACCENT..
00379    *                    ..COMBINING REVERSED COMMA ABOVE */
00380   0x0300,
00381   0x0301,
00382   0x0302,
00383   0x0303,
00384   0x0304,
00385   0x0305,
00386   0x0306,
00387   0x0307,
00388   0x0308,
00389   0x0309,
00390   0x030A,
00391   0x030B,
00392   0x030C,
00393   0x030D,
00394   0x030E,
00395   0x030F,
00396   0x0310,
00397   0x0311,
00398   0x0312,
00399   0x0313,
00400   0x0314,
00401   /* 230 # Mn   [8] COMBINING X ABOVE..
00402    *                    ..COMBINING GREEK DIALYTIKA TONOS */
00403   0x033D,
00404   0x033E,
00405   0x033F,
00406   0x0340,
00407   0x0341,
00408   0x0342,
00409   0x0343,
00410   0x0344,
00411   /* 230 # Mn       COMBINING BRIDGE ABOVE */
00412   0x0346,
00413   /* 230 # Mn   [3] COMBINING NOT TILDE ABOVE..
00414    *                    ..COMBINING ALMOST EQUAL TO ABOVE */
00415   0x034A,
00416   0x034B,
00417   0x034C,
00418   /* 230 # Mn  [13] COMBINING LATIN SMALL LETTER A..
00419    *                    ..COMBINING LATIN SMALL LETTER X */
00420   0x0363,
00421   0x0364,
00422   0x0365,
00423   0x0366,
00424   0x0367,
00425   0x0368,
00426   0x0369,
00427   0x036A,
00428   0x036B,
00429   0x036C,
00430   0x036D,
00431   0x036E,
00432   0x036F,
00433   /* 230 # Mn   [4] COMBINING CYRILLIC TITLO..
00434    *                    ..COMBINING CYRILLIC PSILI PNEUMATA */
00435   0x0483,
00436   0x0484,
00437   0x0485,
00438   0x0486,
00439   /* 230 # Mn   [4] HEBREW ACCENT SEGOL..
00440    *                    ..HEBREW ACCENT ZAQEF GADOL */
00441   0x0592,
00442   0x0593,
00443   0x0594,
00444   0x0595,
00445   /* 230 # Mn   [3] HEBREW ACCENT REVIA..
00446    *                    ..HEBREW ACCENT PASHTA */
00447   0x0597,
00448   0x0598,
00449   0x0599,
00450   /* 230 # Mn   [6] HEBREW ACCENT GERESH..
00451    *                    ..HEBREW ACCENT PAZER */
00452   0x059C,
00453   0x059D,
00454   0x059E,
00455   0x059F,
00456   0x05A0,
00457   0x05A1,
00458   /* 230 # Mn   [2] HEBREW ACCENT QADMA..
00459    *                    ..HEBREW ACCENT TELISHA QETANA */
00460   0x05A8,
00461   0x05A9,
00462   /* 230 # Mn   [2] HEBREW ACCENT OLE..
00463    *                    ..HEBREW ACCENT ILUY */
00464   0x05AB,
00465   0x05AC,
00466   /* 230 # Mn       HEBREW MARK MASORA CIRCLE */
00467   0x05AF,
00468   /* 230 # Mn       HEBREW MARK UPPER DOT */
00469   0x05C4,
00470   /* 230 # Mn   [2] ARABIC MADDAH ABOVE..
00471    *                    ..ARABIC HAMZA ABOVE */
00472   0x0653,
00473   0x0654,
00474   /* 230 # Mn   [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..
00475    *                    ..ARABIC SMALL HIGH SEEN */
00476   0x06D6,
00477   0x06D7,
00478   0x06D8,
00479   0x06D9,
00480   0x06DA,
00481   0x06DB,
00482   0x06DC,
00483   /* 230 # Mn   [4] ARABIC SMALL HIGH ROUNDED ZERO..
00484    *                    ..ARABIC SMALL HIGH MEEM ISOLATED FORM */
00485   0x06DF,
00486   0x06E0,
00487   0x06E1,
00488   0x06E2,
00489   /* 230 # Mn       ARABIC SMALL HIGH MADDA */
00490   0x06E4,
00491   /* 230 # Mn   [2] ARABIC SMALL HIGH YEH..
00492    *                    ..ARABIC SMALL HIGH NOON */
00493   0x06E7,
00494   0x06E8,
00495   /* 230 # Mn   [2] ARABIC EMPTY CENTRE HIGH STOP..
00496    *                    ..ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE */
00497   0x06EB,
00498   0x06EC,
00499   /* 230 # Mn       SYRIAC PTHAHA ABOVE */
00500   0x0730,
00501   /* 230 # Mn   [2] SYRIAC PTHAHA DOTTED..
00502    *                    ..SYRIAC ZQAPHA ABOVE */
00503   0x0732,
00504   0x0733,
00505   /* 230 # Mn   [2] SYRIAC ZQAPHA DOTTED..
00506    *                    ..SYRIAC RBASA ABOVE */
00507   0x0735,
00508   0x0736,
00509   /* 230 # Mn       SYRIAC HBASA ABOVE */
00510   0x073A,
00511   /* 230 # Mn       SYRIAC ESASA ABOVE */
00512   0x073D,
00513   /* 230 # Mn   [3] SYRIAC RWAHA..
00514    *                    ..SYRIAC QUSHSHAYA */
00515   0x073F,
00516   0x0740,
00517   0x0741,
00518   /* 230 # Mn       SYRIAC TWO VERTICAL DOTS ABOVE */
00519   0x0743,
00520   /* 230 # Mn       SYRIAC THREE DOTS ABOVE */
00521   0x0745,
00522   /* 230 # Mn       SYRIAC OBLIQUE LINE ABOVE */
00523   0x0747,
00524   /* 230 # Mn   [2] SYRIAC MUSIC..
00525    *                    ..SYRIAC BARREKH */
00526   0x0749,
00527   0x074A,
00528   /* 230 # Mn       DEVANAGARI STRESS SIGN UDATTA */
00529   0x0951,
00530   /* 230 # Mn   [2] DEVANAGARI GRAVE ACCENT..
00531    *                    ..DEVANAGARI ACUTE ACCENT */
00532   0x0953,
00533   0x0954,
00534   /* 230 # Mn   [2] TIBETAN SIGN NYI ZLA NAA DA..
00535    *                    ..TIBETAN SIGN SNA LDAN */
00536   0x0F82,
00537   0x0F83,
00538   /* 230 # Mn   [2] TIBETAN SIGN LCI RTAGS..
00539    *                    ..TIBETAN SIGN YANG RTAGS */
00540   0x0F86,
00541   0x0F87,
00542   /* 230 # Mn   [2] COMBINING LEFT HARPOON ABOVE..
00543    *                    ..COMBINING RIGHT HARPOON ABOVE */
00544   0x20D0,
00545   0x20D1,
00546   /* 230 # Mn   [4] COMBINING ANTICLOCKWISE ARROW ABOVE..
00547    *                    ..COMBINING RIGHT ARROW ABOVE */
00548   0x20D4,
00549   0x20D5,
00550   0x20D6,
00551   0x20D7,
00552   /* 230 # Mn   [2] COMBINING THREE DOTS ABOVE..
00553    *                    ..COMBINING FOUR DOTS ABOVE */
00554   0x20DB,
00555   0x20DC,
00556   /* 230 # Mn       COMBINING LEFT RIGHT ARROW ABOVE */
00557   0x20E1,
00558   /* 230 # Mn       COMBINING ANNUITY SYMBOL */
00559   0x20E7,
00560   /* 230 # Mn       COMBINING WIDE BRIDGE ABOVE */
00561   0x20E9,
00562   /* 230 # Mn   [4] COMBINING LIGATURE LEFT HALF..
00563    *                    ..COMBINING DOUBLE TILDE RIGHT HALF */
00564   0xFE20,
00565   0xFE21,
00566   0xFE22,
00567   0xFE23,
00568   /* 230 # Mn   [5] MUSICAL SYMBOL COMBINING DOIT..
00569    *                    ..MUSICAL SYMBOL COMBINING BEND */
00570   0x1D185,
00571   0x1D186,
00572   0x1D187,
00573   0x1D188,
00574   0x1D189,
00575   /* 230 # Mn   [4] MUSICAL SYMBOL COMBINING DOWN BOW..
00576    *                    ..MUSICAL SYMBOL COMBINING SNAP PIZZICATO */
00577   0x1D1AA,
00578   0x1D1AB,
00579   0x1D1AC,
00580   0x1D1AD,
00581   /* 232 # Mn       COMBINING COMMA ABOVE RIGHT */
00582   0x0315,
00583   /* 232 # Mn       COMBINING LEFT ANGLE ABOVE */
00584   0x031A,
00585   /* 232 # Mn       IDEOGRAPHIC DEPARTING TONE MARK */
00586   0x302C,
00587   /* 233 # Mn       COMBINING DOUBLE RIGHTWARDS ARROW BELOW */
00588   0x0362,
00589   /* 234 # Mn   [2] COMBINING DOUBLE TILDE..
00590    *                    ..COMBINING DOUBLE INVERTED BREVE */
00591   0x0360,
00592   0x0361,
00593   /* 240 # Mn       COMBINING GREEK YPOGEGRAMMENI */
00594   0x0345,
00595   0
00596 };
00597 
00598 /*
00599  * 09C7 BENGALI VOWEL SIGN E    09BE BENGALI VOWEL SIGN AA or
00600  *                              09D7 BENGALI AU LENGTH MARK
00601  */
00602 
00603 static const uint32_t pr29_1_1[] = {
00604   0x09C7, 0
00605 };
00606 
00607 static const uint32_t pr29_1_2[] = {
00608   0x09BE, 0x09D7, 0
00609 };
00610 
00611 /*
00612  * 0B47 ORIYA VOWEL SIGN E      0B3E ORIYA VOWEL SIGN AA or
00613  *                              0B56 ORIYA AI LENGTH MARK or
00614  *                              0B57 ORIYA AU LENGTH MARK
00615  */
00616 
00617 static const uint32_t pr29_2_1[] = {
00618   0x0B47, 0
00619 };
00620 
00621 static const uint32_t pr29_2_2[] = {
00622   0x0B3E, 0x0B56, 0x0B57, 0
00623 };
00624 
00625 /*
00626  * 0BC6 TAMIL VOWEL SIGN E      0BBE TAMIL VOWEL SIGN AA or
00627  *                              0BD7 TAMIL AU LENGTH MARK
00628  */
00629 
00630 static const uint32_t pr29_3_1[] = {
00631   0x0BC6, 0
00632 };
00633 
00634 static const uint32_t pr29_3_2[] = {
00635   0x0BBE, 0x0BD7, 0
00636 };
00637 
00638 /*
00639  * 0BC7 TAMIL VOWEL SIGN EE     0BBE TAMIL VOWEL SIGN AA
00640  */
00641 
00642 static const uint32_t pr29_4_1[] = {
00643   0x0BC7, 0
00644 };
00645 
00646 static const uint32_t pr29_4_2[] = {
00647   0x0BBE, 0
00648 };
00649 
00650 /*
00651  * 0B92 TAMIL LETTER O          0BD7 TAMIL AU LENGTH MARK
00652  */
00653 
00654 static const uint32_t pr29_5_1[] = {
00655   0x0B92, 0
00656 };
00657 
00658 static const uint32_t pr29_5_2[] = {
00659   0x0BD7, 0
00660 };
00661 
00662 /*
00663  * 0CC6 KANNADA VOWEL SIGN E    0CC2 KANNADA VOWEL SIGN UU or
00664  *                              0CD5 KANNADA LENGTH MARK or
00665  *                              0CD6 KANNADA AI LENGTH MARK
00666  */
00667 
00668 static const uint32_t pr29_6_1[] = {
00669   0x0CC6, 0
00670 };
00671 
00672 static const uint32_t pr29_6_2[] = {
00673   0x0CC2, 0xCD5, 0xCD6, 0
00674 };
00675 
00676 /*
00677  * 0CBF KANNADA VOWEL SIGN I or
00678  * 0CCA KANNADA VOWEL SIGN O    0CD5 KANNADA LENGTH MARK
00679  */
00680 
00681 static const uint32_t pr29_7_1[] = {
00682   0x0CBF, 0xCCA, 0
00683 };
00684 
00685 static const uint32_t pr29_7_2[] = {
00686   0x0CD5, 0
00687 };
00688 
00689 /*
00690  * 0D47 MALAYALAM VOWEL SIGN EE         0D3E MALAYALAM VOWEL SIGN AA
00691  */
00692 
00693 static const uint32_t pr29_8_1[] = {
00694   0x0D47, 0
00695 };
00696 
00697 static const uint32_t pr29_8_2[] = {
00698   0x0D3E, 0
00699 };
00700 
00701 /*
00702  * 0D46 MALAYALAM VOWEL SIGN E          0D3E MALAYALAM VOWEL SIGN AA or
00703  *                                      0D57 MALAYALAM AU LENGTH MARK
00704  */
00705 
00706 static const uint32_t pr29_9_1[] = {
00707   0x0D46, 0
00708 };
00709 
00710 static const uint32_t pr29_9_2[] = {
00711   0x0D3E, 0x0D57, 0
00712 };
00713 
00714 /*
00715  * 1025 MYANMAR LETTER U                102E MYANMAR VOWEL SIGN II
00716  */
00717 
00718 static const uint32_t pr29_10_1[] = {
00719   0x1025, 0
00720 };
00721 
00722 static const uint32_t pr29_10_2[] = {
00723   0x102E, 0
00724 };
00725 
00726 /*
00727  * 0DD9 SINHALA VOWEL SIGN KOMBUVA      0DCF SINHALA VOWEL SIGN AELA-PILLA or
00728  *                                      0DDF SINHALA VOWEL SIGN GAYANUKITTA
00729  */
00730 
00731 static const uint32_t pr29_11_1[] = {
00732   0x0DD9, 0
00733 };
00734 
00735 static const uint32_t pr29_11_2[] = {
00736   0x0DCF, 0x0DDF, 0
00737 };
00738 
00739 /*
00740  * 1100..1112 HANGUL CHOSEONG KIYEOK..HIEUH [19 instances]
00741  *                              1161..1175 HANGUL JUNGSEONG A..I [21 instances]
00742  */
00743 
00744 static const uint32_t pr29_12_1[] = {
00745   0x1100, 0x1101, 0x1102, 0x1103, 0x1104, 0x1105, 0x1106, 0x1107,
00746   0x1108, 0x1109, 0x110A, 0x110B, 0x110C, 0x110D, 0x110E, 0x110F,
00747   0x1110, 0x1111, 0x1112, 0
00748 };
00749 
00750 static const uint32_t pr29_12_2[] = {
00751   0x1161, 0x1162, 0x1163, 0x1164, 0x1165, 0x1166, 0x1167, 0x1168,
00752   0x1169, 0x116A, 0x116B, 0x116C, 0x116D, 0x116E, 0x116F, 0x1170,
00753   0x1171, 0x1172, 0x1173, 0x1174, 0x1175, 0
00754 };
00755 
00756 
00757 /*
00758  * [:HangulSyllableType=LV:]
00759  *                     11A8..11C2 HANGUL JONGSEONG KIYEOK..HIEUH [27 instances]
00760  */
00761 
00762 static const uint32_t pr29_13_1[] = {
00763   0xAC00,                       /* LV # Lo       HANGUL SYLLABLE GA     */
00764   0xAC1C,                       /* LV # Lo       HANGUL SYLLABLE GAE    */
00765   0xAC38,                       /* LV # Lo       HANGUL SYLLABLE GYA    */
00766   0xAC54,                       /* LV # Lo       HANGUL SYLLABLE GYAE   */
00767   0xAC70,                       /* LV # Lo       HANGUL SYLLABLE GEO    */
00768   0xAC8C,                       /* LV # Lo       HANGUL SYLLABLE GE     */
00769   0xACA8,                       /* LV # Lo       HANGUL SYLLABLE GYEO   */
00770   0xACC4,                       /* LV # Lo       HANGUL SYLLABLE GYE    */
00771   0xACE0,                       /* LV # Lo       HANGUL SYLLABLE GO     */
00772   0xACFC,                       /* LV # Lo       HANGUL SYLLABLE GWA    */
00773   0xAD18,                       /* LV # Lo       HANGUL SYLLABLE GWAE   */
00774   0xAD34,                       /* LV # Lo       HANGUL SYLLABLE GOE    */
00775   0xAD50,                       /* LV # Lo       HANGUL SYLLABLE GYO    */
00776   0xAD6C,                       /* LV # Lo       HANGUL SYLLABLE GU     */
00777   0xAD88,                       /* LV # Lo       HANGUL SYLLABLE GWEO   */
00778   0xADA4,                       /* LV # Lo       HANGUL SYLLABLE GWE    */
00779   0xADC0,                       /* LV # Lo       HANGUL SYLLABLE GWI    */
00780   0xADDC,                       /* LV # Lo       HANGUL SYLLABLE GYU    */
00781   0xADF8,                       /* LV # Lo       HANGUL SYLLABLE GEU    */
00782   0xAE14,                       /* LV # Lo       HANGUL SYLLABLE GYI    */
00783   0xAE30,                       /* LV # Lo       HANGUL SYLLABLE GI     */
00784   0xAE4C,                       /* LV # Lo       HANGUL SYLLABLE GGA    */
00785   0xAE68,                       /* LV # Lo       HANGUL SYLLABLE GGAE   */
00786   0xAE84,                       /* LV # Lo       HANGUL SYLLABLE GGYA   */
00787   0xAEA0,                       /* LV # Lo       HANGUL SYLLABLE GGYAE  */
00788   0xAEBC,                       /* LV # Lo       HANGUL SYLLABLE GGEO   */
00789   0xAED8,                       /* LV # Lo       HANGUL SYLLABLE GGE    */
00790   0xAEF4,                       /* LV # Lo       HANGUL SYLLABLE GGYEO  */
00791   0xAF10,                       /* LV # Lo       HANGUL SYLLABLE GGYE   */
00792   0xAF2C,                       /* LV # Lo       HANGUL SYLLABLE GGO    */
00793   0xAF48,                       /* LV # Lo       HANGUL SYLLABLE GGWA   */
00794   0xAF64,                       /* LV # Lo       HANGUL SYLLABLE GGWAE  */
00795   0xAF80,                       /* LV # Lo       HANGUL SYLLABLE GGOE   */
00796   0xAF9C,                       /* LV # Lo       HANGUL SYLLABLE GGYO   */
00797   0xAFB8,                       /* LV # Lo       HANGUL SYLLABLE GGU    */
00798   0xAFD4,                       /* LV # Lo       HANGUL SYLLABLE GGWEO  */
00799   0xAFF0,                       /* LV # Lo       HANGUL SYLLABLE GGWE   */
00800   0xB00C,                       /* LV # Lo       HANGUL SYLLABLE GGWI   */
00801   0xB028,                       /* LV # Lo       HANGUL SYLLABLE GGYU   */
00802   0xB044,                       /* LV # Lo       HANGUL SYLLABLE GGEU   */
00803   0xB060,                       /* LV # Lo       HANGUL SYLLABLE GGYI   */
00804   0xB07C,                       /* LV # Lo       HANGUL SYLLABLE GGI    */
00805   0xB098,                       /* LV # Lo       HANGUL SYLLABLE NA     */
00806   0xB0B4,                       /* LV # Lo       HANGUL SYLLABLE NAE    */
00807   0xB0D0,                       /* LV # Lo       HANGUL SYLLABLE NYA    */
00808   0xB0EC,                       /* LV # Lo       HANGUL SYLLABLE NYAE   */
00809   0xB108,                       /* LV # Lo       HANGUL SYLLABLE NEO    */
00810   0xB124,                       /* LV # Lo       HANGUL SYLLABLE NE     */
00811   0xB140,                       /* LV # Lo       HANGUL SYLLABLE NYEO   */
00812   0xB15C,                       /* LV # Lo       HANGUL SYLLABLE NYE    */
00813   0xB178,                       /* LV # Lo       HANGUL SYLLABLE NO     */
00814   0xB194,                       /* LV # Lo       HANGUL SYLLABLE NWA    */
00815   0xB1B0,                       /* LV # Lo       HANGUL SYLLABLE NWAE   */
00816   0xB1CC,                       /* LV # Lo       HANGUL SYLLABLE NOE    */
00817   0xB1E8,                       /* LV # Lo       HANGUL SYLLABLE NYO    */
00818   0xB204,                       /* LV # Lo       HANGUL SYLLABLE NU     */
00819   0xB220,                       /* LV # Lo       HANGUL SYLLABLE NWEO   */
00820   0xB23C,                       /* LV # Lo       HANGUL SYLLABLE NWE    */
00821   0xB258,                       /* LV # Lo       HANGUL SYLLABLE NWI    */
00822   0xB274,                       /* LV # Lo       HANGUL SYLLABLE NYU    */
00823   0xB290,                       /* LV # Lo       HANGUL SYLLABLE NEU    */
00824   0xB2AC,                       /* LV # Lo       HANGUL SYLLABLE NYI    */
00825   0xB2C8,                       /* LV # Lo       HANGUL SYLLABLE NI     */
00826   0xB2E4,                       /* LV # Lo       HANGUL SYLLABLE DA     */
00827   0xB300,                       /* LV # Lo       HANGUL SYLLABLE DAE    */
00828   0xB31C,                       /* LV # Lo       HANGUL SYLLABLE DYA    */
00829   0xB338,                       /* LV # Lo       HANGUL SYLLABLE DYAE   */
00830   0xB354,                       /* LV # Lo       HANGUL SYLLABLE DEO    */
00831   0xB370,                       /* LV # Lo       HANGUL SYLLABLE DE     */
00832   0xB38C,                       /* LV # Lo       HANGUL SYLLABLE DYEO   */
00833   0xB3A8,                       /* LV # Lo       HANGUL SYLLABLE DYE    */
00834   0xB3C4,                       /* LV # Lo       HANGUL SYLLABLE DO     */
00835   0xB3E0,                       /* LV # Lo       HANGUL SYLLABLE DWA    */
00836   0xB3FC,                       /* LV # Lo       HANGUL SYLLABLE DWAE   */
00837   0xB418,                       /* LV # Lo       HANGUL SYLLABLE DOE    */
00838   0xB434,                       /* LV # Lo       HANGUL SYLLABLE DYO    */
00839   0xB450,                       /* LV # Lo       HANGUL SYLLABLE DU     */
00840   0xB46C,                       /* LV # Lo       HANGUL SYLLABLE DWEO   */
00841   0xB488,                       /* LV # Lo       HANGUL SYLLABLE DWE    */
00842   0xB4A4,                       /* LV # Lo       HANGUL SYLLABLE DWI    */
00843   0xB4C0,                       /* LV # Lo       HANGUL SYLLABLE DYU    */
00844   0xB4DC,                       /* LV # Lo       HANGUL SYLLABLE DEU    */
00845   0xB4F8,                       /* LV # Lo       HANGUL SYLLABLE DYI    */
00846   0xB514,                       /* LV # Lo       HANGUL SYLLABLE DI     */
00847   0xB530,                       /* LV # Lo       HANGUL SYLLABLE DDA    */
00848   0xB54C,                       /* LV # Lo       HANGUL SYLLABLE DDAE   */
00849   0xB568,                       /* LV # Lo       HANGUL SYLLABLE DDYA   */
00850   0xB584,                       /* LV # Lo       HANGUL SYLLABLE DDYAE  */
00851   0xB5A0,                       /* LV # Lo       HANGUL SYLLABLE DDEO   */
00852   0xB5BC,                       /* LV # Lo       HANGUL SYLLABLE DDE    */
00853   0xB5D8,                       /* LV # Lo       HANGUL SYLLABLE DDYEO  */
00854   0xB5F4,                       /* LV # Lo       HANGUL SYLLABLE DDYE   */
00855   0xB610,                       /* LV # Lo       HANGUL SYLLABLE DDO    */
00856   0xB62C,                       /* LV # Lo       HANGUL SYLLABLE DDWA   */
00857   0xB648,                       /* LV # Lo       HANGUL SYLLABLE DDWAE  */
00858   0xB664,                       /* LV # Lo       HANGUL SYLLABLE DDOE   */
00859   0xB680,                       /* LV # Lo       HANGUL SYLLABLE DDYO   */
00860   0xB69C,                       /* LV # Lo       HANGUL SYLLABLE DDU    */
00861   0xB6B8,                       /* LV # Lo       HANGUL SYLLABLE DDWEO  */
00862   0xB6D4,                       /* LV # Lo       HANGUL SYLLABLE DDWE   */
00863   0xB6F0,                       /* LV # Lo       HANGUL SYLLABLE DDWI   */
00864   0xB70C,                       /* LV # Lo       HANGUL SYLLABLE DDYU   */
00865   0xB728,                       /* LV # Lo       HANGUL SYLLABLE DDEU   */
00866   0xB744,                       /* LV # Lo       HANGUL SYLLABLE DDYI   */
00867   0xB760,                       /* LV # Lo       HANGUL SYLLABLE DDI    */
00868   0xB77C,                       /* LV # Lo       HANGUL SYLLABLE RA     */
00869   0xB798,                       /* LV # Lo       HANGUL SYLLABLE RAE    */
00870   0xB7B4,                       /* LV # Lo       HANGUL SYLLABLE RYA    */
00871   0xB7D0,                       /* LV # Lo       HANGUL SYLLABLE RYAE   */
00872   0xB7EC,                       /* LV # Lo       HANGUL SYLLABLE REO    */
00873   0xB808,                       /* LV # Lo       HANGUL SYLLABLE RE     */
00874   0xB824,                       /* LV # Lo       HANGUL SYLLABLE RYEO   */
00875   0xB840,                       /* LV # Lo       HANGUL SYLLABLE RYE    */
00876   0xB85C,                       /* LV # Lo       HANGUL SYLLABLE RO     */
00877   0xB878,                       /* LV # Lo       HANGUL SYLLABLE RWA    */
00878   0xB894,                       /* LV # Lo       HANGUL SYLLABLE RWAE   */
00879   0xB8B0,                       /* LV # Lo       HANGUL SYLLABLE ROE    */
00880   0xB8CC,                       /* LV # Lo       HANGUL SYLLABLE RYO    */
00881   0xB8E8,                       /* LV # Lo       HANGUL SYLLABLE RU     */
00882   0xB904,                       /* LV # Lo       HANGUL SYLLABLE RWEO   */
00883   0xB920,                       /* LV # Lo       HANGUL SYLLABLE RWE    */
00884   0xB93C,                       /* LV # Lo       HANGUL SYLLABLE RWI    */
00885   0xB958,                       /* LV # Lo       HANGUL SYLLABLE RYU    */
00886   0xB974,                       /* LV # Lo       HANGUL SYLLABLE REU    */
00887   0xB990,                       /* LV # Lo       HANGUL SYLLABLE RYI    */
00888   0xB9AC,                       /* LV # Lo       HANGUL SYLLABLE RI     */
00889   0xB9C8,                       /* LV # Lo       HANGUL SYLLABLE MA     */
00890   0xB9E4,                       /* LV # Lo       HANGUL SYLLABLE MAE    */
00891   0xBA00,                       /* LV # Lo       HANGUL SYLLABLE MYA    */
00892   0xBA1C,                       /* LV # Lo       HANGUL SYLLABLE MYAE   */
00893   0xBA38,                       /* LV # Lo       HANGUL SYLLABLE MEO    */
00894   0xBA54,                       /* LV # Lo       HANGUL SYLLABLE ME     */
00895   0xBA70,                       /* LV # Lo       HANGUL SYLLABLE MYEO   */
00896   0xBA8C,                       /* LV # Lo       HANGUL SYLLABLE MYE    */
00897   0xBAA8,                       /* LV # Lo       HANGUL SYLLABLE MO     */
00898   0xBAC4,                       /* LV # Lo       HANGUL SYLLABLE MWA    */
00899   0xBAE0,                       /* LV # Lo       HANGUL SYLLABLE MWAE   */
00900   0xBAFC,                       /* LV # Lo       HANGUL SYLLABLE MOE    */
00901   0xBB18,                       /* LV # Lo       HANGUL SYLLABLE MYO    */
00902   0xBB34,                       /* LV # Lo       HANGUL SYLLABLE MU     */
00903   0xBB50,                       /* LV # Lo       HANGUL SYLLABLE MWEO   */
00904   0xBB6C,                       /* LV # Lo       HANGUL SYLLABLE MWE    */
00905   0xBB88,                       /* LV # Lo       HANGUL SYLLABLE MWI    */
00906   0xBBA4,                       /* LV # Lo       HANGUL SYLLABLE MYU    */
00907   0xBBC0,                       /* LV # Lo       HANGUL SYLLABLE MEU    */
00908   0xBBDC,                       /* LV # Lo       HANGUL SYLLABLE MYI    */
00909   0xBBF8,                       /* LV # Lo       HANGUL SYLLABLE MI     */
00910   0xBC14,                       /* LV # Lo       HANGUL SYLLABLE BA     */
00911   0xBC30,                       /* LV # Lo       HANGUL SYLLABLE BAE    */
00912   0xBC4C,                       /* LV # Lo       HANGUL SYLLABLE BYA    */
00913   0xBC68,                       /* LV # Lo       HANGUL SYLLABLE BYAE   */
00914   0xBC84,                       /* LV # Lo       HANGUL SYLLABLE BEO    */
00915   0xBCA0,                       /* LV # Lo       HANGUL SYLLABLE BE     */
00916   0xBCBC,                       /* LV # Lo       HANGUL SYLLABLE BYEO   */
00917   0xBCD8,                       /* LV # Lo       HANGUL SYLLABLE BYE    */
00918   0xBCF4,                       /* LV # Lo       HANGUL SYLLABLE BO     */
00919   0xBD10,                       /* LV # Lo       HANGUL SYLLABLE BWA    */
00920   0xBD2C,                       /* LV # Lo       HANGUL SYLLABLE BWAE   */
00921   0xBD48,                       /* LV # Lo       HANGUL SYLLABLE BOE    */
00922   0xBD64,                       /* LV # Lo       HANGUL SYLLABLE BYO    */
00923   0xBD80,                       /* LV # Lo       HANGUL SYLLABLE BU     */
00924   0xBD9C,                       /* LV # Lo       HANGUL SYLLABLE BWEO   */
00925   0xBDB8,                       /* LV # Lo       HANGUL SYLLABLE BWE    */
00926   0xBDD4,                       /* LV # Lo       HANGUL SYLLABLE BWI    */
00927   0xBDF0,                       /* LV # Lo       HANGUL SYLLABLE BYU    */
00928   0xBE0C,                       /* LV # Lo       HANGUL SYLLABLE BEU    */
00929   0xBE28,                       /* LV # Lo       HANGUL SYLLABLE BYI    */
00930   0xBE44,                       /* LV # Lo       HANGUL SYLLABLE BI     */
00931   0xBE60,                       /* LV # Lo       HANGUL SYLLABLE BBA    */
00932   0xBE7C,                       /* LV # Lo       HANGUL SYLLABLE BBAE   */
00933   0xBE98,                       /* LV # Lo       HANGUL SYLLABLE BBYA   */
00934   0xBEB4,                       /* LV # Lo       HANGUL SYLLABLE BBYAE  */
00935   0xBED0,                       /* LV # Lo       HANGUL SYLLABLE BBEO   */
00936   0xBEEC,                       /* LV # Lo       HANGUL SYLLABLE BBE    */
00937   0xBF08,                       /* LV # Lo       HANGUL SYLLABLE BBYEO  */
00938   0xBF24,                       /* LV # Lo       HANGUL SYLLABLE BBYE   */
00939   0xBF40,                       /* LV # Lo       HANGUL SYLLABLE BBO    */
00940   0xBF5C,                       /* LV # Lo       HANGUL SYLLABLE BBWA   */
00941   0xBF78,                       /* LV # Lo       HANGUL SYLLABLE BBWAE  */
00942   0xBF94,                       /* LV # Lo       HANGUL SYLLABLE BBOE   */
00943   0xBFB0,                       /* LV # Lo       HANGUL SYLLABLE BBYO   */
00944   0xBFCC,                       /* LV # Lo       HANGUL SYLLABLE BBU    */
00945   0xBFE8,                       /* LV # Lo       HANGUL SYLLABLE BBWEO  */
00946   0xC004,                       /* LV # Lo       HANGUL SYLLABLE BBWE   */
00947   0xC020,                       /* LV # Lo       HANGUL SYLLABLE BBWI   */
00948   0xC03C,                       /* LV # Lo       HANGUL SYLLABLE BBYU   */
00949   0xC058,                       /* LV # Lo       HANGUL SYLLABLE BBEU   */
00950   0xC074,                       /* LV # Lo       HANGUL SYLLABLE BBYI   */
00951   0xC090,                       /* LV # Lo       HANGUL SYLLABLE BBI    */
00952   0xC0AC,                       /* LV # Lo       HANGUL SYLLABLE SA     */
00953   0xC0C8,                       /* LV # Lo       HANGUL SYLLABLE SAE    */
00954   0xC0E4,                       /* LV # Lo       HANGUL SYLLABLE SYA    */
00955   0xC100,                       /* LV # Lo       HANGUL SYLLABLE SYAE   */
00956   0xC11C,                       /* LV # Lo       HANGUL SYLLABLE SEO    */
00957   0xC138,                       /* LV # Lo       HANGUL SYLLABLE SE     */
00958   0xC154,                       /* LV # Lo       HANGUL SYLLABLE SYEO   */
00959   0xC170,                       /* LV # Lo       HANGUL SYLLABLE SYE    */
00960   0xC18C,                       /* LV # Lo       HANGUL SYLLABLE SO     */
00961   0xC1A8,                       /* LV # Lo       HANGUL SYLLABLE SWA    */
00962   0xC1C4,                       /* LV # Lo       HANGUL SYLLABLE SWAE   */
00963   0xC1E0,                       /* LV # Lo       HANGUL SYLLABLE SOE    */
00964   0xC1FC,                       /* LV # Lo       HANGUL SYLLABLE SYO    */
00965   0xC218,                       /* LV # Lo       HANGUL SYLLABLE SU     */
00966   0xC234,                       /* LV # Lo       HANGUL SYLLABLE SWEO   */
00967   0xC250,                       /* LV # Lo       HANGUL SYLLABLE SWE    */
00968   0xC26C,                       /* LV # Lo       HANGUL SYLLABLE SWI    */
00969   0xC288,                       /* LV # Lo       HANGUL SYLLABLE SYU    */
00970   0xC2A4,                       /* LV # Lo       HANGUL SYLLABLE SEU    */
00971   0xC2C0,                       /* LV # Lo       HANGUL SYLLABLE SYI    */
00972   0xC2DC,                       /* LV # Lo       HANGUL SYLLABLE SI     */
00973   0xC2F8,                       /* LV # Lo       HANGUL SYLLABLE SSA    */
00974   0xC314,                       /* LV # Lo       HANGUL SYLLABLE SSAE   */
00975   0xC330,                       /* LV # Lo       HANGUL SYLLABLE SSYA   */
00976   0xC34C,                       /* LV # Lo       HANGUL SYLLABLE SSYAE  */
00977   0xC368,                       /* LV # Lo       HANGUL SYLLABLE SSEO   */
00978   0xC384,                       /* LV # Lo       HANGUL SYLLABLE SSE    */
00979   0xC3A0,                       /* LV # Lo       HANGUL SYLLABLE SSYEO  */
00980   0xC3BC,                       /* LV # Lo       HANGUL SYLLABLE SSYE   */
00981   0xC3D8,                       /* LV # Lo       HANGUL SYLLABLE SSO    */
00982   0xC3F4,                       /* LV # Lo       HANGUL SYLLABLE SSWA   */
00983   0xC410,                       /* LV # Lo       HANGUL SYLLABLE SSWAE  */
00984   0xC42C,                       /* LV # Lo       HANGUL SYLLABLE SSOE   */
00985   0xC448,                       /* LV # Lo       HANGUL SYLLABLE SSYO   */
00986   0xC464,                       /* LV # Lo       HANGUL SYLLABLE SSU    */
00987   0xC480,                       /* LV # Lo       HANGUL SYLLABLE SSWEO  */
00988   0xC49C,                       /* LV # Lo       HANGUL SYLLABLE SSWE   */
00989   0xC4B8,                       /* LV # Lo       HANGUL SYLLABLE SSWI   */
00990   0xC4D4,                       /* LV # Lo       HANGUL SYLLABLE SSYU   */
00991   0xC4F0,                       /* LV # Lo       HANGUL SYLLABLE SSEU   */
00992   0xC50C,                       /* LV # Lo       HANGUL SYLLABLE SSYI   */
00993   0xC528,                       /* LV # Lo       HANGUL SYLLABLE SSI    */
00994   0xC544,                       /* LV # Lo       HANGUL SYLLABLE A      */
00995   0xC560,                       /* LV # Lo       HANGUL SYLLABLE AE     */
00996   0xC57C,                       /* LV # Lo       HANGUL SYLLABLE YA     */
00997   0xC598,                       /* LV # Lo       HANGUL SYLLABLE YAE    */
00998   0xC5B4,                       /* LV # Lo       HANGUL SYLLABLE EO     */
00999   0xC5D0,                       /* LV # Lo       HANGUL SYLLABLE E      */
01000   0xC5EC,                       /* LV # Lo       HANGUL SYLLABLE YEO    */
01001   0xC608,                       /* LV # Lo       HANGUL SYLLABLE YE     */
01002   0xC624,                       /* LV # Lo       HANGUL SYLLABLE O      */
01003   0xC640,                       /* LV # Lo       HANGUL SYLLABLE WA     */
01004   0xC65C,                       /* LV # Lo       HANGUL SYLLABLE WAE    */
01005   0xC678,                       /* LV # Lo       HANGUL SYLLABLE OE     */
01006   0xC694,                       /* LV # Lo       HANGUL SYLLABLE YO     */
01007   0xC6B0,                       /* LV # Lo       HANGUL SYLLABLE U      */
01008   0xC6CC,                       /* LV # Lo       HANGUL SYLLABLE WEO    */
01009   0xC6E8,                       /* LV # Lo       HANGUL SYLLABLE WE     */
01010   0xC704,                       /* LV # Lo       HANGUL SYLLABLE WI     */
01011   0xC720,                       /* LV # Lo       HANGUL SYLLABLE YU     */
01012   0xC73C,                       /* LV # Lo       HANGUL SYLLABLE EU     */
01013   0xC758,                       /* LV # Lo       HANGUL SYLLABLE YI     */
01014   0xC774,                       /* LV # Lo       HANGUL SYLLABLE I      */
01015   0xC790,                       /* LV # Lo       HANGUL SYLLABLE JA     */
01016   0xC7AC,                       /* LV # Lo       HANGUL SYLLABLE JAE    */
01017   0xC7C8,                       /* LV # Lo       HANGUL SYLLABLE JYA    */
01018   0xC7E4,                       /* LV # Lo       HANGUL SYLLABLE JYAE   */
01019   0xC800,                       /* LV # Lo       HANGUL SYLLABLE JEO    */
01020   0xC81C,                       /* LV # Lo       HANGUL SYLLABLE JE     */
01021   0xC838,                       /* LV # Lo       HANGUL SYLLABLE JYEO   */
01022   0xC854,                       /* LV # Lo       HANGUL SYLLABLE JYE    */
01023   0xC870,                       /* LV # Lo       HANGUL SYLLABLE JO     */
01024   0xC88C,                       /* LV # Lo       HANGUL SYLLABLE JWA    */
01025   0xC8A8,                       /* LV # Lo       HANGUL SYLLABLE JWAE   */
01026   0xC8C4,                       /* LV # Lo       HANGUL SYLLABLE JOE    */
01027   0xC8E0,                       /* LV # Lo       HANGUL SYLLABLE JYO    */
01028   0xC8FC,                       /* LV # Lo       HANGUL SYLLABLE JU     */
01029   0xC918,                       /* LV # Lo       HANGUL SYLLABLE JWEO   */
01030   0xC934,                       /* LV # Lo       HANGUL SYLLABLE JWE    */
01031   0xC950,                       /* LV # Lo       HANGUL SYLLABLE JWI    */
01032   0xC96C,                       /* LV # Lo       HANGUL SYLLABLE JYU    */
01033   0xC988,                       /* LV # Lo       HANGUL SYLLABLE JEU    */
01034   0xC9A4,                       /* LV # Lo       HANGUL SYLLABLE JYI    */
01035   0xC9C0,                       /* LV # Lo       HANGUL SYLLABLE JI     */
01036   0xC9DC,                       /* LV # Lo       HANGUL SYLLABLE JJA    */
01037   0xC9F8,                       /* LV # Lo       HANGUL SYLLABLE JJAE   */
01038   0xCA14,                       /* LV # Lo       HANGUL SYLLABLE JJYA   */
01039   0xCA30,                       /* LV # Lo       HANGUL SYLLABLE JJYAE  */
01040   0xCA4C,                       /* LV # Lo       HANGUL SYLLABLE JJEO   */
01041   0xCA68,                       /* LV # Lo       HANGUL SYLLABLE JJE    */
01042   0xCA84,                       /* LV # Lo       HANGUL SYLLABLE JJYEO  */
01043   0xCAA0,                       /* LV # Lo       HANGUL SYLLABLE JJYE   */
01044   0xCABC,                       /* LV # Lo       HANGUL SYLLABLE JJO    */
01045   0xCAD8,                       /* LV # Lo       HANGUL SYLLABLE JJWA   */
01046   0xCAF4,                       /* LV # Lo       HANGUL SYLLABLE JJWAE  */
01047   0xCB10,                       /* LV # Lo       HANGUL SYLLABLE JJOE   */
01048   0xCB2C,                       /* LV # Lo       HANGUL SYLLABLE JJYO   */
01049   0xCB48,                       /* LV # Lo       HANGUL SYLLABLE JJU    */
01050   0xCB64,                       /* LV # Lo       HANGUL SYLLABLE JJWEO  */
01051   0xCB80,                       /* LV # Lo       HANGUL SYLLABLE JJWE   */
01052   0xCB9C,                       /* LV # Lo       HANGUL SYLLABLE JJWI   */
01053   0xCBB8,                       /* LV # Lo       HANGUL SYLLABLE JJYU   */
01054   0xCBD4,                       /* LV # Lo       HANGUL SYLLABLE JJEU   */
01055   0xCBF0,                       /* LV # Lo       HANGUL SYLLABLE JJYI   */
01056   0xCC0C,                       /* LV # Lo       HANGUL SYLLABLE JJI    */
01057   0xCC28,                       /* LV # Lo       HANGUL SYLLABLE CA     */
01058   0xCC44,                       /* LV # Lo       HANGUL SYLLABLE CAE    */
01059   0xCC60,                       /* LV # Lo       HANGUL SYLLABLE CYA    */
01060   0xCC7C,                       /* LV # Lo       HANGUL SYLLABLE CYAE   */
01061   0xCC98,                       /* LV # Lo       HANGUL SYLLABLE CEO    */
01062   0xCCB4,                       /* LV # Lo       HANGUL SYLLABLE CE     */
01063   0xCCD0,                       /* LV # Lo       HANGUL SYLLABLE CYEO   */
01064   0xCCEC,                       /* LV # Lo       HANGUL SYLLABLE CYE    */
01065   0xCD08,                       /* LV # Lo       HANGUL SYLLABLE CO     */
01066   0xCD24,                       /* LV # Lo       HANGUL SYLLABLE CWA    */
01067   0xCD40,                       /* LV # Lo       HANGUL SYLLABLE CWAE   */
01068   0xCD5C,                       /* LV # Lo       HANGUL SYLLABLE COE    */
01069   0xCD78,                       /* LV # Lo       HANGUL SYLLABLE CYO    */
01070   0xCD94,                       /* LV # Lo       HANGUL SYLLABLE CU     */
01071   0xCDB0,                       /* LV # Lo       HANGUL SYLLABLE CWEO   */
01072   0xCDCC,                       /* LV # Lo       HANGUL SYLLABLE CWE    */
01073   0xCDE8,                       /* LV # Lo       HANGUL SYLLABLE CWI    */
01074   0xCE04,                       /* LV # Lo       HANGUL SYLLABLE CYU    */
01075   0xCE20,                       /* LV # Lo       HANGUL SYLLABLE CEU    */
01076   0xCE3C,                       /* LV # Lo       HANGUL SYLLABLE CYI    */
01077   0xCE58,                       /* LV # Lo       HANGUL SYLLABLE CI     */
01078   0xCE74,                       /* LV # Lo       HANGUL SYLLABLE KA     */
01079   0xCE90,                       /* LV # Lo       HANGUL SYLLABLE KAE    */
01080   0xCEAC,                       /* LV # Lo       HANGUL SYLLABLE KYA    */
01081   0xCEC8,                       /* LV # Lo       HANGUL SYLLABLE KYAE   */
01082   0xCEE4,                       /* LV # Lo       HANGUL SYLLABLE KEO    */
01083   0xCF00,                       /* LV # Lo       HANGUL SYLLABLE KE     */
01084   0xCF1C,                       /* LV # Lo       HANGUL SYLLABLE KYEO   */
01085   0xCF38,                       /* LV # Lo       HANGUL SYLLABLE KYE    */
01086   0xCF54,                       /* LV # Lo       HANGUL SYLLABLE KO     */
01087   0xCF70,                       /* LV # Lo       HANGUL SYLLABLE KWA    */
01088   0xCF8C,                       /* LV # Lo       HANGUL SYLLABLE KWAE   */
01089   0xCFA8,                       /* LV # Lo       HANGUL SYLLABLE KOE    */
01090   0xCFC4,                       /* LV # Lo       HANGUL SYLLABLE KYO    */
01091   0xCFE0,                       /* LV # Lo       HANGUL SYLLABLE KU     */
01092   0xCFFC,                       /* LV # Lo       HANGUL SYLLABLE KWEO   */
01093   0xD018,                       /* LV # Lo       HANGUL SYLLABLE KWE    */
01094   0xD034,                       /* LV # Lo       HANGUL SYLLABLE KWI    */
01095   0xD050,                       /* LV # Lo       HANGUL SYLLABLE KYU    */
01096   0xD06C,                       /* LV # Lo       HANGUL SYLLABLE KEU    */
01097   0xD088,                       /* LV # Lo       HANGUL SYLLABLE KYI    */
01098   0xD0A4,                       /* LV # Lo       HANGUL SYLLABLE KI     */
01099   0xD0C0,                       /* LV # Lo       HANGUL SYLLABLE TA     */
01100   0xD0DC,                       /* LV # Lo       HANGUL SYLLABLE TAE    */
01101   0xD0F8,                       /* LV # Lo       HANGUL SYLLABLE TYA    */
01102   0xD114,                       /* LV # Lo       HANGUL SYLLABLE TYAE   */
01103   0xD130,                       /* LV # Lo       HANGUL SYLLABLE TEO    */
01104   0xD14C,                       /* LV # Lo       HANGUL SYLLABLE TE     */
01105   0xD168,                       /* LV # Lo       HANGUL SYLLABLE TYEO   */
01106   0xD184,                       /* LV # Lo       HANGUL SYLLABLE TYE    */
01107   0xD1A0,                       /* LV # Lo       HANGUL SYLLABLE TO     */
01108   0xD1BC,                       /* LV # Lo       HANGUL SYLLABLE TWA    */
01109   0xD1D8,                       /* LV # Lo       HANGUL SYLLABLE TWAE   */
01110   0xD1F4,                       /* LV # Lo       HANGUL SYLLABLE TOE    */
01111   0xD210,                       /* LV # Lo       HANGUL SYLLABLE TYO    */
01112   0xD22C,                       /* LV # Lo       HANGUL SYLLABLE TU     */
01113   0xD248,                       /* LV # Lo       HANGUL SYLLABLE TWEO   */
01114   0xD264,                       /* LV # Lo       HANGUL SYLLABLE TWE    */
01115   0xD280,                       /* LV # Lo       HANGUL SYLLABLE TWI    */
01116   0xD29C,                       /* LV # Lo       HANGUL SYLLABLE TYU    */
01117   0xD2B8,                       /* LV # Lo       HANGUL SYLLABLE TEU    */
01118   0xD2D4,                       /* LV # Lo       HANGUL SYLLABLE TYI    */
01119   0xD2F0,                       /* LV # Lo       HANGUL SYLLABLE TI     */
01120   0xD30C,                       /* LV # Lo       HANGUL SYLLABLE PA     */
01121   0xD328,                       /* LV # Lo       HANGUL SYLLABLE PAE    */
01122   0xD344,                       /* LV # Lo       HANGUL SYLLABLE PYA    */
01123   0xD360,                       /* LV # Lo       HANGUL SYLLABLE PYAE   */
01124   0xD37C,                       /* LV # Lo       HANGUL SYLLABLE PEO    */
01125   0xD398,                       /* LV # Lo       HANGUL SYLLABLE PE     */
01126   0xD3B4,                       /* LV # Lo       HANGUL SYLLABLE PYEO   */
01127   0xD3D0,                       /* LV # Lo       HANGUL SYLLABLE PYE    */
01128   0xD3EC,                       /* LV # Lo       HANGUL SYLLABLE PO     */
01129   0xD408,                       /* LV # Lo       HANGUL SYLLABLE PWA    */
01130   0xD424,                       /* LV # Lo       HANGUL SYLLABLE PWAE   */
01131   0xD440,                       /* LV # Lo       HANGUL SYLLABLE POE    */
01132   0xD45C,                       /* LV # Lo       HANGUL SYLLABLE PYO    */
01133   0xD478,                       /* LV # Lo       HANGUL SYLLABLE PU     */
01134   0xD494,                       /* LV # Lo       HANGUL SYLLABLE PWEO   */
01135   0xD4B0,                       /* LV # Lo       HANGUL SYLLABLE PWE    */
01136   0xD4CC,                       /* LV # Lo       HANGUL SYLLABLE PWI    */
01137   0xD4E8,                       /* LV # Lo       HANGUL SYLLABLE PYU    */
01138   0xD504,                       /* LV # Lo       HANGUL SYLLABLE PEU    */
01139   0xD520,                       /* LV # Lo       HANGUL SYLLABLE PYI    */
01140   0xD53C,                       /* LV # Lo       HANGUL SYLLABLE PI     */
01141   0xD558,                       /* LV # Lo       HANGUL SYLLABLE HA     */
01142   0xD574,                       /* LV # Lo       HANGUL SYLLABLE HAE    */
01143   0xD590,                       /* LV # Lo       HANGUL SYLLABLE HYA    */
01144   0xD5AC,                       /* LV # Lo       HANGUL SYLLABLE HYAE   */
01145   0xD5C8,                       /* LV # Lo       HANGUL SYLLABLE HEO    */
01146   0xD5E4,                       /* LV # Lo       HANGUL SYLLABLE HE     */
01147   0xD600,                       /* LV # Lo       HANGUL SYLLABLE HYEO   */
01148   0xD61C,                       /* LV # Lo       HANGUL SYLLABLE HYE    */
01149   0xD638,                       /* LV # Lo       HANGUL SYLLABLE HO     */
01150   0xD654,                       /* LV # Lo       HANGUL SYLLABLE HWA    */
01151   0xD670,                       /* LV # Lo       HANGUL SYLLABLE HWAE   */
01152   0xD68C,                       /* LV # Lo       HANGUL SYLLABLE HOE    */
01153   0xD6A8,                       /* LV # Lo       HANGUL SYLLABLE HYO    */
01154   0xD6C4,                       /* LV # Lo       HANGUL SYLLABLE HU     */
01155   0xD6E0,                       /* LV # Lo       HANGUL SYLLABLE HWEO   */
01156   0xD6FC,                       /* LV # Lo       HANGUL SYLLABLE HWE    */
01157   0xD718,                       /* LV # Lo       HANGUL SYLLABLE HWI    */
01158   0xD734,                       /* LV # Lo       HANGUL SYLLABLE HYU    */
01159   0xD750,                       /* LV # Lo       HANGUL SYLLABLE HEU    */
01160   0xD76C,                       /* LV # Lo       HANGUL SYLLABLE HYI    */
01161   0xD788,                       /* LV # Lo       HANGUL SYLLABLE HI     */
01162   0
01163 };
01164 
01165 static const uint32_t pr29_13_2[] = {
01166   0x11A8, 0x11A9, 0x11AA, 0x11AB, 0x11AC, 0x11AD, 0x11AE, 0x11AF,
01167   0x11B0, 0x11B1, 0x11B2, 0x11B3, 0x11B4, 0x11B5, 0x11B6, 0x11B7,
01168   0x11B8, 0x11B9, 0x11BA, 0x11BB, 0x11BC, 0x11BD, 0x11BE, 0x11BF,
01169   0x11C0, 0x11C1, 0x11C2, 0
01170 };
01171 
01172 typedef struct
01173 {
01174   const uint32_t *first;
01175   const uint32_t *last;
01176 } Pr29;
01177 
01178 static const Pr29 pr29[] = {
01179   {&pr29_1_1[0], &pr29_1_2[0]},
01180   {&pr29_2_1[0], &pr29_2_2[0]},
01181   {&pr29_3_1[0], &pr29_3_2[0]},
01182   {&pr29_4_1[0], &pr29_4_2[0]},
01183   {&pr29_5_1[0], &pr29_5_2[0]},
01184   {&pr29_6_1[0], &pr29_6_2[0]},
01185   {&pr29_7_1[0], &pr29_7_2[0]},
01186   {&pr29_8_1[0], &pr29_8_2[0]},
01187   {&pr29_9_1[0], &pr29_9_2[0]},
01188   {&pr29_10_1[0], &pr29_10_2[0]},
01189   {&pr29_11_1[0], &pr29_11_2[0]},
01190   {&pr29_12_1[0], &pr29_12_2[0]},
01191   {&pr29_13_1[0], &pr29_13_2[0]},
01192   {NULL, NULL}
01193 };
01194 
01195 static size_t
01196 first_column (uint32_t c)
01197 {
01198   size_t i, j;
01199 
01200   for (i = 0; pr29[i].first; i++)
01201     for (j = 0; pr29[i].first[j]; j++)
01202       if (c == pr29[i].first[j])
01203         return i + 1;
01204 
01205   return 0;
01206 }
01207 
01208 static int
01209 in_last_column_row (uint32_t c, size_t row)
01210 {
01211   size_t i;
01212 
01213   for (i = 0; pr29[row - 1].last[i]; i++)
01214     if (c == pr29[row - 1].last[i])
01215       return 1;
01216 
01217   return 0;
01218 }
01219 
01220 static size_t
01221 combinationclass (uint32_t c)
01222 {
01223   size_t i;
01224 
01225   for (i = 0; nzcc[i]; i++)
01226     if (c == nzcc[i])
01227       return i + 1;
01228 
01229   return 0;
01230 }
01231 
01246 int
01247 pr29_4 (const uint32_t * in, size_t len)
01248 {
01249   size_t i, j, k, row;
01250 
01251   /*
01252    * The problem sequence are of the form:
01253    *
01254    *      first_character  intervening_character+ last_character
01255    *
01256    * where the first_character and last_character come from the same
01257    * row in the following table, and there is at least one
01258    * intervening_character with non-zero Canonical Combining
01259    * Class. (The '+' above means one or more occurrences.)
01260    *
01261    */
01262 
01263   for (i = 0; i < len; i++)
01264     if ((row = first_column (in[i])) > 0)
01265       for (j = i + 1; j < len; j++)
01266         if (combinationclass (in[j]))
01267           for (k = j + 1; k < len; k++)
01268             if (in_last_column_row (in[k], row))
01269               return PR29_PROBLEM;
01270 
01271   return PR29_SUCCESS;
01272 }
01273 
01287 int
01288 pr29_4z (const uint32_t * in)
01289 {
01290   size_t len;
01291 
01292   for (len = 0; in[len]; len++)
01293     ;
01294 
01295   return pr29_4 (in, len);
01296 }
01297 
01312 int
01313 pr29_8z (const char *in)
01314 {
01315   uint32_t *p;
01316   int rc;
01317 
01318   p = stringprep_utf8_to_ucs4 (in, -1, NULL);
01319   if (!p)
01320     return PR29_STRINGPREP_ERROR;
01321 
01322   rc = pr29_4z (p);
01323 
01324   free (p);
01325 
01326   return rc;
01327 }
01328