// 
// Decompiled by Procyon v0.6.0
// 

package org.bouncycastle.util.encoders;

public class UTF8
{
    private static final byte C_ILL = 0;
    private static final byte C_CR1 = 1;
    private static final byte C_CR2 = 2;
    private static final byte C_CR3 = 3;
    private static final byte C_L2A = 4;
    private static final byte C_L3A = 5;
    private static final byte C_L3B = 6;
    private static final byte C_L3C = 7;
    private static final byte C_L4A = 8;
    private static final byte C_L4B = 9;
    private static final byte C_L4C = 10;
    private static final byte S_ERR = -2;
    private static final byte S_END = -1;
    private static final byte S_CS1 = 0;
    private static final byte S_CS2 = 16;
    private static final byte S_CS3 = 32;
    private static final byte S_P3A = 48;
    private static final byte S_P3B = 64;
    private static final byte S_P4A = 80;
    private static final byte S_P4B = 96;
    private static final short[] firstUnitTable;
    private static final byte[] transitionTable;
    
    private static void fill(final byte[] array, final int n, final int n2, final byte b) {
        for (int i = n; i <= n2; ++i) {
            array[i] = b;
        }
    }
    
    public static int transcodeToUTF16(final byte[] array, final char[] array2) {
        return transcodeToUTF16(array, 0, array.length, array2);
    }
    
    public static int transcodeToUTF16(final byte[] array, final int n, final int n2, final char[] array2) {
        int i = n;
        int n3 = 0;
        final int n4 = n + n2;
        while (i < n4) {
            final byte b = array[i++];
            if (b >= 0) {
                if (n3 >= array2.length) {
                    return -1;
                }
                array2[n3++] = (char)b;
            }
            else {
                final short n5 = UTF8.firstUnitTable[b & 0x7F];
                int n6 = n5 >>> 8;
                byte b2;
                byte b3;
                for (b2 = (byte)n5; b2 >= 0; b2 = UTF8.transitionTable[b2 + ((b3 & 0xFF) >>> 4)]) {
                    if (i >= n4) {
                        return -1;
                    }
                    b3 = array[i++];
                    n6 = (n6 << 6 | (b3 & 0x3F));
                }
                if (b2 == -2) {
                    return -1;
                }
                if (n6 <= 65535) {
                    if (n3 >= array2.length) {
                        return -1;
                    }
                    array2[n3++] = (char)n6;
                }
                else {
                    if (n3 >= array2.length - 1) {
                        return -1;
                    }
                    array2[n3++] = (char)(55232 + (n6 >>> 10));
                    array2[n3++] = (char)(0xDC00 | (n6 & 0x3FF));
                }
            }
        }
        return n3;
    }
    
    static {
        firstUnitTable = new short[128];
        transitionTable = new byte[112];
        final byte[] array = new byte[128];
        fill(array, 0, 15, (byte)1);
        fill(array, 16, 31, (byte)2);
        fill(array, 32, 63, (byte)3);
        fill(array, 64, 65, (byte)0);
        fill(array, 66, 95, (byte)4);
        fill(array, 96, 96, (byte)5);
        fill(array, 97, 108, (byte)6);
        fill(array, 109, 109, (byte)7);
        fill(array, 110, 111, (byte)6);
        fill(array, 112, 112, (byte)8);
        fill(array, 113, 115, (byte)9);
        fill(array, 116, 116, (byte)10);
        fill(array, 117, 127, (byte)0);
        fill(UTF8.transitionTable, 0, UTF8.transitionTable.length - 1, (byte)(-2));
        fill(UTF8.transitionTable, 8, 11, (byte)(-1));
        fill(UTF8.transitionTable, 24, 27, (byte)0);
        fill(UTF8.transitionTable, 40, 43, (byte)16);
        fill(UTF8.transitionTable, 58, 59, (byte)0);
        fill(UTF8.transitionTable, 72, 73, (byte)0);
        fill(UTF8.transitionTable, 89, 91, (byte)16);
        fill(UTF8.transitionTable, 104, 104, (byte)16);
        final byte[] array2 = { 0, 0, 0, 0, 31, 15, 15, 15, 7, 7, 7 };
        final byte[] array3 = { -2, -2, -2, -2, 0, 48, 16, 64, 80, 32, 96 };
        for (byte b = 0; b < 128; ++b) {
            final byte b2 = array[b];
            UTF8.firstUnitTable[b] = (short)((b & array2[b2]) << 8 | array3[b2]);
        }
    }
}
