15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2007 Apple Computer, Inc.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Portions are Copyright (C) 1998 Netscape Communications Corporation.
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Lesser General Public
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2.1 of the License, or (at your option) any later version.
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful,
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Lesser General Public License for more details.
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Lesser General Public
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License along with this library; if not, write to the Free Software
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Alternatively, the contents of this file may be used under the terms
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * of either the Mozilla Public License Version 1.1, found at
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * http://www.mozilla.org/MPL/ (the "MPL") or the GNU General Public
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License Version 2.0, found at http://www.fsf.org/copyleft/gpl.html
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (the "GPL"), in which case the provisions of the MPL or the GPL are
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * applicable instead of those above.  If you wish to allow use of your
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version of this file only under the terms of one of those two
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * licenses (the MPL or the GPL) and not to allow others to use your
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version of this file under the LGPL, indicate your decision by
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * deletingthe provisions above and replace them with the notice and
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * other provisions required by the MPL or the GPL, as the case may be.
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * If you do not delete the provisions above, a recipient may use your
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version of this file under any of the LGPL, the MPL or the GPL.
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
361e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/text/UnicodeRange.h"
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
38c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch// This table depends on unicode range definitions.
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Each item's index must correspond to a unicode range value
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// eg. x-cyrillic = LangGroupTable[cRangeCyrillic]
43f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)static const char* const gUnicodeRangeToLangGroupTable[] =
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  "x-cyrillic",
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  "el",
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  "tr",
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  "he",
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  "ar",
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  "x-baltic",
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  "th",
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  "ko",
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  "ja",
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  "zh-CN",
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  "zh-TW",
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  "x-devanagari",
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  "x-tamil",
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  "x-armn",
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  "x-beng",
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  "x-cans",
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  "x-ethi",
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  "x-geor",
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  "x-gujr",
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  "x-guru",
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  "x-khmr",
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  "x-mlym"
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/**********************************************************************
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Unicode subranges as defined in unicode 3.0
7102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch * x-western, x-central-euro, tr, x-baltic  -> latin
7202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch *  0000 - 036f
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  1e00 - 1eff
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  2000 - 206f  (general punctuation)
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  20a0 - 20cf  (currency symbols)
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  2100 - 214f  (letterlike symbols)
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  2150 - 218f  (Number Forms)
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * el         -> greek
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  0370 - 03ff
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  1f00 - 1fff
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * x-cyrillic -> cyrillic
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  0400 - 04ff
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * he         -> hebrew
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  0590 - 05ff
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * ar         -> arabic
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  0600 - 06ff
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  fb50 - fdff (arabic presentation forms)
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  fe70 - feff (arabic presentation forms b)
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * th - thai
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  0e00 - 0e7f
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * ko        -> korean
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  ac00 - d7af  (hangul Syllables)
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  1100 - 11ff    (jamo)
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  3130 - 318f (hangul compatibility jamo)
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * ja
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  3040 - 309f (hiragana)
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  30a0 - 30ff (katakana)
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * zh-CN
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * zh-TW
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * CJK
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  3100 - 312f (bopomofo)
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  31a0 - 31bf (bopomofo extended)
10402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch *  3000 - 303f (CJK Symbols and Punctuation)
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  2e80 - 2eff (CJK radicals supplement)
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  2f00 - 2fdf (Kangxi Radicals)
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  2ff0 - 2fff (Ideographic Description Characters)
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  3190 - 319f (kanbun)
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  3200 - 32ff (Enclosed CJK letters and Months)
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  3300 - 33ff (CJK compatibility)
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  3400 - 4dbf (CJK Unified Ideographs Extension A)
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  4e00 - 9faf (CJK Unified Ideographs)
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  f900 - fa5f (CJK Compatibility Ideographs)
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  fe30 - fe4f (CJK compatibility Forms)
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  ff00 - ffef (halfwidth and fullwidth forms)
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Armenian
11802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch *  0530 - 058f
11902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch * Sriac
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  0700 - 074f
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Thaana
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  0780 - 07bf
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Devanagari
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  0900 - 097f
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Bengali
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  0980 - 09ff
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Gurmukhi
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  0a00 - 0a7f
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Gujarati
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  0a80 - 0aff
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Oriya
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  0b00 - 0b7f
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Tamil
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  0b80 - 0bff
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Telugu
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  0c00 - 0c7f
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Kannada
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  0c80 - 0cff
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Malayalam
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  0d00 - 0d7f
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Sinhala
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  0d80 - 0def
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Lao
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  0e80 - 0eff
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Tibetan
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  0f00 - 0fbf
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Myanmar
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  1000 - 109f
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Georgian
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  10a0 - 10ff
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Ethiopic
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  1200 - 137f
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Cherokee
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  13a0 - 13ff
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Canadian Aboriginal Syllabics
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  1400 - 167f
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Ogham
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  1680 - 169f
15902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch * Runic
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  16a0 - 16ff
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Khmer
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  1780 - 17ff
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Mongolian
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  1800 - 18af
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Misc - superscripts and subscripts
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  2070 - 209f
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Misc - Combining Diacritical Marks for Symbols
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  20d0 - 20ff
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Misc - Arrows
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  2190 - 21ff
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Misc - Mathematical Operators
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  2200 - 22ff
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Misc - Miscellaneous Technical
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  2300 - 23ff
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Misc - Control picture
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  2400 - 243f
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Misc - Optical character recognition
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  2440 - 2450
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Misc - Enclose Alphanumerics
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  2460 - 24ff
18102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch * Misc - Box Drawing
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  2500 - 257f
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Misc - Block Elements
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  2580 - 259f
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Misc - Geometric Shapes
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  25a0 - 25ff
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Misc - Miscellaneous Symbols
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  2600 - 267f
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Misc - Dingbats
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  2700 - 27bf
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Misc - Braille Patterns
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  2800 - 28ff
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Yi Syllables
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  a000 - a48f
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Yi radicals
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  a490 - a4cf
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Alphabetic Presentation Forms
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  fb00 - fb4f
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Misc - Combining half Marks
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  fe20 - fe2f
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Misc - small form variants
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  fe50 - fe6f
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Misc - Specials
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  fff0 - ffff
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *********************************************************************/
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const unsigned cNumSubTables = 9;
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const unsigned cSubTableSize = 16;
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdochstatic const unsigned char gUnicodeSubrangeTable[cNumSubTables][cSubTableSize] =
21102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch{
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  { // table for X---
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeTableBase+1,  //u0xxx
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeTableBase+2,  //u1xxx
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeTableBase+3,  //u2xxx
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeSetCJK,       //u3xxx
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeSetCJK,       //u4xxx
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeSetCJK,       //u5xxx
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeSetCJK,       //u6xxx
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeSetCJK,       //u7xxx
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeSetCJK,       //u8xxx
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeSetCJK,       //u9xxx
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeTableBase+4,  //uaxxx
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeKorean,       //ubxxx
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeKorean,       //ucxxx
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeTableBase+5,  //udxxx
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangePrivate,      //uexxx
2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeTableBase+6   //ufxxx
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  { //table for 0X--
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeSetLatin,          //u00xx
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeSetLatin,          //u01xx
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeSetLatin,          //u02xx
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeGreek,             //u03xx     XXX 0300-036f is in fact cRangeCombiningDiacriticalMarks
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeCyrillic,          //u04xx
2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeTableBase+7,       //u05xx, includes Cyrillic supplement, Hebrew, and Armenian
2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeArabic,            //u06xx
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeTertiaryTable,     //u07xx
2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeUnassigned,        //u08xx
2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeTertiaryTable,     //u09xx
2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeTertiaryTable,     //u0axx
2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeTertiaryTable,     //u0bxx
2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeTertiaryTable,     //u0cxx
2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeTertiaryTable,     //u0dxx
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeTertiaryTable,     //u0exx
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeTibetan,           //u0fxx
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  { //table for 1x--
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeTertiaryTable,     //u10xx
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeKorean,            //u11xx
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeEthiopic,          //u12xx
2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeTertiaryTable,     //u13xx
2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeCanadian,          //u14xx
2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeCanadian,          //u15xx
2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeTertiaryTable,     //u16xx
2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeKhmer,             //u17xx
2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeMongolian,         //u18xx
2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeUnassigned,        //u19xx
2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeUnassigned,        //u1axx
2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeUnassigned,        //u1bxx
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeUnassigned,        //u1cxx
2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeUnassigned,        //u1dxx
2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeSetLatin,          //u1exx
2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeGreek,             //u1fxx
2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  { //table for 2x--
2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeSetLatin,          //u20xx
2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeSetLatin,          //u21xx
2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeMathOperators,     //u22xx
2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeMiscTechnical,     //u23xx
2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeControlOpticalEnclose, //u24xx
2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeBoxBlockGeometrics, //u25xx
2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeMiscSymbols,       //u26xx
2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeDingbats,          //u27xx
2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeBraillePattern,    //u28xx
2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeUnassigned,        //u29xx
2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeUnassigned,        //u2axx
2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeUnassigned,        //u2bxx
2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeUnassigned,        //u2cxx
2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeUnassigned,        //u2dxx
2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeSetCJK,            //u2exx
2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeSetCJK,            //u2fxx
2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  {  //table for ax--
2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeYi,                //ua0xx
2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeYi,                //ua1xx
2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeYi,                //ua2xx
2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeYi,                //ua3xx
2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeYi,                //ua4xx
2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeUnassigned,        //ua5xx
2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeUnassigned,        //ua6xx
2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeUnassigned,        //ua7xx
2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeUnassigned,        //ua8xx
2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeUnassigned,        //ua9xx
2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeUnassigned,        //uaaxx
2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeUnassigned,        //uabxx
2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeKorean,            //uacxx
2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeKorean,            //uadxx
2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeKorean,            //uaexx
3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeKorean,            //uafxx
3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  {  //table for dx--
3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeKorean,            //ud0xx
3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeKorean,            //ud1xx
3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeKorean,            //ud2xx
3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeKorean,            //ud3xx
3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeKorean,            //ud4xx
3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeKorean,            //ud5xx
3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeKorean,            //ud6xx
3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeKorean,            //ud7xx
3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeSurrogate,         //ud8xx
3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeSurrogate,         //ud9xx
3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeSurrogate,         //udaxx
3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeSurrogate,         //udbxx
3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeSurrogate,         //udcxx
3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeSurrogate,         //uddxx
3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeSurrogate,         //udexx
3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeSurrogate,         //udfxx
3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  { // table for fx--
32102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    cRangePrivate,           //uf0xx
32202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    cRangePrivate,           //uf1xx
32302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    cRangePrivate,           //uf2xx
32402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    cRangePrivate,           //uf3xx
32502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    cRangePrivate,           //uf4xx
32602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    cRangePrivate,           //uf5xx
32702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    cRangePrivate,           //uf6xx
32802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    cRangePrivate,           //uf7xx
32902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    cRangePrivate,           //uf8xx
33002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    cRangeSetCJK,            //uf9xx
33102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    cRangeSetCJK,            //ufaxx
3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeArabic,            //ufbxx, includes alphabic presentation form
3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeArabic,            //ufcxx
3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeArabic,            //ufdxx
33502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    cRangeArabic,            //ufexx, includes Combining half marks,
33602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch                             //                CJK compatibility forms,
33702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch                             //                CJK compatibility forms,
3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                             //                small form variants
3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeTableBase+8,       //uffxx, halfwidth and fullwidth forms, includes Specials
3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  { //table for 0x0500 - 0x05ff
3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeCyrillic,          //u050x
3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeCyrillic,          //u051x
3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeCyrillic,          //u052x
3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeArmenian,          //u053x
3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeArmenian,          //u054x
3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeArmenian,          //u055x
3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeArmenian,          //u056x
3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeArmenian,          //u057x
3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeArmenian,          //u058x
3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeHebrew,            //u059x
3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeHebrew,            //u05ax
3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeHebrew,            //u05bx
3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeHebrew,            //u05cx
3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeHebrew,            //u05dx
3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeHebrew,            //u05ex
3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeHebrew,            //u05fx
3585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
3595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  { //table for 0xff00 - 0xffff
3605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeSetCJK,            //uff0x, fullwidth latin
3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeSetCJK,            //uff1x, fullwidth latin
3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeSetCJK,            //uff2x, fullwidth latin
3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeSetCJK,            //uff3x, fullwidth latin
3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeSetCJK,            //uff4x, fullwidth latin
3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeSetCJK,            //uff5x, fullwidth latin
3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeSetCJK,            //uff6x, halfwidth katakana
3675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeSetCJK,            //uff7x, halfwidth katakana
3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeSetCJK,            //uff8x, halfwidth katakana
3695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeSetCJK,            //uff9x, halfwidth katakana
3705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeSetCJK,            //uffax, halfwidth hangul jamo
3715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeSetCJK,            //uffbx, halfwidth hangul jamo
3725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeSetCJK,            //uffcx, halfwidth hangul jamo
3735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeSetCJK,            //uffdx, halfwidth hangul jamo
3745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeSetCJK,            //uffex, fullwidth symbols
3755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeSpecials,          //ufffx, Specials
3765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
3775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
3785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
37902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch// Most scripts between U+0700 and U+16FF are assigned a chunk of 128 (0x80)
3805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// code points so that the number of entries in the tertiary range
3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// table for that range is obtained by dividing (0x1700 - 0x0700) by 128.
38202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch// Exceptions: Ethiopic, Tibetan, Hangul Jamo and Canadian aboriginal
3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// syllabaries take multiple chunks and Ogham and Runic share a single chunk.
3845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const unsigned cTertiaryTableSize = ((0x1700 - 0x0700) / 0x80);
3855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const unsigned char gUnicodeTertiaryRangeTable[cTertiaryTableSize] =
38702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch{ //table for 0x0700 - 0x1600
3885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeSyriac,            //u070x
3895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeThaana,            //u078x
3905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeUnassigned,        //u080x  place holder(resolved in the 2ndary tab.)
3915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeUnassigned,        //u088x  place holder(resolved in the 2ndary tab.)
3925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeDevanagari,        //u090x
3935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeBengali,           //u098x
3945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeGurmukhi,          //u0a0x
3955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeGujarati,          //u0a8x
3965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeOriya,             //u0b0x
3975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeTamil,             //u0b8x
3985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeTelugu,            //u0c0x
3995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeKannada,           //u0c8x
4005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeMalayalam,         //u0d0x
4015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeSinhala,           //u0d8x
40202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    cRangeThai,              //u0e0x
4035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeLao,               //u0e8x
4045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeTibetan,           //u0f0x  place holder(resolved in the 2ndary tab.)
4055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeTibetan,           //u0f8x  place holder(resolved in the 2ndary tab.)
4065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeMyanmar,           //u100x
4075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeGeorgian,          //u108x
4085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeKorean,            //u110x  place holder(resolved in the 2ndary tab.)
4095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeKorean,            //u118x  place holder(resolved in the 2ndary tab.)
4105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeEthiopic,          //u120x  place holder(resolved in the 2ndary tab.)
4115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeEthiopic,          //u128x  place holder(resolved in the 2ndary tab.)
41202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    cRangeEthiopic,          //u130x
4135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeCherokee,          //u138x
4145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeCanadian,          //u140x  place holder(resolved in the 2ndary tab.)
4155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeCanadian,          //u148x  place holder(resolved in the 2ndary tab.)
4165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeCanadian,          //u150x  place holder(resolved in the 2ndary tab.)
4175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeCanadian,          //u158x  place holder(resolved in the 2ndary tab.)
41802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    cRangeCanadian,          //u160x
4195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cRangeOghamRunic,        //u168x  this contains two scripts, Ogham & Runic
4205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
4215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
42202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch// A two level index is almost enough for locating a range, with the
4235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// exception of u03xx and u05xx. Since we don't really care about range for
42402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch// combining diacritical marks in our font application, they are
42502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch// not discriminated further.  Future adoption of this method for other use
42602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch// should be aware of this limitation. The implementation can be extended if
4275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// there is such a need.
4285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// For Indic, Southeast Asian scripts and some other scripts between
4295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// U+0700 and U+16FF, it's extended to the third level.
43007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochunsigned findCharUnicodeRange(UChar32 ch)
4315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (ch >= 0xFFFF)
4335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
4345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
43507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    unsigned range;
4365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //search the first table
4385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    range = gUnicodeSubrangeTable[0][ch >> 12];
43902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
4405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (range < cRangeTableBase)
44102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch        // we try to get a specific range
4425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return range;
4435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // otherwise, we have one more table to look at
4455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    range = gUnicodeSubrangeTable[range - cRangeTableBase][(ch & 0x0f00) >> 8];
4465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (range < cRangeTableBase)
4475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return range;
4485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (range < cRangeTertiaryTable)
4495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return gUnicodeSubrangeTable[range - cRangeTableBase][(ch & 0x00f0) >> 4];
4505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Yet another table to look at : U+0700 - U+16FF : 128 code point blocks
4525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return gUnicodeTertiaryRangeTable[(ch - 0x0700) >> 7];
4535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const char* langGroupFromUnicodeRange(unsigned char unicodeRange)
4565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
45702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    if (cRangeSpecificItemNum > unicodeRange)
4585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return gUnicodeRangeToLangGroupTable[unicodeRange];
4595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
4605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
463