/* ** 2012 May 03 ** ** The author disclaims copyright to this source code. In place of ** a legal notice, here is a blessing: ** ** May you do good and not evil. ** May you find forgiveness for yourself and forgive others. ** May you share freely, never taking more than you give. ** ****************************************************************************** ** ** Implementation of the "translit" full-text-search tokenizer. ** ** This tokenizer looks for tokens composed of any Latin, Greek, Cyrillic, ** and/or Hebrew characters and apostrophy. All other characters are ** considered to be token separators. All characters are transliterated ** into ASCII for indexing. The maximum token length is limited to ** MX_TRANSLIT characters. */ /* ** The code in this file is only compiled if: ** ** * The FTS3 module is being built as an extension ** (in which case SQLITE_CORE is not defined), or ** ** * The FTS3 module is being built into the core of ** SQLite (in which case SQLITE_ENABLE_FTS3 is defined). */ #include "fts3Int.h" #if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) #include #include #include #include #include "fts3_tokenizer.h" /* ** The following constant is a concatenation (with overlap) of all ** possible generated transliterations. */ static const char zTranslit[] = "psshchhvvyylsthwiaaedzhoeueoijhnghljnjouphtstcfelslz'bkmqrxkhiu"; /* 123456789 123456789 123456789 123456789 123456789 123456789 123 */ /* Given a unicode character U, that value is translated into an offset ** into the following table by skipping the following ranges: ** ** u0000-u0025 ** u02ae-u0385 ** u0460-u05b0 ** ** Let the table value be T. Then the transliteration is ((T-1)%4)+1 ** characters in length and begins at an offset of (T-1)/4 in zTranslit[]. * Or if T is zero, then the character is a delimiter. */ static const unsigned char aTranslate[] = { 0, /* 0 */ (52*4 + 1), /* u0027 (') -> ' */ /* 1 */ 0, /* 2 */ 0, /* 3 */ 0, /* 4 */ 0, /* 5 */ 0, /* 6 */ 0, /* 7 */ 0, /* 8 */ 0, /* 9 */ 0, /* 10 */ 0, /* 11 */ 0, /* 12 */ 0, /* 13 */ 0, /* 14 */ 0, /* 15 */ 0, /* 16 */ 0, /* 17 */ 0, /* 18 */ 0, /* 19 */ 0, /* 20 */ 0, /* 21 */ 0, /* 22 */ 0, /* 23 */ 0, /* 24 */ 0, /* 25 */ 0, /* 26 */ (17*4 + 1), /* u0041 (A) -> a */ /* 27 */ (53*4 + 1), /* u0042 (B) -> b */ /* 28 */ ( 4*4 + 1), /* u0043 (C) -> c */ /* 29 */ (20*4 + 1), /* u0044 (D) -> d */ /* 30 */ (19*4 + 1), /* u0045 (E) -> e */ /* 31 */ (46*4 + 1), /* u0046 (F) -> f */ /* 32 */ (32*4 + 1), /* u0047 (G) -> g */ /* 33 */ ( 3*4 + 1), /* u0048 (H) -> h */ /* 34 */ (16*4 + 1), /* u0049 (I) -> i */ /* 35 */ (29*4 + 1), /* u004A (J) -> j */ /* 36 */ (54*4 + 1), /* u004B (K) -> k */ /* 37 */ (11*4 + 1), /* u004C (L) -> l */ /* 38 */ (55*4 + 1), /* u004D (M) -> m */ /* 39 */ (31*4 + 1), /* u004E (N) -> n */ /* 40 */ (23*4 + 1), /* u004F (O) -> o */ /* 41 */ ( 0*4 + 1), /* u0050 (P) -> p */ /* 42 */ (56*4 + 1), /* u0051 (Q) -> q */ /* 43 */ (57*4 + 1), /* u0052 (R) -> r */ /* 44 */ ( 1*4 + 1), /* u0053 (S) -> s */ /* 45 */ (13*4 + 1), /* u0054 (T) -> t */ /* 46 */ (25*4 + 1), /* u0055 (U) -> u */ /* 47 */ ( 7*4 + 1), /* u0056 (V) -> v */ /* 48 */ (15*4 + 1), /* u0057 (W) -> w */ /* 49 */ (15*4 + 1), /* u0058 (X) -> w */ /* 50 */ ( 9*4 + 1), /* u0059 (Y) -> y */ /* 51 */ (21*4 + 1), /* u005A (Z) -> z */ /* 52 */ 0, /* 53 */ 0, /* 54 */ 0, /* 55 */ 0, /* 56 */ 0, /* 57 */ 0, /* 58 */ (17*4 + 1), /* u0061 (a) -> a */ /* 59 */ (53*4 + 1), /* u0062 (b) -> b */ /* 60 */ ( 4*4 + 1), /* u0063 (c) -> c */ /* 61 */ (20*4 + 1), /* u0064 (d) -> d */ /* 62 */ (19*4 + 1), /* u0065 (e) -> e */ /* 63 */ (46*4 + 1), /* u0066 (f) -> f */ /* 64 */ (32*4 + 1), /* u0067 (g) -> g */ /* 65 */ ( 3*4 + 1), /* u0068 (h) -> h */ /* 66 */ (16*4 + 1), /* u0069 (i) -> i */ /* 67 */ (29*4 + 1), /* u006A (j) -> j */ /* 68 */ (54*4 + 1), /* u006B (k) -> k */ /* 69 */ (11*4 + 1), /* u006C (l) -> l */ /* 70 */ (55*4 + 1), /* u006D (m) -> m */ /* 71 */ (31*4 + 1), /* u006E (n) -> n */ /* 72 */ (23*4 + 1), /* u006F (o) -> o */ /* 73 */ ( 0*4 + 1), /* u0070 (p) -> p */ /* 74 */ (56*4 + 1), /* u0071 (q) -> q */ /* 75 */ (57*4 + 1), /* u0072 (r) -> r */ /* 76 */ ( 1*4 + 1), /* u0073 (s) -> s */ /* 77 */ (13*4 + 1), /* u0074 (t) -> t */ /* 78 */ (25*4 + 1), /* u0075 (u) -> u */ /* 79 */ ( 7*4 + 1), /* u0076 (v) -> v */ /* 80 */ (15*4 + 1), /* u0077 (w) -> w */ /* 81 */ (58*4 + 1), /* u0078 (x) -> x */ /* 82 */ ( 9*4 + 1), /* u0079 (y) -> y */ /* 83 */ (21*4 + 1), /* u007A (z) -> z */ /* 84 */ 0, /* 85 */ 0, /* 86 */ 0, /* 87 */ 0, /* 88 */ 0, /* 89 */ 0, /* 90 */ 0, /* 91 */ 0, /* 92 */ 0, /* 93 */ 0, /* 94 */ 0, /* 95 */ 0, /* 96 */ 0, /* 97 */ 0, /* 98 */ 0, /* 99 */ 0, /* 100 */ 0, /* 101 */ 0, /* 102 */ 0, /* 103 */ 0, /* 104 */ 0, /* 105 */ 0, /* 106 */ 0, /* 107 */ 0, /* 108 */ 0, /* 109 */ 0, /* 110 */ 0, /* 111 */ 0, /* 112 */ 0, /* 113 */ 0, /* 114 */ 0, /* 115 */ 0, /* 116 */ 0, /* 117 */ 0, /* 118 */ 0, /* 119 */ 0, /* 120 */ 0, /* 121 */ 0, /* 122 */ 0, /* 123 */ 0, /* 124 */ 0, /* 125 */ 0, /* 126 */ 0, /* 127 */ 0, /* 128 */ 0, /* 129 */ 0, /* 130 */ 0, /* 131 */ 0, /* 132 */ 0, /* 133 */ 0, /* 134 */ 0, /* 135 */ 0, /* 136 */ 0, /* 137 */ 0, /* 138 */ 0, /* 139 */ 0, /* 140 */ 0, /* 141 */ 0, /* 142 */ 0, /* 143 */ 0, /* 144 */ 0, /* 145 */ 0, /* 146 */ 0, /* 147 */ 0, /* 148 */ 0, /* 149 */ 0, /* 150 */ 0, /* 151 */ 0, /* 152 */ 0, /* 153 */ (17*4 + 1), /* u00C0 (À) -> a */ /* 154 */ (17*4 + 1), /* u00C1 (Á) -> a */ /* 155 */ (17*4 + 1), /* u00C2 (Â) -> a */ /* 156 */ (17*4 + 1), /* u00C3 (Ã) -> a */ /* 157 */ (18*4 + 2), /* u00C4 (Ä) -> ae */ /* 158 */ (17*4 + 2), /* u00C5 (Å) -> aa */ /* 159 */ (18*4 + 2), /* u00C6 (Æ) -> ae */ /* 160 */ ( 4*4 + 1), /* u00C7 (Ç) -> c */ /* 161 */ (19*4 + 1), /* u00C8 (È) -> e */ /* 162 */ (19*4 + 1), /* u00C9 (É) -> e */ /* 163 */ (19*4 + 1), /* u00CA (Ê) -> e */ /* 164 */ (19*4 + 1), /* u00CB (Ë) -> e */ /* 165 */ (16*4 + 1), /* u00CC (Ì) -> i */ /* 166 */ (16*4 + 1), /* u00CD (Í) -> i */ /* 167 */ (16*4 + 1), /* u00CE (Î) -> i */ /* 168 */ (16*4 + 1), /* u00CF (Ï) -> i */ /* 169 */ (20*4 + 1), /* u00D0 (Ð) -> d */ /* 170 */ (31*4 + 1), /* u00D1 (Ñ) -> n */ /* 171 */ (23*4 + 1), /* u00D2 (Ò) -> o */ /* 172 */ (23*4 + 1), /* u00D3 (Ó) -> o */ /* 173 */ (23*4 + 1), /* u00D4 (Ô) -> o */ /* 174 */ (23*4 + 1), /* u00D5 (Õ) -> o */ /* 175 */ (23*4 + 2), /* u00D6 (Ö) -> oe */ /* 176 */ 0, /* 177 */ (23*4 + 1), /* u00D8 (Ø) -> o */ /* 178 */ (25*4 + 1), /* u00D9 (Ù) -> u */ /* 179 */ (25*4 + 1), /* u00DA (Ú) -> u */ /* 180 */ (25*4 + 1), /* u00DB (Û) -> u */ /* 181 */ (25*4 + 2), /* u00DC (Ü) -> ue */ /* 182 */ ( 9*4 + 1), /* u00DD (Ý) -> y */ /* 183 */ (13*4 + 2), /* u00DE (Þ) -> th */ /* 184 */ ( 1*4 + 2), /* u00DF (ß) -> ss */ /* 185 */ (17*4 + 1), /* u00E0 (à) -> a */ /* 186 */ (17*4 + 1), /* u00E1 (á) -> a */ /* 187 */ (17*4 + 1), /* u00E2 (â) -> a */ /* 188 */ (17*4 + 1), /* u00E3 (ã) -> a */ /* 189 */ (18*4 + 2), /* u00E4 (ä) -> ae */ /* 190 */ (17*4 + 2), /* u00E5 (å) -> aa */ /* 191 */ (18*4 + 2), /* u00E6 (æ) -> ae */ /* 192 */ ( 4*4 + 1), /* u00E7 (ç) -> c */ /* 193 */ (19*4 + 1), /* u00E8 (è) -> e */ /* 194 */ (19*4 + 1), /* u00E9 (é) -> e */ /* 195 */ (19*4 + 1), /* u00EA (ê) -> e */ /* 196 */ (19*4 + 1), /* u00EB (ë) -> e */ /* 197 */ (16*4 + 1), /* u00EC (ì) -> i */ /* 198 */ (16*4 + 1), /* u00ED (í) -> i */ /* 199 */ (16*4 + 1), /* u00EE (î) -> i */ /* 200 */ (16*4 + 1), /* u00EF (ï) -> i */ /* 201 */ (20*4 + 1), /* u00F0 (ð) -> d */ /* 202 */ (31*4 + 1), /* u00F1 (ñ) -> n */ /* 203 */ (23*4 + 1), /* u00F2 (ò) -> o */ /* 204 */ (23*4 + 1), /* u00F3 (ó) -> o */ /* 205 */ (23*4 + 1), /* u00F4 (ô) -> o */ /* 206 */ (23*4 + 1), /* u00F5 (õ) -> o */ /* 207 */ (23*4 + 2), /* u00F6 (ö) -> oe */ /* 208 */ 0, /* 209 */ (23*4 + 1), /* u00F8 (ø) -> o */ /* 210 */ (25*4 + 1), /* u00F9 (ù) -> u */ /* 211 */ (25*4 + 1), /* u00FA (ú) -> u */ /* 212 */ (25*4 + 1), /* u00FB (û) -> u */ /* 213 */ (25*4 + 2), /* u00FC (ü) -> ue */ /* 214 */ ( 9*4 + 1), /* u00FD (ý) -> y */ /* 215 */ (13*4 + 2), /* u00FE (þ) -> th */ /* 216 */ ( 9*4 + 1), /* u00FF (ÿ) -> y */ /* 217 */ (17*4 + 1), /* u0100 (Ā) -> a */ /* 218 */ (17*4 + 1), /* u0101 (ā) -> a */ /* 219 */ (17*4 + 1), /* u0102 (Ă) -> a */ /* 220 */ (17*4 + 1), /* u0103 (ă) -> a */ /* 221 */ (17*4 + 1), /* u0104 (Ą) -> a */ /* 222 */ (17*4 + 1), /* u0105 (ą) -> a */ /* 223 */ ( 4*4 + 1), /* u0106 (Ć) -> c */ /* 224 */ ( 4*4 + 1), /* u0107 (ć) -> c */ /* 225 */ ( 4*4 + 2), /* u0108 (Ĉ) -> ch */ /* 226 */ ( 4*4 + 2), /* u0109 (ĉ) -> ch */ /* 227 */ ( 4*4 + 1), /* u010A (Ċ) -> c */ /* 228 */ ( 4*4 + 1), /* u010B (ċ) -> c */ /* 229 */ ( 4*4 + 1), /* u010C (Č) -> c */ /* 230 */ ( 4*4 + 1), /* u010D (č) -> c */ /* 231 */ (20*4 + 1), /* u010E (Ď) -> d */ /* 232 */ ( 4*4 + 1), /* u010F (ď) -> c */ /* 233 */ (20*4 + 1), /* u0110 (Đ) -> d */ /* 234 */ (20*4 + 1), /* u0111 (đ) -> d */ /* 235 */ (19*4 + 1), /* u0112 (Ē) -> e */ /* 236 */ (19*4 + 1), /* u0113 (ē) -> e */ /* 237 */ (19*4 + 1), /* u0114 (Ĕ) -> e */ /* 238 */ (19*4 + 1), /* u0115 (ĕ) -> e */ /* 239 */ (19*4 + 1), /* u0116 (Ė) -> e */ /* 240 */ (19*4 + 1), /* u0117 (ė) -> e */ /* 241 */ (19*4 + 1), /* u0118 (Ę) -> e */ /* 242 */ (19*4 + 1), /* u0119 (ę) -> e */ /* 243 */ (19*4 + 1), /* u011A (Ě) -> e */ /* 244 */ (19*4 + 1), /* u011B (ě) -> e */ /* 245 */ (32*4 + 2), /* u011C (Ĝ) -> gh */ /* 246 */ (32*4 + 2), /* u011D (ĝ) -> gh */ /* 247 */ (32*4 + 1), /* u011E (Ğ) -> g */ /* 248 */ (32*4 + 1), /* u011F (ğ) -> g */ /* 249 */ (32*4 + 1), /* u0120 (Ġ) -> g */ /* 250 */ (32*4 + 1), /* u0121 (ġ) -> g */ /* 251 */ (32*4 + 1), /* u0122 (Ģ) -> g */ /* 252 */ (32*4 + 1), /* u0123 (ģ) -> g */ /* 253 */ ( 5*4 + 2), /* u0124 (Ĥ) -> hh */ /* 254 */ ( 5*4 + 2), /* u0125 (ĥ) -> hh */ /* 255 */ ( 3*4 + 1), /* u0126 (Ħ) -> h */ /* 256 */ ( 3*4 + 1), /* u0127 (ħ) -> h */ /* 257 */ (16*4 + 1), /* u0128 (Ĩ) -> i */ /* 258 */ (16*4 + 1), /* u0129 (ĩ) -> i */ /* 259 */ (16*4 + 1), /* u012A (Ī) -> i */ /* 260 */ (16*4 + 1), /* u012B (ī) -> i */ /* 261 */ (16*4 + 1), /* u012C (Ĭ) -> i */ /* 262 */ (16*4 + 1), /* u012D (ĭ) -> i */ /* 263 */ (16*4 + 1), /* u012E (Į) -> i */ /* 264 */ (16*4 + 1), /* u012F (į) -> i */ /* 265 */ (16*4 + 1), /* u0130 (İ) -> i */ /* 266 */ (16*4 + 1), /* u0131 (ı) -> i */ /* 267 */ (28*4 + 2), /* u0132 (IJ) -> ij */ /* 268 */ (28*4 + 2), /* u0133 (ij) -> ij */ /* 269 */ (29*4 + 2), /* u0134 (Ĵ) -> jh */ /* 270 */ (29*4 + 2), /* u0135 (ĵ) -> jh */ /* 271 */ (54*4 + 1), /* u0136 (Ķ) -> k */ /* 272 */ (54*4 + 1), /* u0137 (ķ) -> k */ /* 273 */ (54*4 + 1), /* u0138 (ĸ) -> k */ /* 274 */ (11*4 + 1), /* u0139 (Ĺ) -> l */ /* 275 */ (11*4 + 1), /* u013A (ĺ) -> l */ /* 276 */ (11*4 + 1), /* u013B (Ļ) -> l */ /* 277 */ (11*4 + 1), /* u013C (ļ) -> l */ /* 278 */ (11*4 + 1), /* u013D (Ľ) -> l */ /* 279 */ (11*4 + 1), /* u013E (ľ) -> l */ /* 280 */ (11*4 + 1), /* u013F (Ŀ) -> l */ /* 281 */ (11*4 + 1), /* u0140 (ŀ) -> l */ /* 282 */ (11*4 + 1), /* u0141 (Ł) -> l */ /* 283 */ (11*4 + 1), /* u0142 (ł) -> l */ /* 284 */ (31*4 + 1), /* u0143 (Ń) -> n */ /* 285 */ (31*4 + 1), /* u0144 (ń) -> n */ /* 286 */ (31*4 + 1), /* u0145 (Ņ) -> n */ /* 287 */ (31*4 + 1), /* u0146 (ņ) -> n */ /* 288 */ (31*4 + 1), /* u0147 (Ň) -> n */ /* 289 */ (31*4 + 1), /* u0148 (ň) -> n */ /* 290 */ (31*4 + 1), /* u0149 (ʼn) -> n */ /* 291 */ (31*4 + 2), /* u014A (Ŋ) -> ng */ /* 292 */ (31*4 + 2), /* u014B (ŋ) -> ng */ /* 293 */ (23*4 + 1), /* u014C (Ō) -> o */ /* 294 */ (23*4 + 1), /* u014D (ō) -> o */ /* 295 */ (23*4 + 1), /* u014E (Ŏ) -> o */ /* 296 */ (23*4 + 1), /* u014F (ŏ) -> o */ /* 297 */ (23*4 + 1), /* u0150 (Ő) -> o */ /* 298 */ (23*4 + 1), /* u0151 (ő) -> o */ /* 299 */ (23*4 + 2), /* u0152 (Œ) -> oe */ /* 300 */ (23*4 + 2), /* u0153 (œ) -> oe */ /* 301 */ (57*4 + 1), /* u0154 (Ŕ) -> r */ /* 302 */ (57*4 + 1), /* u0155 (ŕ) -> r */ /* 303 */ (57*4 + 1), /* u0156 (Ŗ) -> r */ /* 304 */ (57*4 + 1), /* u0157 (ŗ) -> r */ /* 305 */ (57*4 + 1), /* u0158 (Ř) -> r */ /* 306 */ (57*4 + 1), /* u0159 (ř) -> r */ /* 307 */ ( 1*4 + 1), /* u015A (Ś) -> s */ /* 308 */ ( 1*4 + 1), /* u015B (ś) -> s */ /* 309 */ ( 2*4 + 2), /* u015C (Ŝ) -> sh */ /* 310 */ ( 2*4 + 2), /* u015D (ŝ) -> sh */ /* 311 */ ( 1*4 + 1), /* u015E (Ş) -> s */ /* 312 */ ( 1*4 + 1), /* u015F (ş) -> s */ /* 313 */ ( 1*4 + 1), /* u0160 (Š) -> s */ /* 314 */ ( 1*4 + 1), /* u0161 (š) -> s */ /* 315 */ (13*4 + 1), /* u0162 (Ţ) -> t */ /* 316 */ (13*4 + 1), /* u0163 (ţ) -> t */ /* 317 */ (13*4 + 1), /* u0164 (Ť) -> t */ /* 318 */ (13*4 + 1), /* u0165 (ť) -> t */ /* 319 */ (13*4 + 1), /* u0166 (Ŧ) -> t */ /* 320 */ (13*4 + 1), /* u0167 (ŧ) -> t */ /* 321 */ (25*4 + 1), /* u0168 (Ũ) -> u */ /* 322 */ (25*4 + 1), /* u0169 (ũ) -> u */ /* 323 */ (25*4 + 1), /* u016A (Ū) -> u */ /* 324 */ (25*4 + 1), /* u016B (ū) -> u */ /* 325 */ (25*4 + 1), /* u016C (Ŭ) -> u */ /* 326 */ (25*4 + 1), /* u016D (ŭ) -> u */ /* 327 */ (25*4 + 1), /* u016E (Ů) -> u */ /* 328 */ (25*4 + 1), /* u016F (ů) -> u */ /* 329 */ (25*4 + 1), /* u0170 (Ű) -> u */ /* 330 */ (25*4 + 1), /* u0171 (ű) -> u */ /* 331 */ (25*4 + 1), /* u0172 (Ų) -> u */ /* 332 */ (25*4 + 1), /* u0173 (ų) -> u */ /* 333 */ (15*4 + 1), /* u0174 (Ŵ) -> w */ /* 334 */ (15*4 + 1), /* u0175 (ŵ) -> w */ /* 335 */ ( 9*4 + 1), /* u0176 (Ŷ) -> y */ /* 336 */ ( 9*4 + 1), /* u0177 (ŷ) -> y */ /* 337 */ ( 9*4 + 1), /* u0178 (Ÿ) -> y */ /* 338 */ (21*4 + 1), /* u0179 (Ź) -> z */ /* 339 */ (21*4 + 1), /* u017A (ź) -> z */ /* 340 */ (21*4 + 1), /* u017B (Ż) -> z */ /* 341 */ (21*4 + 1), /* u017C (ż) -> z */ /* 342 */ (21*4 + 1), /* u017D (Ž) -> z */ /* 343 */ (21*4 + 1), /* u017E (ž) -> z */ /* 344 */ ( 1*4 + 1), /* u017F (ſ) -> s */ /* 345 */ (53*4 + 1), /* u0180 (ƀ) -> b */ /* 346 */ (53*4 + 1), /* u0181 (Ɓ) -> b */ /* 347 */ (53*4 + 1), /* u0182 (Ƃ) -> b */ /* 348 */ (53*4 + 1), /* u0183 (ƃ) -> b */ /* 349 */ 0, /* 350 */ 0, /* 351 */ (23*4 + 1), /* u0186 (Ɔ) -> o */ /* 352 */ ( 4*4 + 1), /* u0187 (Ƈ) -> c */ /* 353 */ ( 4*4 + 1), /* u0188 (ƈ) -> c */ /* 354 */ (20*4 + 1), /* u0189 (Ɖ) -> d */ /* 355 */ (20*4 + 1), /* u018A (Ɗ) -> d */ /* 356 */ (20*4 + 1), /* u018B (Ƌ) -> d */ /* 357 */ (20*4 + 1), /* u018C (ƌ) -> d */ /* 358 */ (20*4 + 1), /* u018D (ƍ) -> d */ /* 359 */ (19*4 + 1), /* u018E (Ǝ) -> e */ /* 360 */ (19*4 + 1), /* u018F (Ə) -> e */ /* 361 */ (19*4 + 1), /* u0190 (Ɛ) -> e */ /* 362 */ (46*4 + 1), /* u0191 (Ƒ) -> f */ /* 363 */ (46*4 + 1), /* u0192 (ƒ) -> f */ /* 364 */ (32*4 + 1), /* u0193 (Ɠ) -> g */ /* 365 */ (32*4 + 1), /* u0194 (Ɣ) -> g */ /* 366 */ ( 3*4 + 1), /* u0195 (ƕ) -> h */ /* 367 */ (16*4 + 1), /* u0196 (Ɩ) -> i */ /* 368 */ (16*4 + 1), /* u0197 (Ɨ) -> i */ /* 369 */ (54*4 + 1), /* u0198 (Ƙ) -> k */ /* 370 */ (54*4 + 1), /* u0199 (ƙ) -> k */ /* 371 */ (11*4 + 1), /* u019A (ƚ) -> l */ /* 372 */ (11*4 + 1), /* u019B (ƛ) -> l */ /* 373 */ (55*4 + 1), /* u019C (Ɯ) -> m */ /* 374 */ (31*4 + 1), /* u019D (Ɲ) -> n */ /* 375 */ (31*4 + 1), /* u019E (ƞ) -> n */ /* 376 */ (23*4 + 1), /* u019F (Ɵ) -> o */ /* 377 */ (23*4 + 1), /* u01A0 (Ơ) -> o */ /* 378 */ (23*4 + 1), /* u01A1 (ơ) -> o */ /* 379 */ (27*4 + 2), /* u01A2 (Ƣ) -> oi */ /* 380 */ (27*4 + 2), /* u01A3 (ƣ) -> oi */ /* 381 */ ( 0*4 + 1), /* u01A4 (Ƥ) -> p */ /* 382 */ ( 0*4 + 1), /* u01A5 (ƥ) -> p */ /* 383 */ (57*4 + 1), /* u01A6 (Ʀ) -> r */ /* 384 */ 0, /* 385 */ 0, /* 386 */ ( 1*4 + 1), /* u01A9 (Ʃ) -> s */ /* 387 */ ( 1*4 + 1), /* u01AA (ƪ) -> s */ /* 388 */ (13*4 + 1), /* u01AB (ƫ) -> t */ /* 389 */ (13*4 + 1), /* u01AC (Ƭ) -> t */ /* 390 */ (13*4 + 1), /* u01AD (ƭ) -> t */ /* 391 */ (13*4 + 1), /* u01AE (Ʈ) -> t */ /* 392 */ (25*4 + 1), /* u01AF (Ư) -> u */ /* 393 */ (25*4 + 1), /* u01B0 (ư) -> u */ /* 394 */ (25*4 + 1), /* u01B1 (Ʊ) -> u */ /* 395 */ ( 7*4 + 1), /* u01B2 (Ʋ) -> v */ /* 396 */ ( 9*4 + 1), /* u01B3 (Ƴ) -> y */ /* 397 */ ( 9*4 + 1), /* u01B4 (ƴ) -> y */ /* 398 */ (21*4 + 1), /* u01B5 (Ƶ) -> z */ /* 399 */ (21*4 + 1), /* u01B6 (ƶ) -> z */ /* 400 */ ( 1*4 + 1), /* u01B7 (Ʒ) -> s */ /* 401 */ ( 1*4 + 1), /* u01B8 (Ƹ) -> s */ /* 402 */ ( 1*4 + 1), /* u01B9 (ƹ) -> s */ /* 403 */ ( 1*4 + 1), /* u01BA (ƺ) -> s */ /* 404 */ 0, /* 405 */ 0, /* 406 */ 0, /* 407 */ (52*4 + 1), /* u01BE (ƾ) -> ' */ /* 408 */ (15*4 + 1), /* u01BF (ƿ) -> w */ /* 409 */ ( 4*4 + 1), /* u01C0 (ǀ) -> c */ /* 410 */ (58*4 + 1), /* u01C1 (ǁ) -> x */ /* 411 */ (56*4 + 1), /* u01C2 (ǂ) -> q */ /* 412 */ (58*4 + 1), /* u01C3 (ǃ) -> x */ /* 413 */ (20*4 + 2), /* u01C4 (DŽ) -> dz */ /* 414 */ (20*4 + 2), /* u01C5 (Dž) -> dz */ /* 415 */ (20*4 + 2), /* u01C6 (dž) -> dz */ /* 416 */ (34*4 + 2), /* u01C7 (LJ) -> lj */ /* 417 */ (34*4 + 2), /* u01C8 (Lj) -> lj */ /* 418 */ (34*4 + 2), /* u01C9 (lj) -> lj */ /* 419 */ (36*4 + 2), /* u01CA (NJ) -> nj */ /* 420 */ (36*4 + 2), /* u01CB (Nj) -> nj */ /* 421 */ (36*4 + 2), /* u01CC (nj) -> nj */ /* 422 */ (17*4 + 1), /* u01CD (Ǎ) -> a */ /* 423 */ (17*4 + 1), /* u01CE (ǎ) -> a */ /* 424 */ (16*4 + 1), /* u01CF (Ǐ) -> i */ /* 425 */ (16*4 + 1), /* u01D0 (ǐ) -> i */ /* 426 */ (23*4 + 1), /* u01D1 (Ǒ) -> o */ /* 427 */ (23*4 + 1), /* u01D2 (ǒ) -> o */ /* 428 */ (25*4 + 1), /* u01D3 (Ǔ) -> u */ /* 429 */ (25*4 + 1), /* u01D4 (ǔ) -> u */ /* 430 */ (25*4 + 2), /* u01D5 (Ǖ) -> ue */ /* 431 */ (25*4 + 2), /* u01D6 (ǖ) -> ue */ /* 432 */ (25*4 + 2), /* u01D7 (Ǘ) -> ue */ /* 433 */ (25*4 + 2), /* u01D8 (ǘ) -> ue */ /* 434 */ (25*4 + 2), /* u01D9 (Ǚ) -> ue */ /* 435 */ (25*4 + 2), /* u01DA (ǚ) -> ue */ /* 436 */ (25*4 + 2), /* u01DB (Ǜ) -> ue */ /* 437 */ (25*4 + 2), /* u01DC (ǜ) -> ue */ /* 438 */ (19*4 + 1), /* u01DD (ǝ) -> e */ /* 439 */ (18*4 + 2), /* u01DE (Ǟ) -> ae */ /* 440 */ (18*4 + 2), /* u01DF (ǟ) -> ae */ /* 441 */ (17*4 + 1), /* u01E0 (Ǡ) -> a */ /* 442 */ (17*4 + 1), /* u01E1 (ǡ) -> a */ /* 443 */ (17*4 + 1), /* u01E2 (Ǣ) -> a */ /* 444 */ (18*4 + 2), /* u01E3 (ǣ) -> ae */ /* 445 */ (32*4 + 1), /* u01E4 (Ǥ) -> g */ /* 446 */ (32*4 + 1), /* u01E5 (ǥ) -> g */ /* 447 */ (32*4 + 1), /* u01E6 (Ǧ) -> g */ /* 448 */ (32*4 + 1), /* u01E7 (ǧ) -> g */ /* 449 */ (54*4 + 1), /* u01E8 (Ǩ) -> k */ /* 450 */ (54*4 + 1), /* u01E9 (ǩ) -> k */ /* 451 */ (23*4 + 1), /* u01EA (Ǫ) -> o */ /* 452 */ (23*4 + 1), /* u01EB (ǫ) -> o */ /* 453 */ (23*4 + 1), /* u01EC (Ǭ) -> o */ /* 454 */ (23*4 + 1), /* u01ED (ǭ) -> o */ /* 455 */ ( 1*4 + 1), /* u01EE (Ǯ) -> s */ /* 456 */ ( 1*4 + 1), /* u01EF (ǯ) -> s */ /* 457 */ (29*4 + 1), /* u01F0 (ǰ) -> j */ /* 458 */ (20*4 + 2), /* u01F1 (DZ) -> dz */ /* 459 */ (20*4 + 2), /* u01F2 (Dz) -> dz */ /* 460 */ (20*4 + 2), /* u01F3 (dz) -> dz */ /* 461 */ (32*4 + 1), /* u01F4 (Ǵ) -> g */ /* 462 */ (32*4 + 1), /* u01F5 (ǵ) -> g */ /* 463 */ (14*4 + 2), /* u01F6 (Ƕ) -> hw */ /* 464 */ (15*4 + 1), /* u01F7 (Ƿ) -> w */ /* 465 */ (31*4 + 1), /* u01F8 (Ǹ) -> n */ /* 466 */ (31*4 + 1), /* u01F9 (ǹ) -> n */ /* 467 */ (17*4 + 1), /* u01FA (Ǻ) -> a */ /* 468 */ (17*4 + 1), /* u01FB (ǻ) -> a */ /* 469 */ (18*4 + 2), /* u01FC (Ǽ) -> ae */ /* 470 */ (18*4 + 2), /* u01FD (ǽ) -> ae */ /* 471 */ (23*4 + 1), /* u01FE (Ǿ) -> o */ /* 472 */ (23*4 + 1), /* u01FF (ǿ) -> o */ /* 473 */ (17*4 + 1), /* u0200 (Ȁ) -> a */ /* 474 */ (17*4 + 1), /* u0201 (ȁ) -> a */ /* 475 */ (17*4 + 1), /* u0202 (Ȃ) -> a */ /* 476 */ (17*4 + 1), /* u0203 (ȃ) -> a */ /* 477 */ (19*4 + 1), /* u0204 (Ȅ) -> e */ /* 478 */ (19*4 + 1), /* u0205 (ȅ) -> e */ /* 479 */ (19*4 + 1), /* u0206 (Ȇ) -> e */ /* 480 */ (19*4 + 1), /* u0207 (ȇ) -> e */ /* 481 */ (16*4 + 1), /* u0208 (Ȉ) -> i */ /* 482 */ (16*4 + 1), /* u0209 (ȉ) -> i */ /* 483 */ (16*4 + 1), /* u020A (Ȋ) -> i */ /* 484 */ (16*4 + 1), /* u020B (ȋ) -> i */ /* 485 */ (23*4 + 1), /* u020C (Ȍ) -> o */ /* 486 */ (23*4 + 1), /* u020D (ȍ) -> o */ /* 487 */ (23*4 + 1), /* u020E (Ȏ) -> o */ /* 488 */ (23*4 + 1), /* u020F (ȏ) -> o */ /* 489 */ (57*4 + 1), /* u0210 (Ȑ) -> r */ /* 490 */ (57*4 + 1), /* u0211 (ȑ) -> r */ /* 491 */ (57*4 + 1), /* u0212 (Ȓ) -> r */ /* 492 */ (57*4 + 1), /* u0213 (ȓ) -> r */ /* 493 */ (25*4 + 1), /* u0214 (Ȕ) -> u */ /* 494 */ (25*4 + 1), /* u0215 (ȕ) -> u */ /* 495 */ (25*4 + 1), /* u0216 (Ȗ) -> u */ /* 496 */ (25*4 + 1), /* u0217 (ȗ) -> u */ /* 497 */ ( 1*4 + 1), /* u0218 (Ș) -> s */ /* 498 */ ( 1*4 + 1), /* u0219 (ș) -> s */ /* 499 */ (13*4 + 1), /* u021A (Ț) -> t */ /* 500 */ (13*4 + 1), /* u021B (ț) -> t */ /* 501 */ (29*4 + 1), /* u021C (Ȝ) -> j */ /* 502 */ (29*4 + 1), /* u021D (ȝ) -> j */ /* 503 */ ( 3*4 + 1), /* u021E (Ȟ) -> h */ /* 504 */ ( 3*4 + 1), /* u021F (ȟ) -> h */ /* 505 */ (31*4 + 1), /* u0220 (Ƞ) -> n */ /* 506 */ 0, /* 507 */ (38*4 + 2), /* u0222 (Ȣ) -> ou */ /* 508 */ (38*4 + 2), /* u0223 (ȣ) -> ou */ /* 509 */ (21*4 + 1), /* u0224 (Ȥ) -> z */ /* 510 */ (21*4 + 1), /* u0225 (ȥ) -> z */ /* 511 */ (17*4 + 1), /* u0226 (Ȧ) -> a */ /* 512 */ (17*4 + 1), /* u0227 (ȧ) -> a */ /* 513 */ (19*4 + 1), /* u0228 (Ȩ) -> e */ /* 514 */ (19*4 + 1), /* u0229 (ȩ) -> e */ /* 515 */ (23*4 + 2), /* u022A (Ȫ) -> oe */ /* 516 */ (23*4 + 2), /* u022B (ȫ) -> oe */ /* 517 */ (23*4 + 1), /* u022C (Ȭ) -> o */ /* 518 */ (23*4 + 1), /* u022D (ȭ) -> o */ /* 519 */ (23*4 + 1), /* u022E (Ȯ) -> o */ /* 520 */ (23*4 + 1), /* u022F (ȯ) -> o */ /* 521 */ (23*4 + 1), /* u0230 (Ȱ) -> o */ /* 522 */ (23*4 + 1), /* u0231 (ȱ) -> o */ /* 523 */ ( 9*4 + 1), /* u0232 (Ȳ) -> y */ /* 524 */ ( 9*4 + 1), /* u0233 (ȳ) -> y */ /* 525 */ 0, /* 526 */ 0, /* 527 */ 0, /* 528 */ 0, /* 529 */ 0, /* 530 */ 0, /* 531 */ 0, /* 532 */ 0, /* 533 */ 0, /* 534 */ 0, /* 535 */ 0, /* 536 */ 0, /* 537 */ 0, /* 538 */ 0, /* 539 */ 0, /* 540 */ 0, /* 541 */ 0, /* 542 */ 0, /* 543 */ 0, /* 544 */ 0, /* 545 */ 0, /* 546 */ 0, /* 547 */ 0, /* 548 */ 0, /* 549 */ 0, /* 550 */ 0, /* 551 */ 0, /* 552 */ 0, /* 553 */ (17*4 + 1), /* u0250 (ɐ) -> a */ /* 554 */ (17*4 + 1), /* u0251 (ɑ) -> a */ /* 555 */ (17*4 + 1), /* u0252 (ɒ) -> a */ /* 556 */ (53*4 + 1), /* u0253 (ɓ) -> b */ /* 557 */ (23*4 + 1), /* u0254 (ɔ) -> o */ /* 558 */ ( 4*4 + 1), /* u0255 (ɕ) -> c */ /* 559 */ (20*4 + 1), /* u0256 (ɖ) -> d */ /* 560 */ (20*4 + 1), /* u0257 (ɗ) -> d */ /* 561 */ (19*4 + 1), /* u0258 (ɘ) -> e */ /* 562 */ (19*4 + 1), /* u0259 (ə) -> e */ /* 563 */ (19*4 + 1), /* u025A (ɚ) -> e */ /* 564 */ (19*4 + 1), /* u025B (ɛ) -> e */ /* 565 */ (19*4 + 1), /* u025C (ɜ) -> e */ /* 566 */ (19*4 + 1), /* u025D (ɝ) -> e */ /* 567 */ (19*4 + 1), /* u025E (ɞ) -> e */ /* 568 */ (29*4 + 1), /* u025F (ɟ) -> j */ /* 569 */ (32*4 + 1), /* u0260 (ɠ) -> g */ /* 570 */ (32*4 + 1), /* u0261 (ɡ) -> g */ /* 571 */ (32*4 + 1), /* u0262 (ɢ) -> g */ /* 572 */ (32*4 + 1), /* u0263 (ɣ) -> g */ /* 573 */ (23*4 + 1), /* u0264 (ɤ) -> o */ /* 574 */ ( 3*4 + 1), /* u0265 (ɥ) -> h */ /* 575 */ ( 3*4 + 1), /* u0266 (ɦ) -> h */ /* 576 */ ( 3*4 + 1), /* u0267 (ɧ) -> h */ /* 577 */ (16*4 + 1), /* u0268 (ɨ) -> i */ /* 578 */ (16*4 + 1), /* u0269 (ɩ) -> i */ /* 579 */ (16*4 + 1), /* u026A (ɪ) -> i */ /* 580 */ (11*4 + 1), /* u026B (ɫ) -> l */ /* 581 */ (11*4 + 1), /* u026C (ɬ) -> l */ /* 582 */ (11*4 + 1), /* u026D (ɭ) -> l */ /* 583 */ (11*4 + 1), /* u026E (ɮ) -> l */ /* 584 */ (55*4 + 1), /* u026F (ɯ) -> m */ /* 585 */ (55*4 + 1), /* u0270 (ɰ) -> m */ /* 586 */ (55*4 + 1), /* u0271 (ɱ) -> m */ /* 587 */ (31*4 + 1), /* u0272 (ɲ) -> n */ /* 588 */ (31*4 + 1), /* u0273 (ɳ) -> n */ /* 589 */ (31*4 + 1), /* u0274 (ɴ) -> n */ /* 590 */ (23*4 + 1), /* u0275 (ɵ) -> o */ /* 591 */ (23*4 + 2), /* u0276 (ɶ) -> oe */ /* 592 */ (23*4 + 1), /* u0277 (ɷ) -> o */ /* 593 */ (40*4 + 2), /* u0278 (ɸ) -> ph */ /* 594 */ (57*4 + 1), /* u0279 (ɹ) -> r */ /* 595 */ (57*4 + 1), /* u027A (ɺ) -> r */ /* 596 */ (57*4 + 1), /* u027B (ɻ) -> r */ /* 597 */ (57*4 + 1), /* u027C (ɼ) -> r */ /* 598 */ (57*4 + 1), /* u027D (ɽ) -> r */ /* 599 */ (57*4 + 1), /* u027E (ɾ) -> r */ /* 600 */ (57*4 + 1), /* u027F (ɿ) -> r */ /* 601 */ (57*4 + 1), /* u0280 (ʀ) -> r */ /* 602 */ (57*4 + 1), /* u0281 (ʁ) -> r */ /* 603 */ ( 1*4 + 1), /* u0282 (ʂ) -> s */ /* 604 */ ( 1*4 + 1), /* u0283 (ʃ) -> s */ /* 605 */ (29*4 + 1), /* u0284 (ʄ) -> j */ /* 606 */ ( 1*4 + 1), /* u0285 (ʅ) -> s */ /* 607 */ ( 1*4 + 1), /* u0286 (ʆ) -> s */ /* 608 */ (13*4 + 1), /* u0287 (ʇ) -> t */ /* 609 */ (13*4 + 1), /* u0288 (ʈ) -> t */ /* 610 */ (25*4 + 1), /* u0289 (ʉ) -> u */ /* 611 */ (25*4 + 1), /* u028A (ʊ) -> u */ /* 612 */ ( 7*4 + 1), /* u028B (ʋ) -> v */ /* 613 */ ( 7*4 + 1), /* u028C (ʌ) -> v */ /* 614 */ (15*4 + 1), /* u028D (ʍ) -> w */ /* 615 */ ( 9*4 + 1), /* u028E (ʎ) -> y */ /* 616 */ ( 9*4 + 1), /* u028F (ʏ) -> y */ /* 617 */ (21*4 + 1), /* u0290 (ʐ) -> z */ /* 618 */ (21*4 + 1), /* u0291 (ʑ) -> z */ /* 619 */ (21*4 + 1), /* u0292 (ʒ) -> z */ /* 620 */ (21*4 + 1), /* u0293 (ʓ) -> z */ /* 621 */ (58*4 + 1), /* u0294 (ʔ) -> x */ /* 622 */ (58*4 + 1), /* u0295 (ʕ) -> x */ /* 623 */ (58*4 + 1), /* u0296 (ʖ) -> x */ /* 624 */ ( 4*4 + 1), /* u0297 (ʗ) -> c */ /* 625 */ ( 4*4 + 1), /* u0298 (ʘ) -> c */ /* 626 */ (53*4 + 1), /* u0299 (ʙ) -> b */ /* 627 */ (19*4 + 1), /* u029A (ʚ) -> e */ /* 628 */ (32*4 + 1), /* u029B (ʛ) -> g */ /* 629 */ ( 3*4 + 1), /* u029C (ʜ) -> h */ /* 630 */ (29*4 + 1), /* u029D (ʝ) -> j */ /* 631 */ (54*4 + 1), /* u029E (ʞ) -> k */ /* 632 */ (11*4 + 1), /* u029F (ʟ) -> l */ /* 633 */ (56*4 + 1), /* u02A0 (ʠ) -> q */ /* 634 */ (52*4 + 1), /* u02A1 (ʡ) -> ' */ /* 635 */ (52*4 + 1), /* u02A2 (ʢ) -> ' */ /* 636 */ (20*4 + 2), /* u02A3 (ʣ) -> dz */ /* 637 */ (20*4 + 2), /* u02A4 (ʤ) -> dz */ /* 638 */ (20*4 + 2), /* u02A5 (ʥ) -> dz */ /* 639 */ (42*4 + 2), /* u02A6 (ʦ) -> ts */ /* 640 */ (42*4 + 2), /* u02A7 (ʧ) -> ts */ /* 641 */ (44*4 + 2), /* u02A8 (ʨ) -> tc */ /* 642 */ (46*4 + 2), /* u02A9 (ʩ) -> fe */ /* 643 */ (11*4 + 2), /* u02AA (ʪ) -> ls */ /* 644 */ (50*4 + 2), /* u02AB (ʫ) -> lz */ /* 645 */ (53*4 + 1), /* u02AC (ʬ) -> b */ /* 646 */ (20*4 + 1), /* u02AD (ʭ) -> d */ /* 647 */ (17*4 + 1), /* u0386 (Ά) -> a */ /* 648 */ 0, /* 649 */ (19*4 + 1), /* u0388 (Έ) -> e */ /* 650 */ (16*4 + 1), /* u0389 (Ή) -> i */ /* 651 */ (16*4 + 1), /* u038A (Ί) -> i */ /* 652 */ 0, /* 653 */ (23*4 + 1), /* u038C (Ό) -> o */ /* 654 */ 0, /* 655 */ ( 9*4 + 1), /* u038E (Ύ) -> y */ /* 656 */ (23*4 + 1), /* u038F (Ώ) -> o */ /* 657 */ (16*4 + 1), /* u0390 (ΐ) -> i */ /* 658 */ (17*4 + 1), /* u0391 (Α) -> a */ /* 659 */ (53*4 + 1), /* u0392 (Β) -> b */ /* 660 */ (32*4 + 1), /* u0393 (Γ) -> g */ /* 661 */ (20*4 + 1), /* u0394 (Δ) -> d */ /* 662 */ (19*4 + 1), /* u0395 (Ε) -> e */ /* 663 */ (21*4 + 1), /* u0396 (Ζ) -> z */ /* 664 */ (16*4 + 1), /* u0397 (Η) -> i */ /* 665 */ (13*4 + 2), /* u0398 (Θ) -> th */ /* 666 */ (16*4 + 1), /* u0399 (Ι) -> i */ /* 667 */ (54*4 + 1), /* u039A (Κ) -> k */ /* 668 */ (11*4 + 1), /* u039B (Λ) -> l */ /* 669 */ (55*4 + 1), /* u039C (Μ) -> m */ /* 670 */ (31*4 + 1), /* u039D (Ν) -> n */ /* 671 */ (58*4 + 1), /* u039E (Ξ) -> x */ /* 672 */ (23*4 + 1), /* u039F (Ο) -> o */ /* 673 */ ( 0*4 + 1), /* u03A0 (Π) -> p */ /* 674 */ (57*4 + 1), /* u03A1 (Ρ) -> r */ /* 675 */ 0, /* 676 */ ( 1*4 + 1), /* u03A3 (Σ) -> s */ /* 677 */ (13*4 + 1), /* u03A4 (Τ) -> t */ /* 678 */ ( 9*4 + 1), /* u03A5 (Υ) -> y */ /* 679 */ (46*4 + 1), /* u03A6 (Φ) -> f */ /* 680 */ ( 4*4 + 2), /* u03A7 (Χ) -> ch */ /* 681 */ ( 0*4 + 2), /* u03A8 (Ψ) -> ps */ /* 682 */ (23*4 + 1), /* u03A9 (Ω) -> o */ /* 683 */ (16*4 + 1), /* u03AA (Ϊ) -> i */ /* 684 */ ( 9*4 + 1), /* u03AB (Ϋ) -> y */ /* 685 */ (17*4 + 1), /* u03AC (ά) -> a */ /* 686 */ (19*4 + 1), /* u03AD (έ) -> e */ /* 687 */ (16*4 + 1), /* u03AE (ή) -> i */ /* 688 */ (16*4 + 1), /* u03AF (ί) -> i */ /* 689 */ ( 9*4 + 1), /* u03B0 (ΰ) -> y */ /* 690 */ (17*4 + 1), /* u03B1 (α) -> a */ /* 691 */ (53*4 + 1), /* u03B2 (β) -> b */ /* 692 */ (32*4 + 1), /* u03B3 (γ) -> g */ /* 693 */ (20*4 + 1), /* u03B4 (δ) -> d */ /* 694 */ (19*4 + 1), /* u03B5 (ε) -> e */ /* 695 */ (21*4 + 1), /* u03B6 (ζ) -> z */ /* 696 */ (16*4 + 1), /* u03B7 (η) -> i */ /* 697 */ (13*4 + 2), /* u03B8 (θ) -> th */ /* 698 */ (16*4 + 1), /* u03B9 (ι) -> i */ /* 699 */ (54*4 + 1), /* u03BA (κ) -> k */ /* 700 */ (11*4 + 1), /* u03BB (λ) -> l */ /* 701 */ (55*4 + 1), /* u03BC (μ) -> m */ /* 702 */ (31*4 + 1), /* u03BD (ν) -> n */ /* 703 */ (58*4 + 1), /* u03BE (ξ) -> x */ /* 704 */ (23*4 + 1), /* u03BF (ο) -> o */ /* 705 */ ( 0*4 + 1), /* u03C0 (π) -> p */ /* 706 */ (57*4 + 1), /* u03C1 (ρ) -> r */ /* 707 */ ( 1*4 + 1), /* u03C2 (ς) -> s */ /* 708 */ ( 1*4 + 1), /* u03C3 (σ) -> s */ /* 709 */ (13*4 + 1), /* u03C4 (τ) -> t */ /* 710 */ ( 9*4 + 1), /* u03C5 (υ) -> y */ /* 711 */ (46*4 + 1), /* u03C6 (φ) -> f */ /* 712 */ ( 4*4 + 2), /* u03C7 (χ) -> ch */ /* 713 */ ( 0*4 + 2), /* u03C8 (ψ) -> ps */ /* 714 */ (23*4 + 1), /* u03C9 (ω) -> o */ /* 715 */ (16*4 + 1), /* u03CA (ϊ) -> i */ /* 716 */ ( 9*4 + 1), /* u03CB (ϋ) -> y */ /* 717 */ (23*4 + 1), /* u03CC (ό) -> o */ /* 718 */ ( 9*4 + 1), /* u03CD (ύ) -> y */ /* 719 */ (23*4 + 1), /* u03CE (ώ) -> o */ /* 720 */ 0, /* 721 */ 0, /* 722 */ 0, /* 723 */ 0, /* 724 */ 0, /* 725 */ 0, /* 726 */ 0, /* 727 */ 0, /* 728 */ 0, /* 729 */ (54*4 + 1), /* u03D8 (Ϙ) -> k */ /* 730 */ (54*4 + 1), /* u03D9 (ϙ) -> k */ /* 731 */ (12*4 + 2), /* u03DA (Ϛ) -> st */ /* 732 */ (12*4 + 2), /* u03DB (ϛ) -> st */ /* 733 */ (15*4 + 1), /* u03DC (Ϝ) -> w */ /* 734 */ (15*4 + 1), /* u03DD (ϝ) -> w */ /* 735 */ (54*4 + 1), /* u03DE (Ϟ) -> k */ /* 736 */ (54*4 + 1), /* u03DF (ϟ) -> k */ /* 737 */ (42*4 + 2), /* u03E0 (Ϡ) -> ts */ /* 738 */ (42*4 + 2), /* u03E1 (ϡ) -> ts */ /* 739 */ 0, /* 740 */ 0, /* 741 */ 0, /* 742 */ 0, /* 743 */ 0, /* 744 */ 0, /* 745 */ 0, /* 746 */ 0, /* 747 */ 0, /* 748 */ 0, /* 749 */ 0, /* 750 */ 0, /* 751 */ 0, /* 752 */ 0, /* 753 */ 0, /* 754 */ 0, /* 755 */ 0, /* 756 */ 0, /* 757 */ 0, /* 758 */ 0, /* 759 */ 0, /* 760 */ 0, /* 761 */ 0, /* 762 */ 0, /* 763 */ 0, /* 764 */ 0, /* 765 */ 0, /* 766 */ 0, /* 767 */ 0, /* 768 */ 0, /* 769 */ (19*4 + 1), /* u0400 (Ѐ) -> e */ /* 770 */ (19*4 + 1), /* u0401 (Ё) -> e */ /* 771 */ (20*4 + 1), /* u0402 (Ђ) -> d */ /* 772 */ (32*4 + 1), /* u0403 (Ѓ) -> g */ /* 773 */ (19*4 + 1), /* u0404 (Є) -> e */ /* 774 */ (21*4 + 1), /* u0405 (Ѕ) -> z */ /* 775 */ (16*4 + 1), /* u0406 (І) -> i */ /* 776 */ (16*4 + 1), /* u0407 (Ї) -> i */ /* 777 */ (29*4 + 1), /* u0408 (Ј) -> j */ /* 778 */ (16*4 + 1), /* u0409 (Љ) -> i */ /* 779 */ (31*4 + 1), /* u040A (Њ) -> n */ /* 780 */ (20*4 + 1), /* u040B (Ћ) -> d */ /* 781 */ (54*4 + 1), /* u040C (Ќ) -> k */ /* 782 */ (16*4 + 1), /* u040D (Ѝ) -> i */ /* 783 */ (25*4 + 1), /* u040E (Ў) -> u */ /* 784 */ (20*4 + 1), /* u040F (Џ) -> d */ /* 785 */ (17*4 + 1), /* u0410 (А) -> a */ /* 786 */ (53*4 + 1), /* u0411 (Б) -> b */ /* 787 */ ( 7*4 + 1), /* u0412 (В) -> v */ /* 788 */ (32*4 + 1), /* u0413 (Г) -> g */ /* 789 */ (20*4 + 1), /* u0414 (Д) -> d */ /* 790 */ (19*4 + 1), /* u0415 (Е) -> e */ /* 791 */ (21*4 + 2), /* u0416 (Ж) -> zh */ /* 792 */ (21*4 + 1), /* u0417 (З) -> z */ /* 793 */ (16*4 + 1), /* u0418 (И) -> i */ /* 794 */ (16*4 + 1), /* u0419 (Й) -> i */ /* 795 */ (54*4 + 1), /* u041A (К) -> k */ /* 796 */ (11*4 + 1), /* u041B (Л) -> l */ /* 797 */ (55*4 + 1), /* u041C (М) -> m */ /* 798 */ (31*4 + 1), /* u041D (Н) -> n */ /* 799 */ (23*4 + 1), /* u041E (О) -> o */ /* 800 */ ( 0*4 + 1), /* u041F (П) -> p */ /* 801 */ (57*4 + 1), /* u0420 (Р) -> r */ /* 802 */ ( 1*4 + 1), /* u0421 (С) -> s */ /* 803 */ (13*4 + 1), /* u0422 (Т) -> t */ /* 804 */ (25*4 + 1), /* u0423 (У) -> u */ /* 805 */ (46*4 + 1), /* u0424 (Ф) -> f */ /* 806 */ (59*4 + 2), /* u0425 (Х) -> kh */ /* 807 */ (44*4 + 2), /* u0426 (Ц) -> tc */ /* 808 */ ( 4*4 + 2), /* u0427 (Ч) -> ch */ /* 809 */ ( 2*4 + 2), /* u0428 (Ш) -> sh */ /* 810 */ ( 2*4 + 4), /* u0429 (Щ) -> shch */ /* 811 */ (17*4 + 1), /* u042A (Ъ) -> a */ /* 812 */ ( 9*4 + 1), /* u042B (Ы) -> y */ /* 813 */ ( 9*4 + 1), /* u042C (Ь) -> y */ /* 814 */ (19*4 + 1), /* u042D (Э) -> e */ /* 815 */ (61*4 + 2), /* u042E (Ю) -> iu */ /* 816 */ (16*4 + 2), /* u042F (Я) -> ia */ /* 817 */ (17*4 + 1), /* u0430 (а) -> a */ /* 818 */ (53*4 + 1), /* u0431 (б) -> b */ /* 819 */ ( 7*4 + 1), /* u0432 (в) -> v */ /* 820 */ (32*4 + 1), /* u0433 (г) -> g */ /* 821 */ (20*4 + 1), /* u0434 (д) -> d */ /* 822 */ (19*4 + 1), /* u0435 (е) -> e */ /* 823 */ (21*4 + 2), /* u0436 (ж) -> zh */ /* 824 */ (21*4 + 1), /* u0437 (з) -> z */ /* 825 */ (16*4 + 1), /* u0438 (и) -> i */ /* 826 */ (16*4 + 1), /* u0439 (й) -> i */ /* 827 */ (54*4 + 1), /* u043A (к) -> k */ /* 828 */ (11*4 + 1), /* u043B (л) -> l */ /* 829 */ (55*4 + 1), /* u043C (м) -> m */ /* 830 */ (31*4 + 1), /* u043D (н) -> n */ /* 831 */ (23*4 + 1), /* u043E (о) -> o */ /* 832 */ ( 0*4 + 1), /* u043F (п) -> p */ /* 833 */ (57*4 + 1), /* u0440 (р) -> r */ /* 834 */ ( 1*4 + 1), /* u0441 (с) -> s */ /* 835 */ (13*4 + 1), /* u0442 (т) -> t */ /* 836 */ (25*4 + 1), /* u0443 (у) -> u */ /* 837 */ (46*4 + 1), /* u0444 (ф) -> f */ /* 838 */ (59*4 + 2), /* u0445 (х) -> kh */ /* 839 */ (44*4 + 2), /* u0446 (ц) -> tc */ /* 840 */ ( 4*4 + 2), /* u0447 (ч) -> ch */ /* 841 */ ( 2*4 + 2), /* u0448 (ш) -> sh */ /* 842 */ ( 2*4 + 4), /* u0449 (щ) -> shch */ /* 843 */ (17*4 + 1), /* u044A (ъ) -> a */ /* 844 */ ( 9*4 + 1), /* u044B (ы) -> y */ /* 845 */ ( 9*4 + 1), /* u044C (ь) -> y */ /* 846 */ (19*4 + 1), /* u044D (э) -> e */ /* 847 */ (61*4 + 2), /* u044E (ю) -> iu */ /* 848 */ (16*4 + 2), /* u044F (я) -> ia */ /* 849 */ (19*4 + 1), /* u0450 (ѐ) -> e */ /* 850 */ (19*4 + 1), /* u0451 (ё) -> e */ /* 851 */ (20*4 + 1), /* u0452 (ђ) -> d */ /* 852 */ (32*4 + 1), /* u0453 (ѓ) -> g */ /* 853 */ (19*4 + 1), /* u0454 (є) -> e */ /* 854 */ (21*4 + 1), /* u0455 (ѕ) -> z */ /* 855 */ (16*4 + 1), /* u0456 (і) -> i */ /* 856 */ (16*4 + 1), /* u0457 (ї) -> i */ /* 857 */ (29*4 + 1), /* u0458 (ј) -> j */ /* 858 */ (16*4 + 1), /* u0459 (љ) -> i */ /* 859 */ (31*4 + 1), /* u045A (њ) -> n */ /* 860 */ (20*4 + 1), /* u045B (ћ) -> d */ /* 861 */ (54*4 + 1), /* u045C (ќ) -> k */ /* 862 */ (16*4 + 1), /* u045D (ѝ) -> i */ /* 863 */ (25*4 + 1), /* u045E (ў) -> u */ /* 864 */ (20*4 + 1), /* u045F (џ) -> d */ /* 865 */ (19*4 + 1), /* u05B0 (ְ) -> e */ /* 866 */ (19*4 + 1), /* u05B1 (ֱ) -> e */ /* 867 */ (17*4 + 1), /* u05B2 (ֲ) -> a */ /* 868 */ (23*4 + 1), /* u05B3 (ֳ) -> o */ /* 869 */ (16*4 + 1), /* u05B4 (ִ) -> i */ /* 870 */ (19*4 + 1), /* u05B5 (ֵ) -> e */ /* 871 */ (19*4 + 1), /* u05B6 (ֶ) -> e */ /* 872 */ (17*4 + 1), /* u05B7 (ַ) -> a */ /* 873 */ (17*4 + 1), /* u05B8 (ָ) -> a */ /* 874 */ (23*4 + 1), /* u05B9 (ֹ) -> o */ /* 875 */ 0, /* 876 */ (25*4 + 1), /* u05BB (ֻ) -> u */ /* 877 */ (17*4 + 1), /* u05BC (ּ) -> a */ /* 878 */ ( 1*4 + 0), /* u05BD (ֽ) -> */ /* 879 */ ( 1*4 + 0), /* u05BE (־) -> */ /* 880 */ (19*4 + 1), /* u05BF (ֿ) -> e */ /* 881 */ 0, /* 882 */ ( 2*4 + 2), /* u05C1 (ׁ) -> sh */ /* 883 */ ( 1*4 + 1), /* u05C2 (ׂ) -> s */ /* 884 */ 0, /* 885 */ ( 1*4 + 0), /* u05C4 (ׄ) -> */ /* 886 */ 0, /* 887 */ 0, /* 888 */ 0, /* 889 */ 0, /* 890 */ 0, /* 891 */ 0, /* 892 */ 0, /* 893 */ 0, /* 894 */ 0, /* 895 */ 0, /* 896 */ 0, /* 897 */ ( 1*4 + 0), /* u05D0 (א) -> */ /* 898 */ (53*4 + 1), /* u05D1 (ב) -> b */ /* 899 */ (32*4 + 1), /* u05D2 (ג) -> g */ /* 900 */ (20*4 + 1), /* u05D3 (ד) -> d */ /* 901 */ ( 3*4 + 1), /* u05D4 (ה) -> h */ /* 902 */ ( 7*4 + 1), /* u05D5 (ו) -> v */ /* 903 */ (21*4 + 1), /* u05D6 (ז) -> z */ /* 904 */ ( 3*4 + 1), /* u05D7 (ח) -> h */ /* 905 */ (13*4 + 1), /* u05D8 (ט) -> t */ /* 906 */ ( 9*4 + 1), /* u05D9 (י) -> y */ /* 907 */ (54*4 + 1), /* u05DA (ך) -> k */ /* 908 */ (54*4 + 1), /* u05DB (כ) -> k */ /* 909 */ (11*4 + 1), /* u05DC (ל) -> l */ /* 910 */ (55*4 + 1), /* u05DD (ם) -> m */ /* 911 */ (55*4 + 1), /* u05DE (מ) -> m */ /* 912 */ (31*4 + 1), /* u05DF (ן) -> n */ /* 913 */ (31*4 + 1), /* u05E0 (נ) -> n */ /* 914 */ ( 1*4 + 1), /* u05E1 (ס) -> s */ /* 915 */ ( 1*4 + 0), /* u05E2 (ע) -> */ /* 916 */ ( 0*4 + 1), /* u05E3 (ף) -> p */ /* 917 */ ( 0*4 + 1), /* u05E4 (פ) -> p */ /* 918 */ (42*4 + 2), /* u05E5 (ץ) -> ts */ /* 919 */ (42*4 + 2), /* u05E6 (צ) -> ts */ /* 920 */ (56*4 + 1), /* u05E7 (ק) -> q */ /* 921 */ (57*4 + 1), /* u05E8 (ר) -> r */ /* 922 */ ( 2*4 + 2), /* u05E9 (ש) -> sh */ /* 923 */ (13*4 + 1), /* u05EA (ת) -> t */ /* 924 */ 0, /* 925 */ 0, /* 926 */ 0, /* 927 */ 0, /* 928 */ 0, /* 929 */ ( 7*4 + 2), /* u05F0 (װ) -> vv */ /* 930 */ ( 8*4 + 2), /* u05F1 (ױ) -> vy */ /* 931 */ ( 9*4 + 2), /* u05F2 (ײ) -> yy */ /* 932 */ }; /* Maximum token length. Longer tokens are truncated */ #define MX_TRANSLIT 40 /* The cursor object for the translit tokenizer */ typedef struct translit_tokenizer_cursor { sqlite3_tokenizer_cursor base; /* Base class. Must be first */ const unsigned char *zInput; /* input we are tokenizing */ int nBytes; /* size of the input */ int iOffset; /* current position in pInput */ int iToken; /* index of next token to be returned */ char zToken[MX_TRANSLIT+1]; /* storage for current token */ } translit_tokenizer_cursor; /* ** Create a new tokenizer instance. */ static int translitCreate( int argc, const char * const *argv, sqlite3_tokenizer **ppTokenizer ){ sqlite3_tokenizer *p; *ppTokenizer = p = (sqlite3_tokenizer*)sqlite3_malloc(sizeof(*p)); if( p==NULL ) return SQLITE_NOMEM; memset(p, 0, sizeof(*p)); return SQLITE_OK; } /* ** Destroy a tokenizer */ static int translitDestroy(sqlite3_tokenizer *pTokenizer){ sqlite3_free(pTokenizer); return SQLITE_OK; } /* ** Prepare to begin tokenizing a particular string. The input ** string to be tokenized is pInput[0..nBytes-1]. A cursor ** used to incrementally tokenize this string is returned in ** *ppCursor. */ static int translitOpen( sqlite3_tokenizer *pTokenizer, /* The tokenizer */ const char *zInput, int nBytes, /* String to be tokenized */ sqlite3_tokenizer_cursor **ppCursor /* OUT: Tokenization cursor */ ){ translit_tokenizer_cursor *pCur; UNUSED_PARAMETER(pTokenizer); pCur = (translit_tokenizer_cursor *) sqlite3_malloc(sizeof(*pCur)); if( pCur==NULL ) return SQLITE_NOMEM; memset(pCur, 0, sizeof(*pCur)); pCur->zInput = (const unsigned char*)zInput; if( zInput==0 ){ pCur->nBytes = 0; }else if( nBytes<0 ){ pCur->nBytes = (int)strlen(zInput); }else{ pCur->nBytes = nBytes; } pCur->iOffset = 0; /* start tokenizing at the beginning */ pCur->iToken = 0; *ppCursor = &pCur->base; return SQLITE_OK; } /* ** Close a tokenization cursor previously opened by a call to ** translitOpen() above. */ static int translitClose(sqlite3_tokenizer_cursor *pCursor){ sqlite3_free(pCursor); return SQLITE_OK; } /* ** Extract the next token from a tokenization cursor. The cursor must ** have been opened by a prior call to translitOpen(). */ static int translitNext( sqlite3_tokenizer_cursor *pCursor, /* Cursor returned by translitOpen */ const char **ppToken, /* OUT: *ppToken is the token text */ int *pnBytes, /* OUT: Number of bytes in token */ int *piStartOffset, /* OUT: Starting offset of token */ int *piEndOffset, /* OUT: Ending offset of token */ int *piPosition /* OUT: Position integer of token */ ){ translit_tokenizer_cursor *pCur = (translit_tokenizer_cursor *) pCursor; int n = 0; /* Number of characters in the generated token */ int u = 0; /* Unicode value of the next input character */ int i; /* Index of transliteration of u in aTranslat[] */ unsigned char c; /* Next input character */ unsigned char t; /* aTranslat[u] - 1 */ int j, k; /* Loop counters */ *ppToken = pCur->zToken; while( pCur->iOffsetnBytes ){ if( n==0 ) *piStartOffset = pCur->iOffset; c = pCur->zInput[pCur->iOffset++]; u = c; if( (c&0x80)==0 ){ i = c; }else{ i = 0; if( pCur->iOffsetnBytes ){ u = ((int)(c&0x3f)<<6); c = pCur->zInput[pCur->iOffset++]; if( (c&0xc0)!=0x80 ){ i = 0; }else{ u |= c&0x3f; i = u; while( pCur->iOffsetnBytes && (pCur->zInput[pCur->iOffset]&0xc0)==0x80 ){ pCur->iOffset++; u = 0x0300; /* Assume a combining accent character */ } if( u>=0x02ae ){ if( u<=0x0385 ){ if( u>=0x0300 && u<=0x036f ){ continue; /* Skip Combining accents */ } i = 0; }else{ i -= 0x0386 - 0x02ae; if( u>=0x0460 ){ if( u<0x0591 ){ i = 0; }else if( u>=0x05b0 && u<0x05f2 ){ i -= 0x05b0 - 0x0460; }else{ continue; /* Assume a combining accent character */ } } } } } } } if( i ) i -= 0x0026; assert( i>=0 && i0 ) pCur->zToken[n++] = zTranslit[k++]; } } pCur->zToken[n] = 0; *pnBytes = n; *piEndOffset = pCur->iOffset; *piPosition = pCur->iToken; if( n ){ pCur->iToken++; return SQLITE_OK; }else{ return SQLITE_DONE; } } /* ** The set of routines that implement the translit tokenizer */ static const sqlite3_tokenizer_module translitTokenizerModule = { 0, translitCreate, translitDestroy, translitOpen, translitClose, translitNext, 0, }; /* ** Allocate a new translit tokenizer. Return a pointer to the new ** tokenizer in *ppModule */ void sqlite3Fts3TranslitTokenizerModule( sqlite3_tokenizer_module const**ppModule ){ *ppModule = &translitTokenizerModule; } #endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) */