17935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/* 27935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ******************************************************************************* 37935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Copyright (C) 2008-2012, International Business Machines Corporation and * 47935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * others. All Rights Reserved. * 57935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ******************************************************************************* 67935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 77935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpackage com.ibm.icu.charset; 87935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 97935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.nio.ByteBuffer; 107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.nio.CharBuffer; 117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.nio.IntBuffer; 127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.nio.charset.CharsetDecoder; 137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.nio.charset.CharsetEncoder; 147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.nio.charset.CoderResult; 157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.UTF16; 177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.UnicodeSet; 187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/** 207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @author Michael Ow 217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * 227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertclass CharsetISCII extends CharsetICU { 247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final short UCNV_OPTIONS_VERSION_MASK = 0X0f; 257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert //private static final short NUKTA = 0x093c; 267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert //private static final short HALANT = 0x094d; 277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final short ZWNJ = 0x200c; /* Zero Width Non Joiner */ 287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final short ZWJ = 0x200d; /* Zero Width Joiner */ 297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert //private static final int INVALID_CHAR = 0xffff; 307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final short ATR = 0xef; /* Attribute code */ 317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final short EXT = 0xf0; /* Extension code */ 327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final short DANDA = 0x0964; 337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final short DOUBLE_DANDA = 0x0965; 347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final short ISCII_NUKTA = 0xe9; 357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final short ISCII_HALANT = 0xe8; 367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final short ISCII_DANDA = 0xea; 377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final short ISCII_VOWEL_SIGN_E = 0xe0; 387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final short ISCII_INV = 0xd9; 397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final short INDIC_BLOCK_BEGIN = 0x0900; 407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final short INDIC_BLOCK_END = 0x0d7f; 417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final short INDIC_RANGE = (INDIC_BLOCK_END - INDIC_BLOCK_BEGIN); 427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final short VOCALLIC_RR = 0x0931; 437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final short LF = 0x0a; 447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final short ASCII_END = 0xa0; 457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final short TELUGU_DELTA = (UniLang.DELTA * UniLang.TELUGU); 467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final short DEV_ABBR_SIGN = 0x0970; 477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final short DEV_ANUDATTA = 0x0952; 487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final short EXT_RANGE_BEGIN = 0xa1; 497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final short EXT_RANGE_END = 0xee; 507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final short PNJ_DELTA = 0x100; 517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final int NO_CHAR_MARKER = 0xfffe; 527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* Used for proper conversion to and from Gurmukhi */ 547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static UnicodeSet PNJ_BINDI_TIPPI_SET; 557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static UnicodeSet PNJ_CONSONANT_SET; 567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final short PNJ_BINDI = 0x0a02; 577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final short PNJ_TIPPI = 0x0a70; 587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final short PNJ_SIGN_VIRAMA = 0x0a4d; 597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final short PNJ_ADHAK = 0x0a71; 607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final short PNJ_HA = 0x0a39; 617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final short PNJ_RRA = 0x0a5c; 627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final class UniLang { 647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert static final short DEVALANGARI = 0; 657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert static final short BENGALI = DEVALANGARI + 1; 667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert static final short GURMUKHI = BENGALI + 1; 677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert static final short GUJARATI = GURMUKHI + 1; 687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert static final short ORIYA = GUJARATI + 1; 697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert static final short TAMIL = ORIYA + 1; 707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert static final short TELUGU = TAMIL + 1; 717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert static final short KANNADA = TELUGU + 1; 727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert static final short MALAYALAM = KANNADA + 1; 737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert static final short DELTA = 0x80; 747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @SuppressWarnings("unused") 767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final class ISCIILang { 777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert static final short DEF = 0x40; 787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert static final short RMN = 0x41; 797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert static final short DEV = 0x42; 807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert static final short BNG = 0x43; 817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert static final short TML = 0x44; 827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert static final short TLG = 0x45; 837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert static final short ASM = 0x46; 847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert static final short ORI = 0x47; 857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert static final short KND = 0x48; 867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert static final short MLM = 0x49; 877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert static final short GJR = 0x4a; 887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert static final short PNJ = 0x4b; 897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert static final short ARB = 0x71; 907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert static final short PES = 0x72; 917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert static final short URD = 0x73; 927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert static final short SND = 0x74; 937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert static final short KSM = 0x75; 947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert static final short PST = 0x76; 957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final class MaskEnum { 987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert static final short DEV_MASK = 0x80; 997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert static final short PNJ_MASK = 0x40; 1007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert static final short GJR_MASK = 0x20; 1017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert static final short ORI_MASK = 0x10; 1027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert static final short BNG_MASK = 0x08; 1037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert static final short KND_MASK = 0x04; 1047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert static final short MLM_MASK = 0x02; 1057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert static final short TML_MASK = 0x01; 1067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert static final short ZERO = 0x00; 1077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private final static String ISCII_CNV_PREFIX = "ISCII,version="; 1107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @SuppressWarnings("unused") 1127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final class UConverterDataISCII { 1137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int option; 1147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int contextCharToUnicode; /* previous Unicode codepoint for contextual analysis */ 1157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int contextCharFromUnicode; /* previous Unicode codepoint for contextual analysis */ 1167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert short defDeltaToUnicode; /* delta for switching to default state when DEF is encountered */ 1177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert short currentDeltaFromUnicode; /* current delta in Indic block */ 1187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert short currentDeltaToUnicode; /* current delta in Indic block */ 1197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert short currentMaskFromUnicode; /* mask for current state in fromUnicode */ 1207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert short currentMaskToUnicode; /* mask for current state in toUnicode */ 1217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert short defMaskToUnicode; /* mask for default state in toUnicode */ 1227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert boolean isFirstBuffer; /* boolean for fromUnicode to see if we need to announce the first script */ 1237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert boolean resetToDefaultToUnicode; /* boolean for reseting to default delta and mask when a newline is encountered */ 1247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String name; 1257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int prevToUnicodeStatus; /* Hold the previous toUnicodeStatus. This is necessary because we may need to know the last two code points. */ 1267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert UConverterDataISCII(int option, String name) { 1287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.option = option; 1297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.name = name; 1307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert initialize(); 1327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert void initialize() { 1357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.contextCharToUnicode = NO_CHAR_MARKER; /* contextCharToUnicode */ 1367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.currentDeltaFromUnicode = 0x0000; /* contextCharFromUnicode */ 1377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.defDeltaToUnicode = (short)(lookupInitialData[option & UCNV_OPTIONS_VERSION_MASK].uniLang * UniLang.DELTA); /* defDeltaToUnicode */ 1387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.currentDeltaFromUnicode = (short)(lookupInitialData[option & UCNV_OPTIONS_VERSION_MASK].uniLang * UniLang.DELTA); /* currentDeltaFromUnicode */ 1397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.currentDeltaToUnicode = (short)(lookupInitialData[option & UCNV_OPTIONS_VERSION_MASK].uniLang * UniLang.DELTA); /* currentDeltaToUnicode */ 1407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.currentMaskToUnicode = lookupInitialData[option & UCNV_OPTIONS_VERSION_MASK].maskEnum; /* currentMaskToUnicode */ 1417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.currentMaskFromUnicode = lookupInitialData[option & UCNV_OPTIONS_VERSION_MASK].maskEnum; /* currentMaskFromUnicode */ 1427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.defMaskToUnicode = lookupInitialData[option & UCNV_OPTIONS_VERSION_MASK].maskEnum; /* defMaskToUnicode */ 1437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.isFirstBuffer = true; /* isFirstBuffer */ 1447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.resetToDefaultToUnicode = false; /* resetToDefaultToUnicode */ 1457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.prevToUnicodeStatus = 0x0000; 1467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final class LookupDataStruct { 1507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert short uniLang; 1517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert short maskEnum; 1527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert short isciiLang; 1537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert LookupDataStruct(short uniLang, short maskEnum, short isciiLang) { 1557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.uniLang = uniLang; 1567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.maskEnum = maskEnum; 1577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.isciiLang = isciiLang; 1587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final LookupDataStruct [] lookupInitialData = { 1627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new LookupDataStruct(UniLang.DEVALANGARI, MaskEnum.DEV_MASK, ISCIILang.DEV), 1637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new LookupDataStruct(UniLang.BENGALI, MaskEnum.BNG_MASK, ISCIILang.BNG), 1647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new LookupDataStruct(UniLang.GURMUKHI, MaskEnum.PNJ_MASK, ISCIILang.PNJ), 1657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new LookupDataStruct(UniLang.GUJARATI, MaskEnum.GJR_MASK, ISCIILang.GJR), 1667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new LookupDataStruct(UniLang.ORIYA, MaskEnum.ORI_MASK, ISCIILang.ORI), 1677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new LookupDataStruct(UniLang.TAMIL, MaskEnum.TML_MASK, ISCIILang.TML), 1687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new LookupDataStruct(UniLang.TELUGU, MaskEnum.KND_MASK, ISCIILang.TLG), 1697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new LookupDataStruct(UniLang.KANNADA, MaskEnum.KND_MASK, ISCIILang.KND), 1707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new LookupDataStruct(UniLang.MALAYALAM, MaskEnum.MLM_MASK, ISCIILang.MLM) 1717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 1727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 1747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * The values in validity table are indexed by the lower bits of Unicode 1757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * range 0x0900 - 0x09ff. The values have a structure like: 1767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * ----------------------------------------------------------------- 1777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * |DEV | PNJ | GJR | ORI | BNG | TLG | MLM | TML | 1787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * | | | | | ASM | KND | | | 1797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * ----------------------------------------------------------------- 1807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * If a code point is valid in a particular script 1817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * then that bit is turned on 1827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * 1837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Unicode does not distinguish between Bengali and Assamese aso we use 1 bit for 1847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * to represent these languages 1857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * 1867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Telugu and Kannda have same codepoints except for Vocallic_RR which we special case 1877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * and combine and use 1 bit to represent these languages 1887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 1897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final short validityTable[] = { 1907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* This state table is tool generated so please do not edit unless you know exactly what you are doing */ 1917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* Note: This table was edited to mirror the Windows XP implementation */ 1927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* ISCII: Valid: Unicode */ 1937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xa0: 0x00: 0x900 */ MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO, 1947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xa1: 0xb8: 0x901 */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO, 1957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xa2: 0xfe: 0x902 */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.TML_MASK, 1967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xa3: 0xbf: 0x903 */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.TML_MASK, 1977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0x00: 0x00: 0x904 */ MaskEnum.DEV_MASK + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO, 1987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xa4: 0xff: 0x905 */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.TML_MASK, 1997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xa5: 0xff: 0x906 */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.TML_MASK, 2007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xa6: 0xff: 0x907 */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.TML_MASK, 2017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xa7: 0xff: 0x908 */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.TML_MASK, 2027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xa8: 0xff: 0x909 */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.TML_MASK, 2037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xa9: 0xff: 0x90a */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.TML_MASK, 2047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xaa: 0xfe: 0x90b */ MaskEnum.DEV_MASK + MaskEnum.ZERO + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.ZERO, 2057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0x00: 0x00: 0x90c */ MaskEnum.DEV_MASK + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.ZERO, 2067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xae: 0x80: 0x90d */ MaskEnum.DEV_MASK + MaskEnum.ZERO + MaskEnum.GJR_MASK + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO, 2077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xab: 0x87: 0x90e */ MaskEnum.DEV_MASK + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.TML_MASK, 2087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xac: 0xff: 0x90f */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.TML_MASK, 2097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xad: 0xff: 0x910 */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.TML_MASK, 2107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xb2: 0x80: 0x911 */ MaskEnum.DEV_MASK + MaskEnum.ZERO + MaskEnum.GJR_MASK + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO, 2117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xaf: 0x87: 0x912 */ MaskEnum.DEV_MASK + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.TML_MASK, 2127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xb0: 0xff: 0x913 */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.TML_MASK, 2137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xb1: 0xff: 0x914 */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.TML_MASK, 2147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xb3: 0xff: 0x915 */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.TML_MASK, 2157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xb4: 0xfe: 0x916 */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.ZERO, 2167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xb5: 0xfe: 0x917 */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.ZERO, 2177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xb6: 0xfe: 0x918 */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.ZERO, 2187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xb7: 0xff: 0x919 */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.TML_MASK, 2197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xb8: 0xff: 0x91a */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.TML_MASK, 2207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xb9: 0xfe: 0x91b */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.ZERO, 2217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xba: 0xff: 0x91c */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.TML_MASK, 2227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xbb: 0xfe: 0x91d */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.ZERO, 2237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xbc: 0xff: 0x91e */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.TML_MASK, 2247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xbd: 0xff: 0x91f */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.TML_MASK, 2257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xbe: 0xfe: 0x920 */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.ZERO, 2267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xbf: 0xfe: 0x921 */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.ZERO, 2277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xc0: 0xfe: 0x922 */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.ZERO, 2287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xc1: 0xff: 0x923 */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.TML_MASK, 2297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xc2: 0xff: 0x924 */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.TML_MASK, 2307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xc3: 0xfe: 0x925 */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.ZERO, 2317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xc4: 0xfe: 0x926 */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.ZERO, 2327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xc5: 0xfe: 0x927 */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.ZERO, 2337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xc6: 0xff: 0x928 */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.TML_MASK, 2347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xc7: 0x81: 0x929 */ MaskEnum.DEV_MASK + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.TML_MASK, 2357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xc8: 0xff: 0x92a */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.TML_MASK, 2367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xc9: 0xfe: 0x92b */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.ZERO, 2377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xca: 0xfe: 0x92c */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.ZERO, 2387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xcb: 0xfe: 0x92d */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.ZERO, 2397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xcc: 0xfe: 0x92e */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.TML_MASK, 2407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xcd: 0xff: 0x92f */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.TML_MASK, 2417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xcf: 0xff: 0x930 */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.TML_MASK, 2427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xd0: 0x87: 0x931 */ MaskEnum.DEV_MASK + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.MLM_MASK + MaskEnum.TML_MASK, 2437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xd1: 0xff: 0x932 */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.TML_MASK, 2447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xd2: 0xb7: 0x933 */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.ZERO + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.TML_MASK, 2457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xd3: 0x83: 0x934 */ MaskEnum.DEV_MASK + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.MLM_MASK + MaskEnum.TML_MASK, 2467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xd4: 0xff: 0x935 */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.ZERO + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.TML_MASK, 2477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xd5: 0xfe: 0x936 */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.ZERO, 2487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xd6: 0xbf: 0x937 */ MaskEnum.DEV_MASK + MaskEnum.ZERO + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.TML_MASK, 2497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xd7: 0xff: 0x938 */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.TML_MASK, 2507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xd8: 0xff: 0x939 */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.TML_MASK, 2517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0x00: 0x00: 0x93a */ MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO, 2527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0x00: 0x00: 0x93b */ MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO, 2537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xe9: 0xda: 0x93c */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.ZERO + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO, 2547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0x00: 0x00: 0x93d */ MaskEnum.DEV_MASK + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO, 2557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xda: 0xff: 0x93e */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.TML_MASK, 2567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xdb: 0xff: 0x93f */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.TML_MASK, 2577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xdc: 0xff: 0x940 */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.TML_MASK, 2587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xdd: 0xff: 0x941 */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.TML_MASK, 2597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xde: 0xff: 0x942 */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.TML_MASK, 2607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xdf: 0xbe: 0x943 */ MaskEnum.DEV_MASK + MaskEnum.ZERO + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.ZERO, 2617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0x00: 0x00: 0x944 */ MaskEnum.DEV_MASK + MaskEnum.ZERO + MaskEnum.GJR_MASK + MaskEnum.ZERO + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.ZERO + MaskEnum.ZERO, 2627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xe3: 0x80: 0x945 */ MaskEnum.DEV_MASK + MaskEnum.ZERO + MaskEnum.GJR_MASK + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO, 2637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xe0: 0x87: 0x946 */ MaskEnum.DEV_MASK + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.TML_MASK, 2647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xe1: 0xff: 0x947 */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.TML_MASK, 2657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xe2: 0xff: 0x948 */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.TML_MASK, 2667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xe7: 0x80: 0x949 */ MaskEnum.DEV_MASK + MaskEnum.ZERO + MaskEnum.GJR_MASK + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO, 2677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xe4: 0x87: 0x94a */ MaskEnum.DEV_MASK + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.TML_MASK, 2687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xe5: 0xff: 0x94b */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.TML_MASK, 2697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xe6: 0xff: 0x94c */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.TML_MASK, 2707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xe8: 0xff: 0x94d */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.TML_MASK, 2717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xec: 0x00: 0x94e */ MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO, 2727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xed: 0x00: 0x94f */ MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO, 2737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0x00: 0x00: 0x950 */ MaskEnum.DEV_MASK + MaskEnum.ZERO + MaskEnum.GJR_MASK + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO, 2747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0x00: 0x00: 0x951 */ MaskEnum.DEV_MASK + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO, 2757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0x00: 0x00: 0x952 */ MaskEnum.DEV_MASK + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO, 2767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0x00: 0x00: 0x953 */ MaskEnum.DEV_MASK + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO, 2777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0x00: 0x00: 0x954 */ MaskEnum.DEV_MASK + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO, 2787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0x00: 0x00: 0x955 */ MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.KND_MASK + MaskEnum.ZERO + MaskEnum.ZERO, 2797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0x00: 0x00: 0x956 */ MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ORI_MASK + MaskEnum.ZERO + MaskEnum.KND_MASK + MaskEnum.ZERO + MaskEnum.ZERO, 2807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0x00: 0x00: 0x957 */ MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.ZERO + MaskEnum.MLM_MASK + MaskEnum.ZERO, 2817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0x00: 0x00: 0x958 */ MaskEnum.DEV_MASK + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO, 2827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0x00: 0x00: 0x959 */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO, 2837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0x00: 0x00: 0x95a */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO, 2847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0x00: 0x00: 0x95b */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO, 2857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0x00: 0x00: 0x95c */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.BNG_MASK + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO, 2867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0x00: 0x00: 0x95d */ MaskEnum.DEV_MASK + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO, 2877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0x00: 0x00: 0x95e */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO, 2887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xce: 0x98: 0x95f */ MaskEnum.DEV_MASK + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO, 2897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0x00: 0x00: 0x960 */ MaskEnum.DEV_MASK + MaskEnum.ZERO + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.ZERO, 2907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0x00: 0x00: 0x961 */ MaskEnum.DEV_MASK + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.ZERO, 2917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0x00: 0x00: 0x962 */ MaskEnum.DEV_MASK + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.BNG_MASK + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO, 2927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0x00: 0x00: 0x963 */ MaskEnum.DEV_MASK + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.BNG_MASK + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO, 2937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xea: 0xf8: 0x964 */ MaskEnum.DEV_MASK + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO, 2947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xeaea: 0x00: 0x965 */ MaskEnum.DEV_MASK + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO, 2957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xf1: 0xff: 0x966 */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.TML_MASK, 2967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xf2: 0xff: 0x967 */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.TML_MASK, 2977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xf3: 0xff: 0x968 */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.TML_MASK, 2987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xf4: 0xff: 0x969 */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.TML_MASK, 2997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xf5: 0xff: 0x96a */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.TML_MASK, 3007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xf6: 0xff: 0x96b */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.TML_MASK, 3017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xf7: 0xff: 0x96c */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.TML_MASK, 3027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xf8: 0xff: 0x96d */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.TML_MASK, 3037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xf9: 0xff: 0x96e */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.TML_MASK, 3047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0xfa: 0xff: 0x96f */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.GJR_MASK + MaskEnum.ORI_MASK + MaskEnum.BNG_MASK + MaskEnum.KND_MASK + MaskEnum.MLM_MASK + MaskEnum.TML_MASK, 3057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0x00: 0x80: 0x970 */ MaskEnum.DEV_MASK + MaskEnum.PNJ_MASK + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO + MaskEnum.ZERO, 3067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 3077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 3087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * The length of the array is 128 to provide values for 0x900..0x97f. 3097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * The last 15 entries for 0x971..0x97f of the table are all zero 3107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * because no Indic script uses such Unicode code points. 3117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 3127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 3137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0x00: 0x00: 0x971 */ MaskEnum.ZERO, 3147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0x00: 0x00: 0x972 */ MaskEnum.ZERO, 3157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0x00: 0x00: 0x973 */ MaskEnum.ZERO, 3167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0x00: 0x00: 0x974 */ MaskEnum.ZERO, 3177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0x00: 0x00: 0x975 */ MaskEnum.ZERO, 3187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0x00: 0x00: 0x976 */ MaskEnum.ZERO, 3197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0x00: 0x00: 0x977 */ MaskEnum.ZERO, 3207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0x00: 0x00: 0x978 */ MaskEnum.ZERO, 3217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0x00: 0x00: 0x979 */ MaskEnum.ZERO, 3227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0x00: 0x00: 0x97A */ MaskEnum.ZERO, 3237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0x00: 0x00: 0x97B */ MaskEnum.ZERO, 3247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0x00: 0x00: 0x97C */ MaskEnum.ZERO, 3257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0x00: 0x00: 0x97D */ MaskEnum.ZERO, 3267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0x00: 0x00: 0x97E */ MaskEnum.ZERO, 3277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 0x00: 0x00: 0x97F */ MaskEnum.ZERO, 3287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 3297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 3307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final char fromUnicodeTable[] = { 3317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00a0, /* 0x0900 */ 3327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00a1, /* 0x0901 */ 3337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00a2, /* 0x0902 */ 3347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00a3, /* 0x0903 */ 3357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0xa4e0, /* 0x0904 */ 3367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00a4, /* 0x0905 */ 3377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00a5, /* 0x0906 */ 3387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00a6, /* 0x0907 */ 3397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00a7, /* 0x0908 */ 3407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00a8, /* 0x0909 */ 3417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00a9, /* 0x090a */ 3427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00aa, /* 0x090b */ 3437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0xA6E9, /* 0x090c */ 3447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00ae, /* 0x090d */ 3457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00ab, /* 0x090e */ 3467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00ac, /* 0x090f */ 3477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00ad, /* 0x0910 */ 3487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00b2, /* 0x0911 */ 3497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00af, /* 0x0912 */ 3507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00b0, /* 0x0913 */ 3517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00b1, /* 0x0914 */ 3527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00b3, /* 0x0915 */ 3537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00b4, /* 0x0916 */ 3547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00b5, /* 0x0917 */ 3557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00b6, /* 0x0918 */ 3567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00b7, /* 0x0919 */ 3577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00b8, /* 0x091a */ 3587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00b9, /* 0x091b */ 3597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00ba, /* 0x091c */ 3607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00bb, /* 0x091d */ 3617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00bc, /* 0x091e */ 3627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00bd, /* 0x091f */ 3637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00be, /* 0x0920 */ 3647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00bf, /* 0x0921 */ 3657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00c0, /* 0x0922 */ 3667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00c1, /* 0x0923 */ 3677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00c2, /* 0x0924 */ 3687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00c3, /* 0x0925 */ 3697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00c4, /* 0x0926 */ 3707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00c5, /* 0x0927 */ 3717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00c6, /* 0x0928 */ 3727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00c7, /* 0x0929 */ 3737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00c8, /* 0x092a */ 3747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00c9, /* 0x092b */ 3757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00ca, /* 0x092c */ 3767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00cb, /* 0x092d */ 3777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00cc, /* 0x092e */ 3787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00cd, /* 0x092f */ 3797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00cf, /* 0x0930 */ 3807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00d0, /* 0x0931 */ 3817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00d1, /* 0x0932 */ 3827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00d2, /* 0x0933 */ 3837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00d3, /* 0x0934 */ 3847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00d4, /* 0x0935 */ 3857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00d5, /* 0x0936 */ 3867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00d6, /* 0x0937 */ 3877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00d7, /* 0x0938 */ 3887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00d8, /* 0x0939 */ 3897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0xFFFF, /* 0x093a */ 3907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0xFFFF, /* 0x093b */ 3917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00e9, /* 0x093c */ 3927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0xEAE9, /* 0x093d */ 3937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00da, /* 0x093e */ 3947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00db, /* 0x093f */ 3957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00dc, /* 0x0940 */ 3967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00dd, /* 0x0941 */ 3977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00de, /* 0x0942 */ 3987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00df, /* 0x0943 */ 3997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0xDFE9, /* 0x0944 */ 4007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00e3, /* 0x0945 */ 4017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00e0, /* 0x0946 */ 4027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00e1, /* 0x0947 */ 4037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00e2, /* 0x0948 */ 4047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00e7, /* 0x0949 */ 4057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00e4, /* 0x094a */ 4067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00e5, /* 0x094b */ 4077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00e6, /* 0x094c */ 4087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00e8, /* 0x094d */ 4097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00ec, /* 0x094e */ 4107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00ed, /* 0x094f */ 4117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0xA1E9, /* 0x0950 */ /* OM Symbol */ 4127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0xFFFF, /* 0x0951 */ 4137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0xF0B8, /* 0x0952 */ 4147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0xFFFF, /* 0x0953 */ 4157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0xFFFF, /* 0x0954 */ 4167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0xFFFF, /* 0x0955 */ 4177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0xFFFF, /* 0x0956 */ 4187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0xFFFF, /* 0x0957 */ 4197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0xb3e9, /* 0x0958 */ 4207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0xb4e9, /* 0x0959 */ 4217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0xb5e9, /* 0x095a */ 4227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0xbae9, /* 0x095b */ 4237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0xbfe9, /* 0x095c */ 4247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0xC0E9, /* 0x095d */ 4257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0xc9e9, /* 0x095e */ 4267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00ce, /* 0x095f */ 4277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0xAAe9, /* 0x0960 */ 4287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0xA7E9, /* 0x0961 */ 4297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0xDBE9, /* 0x0962 */ 4307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0xDCE9, /* 0x0963 */ 4317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00ea, /* 0x0964 */ 4327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0xeaea, /* 0x0965 */ 4337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00f1, /* 0x0966 */ 4347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00f2, /* 0x0967 */ 4357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00f3, /* 0x0968 */ 4367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00f4, /* 0x0969 */ 4377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00f5, /* 0x096a */ 4387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00f6, /* 0x096b */ 4397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00f7, /* 0x096c */ 4407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00f8, /* 0x096d */ 4417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00f9, /* 0x096e */ 4427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00fa, /* 0x096f */ 4437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0xF0BF, /* 0x0970 */ 4447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0xFFFF, /* 0x0971 */ 4457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0xFFFF, /* 0x0972 */ 4467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0xFFFF, /* 0x0973 */ 4477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0xFFFF, /* 0x0974 */ 4487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0xFFFF, /* 0x0975 */ 4497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0xFFFF, /* 0x0976 */ 4507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0xFFFF, /* 0x0977 */ 4517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0xFFFF, /* 0x0978 */ 4527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0xFFFF, /* 0x0979 */ 4537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0xFFFF, /* 0x097a */ 4547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0xFFFF, /* 0x097b */ 4557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0xFFFF, /* 0x097c */ 4567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0xFFFF, /* 0x097d */ 4577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0xFFFF, /* 0x097e */ 4587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0xFFFF, /* 0x097f */ 4597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 4607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final char toUnicodeTable[] = { 4617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0000, /* 0x00 */ 4627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0001, /* 0x01 */ 4637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0002, /* 0x02 */ 4647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0003, /* 0x03 */ 4657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0004, /* 0x04 */ 4667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0005, /* 0x05 */ 4677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0006, /* 0x06 */ 4687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0007, /* 0x07 */ 4697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0008, /* 0x08 */ 4707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0009, /* 0x09 */ 4717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x000a, /* 0x0a */ 4727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x000b, /* 0x0b */ 4737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x000c, /* 0x0c */ 4747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x000d, /* 0x0d */ 4757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x000e, /* 0x0e */ 4767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x000f, /* 0x0f */ 4777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0010, /* 0x10 */ 4787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0011, /* 0x11 */ 4797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0012, /* 0x12 */ 4807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0013, /* 0x13 */ 4817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0014, /* 0x14 */ 4827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0015, /* 0x15 */ 4837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0016, /* 0x16 */ 4847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0017, /* 0x17 */ 4857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0018, /* 0x18 */ 4867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0019, /* 0x19 */ 4877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x001a, /* 0x1a */ 4887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x001b, /* 0x1b */ 4897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x001c, /* 0x1c */ 4907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x001d, /* 0x1d */ 4917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x001e, /* 0x1e */ 4927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x001f, /* 0x1f */ 4937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0020, /* 0x20 */ 4947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0021, /* 0x21 */ 4957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0022, /* 0x22 */ 4967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0023, /* 0x23 */ 4977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0024, /* 0x24 */ 4987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0025, /* 0x25 */ 4997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0026, /* 0x26 */ 5007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0027, /* 0x27 */ 5017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0028, /* 0x28 */ 5027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0029, /* 0x29 */ 5037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x002a, /* 0x2a */ 5047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x002b, /* 0x2b */ 5057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x002c, /* 0x2c */ 5067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x002d, /* 0x2d */ 5077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x002e, /* 0x2e */ 5087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x002f, /* 0x2f */ 5097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0030, /* 0x30 */ 5107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0031, /* 0x31 */ 5117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0032, /* 0x32 */ 5127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0033, /* 0x33 */ 5137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0034, /* 0x34 */ 5147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0035, /* 0x35 */ 5157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0036, /* 0x36 */ 5167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0037, /* 0x37 */ 5177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0038, /* 0x38 */ 5187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0039, /* 0x39 */ 5197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x003A, /* 0x3A */ 5207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x003B, /* 0x3B */ 5217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x003c, /* 0x3c */ 5227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x003d, /* 0x3d */ 5237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x003e, /* 0x3e */ 5247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x003f, /* 0x3f */ 5257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0040, /* 0x40 */ 5267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0041, /* 0x41 */ 5277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0042, /* 0x42 */ 5287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0043, /* 0x43 */ 5297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0044, /* 0x44 */ 5307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0045, /* 0x45 */ 5317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0046, /* 0x46 */ 5327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0047, /* 0x47 */ 5337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0048, /* 0x48 */ 5347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0049, /* 0x49 */ 5357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x004a, /* 0x4a */ 5367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x004b, /* 0x4b */ 5377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x004c, /* 0x4c */ 5387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x004d, /* 0x4d */ 5397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x004e, /* 0x4e */ 5407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x004f, /* 0x4f */ 5417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0050, /* 0x50 */ 5427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0051, /* 0x51 */ 5437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0052, /* 0x52 */ 5447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0053, /* 0x53 */ 5457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0054, /* 0x54 */ 5467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0055, /* 0x55 */ 5477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0056, /* 0x56 */ 5487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0057, /* 0x57 */ 5497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0058, /* 0x58 */ 5507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0059, /* 0x59 */ 5517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x005a, /* 0x5a */ 5527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x005b, /* 0x5b */ 5537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x005c, /* 0x5c */ 5547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x005d, /* 0x5d */ 5557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x005e, /* 0x5e */ 5567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x005f, /* 0x5f */ 5577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0060, /* 0x60 */ 5587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0061, /* 0x61 */ 5597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0062, /* 0x62 */ 5607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0063, /* 0x63 */ 5617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0064, /* 0x64 */ 5627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0065, /* 0x65 */ 5637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0066, /* 0x66 */ 5647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0067, /* 0x67 */ 5657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0068, /* 0x68 */ 5667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0069, /* 0x69 */ 5677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x006a, /* 0x6a */ 5687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x006b, /* 0x6b */ 5697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x006c, /* 0x6c */ 5707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x006d, /* 0x6d */ 5717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x006e, /* 0x6e */ 5727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x006f, /* 0x6f */ 5737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0070, /* 0x70 */ 5747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0071, /* 0x71 */ 5757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0072, /* 0x72 */ 5767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0073, /* 0x73 */ 5777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0074, /* 0x74 */ 5787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0075, /* 0x75 */ 5797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0076, /* 0x76 */ 5807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0077, /* 0x77 */ 5817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0078, /* 0x78 */ 5827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0079, /* 0x79 */ 5837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x007a, /* 0x7a */ 5847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x007b, /* 0x7b */ 5857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x007c, /* 0x7c */ 5867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x007d, /* 0x7d */ 5877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x007e, /* 0x7e */ 5887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x007f, /* 0x7f */ 5897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0080, /* 0x80 */ 5907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0081, /* 0x81 */ 5917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0082, /* 0x82 */ 5927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0083, /* 0x83 */ 5937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0084, /* 0x84 */ 5947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0085, /* 0x85 */ 5957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0086, /* 0x86 */ 5967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0087, /* 0x87 */ 5977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0088, /* 0x88 */ 5987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0089, /* 0x89 */ 5997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x008a, /* 0x8a */ 6007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x008b, /* 0x8b */ 6017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x008c, /* 0x8c */ 6027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x008d, /* 0x8d */ 6037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x008e, /* 0x8e */ 6047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x008f, /* 0x8f */ 6057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0090, /* 0x90 */ 6067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0091, /* 0x91 */ 6077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0092, /* 0x92 */ 6087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0093, /* 0x93 */ 6097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0094, /* 0x94 */ 6107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0095, /* 0x95 */ 6117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0096, /* 0x96 */ 6127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0097, /* 0x97 */ 6137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0098, /* 0x98 */ 6147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0099, /* 0x99 */ 6157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x009a, /* 0x9a */ 6167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x009b, /* 0x9b */ 6177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x009c, /* 0x9c */ 6187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x009d, /* 0x9d */ 6197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x009e, /* 0x9e */ 6207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x009f, /* 0x9f */ 6217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x00A0, /* 0xa0 */ 6227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0901, /* 0xa1 */ 6237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0902, /* 0xa2 */ 6247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0903, /* 0xa3 */ 6257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0905, /* 0xa4 */ 6267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0906, /* 0xa5 */ 6277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0907, /* 0xa6 */ 6287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0908, /* 0xa7 */ 6297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0909, /* 0xa8 */ 6307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x090a, /* 0xa9 */ 6317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x090b, /* 0xaa */ 6327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x090e, /* 0xab */ 6337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x090f, /* 0xac */ 6347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0910, /* 0xad */ 6357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x090d, /* 0xae */ 6367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0912, /* 0xaf */ 6377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0913, /* 0xb0 */ 6387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0914, /* 0xb1 */ 6397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0911, /* 0xb2 */ 6407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0915, /* 0xb3 */ 6417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0916, /* 0xb4 */ 6427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0917, /* 0xb5 */ 6437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0918, /* 0xb6 */ 6447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0919, /* 0xb7 */ 6457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x091a, /* 0xb8 */ 6467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x091b, /* 0xb9 */ 6477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x091c, /* 0xba */ 6487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x091d, /* 0xbb */ 6497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x091e, /* 0xbc */ 6507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x091f, /* 0xbd */ 6517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0920, /* 0xbe */ 6527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0921, /* 0xbf */ 6537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0922, /* 0xc0 */ 6547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0923, /* 0xc1 */ 6557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0924, /* 0xc2 */ 6567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0925, /* 0xc3 */ 6577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0926, /* 0xc4 */ 6587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0927, /* 0xc5 */ 6597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0928, /* 0xc6 */ 6607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0929, /* 0xc7 */ 6617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x092a, /* 0xc8 */ 6627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x092b, /* 0xc9 */ 6637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x092c, /* 0xca */ 6647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x092d, /* 0xcb */ 6657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x092e, /* 0xcc */ 6667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x092f, /* 0xcd */ 6677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x095f, /* 0xce */ 6687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0930, /* 0xcf */ 6697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0931, /* 0xd0 */ 6707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0932, /* 0xd1 */ 6717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0933, /* 0xd2 */ 6727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0934, /* 0xd3 */ 6737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0935, /* 0xd4 */ 6747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0936, /* 0xd5 */ 6757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0937, /* 0xd6 */ 6767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0938, /* 0xd7 */ 6777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0939, /* 0xd8 */ 6787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x200D, /* 0xd9 */ 6797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x093e, /* 0xda */ 6807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x093f, /* 0xdb */ 6817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0940, /* 0xdc */ 6827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0941, /* 0xdd */ 6837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0942, /* 0xde */ 6847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0943, /* 0xdf */ 6857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0946, /* 0xe0 */ 6867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0947, /* 0xe1 */ 6877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0948, /* 0xe2 */ 6887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0945, /* 0xe3 */ 6897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x094a, /* 0xe4 */ 6907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x094b, /* 0xe5 */ 6917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x094c, /* 0xe6 */ 6927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0949, /* 0xe7 */ 6937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x094d, /* 0xe8 */ 6947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x093c, /* 0xe9 */ 6957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0964, /* 0xea */ 6967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0xFFFF, /* 0xeb */ 6977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0xFFFF, /* 0xec */ 6987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0xFFFF, /* 0xed */ 6997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0xFFFF, /* 0xee */ 7007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0xFFFF, /* 0xef */ 7017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0xFFFF, /* 0xf0 */ 7027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0966, /* 0xf1 */ 7037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0967, /* 0xf2 */ 7047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0968, /* 0xf3 */ 7057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x0969, /* 0xf4 */ 7067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x096a, /* 0xf5 */ 7077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x096b, /* 0xf6 */ 7087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x096c, /* 0xf7 */ 7097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x096d, /* 0xf8 */ 7107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x096e, /* 0xf9 */ 7117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0x096f, /* 0xfa */ 7127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0xFFFF, /* 0xfb */ 7137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0xFFFF, /* 0xfc */ 7147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0xFFFF, /* 0xfd */ 7157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0xFFFF, /* 0xfe */ 7167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0xFFFF, /* 0xff */ 7177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 7187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final char nuktaSpecialCases[][] = { 7197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { 16 /* length of array */ , 0 }, 7207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { 0xa6, 0x090c }, 7217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { 0xea, 0x093d }, 7227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { 0xdf, 0x0944 }, 7237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { 0xa1, 0x0950 }, 7247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { 0xb3, 0x0958 }, 7257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { 0xb4, 0x0959 }, 7267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { 0xb5, 0x095a }, 7277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { 0xba, 0x095b }, 7287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { 0xbf, 0x095c }, 7297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { 0xc0, 0x095d }, 7307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { 0xc9, 0x095e }, 7317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { 0xaa, 0x0960 }, 7327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { 0xa7, 0x0961 }, 7337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { 0xdb, 0x0962 }, 7347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { 0xdc, 0x0963 } 7357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 7367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final char vowelSignESpecialCases[][] = { 7377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { 2 /* length of array */ , 0 }, 7387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { 0xA4, 0x0904 } 7397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 7407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 7417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final short lookupTable[][] = { 7427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { MaskEnum.ZERO, MaskEnum.ZERO }, /* DEFAULT */ 7437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { MaskEnum.ZERO, MaskEnum.ZERO }, /* ROMAN */ 7447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { UniLang.DEVALANGARI, MaskEnum.DEV_MASK }, 7457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { UniLang.BENGALI, MaskEnum.BNG_MASK }, 7467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { UniLang.TAMIL, MaskEnum.TML_MASK }, 7477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { UniLang.TELUGU, MaskEnum.KND_MASK }, 7487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { UniLang.BENGALI, MaskEnum.BNG_MASK }, 7497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { UniLang.ORIYA, MaskEnum.ORI_MASK }, 7507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { UniLang.KANNADA, MaskEnum.KND_MASK }, 7517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { UniLang.MALAYALAM, MaskEnum.MLM_MASK }, 7527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { UniLang.GUJARATI, MaskEnum.GJR_MASK }, 7537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { UniLang.GURMUKHI, MaskEnum.PNJ_MASK } 7547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 7557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 7567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private UConverterDataISCII extraInfo = null; 7577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert protected byte[] fromUSubstitution = new byte[]{(byte)0x1A}; 7587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 7597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public CharsetISCII(String icuCanonicalName, String javaCanonicalName, String[] aliases) { 7607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert super(icuCanonicalName, javaCanonicalName, aliases); 7617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert maxBytesPerChar = 4; 7627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert minBytesPerChar = 1; 7637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert maxCharsPerByte = 1; 7647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert //get the version number of the ISCII converter 7657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int option = Integer.parseInt(icuCanonicalName.substring(14)); 7667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 7677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert extraInfo = new UConverterDataISCII( 7687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert option, 7697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ISCII_CNV_PREFIX + (option & UCNV_OPTIONS_VERSION_MASK) /* name */ 7707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ); 7717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 7727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert initializePNJSets(); 7737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 7747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 7757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* Initialize the two UnicodeSets use for proper Gurmukhi conversion if they have not already been created. */ 7767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private void initializePNJSets() { 7777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (PNJ_BINDI_TIPPI_SET != null && PNJ_CONSONANT_SET != null) { 7787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return; 7797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 7807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert PNJ_BINDI_TIPPI_SET = new UnicodeSet(); 7817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert PNJ_CONSONANT_SET = new UnicodeSet(); 7827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 7837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert PNJ_CONSONANT_SET.add(0x0a15, 0x0a28); 7847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert PNJ_CONSONANT_SET.add(0x0a2a, 0x0a30); 7857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert PNJ_CONSONANT_SET.add(0x0a35, 0x0a36); 7867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert PNJ_CONSONANT_SET.add(0x0a38, 0x0a39); 7877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 7887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert PNJ_BINDI_TIPPI_SET.addAll(PNJ_CONSONANT_SET); 7897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert PNJ_BINDI_TIPPI_SET.add(0x0a05); 7907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert PNJ_BINDI_TIPPI_SET.add(0x0a07); 7917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 7927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert PNJ_BINDI_TIPPI_SET.add(0x0a41, 0x0a42); 7937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert PNJ_BINDI_TIPPI_SET.add(0x0a3f); 7947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 7957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert PNJ_CONSONANT_SET.compact(); 7967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert PNJ_BINDI_TIPPI_SET.compact(); 7977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 7987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 7997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 8007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Rules for ISCII to Unicode converter 8017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * ISCII is a stateful encoding. To convert ISCII bytes to Unicode, 8027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * which is both precomposed and decomposed from characters 8037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * pre-context and post-context need to be considered. 8047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * 8057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Post context 8067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * i) ATR : Attribute code is used to declare the font and script switching. 8077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Currently we only switch scripts and font codes consumed without generating an error 8087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * ii) EXT : Extention code is used to declare switching to Sanskrit and for obscure, 8097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * obsolete characters 8107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Pre context 8117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * i) Halant: if preceeded by a halant then it is a explicit halant 8127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * ii) Nukta: 8137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * a) if preceeded by a halant then it is a soft halant 8147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * b) if preceeded by specific consonants and the ligatures have pre-composed 8157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * characters in Unicode then convert to pre-composed characters 8167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * iii) Danda: If Danda is preceeded by a Danda then convert to Double Danda 8177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 8187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert class CharsetDecoderISCII extends CharsetDecoderICU { 8197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public CharsetDecoderISCII(CharsetICU cs) { 8207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert super(cs); 8217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert implReset(); 8227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 8237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 8247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert protected void implReset() { 8257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert super.implReset(); 8267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.toUnicodeStatus = 0xFFFF; 8277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert extraInfo.initialize(); 8287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 8297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 8307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @SuppressWarnings("fallthrough") 8317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert protected CoderResult decodeLoop(ByteBuffer source, CharBuffer target, IntBuffer offsets, boolean flush) { 8327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert CoderResult cr = CoderResult.UNDERFLOW; 8337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int targetUniChar = 0x0000; 8347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert short sourceChar = 0x0000; 8357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert UConverterDataISCII data; 8367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert boolean gotoCallBack = false; 8377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int offset = 0; 8387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 8397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert data = extraInfo; 8407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert //data.contextCharToUnicode; /* contains previous ISCII codepoint visited */ 8417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert //this.toUnicodeStatus; /* contains the mapping to Unicode of the above codepoint */ 8427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 8437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert while (source.hasRemaining()) { 8447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert targetUniChar = UConverterConstants.missingCharMarker; 8457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 8467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (target.hasRemaining()) { 8477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert sourceChar = (short)((short)source.get() & UConverterConstants.UNSIGNED_BYTE_MASK); 8487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 8497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* look at the post-context perform special processing */ 8507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (data.contextCharToUnicode == ATR) { 8517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* If we have ATR in data.contextCharToUnicode then we need to change our 8527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * state to Indic Script specified by sourceChar 8537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 8547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* check if the sourceChar is supported script range */ 8557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (((short)(ISCIILang.PNJ - sourceChar) & UConverterConstants.UNSIGNED_BYTE_MASK) <= (ISCIILang.PNJ - ISCIILang.DEV)) { 8567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert data.currentDeltaToUnicode = (short)(lookupTable[sourceChar & 0x0F][0] * UniLang.DELTA); 8577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert data.currentMaskToUnicode = lookupTable[sourceChar & 0x0F][1]; 8587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else if (sourceChar == ISCIILang.DEF) { 8597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* switch back to default */ 8607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert data.currentDeltaToUnicode = data.defDeltaToUnicode; 8617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert data.currentMaskToUnicode = data.defMaskToUnicode; 8627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 8637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if ((sourceChar >= 0x21 && sourceChar <= 0x3F)) { 8647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* these are display codes consume and continue */ 8657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 8667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cr = CoderResult.malformedForLength(1); 8677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* reset */ 8687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert data.contextCharToUnicode = NO_CHAR_MARKER; 8697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert gotoCallBack = true; 8707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 8717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 8727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* reset */ 8737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!gotoCallBack) { 8747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert data.contextCharToUnicode = NO_CHAR_MARKER; 8757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert continue; 8767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 8777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else if (data.contextCharToUnicode == EXT) { 8787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* check if sourceChar is in 0xA1 - 0xEE range */ 8797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (((short)(EXT_RANGE_END - sourceChar) & UConverterConstants.UNSIGNED_BYTE_MASK) <= (EXT_RANGE_END - EXT_RANGE_BEGIN)) { 8807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* We currently support only Anudatta and Devanagari abbreviation sign */ 8817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (sourceChar == 0xBF || sourceChar == 0xB8) { 8827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert targetUniChar = (sourceChar == 0xBF) ? DEV_ABBR_SIGN : DEV_ANUDATTA; 8837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 8847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* find out if the mappling is valid in this state */ 8857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if ((validityTable[((short)targetUniChar) & UConverterConstants.UNSIGNED_BYTE_MASK] & data.currentMaskToUnicode) > 0) { 8867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert data.contextCharToUnicode = NO_CHAR_MARKER; 8877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 8887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* Write the previous toUnicodeStatus, this was delayed to handle consonant clustering for Gurmukhi script. */ 8897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (data.prevToUnicodeStatus != 0) { 8907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cr = WriteToTargetToU(offsets, (source.position() - 1), source, target, data.prevToUnicodeStatus, (short)0); 8917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert data.prevToUnicodeStatus = 0x0000; 8927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 8937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* write to target */ 8947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cr = WriteToTargetToU(offsets, (source.position() - 2), source, target, targetUniChar, data.currentDeltaToUnicode); 8957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 8967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert continue; 8977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 8987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 8997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* byte unit is unassigned */ 9007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert targetUniChar = UConverterConstants.missingCharMarker; 9017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cr = CoderResult.unmappableForLength(1); 9027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 9037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* only 0xA1 - 0xEE are legal after EXT char */ 9047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert data.contextCharToUnicode = NO_CHAR_MARKER; 9057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cr = CoderResult.malformedForLength(1); 9067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 9077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert gotoCallBack = true; 9087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else if (data.contextCharToUnicode == ISCII_INV) { 9097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (sourceChar == ISCII_HALANT) { 9107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert targetUniChar = 0x0020; /* replace with space according to Indic FAQ */ 9117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 9127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert targetUniChar = ZWJ; 9137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 9147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 9157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* Write the previous toUnicodeStatus, this was delayed to handle consonant clustering for Gurmukhi script. */ 9167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (data.prevToUnicodeStatus != 0) { 9177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cr = WriteToTargetToU(offsets, (source.position() - 1), source, target, data.prevToUnicodeStatus, (short)0); 9187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert data.prevToUnicodeStatus = 0x0000; 9197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 9207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 9217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* write to target */ 9227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cr = WriteToTargetToU(offsets, (source.position() - 2), source, target, targetUniChar, data.currentDeltaToUnicode); 9237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* reset */ 9247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert data.contextCharToUnicode = NO_CHAR_MARKER; 9257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 9267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 9277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* look at the pre-context and perform special processing */ 9287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!gotoCallBack) { 9297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert switch (sourceChar) { 9307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert case ISCII_INV: 9317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert case EXT: /* falls through */ 9327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert case ATR: 9337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert data.contextCharToUnicode = (char)sourceChar; 9347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 9357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (this.toUnicodeStatus != UConverterConstants.missingCharMarker) { 9367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* Write the previous toUnicodeStatus, this was delayed to handle consonant clustering for Gurmukhi script. */ 9377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (data.prevToUnicodeStatus != 0) { 9387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cr = WriteToTargetToU(offsets, (source.position() - 1), source, target, data.prevToUnicodeStatus, (short)0); 9397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert data.prevToUnicodeStatus = 0x0000; 9407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 9417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cr = WriteToTargetToU(offsets, (source.position() - 2), source, target, this.toUnicodeStatus, data.currentDeltaToUnicode); 9427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.toUnicodeStatus = UConverterConstants.missingCharMarker; 9437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 9447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert continue; 9457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert case ISCII_DANDA: 9467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* handle double danda */ 9477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (data.contextCharToUnicode == ISCII_DANDA) { 9487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert targetUniChar = DOUBLE_DANDA; 9497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* clear the context */ 9507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert data.contextCharToUnicode = NO_CHAR_MARKER; 9517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.toUnicodeStatus = UConverterConstants.missingCharMarker; 9527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 9537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert targetUniChar = GetMapping(sourceChar, targetUniChar, data); 9547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert data.contextCharToUnicode = (char)sourceChar; 9557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 9567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert break; 9577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert case ISCII_HALANT: 9587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* handle explicit halant */ 9597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (data.contextCharToUnicode == ISCII_HALANT) { 9607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert targetUniChar = ZWNJ; 9617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* clear context */ 9627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert data.contextCharToUnicode = NO_CHAR_MARKER; 9637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 9647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert targetUniChar = GetMapping(sourceChar, targetUniChar, data); 9657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert data.contextCharToUnicode = (char)sourceChar; 9667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 9677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert break; 9687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert case 0x0A: 9697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* fall through */ 9707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert case 0x0D: 9717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert data.resetToDefaultToUnicode = true; 9727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert targetUniChar = GetMapping(sourceChar, targetUniChar, data); 9737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert data.contextCharToUnicode = (char)sourceChar; 9747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert break; 9757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert case ISCII_VOWEL_SIGN_E: 9767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* find <CHAR> + SIGN_VOWEL_E special mapping */ 9777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int n = 1; 9787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert boolean find = false; 9797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (; n < vowelSignESpecialCases[0][0]; n++) { 9807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (vowelSignESpecialCases[n][0] == ((short)data.contextCharToUnicode & UConverterConstants.UNSIGNED_BYTE_MASK)) { 9817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert targetUniChar = vowelSignESpecialCases[n][1]; 9827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert find = true; 9837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert break; 9847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 9857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 9867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (find) { 9877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* find out if the mapping is valid in this state */ 9887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if ((validityTable[(byte)targetUniChar] & data.currentMaskFromUnicode) > 0) { 9897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert data.contextCharToUnicode = NO_CHAR_MARKER; 9907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.toUnicodeStatus = UConverterConstants.missingCharMarker; 9917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert break; 9927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 9937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 9947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert targetUniChar = GetMapping(sourceChar, targetUniChar, data); 9957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert data.contextCharToUnicode = (char)sourceChar; 9967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert break; 9977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert case ISCII_NUKTA: 9987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* handle soft halant */ 9997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (data.contextCharToUnicode == ISCII_HALANT) { 10007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert targetUniChar = ZWJ; 10017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* clear the context */ 10027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert data.contextCharToUnicode = NO_CHAR_MARKER; 10037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert break; 10047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else if (data.currentDeltaToUnicode == PNJ_DELTA && data.contextCharToUnicode == 0xc0) { 10057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* We got here because ISCII_NUKTA was preceded by 0xc0 and we are converting Gurmukhi. 10067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * In that case we must convert (0xc0 0xe9) to (\u0a5c\u0a4d\u0a39). 10077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * WriteToTargetToU is given 0x095c instead of 0xa5c because that method will automatically 10087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * convert the code point given based on the delta provided. 10097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 10107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cr = WriteToTargetToU(offsets, (source.position() - 2), source, target, PNJ_RRA, (short)0); 10117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!cr.isOverflow()) { 10127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cr = WriteToTargetToU(offsets, (source.position() - 2), source, target, PNJ_SIGN_VIRAMA, (short)0); 10137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!cr.isOverflow()) { 10147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cr = WriteToTargetToU(offsets, (source.position() - 2), source, target, PNJ_HA, (short)0); 10157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 10167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.charErrorBufferArray[this.charErrorBufferLength++] = PNJ_HA; 10177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 10187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 10197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.charErrorBufferArray[this.charErrorBufferLength++] = PNJ_SIGN_VIRAMA; 10207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.charErrorBufferArray[this.charErrorBufferLength++] = PNJ_HA; 10217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 10227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.toUnicodeStatus = UConverterConstants.missingCharMarker; 10237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert data.contextCharToUnicode = NO_CHAR_MARKER; 10247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!cr.isError()) { 10257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert continue; 10267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 10277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert break; 10287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 10297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* try to handle <CHAR> + ISCII_NUKTA special mappings */ 10307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int i = 1; 10317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert boolean found = false; 10327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (; i < nuktaSpecialCases[0][0]; i++) { 10337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (nuktaSpecialCases[i][0] == ((short)data.contextCharToUnicode & UConverterConstants.UNSIGNED_BYTE_MASK)) { 10347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert targetUniChar = nuktaSpecialCases[i][1]; 10357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert found = true; 10367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert break; 10377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 10387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 10397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (found) { 10407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* find out if the mapping is valid in this state */ 10417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if ((validityTable[(byte)targetUniChar] & data.currentMaskToUnicode) > 0) { 10427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert data.contextCharToUnicode = NO_CHAR_MARKER; 10437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.toUnicodeStatus = UConverterConstants.missingCharMarker; 10447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (data.currentDeltaToUnicode == PNJ_DELTA) { 10457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* Write the previous toUnicodeStatus, this was delayed to handle consonant clustering for Gurmukhi script. */ 10467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (data.prevToUnicodeStatus != 0) { 10477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cr = WriteToTargetToU(offsets, (source.position() - 1), source, target, data.prevToUnicodeStatus, (short)0); 10487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert data.prevToUnicodeStatus = 0x0000; 10497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 10507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cr = WriteToTargetToU(offsets, (source.position() - 2), source, target, targetUniChar, data.currentDeltaToUnicode); 10517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert continue; 10527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 10537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert break; 10547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 10557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* else fall through to default */ 10567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 10577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* else fall through to default */ 10587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 10597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 10607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert default: 10617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert targetUniChar = GetMapping(sourceChar, targetUniChar, data); 10627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert data.contextCharToUnicode = (char)sourceChar; 10637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert break; 10647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } //end of switch 10657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }//end of CallBack if statement 10667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 10677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!gotoCallBack && this.toUnicodeStatus != UConverterConstants.missingCharMarker) { 10687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* Check to make sure that consonant clusters are handled correctly for Gurmukhi script. */ 10697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (data.currentDeltaToUnicode == PNJ_DELTA && data.prevToUnicodeStatus != 0 && PNJ_CONSONANT_SET.contains(data.prevToUnicodeStatus) && 10707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert (this.toUnicodeStatus + PNJ_DELTA) == PNJ_SIGN_VIRAMA && (targetUniChar + PNJ_DELTA) == data.prevToUnicodeStatus) { 10717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (offsets != null) { 10727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert offset = source.position() - 3; 10737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 10747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cr = WriteToTargetToU(offsets, offset, source, target, PNJ_ADHAK, (short)0); 10757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cr = WriteToTargetToU(offsets, offset, source, target, data.prevToUnicodeStatus, (short)0); 10767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert data.prevToUnicodeStatus = 0x0000; /* reset the previous unicode code point */ 10777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert toUnicodeStatus = UConverterConstants.missingCharMarker; 10787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert continue; 10797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 10807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* Write the previous toUnicodeStatus, this was delayed to handle consonant clustering for Gurmukhi script. */ 10817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (data.prevToUnicodeStatus != 0) { 10827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cr = WriteToTargetToU(offsets, (source.position() - 1), source, target, data.prevToUnicodeStatus, (short)0); 10837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert data.prevToUnicodeStatus = 0x0000; 10847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 10857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* Check to make sure that Bindi and Tippi are handled correctly for Gurmukhi script. 10867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * If 0xA2 is preceded by a codepoint in the PNJ_BINDI_TIPPI_SET then the target codepoint should be Tippi instead of Bindi. 10877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 10887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (data.currentDeltaToUnicode == PNJ_DELTA && (targetUniChar + PNJ_DELTA) == PNJ_BINDI && PNJ_BINDI_TIPPI_SET.contains(this.toUnicodeStatus + PNJ_DELTA)) { 10897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert targetUniChar = PNJ_TIPPI - PNJ_DELTA; 10907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cr = WriteToTargetToU(offsets, (source.position() - 2), source, target, this.toUnicodeStatus, PNJ_DELTA); 10917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else if (data.currentDeltaToUnicode == PNJ_DELTA && (targetUniChar + PNJ_DELTA) == PNJ_SIGN_VIRAMA && PNJ_CONSONANT_SET.contains(this.toUnicodeStatus + PNJ_DELTA)) { 10927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* Store the current toUnicodeStatus code point for later handling of consonant cluster in Gurmukhi. */ 10937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert data.prevToUnicodeStatus = this.toUnicodeStatus + PNJ_DELTA; 10947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 10957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* write the previously mapped codepoint */ 10967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cr = WriteToTargetToU(offsets, (source.position() - 2), source, target, this.toUnicodeStatus, data.currentDeltaToUnicode); 10977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 10987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 10997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.toUnicodeStatus = UConverterConstants.missingCharMarker; 11007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 11017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 11027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!gotoCallBack && targetUniChar != UConverterConstants.missingCharMarker) { 11037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* now save the targetUniChar for delayed write */ 11047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.toUnicodeStatus = (char)targetUniChar; 11057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (data.resetToDefaultToUnicode) { 11067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert data.currentDeltaToUnicode = data.defDeltaToUnicode; 11077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert data.currentMaskToUnicode = data.defMaskToUnicode; 11087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert data.resetToDefaultToUnicode = false; 11097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 11107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 11117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* we reach here only if targetUniChar == missingCharMarker 11127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * so assign codes to reason and err 11137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 11147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!gotoCallBack) { 11157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cr = CoderResult.unmappableForLength(1); 11167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 11177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert//CallBack : 11187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert toUBytesArray[0] = (byte)sourceChar; 11197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert toULength = 1; 11207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert gotoCallBack = false; 11217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert break; 11227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 11237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 11247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cr = CoderResult.OVERFLOW; 11257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert break; 11267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 11277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 11287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } //end of while 11297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 11307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (cr.isUnderflow() && flush && !source.hasRemaining()) { 11317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /*end of the input stream */ 11327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (data.contextCharToUnicode == ATR || data.contextCharToUnicode == EXT || data.contextCharToUnicode == ISCII_INV) { 11337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* set toUBytes[] */ 11347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert toUBytesArray[0] = (byte)data.contextCharToUnicode; 11357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert toULength = 1; 11367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 11377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* avoid looping on truncated sequences */ 11387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert data.contextCharToUnicode = NO_CHAR_MARKER; 11397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 11407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert toULength = 0; 11417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 11427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 11437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (this.toUnicodeStatus != UConverterConstants.missingCharMarker) { 11447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* output a remaining target character */ 11457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert WriteToTargetToU(offsets, (source.position() - 2), source, target, this.toUnicodeStatus, data.currentDeltaToUnicode); 11467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.toUnicodeStatus = UConverterConstants.missingCharMarker; 11477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 11487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 11497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return cr; 11507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 11517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 11527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private CoderResult WriteToTargetToU(IntBuffer offsets, int offset, ByteBuffer source, CharBuffer target, int targetUniChar, short delta) { 11537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert CoderResult cr = CoderResult.UNDERFLOW; 11547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* add offset to current Indic Block */ 11557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (targetUniChar > ASCII_END && 11567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert targetUniChar != ZWJ && 11577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert targetUniChar != ZWNJ && 11587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert targetUniChar != DANDA && 11597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert targetUniChar != DOUBLE_DANDA) { 11607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert targetUniChar += delta; 11617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 11627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 11637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* now write the targetUniChar */ 11647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (target.hasRemaining()) { 11657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert target.put((char)targetUniChar); 11667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (offsets != null) { 11677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert offsets.put(offset); 11687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 11697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 11707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert charErrorBufferArray[charErrorBufferLength++] = (char)targetUniChar; 11717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cr = CoderResult.OVERFLOW; 11727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 11737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return cr; 11747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 11757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 11767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private int GetMapping(short sourceChar, int targetUniChar, UConverterDataISCII data) { 11777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert targetUniChar = toUnicodeTable[sourceChar]; 11787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* is the code point valid in current script? */ 11797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (sourceChar > ASCII_END && 11807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert (validityTable[targetUniChar & 0x7F] & data.currentMaskToUnicode) == 0) { 11817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* Vocallic RR is assigne in ISCII Telugu and Unicode */ 11827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (data.currentDeltaToUnicode != (TELUGU_DELTA) || targetUniChar != VOCALLIC_RR) { 11837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert targetUniChar = UConverterConstants.missingCharMarker; 11847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 11857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 11867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return targetUniChar; 11877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 11887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 11897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 11907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 11917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Rules: 11927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Explicit Halant : 11937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * <HALANT> + <ZWNJ> 11947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Soft Halant : 11957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * <HALANT> + <ZWJ> 11967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 11977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert class CharsetEncoderISCII extends CharsetEncoderICU { 11987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public CharsetEncoderISCII(CharsetICU cs) { 11997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert super(cs, fromUSubstitution); 12007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert implReset(); 12017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 12027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 12037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert protected void implReset() { 12047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert super.implReset(); 12057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert extraInfo.initialize(); 12067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 12077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 12087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert protected CoderResult encodeLoop(CharBuffer source, ByteBuffer target, IntBuffer offsets, boolean flush) { 12097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int targetByteUnit = 0x0000; 12107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int sourceChar = 0x0000; 12117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert UConverterDataISCII converterData; 12127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert short newDelta = 0; 12137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert short range = 0; 12147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert boolean deltaChanged = false; 12157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int tempContextFromUnicode = 0x0000; /* For special handling of the Gurmukhi script. */ 12167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert CoderResult cr = CoderResult.UNDERFLOW; 12177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 12187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* initialize data */ 12197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert converterData = extraInfo; 12207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert newDelta = converterData.currentDeltaFromUnicode; 12217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert range = (short)(newDelta / UniLang.DELTA); 12227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 12237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if ((sourceChar = fromUChar32) != 0) { 12247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cr = handleSurrogates(source, (char) sourceChar); 12257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return (cr != null) ? cr : CoderResult.unmappableForLength(2); 12267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 12277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 12287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* writing the char to the output stream */ 12297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert while (source.hasRemaining()) { 12307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!target.hasRemaining()) { 12317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return CoderResult.OVERFLOW; 12327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 12337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 12347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* Write the language code following LF only if LF is not the last character. */ 12357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (fromUnicodeStatus == LF) { 12367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert targetByteUnit = ATR << 8; 12377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert targetByteUnit += 0xff & (byte)lookupInitialData[range].isciiLang; 12387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fromUnicodeStatus = 0x0000; 12397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* now append ATR and language code */ 12407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cr = WriteToTargetFromU(offsets, source, target, targetByteUnit); 12417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (cr.isOverflow()) { 12427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert break; 12437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 12447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 12457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 12467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert sourceChar = source.get(); 12477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert tempContextFromUnicode = converterData.contextCharFromUnicode; 12487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 12497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert targetByteUnit = UConverterConstants.missingCharMarker; 12507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 12517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* check if input is in ASCII and C0 control codes range */ 12527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (sourceChar <= ASCII_END) { 12537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fromUnicodeStatus = sourceChar; 12547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cr = WriteToTargetFromU(offsets, source, target, sourceChar); 12557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (cr.isOverflow()) { 12567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert break; 12577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 12587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert continue; 12597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 12607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 12617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert switch (sourceChar) { 12627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert case ZWNJ: 12637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* contextChar has HALANT */ 12647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (converterData.contextCharFromUnicode != 0) { 12657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert converterData.contextCharFromUnicode = 0x00; 12667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert targetByteUnit = ISCII_HALANT; 12677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 12687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* consume ZWNJ and continue */ 12697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert converterData.contextCharFromUnicode = 0x00; 12707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert continue; 12717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 12727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert break; 12737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert case ZWJ: 12747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* contextChar has HALANT */ 12757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (converterData.contextCharFromUnicode != 0) { 12767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert targetByteUnit = ISCII_NUKTA; 12777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 12787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert targetByteUnit = ISCII_INV; 12797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 12807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert converterData.contextCharFromUnicode = 0x00; 12817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert break; 12827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert default: 12837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* is the sourceChar in the INDIC_RANGE? */ 12847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if((char)(INDIC_BLOCK_END - sourceChar) <= INDIC_RANGE) { 12857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* Danda and Doube Danda are valid in Northern scripts.. since Unicode 12867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * does not include these codepoints in all Northern scripts we need to 12877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * filter them out 12887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 12897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (sourceChar != DANDA && sourceChar != DOUBLE_DANDA) { 12907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* find out to which block the sourceChar belongs */ 12917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert range = (short)((sourceChar - INDIC_BLOCK_BEGIN) / UniLang.DELTA); 12927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert newDelta = (short)(range * UniLang.DELTA); 12937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 12947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* Now are we in the same block as previous? */ 12957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (newDelta != converterData.currentDeltaFromUnicode || converterData.isFirstBuffer) { 12967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert converterData.currentDeltaFromUnicode = newDelta; 12977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert converterData.currentMaskFromUnicode = lookupInitialData[range].maskEnum; 12987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert deltaChanged = true; 12997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert converterData.isFirstBuffer = false; 13007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 13017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (converterData.currentDeltaFromUnicode == PNJ_DELTA) { 13027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (sourceChar == PNJ_TIPPI) { 13037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* Make sure Tippi is converterd to Bindi. */ 13047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert sourceChar = PNJ_BINDI; 13057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else if (sourceChar == PNJ_ADHAK) { 13067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* This is for consonant cluster handling. */ 13077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert converterData.contextCharFromUnicode = PNJ_ADHAK; 13087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 13097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 13107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* Normalize all Indic codepoints to Devanagari and map them to ISCII */ 13117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* now subtract the new delta from sourceChar */ 13127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert sourceChar -= converterData.currentDeltaFromUnicode; 13137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 13147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* get the target byte unit */ 13157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert targetByteUnit = fromUnicodeTable[(short)sourceChar & UConverterConstants.UNSIGNED_BYTE_MASK]; 13167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 13177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* is the code point valid in current script? */ 13187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if ((validityTable[(short)sourceChar & UConverterConstants.UNSIGNED_BYTE_MASK] & converterData.currentMaskFromUnicode) == 0) { 13197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* Vocallic RR is assigned in ISCII Telugu and Unicode */ 13207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (converterData.currentDeltaFromUnicode != (TELUGU_DELTA) || sourceChar != VOCALLIC_RR) { 13217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert targetByteUnit = UConverterConstants.missingCharMarker; 13227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 13237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 13247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 13257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (deltaChanged) { 13267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* we are in a script block which is different than 13277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * previous sourceChar's script block write ATR and language codes 13287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 13297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert char temp = 0; 13307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert temp = (char)(ATR << 8); 13317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert temp += (char)(lookupInitialData[range].isciiLang & UConverterConstants.UNSIGNED_BYTE_MASK); 13327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* reset */ 13337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert deltaChanged = false; 13347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* now append ATR and language code */ 13357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cr = WriteToTargetFromU(offsets, source, target, temp); 13367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (cr.isOverflow()) { 13377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert break; 13387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 13397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 13407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (converterData.currentDeltaFromUnicode == PNJ_DELTA && (sourceChar + PNJ_DELTA) == PNJ_ADHAK) { 13417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert continue; 13427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 13437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 13447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* reset context char */ 13457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert converterData.contextCharFromUnicode = 0x00; 13467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert break; 13477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } //end of switch 13487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (converterData.currentDeltaFromUnicode == PNJ_DELTA && tempContextFromUnicode == PNJ_ADHAK && PNJ_CONSONANT_SET.contains(sourceChar + PNJ_DELTA)) { 13497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* If the previous codepoint is Adhak and the current codepoint is a consonant, the targetByteUnit should be C + Halant + C. */ 13507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* reset context char */ 13517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert converterData.contextCharFromUnicode = 0x0000; 13527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert targetByteUnit = targetByteUnit << 16 | ISCII_HALANT << 8 | targetByteUnit; 13537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /*write targetByteUnit to target */ 13547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cr = WriteToTargetFromU(offsets, source, target, targetByteUnit); 13557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (cr.isOverflow()) { 13567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert break; 13577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 13587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else if (targetByteUnit != UConverterConstants.missingCharMarker) { 13597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (targetByteUnit == ISCII_HALANT) { 13607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert converterData.contextCharFromUnicode = (char)targetByteUnit; 13617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 13627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /*write targetByteUnit to target */ 13637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cr = WriteToTargetFromU(offsets, source, target, targetByteUnit); 13647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (cr.isOverflow()) { 13657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert break; 13667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 13677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else if (UTF16.isSurrogate((char)sourceChar)) { 13687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cr = handleSurrogates(source, (char) sourceChar); 13697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return (cr != null) ? cr : CoderResult.unmappableForLength(2); 13707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 13717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return CoderResult.unmappableForLength(1); 13727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 13737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } /* end of while */ 13747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 13757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* save the state and return */ 13767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return cr; 13777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 13787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 13797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private CoderResult WriteToTargetFromU(IntBuffer offsets, CharBuffer source, ByteBuffer target, int targetByteUnit) { 13807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert CoderResult cr = CoderResult.UNDERFLOW; 13817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int offset = source.position() - 1; 13827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* write the targetUniChar to target */ 13837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (target.hasRemaining()) { 13847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (targetByteUnit <= 0xFF) { 13857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert target.put((byte)targetByteUnit); 13867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (offsets != null) { 13877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert offsets.put(offset); 13887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 13897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 13907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (targetByteUnit > 0xFFFF) { 13917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert target.put((byte)(targetByteUnit >> 16)); 13927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (offsets != null) { 13937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert --offset; 13947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert offsets.put(offset); 13957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 13967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 13977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!target.hasRemaining()) { 13987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errorBuffer[errorBufferLength++] = (byte)(targetByteUnit >> 8); 13997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errorBuffer[errorBufferLength++] = (byte)targetByteUnit; 14007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cr = CoderResult.OVERFLOW; 14017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return cr; 14027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 14037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert target.put((byte)(targetByteUnit >> 8)); 14047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (offsets != null) { 14057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert offsets.put(offset); 14067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 14077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (target.hasRemaining()) { 14087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert target.put((byte)targetByteUnit); 14097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (offsets != null) { 14107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert offsets.put(offset); 14117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 14127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 14137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errorBuffer[errorBufferLength++] = (byte)targetByteUnit; 14147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cr = CoderResult.OVERFLOW; 14157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 14167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 14177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 14187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if ((targetByteUnit > 0xFFFF)) { 14197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errorBuffer[errorBufferLength++] = (byte)(targetByteUnit >> 16); 14207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else if ((targetByteUnit & 0xFF00) > 0) { 14217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errorBuffer[errorBufferLength++] = (byte)(targetByteUnit >> 8); 14227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 14237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errorBuffer[errorBufferLength++] = (byte)(targetByteUnit); 14247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cr = CoderResult.OVERFLOW; 14257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 14267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return cr; 14277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 14287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 14297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 14307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public CharsetDecoder newDecoder() { 14317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return new CharsetDecoderISCII(this); 14327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 14337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 14347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public CharsetEncoder newEncoder() { 14357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return new CharsetEncoderISCII(this); 14367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 14377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 14387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert void getUnicodeSetImpl( UnicodeSet setFillIn, int which){ 14397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int idx,script; 14407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert char mask; 14417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 14427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert setFillIn.add(0,ASCII_END ); 14437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for(script = UniLang.DEVALANGARI ; script<= UniLang.MALAYALAM ;script++){ 14447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert mask = (char)lookupInitialData[script].maskEnum; 14457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for(idx=0; idx < UniLang.DELTA ; idx++){ 14467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Special check for telugu character 14477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if((validityTable[idx] & mask)!=0 || (script == UniLang.TELUGU && idx==0x31)){ 14487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert setFillIn.add(idx+(script*UniLang.DELTA)+INDIC_BLOCK_BEGIN ); 14497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 14507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 14517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 14527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert setFillIn.add(DANDA); 14537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert setFillIn.add(DOUBLE_DANDA); 14547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert setFillIn.add(ZWNJ); 14557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert setFillIn.add(ZWJ); 14567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 14577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 14587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert} 1459