LCOV - GNU Libidn - lib/pr29.c

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

AltStyle によって変換されたページ (->オリジナル) /