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