// Decompiled by Jad v1.5.7f. Copyright 2000 Pavel Kouznetsov.
// Jad home page: http://www.geocities.com/SiliconValley/Bridge/8617/jad.html
// Decompiler options: packimports(3) braces deadcode fieldsfirst 
// Source File Name:   CharacterSetAL32UTF8.java
// Class Version:      45.3

package oracle.sql;

import java.sql.SQLException;

// Referenced classes of package oracle.sql:
//            CharacterSet, CharacterBuffer, CharacterRepConstants, CharacterWalker

// flag ACC_SUPER is set
class CharacterSetAL32UTF8 extends CharacterSet
    implements CharacterRepConstants
{
    // Constants:          92
    // Interfaces:         1
    // Fields:             0
    // Methods:            11
    // Class Attributes:   1


    // Decompiling method: <init>  Signature: (I)V
    // Max stack: 2, #locals: 2, #params: 2
    // Code length: 12 bytes, Code offset: 1077
    // Line Number Table found: 3 entries
    // Parameter  0 added: Name this Type Loracle/sql/CharacterSetAL32UTF8; At 0 12 Range 0 11 Init 0 fixed
    // Parameter  1 added: Name i Type I At 0 12 Range 0 11 Init 0
    // RetValue   2 added: Name <returnValue> Type V At 0 12 Range 0 11 Init 0 fixed
    CharacterSetAL32UTF8(int i)
    {
        super(i);
        rep = 6;
        return;
    }

    // Decompiling method: convert  Signature: (Ljava/lang/String;)[B
    // Max stack: 1, #locals: 2, #params: 2
    // Code length: 5 bytes, Code offset: 1135
    // Line Number Table found: 1 entries
    // Parameter  0 added: Name this Type Loracle/sql/CharacterSetAL32UTF8; At 0 5 Range 0 4 Init 0 fixed
    // Parameter  1 added: Name s Type Ljava/lang/String; At 0 5 Range 0 4 Init 0
    // RetValue   2 added: Name <returnValue> Type [B At 0 5 Range 0 4 Init 0 fixed
    public byte[] convert(String s)
        throws SQLException
    {
        return CharacterSet.stringToAL32UTF8(s);
    }

    // Decompiling method: convert  Signature: (Loracle/sql/CharacterSet;[BII)[B
    // Max stack: 4, #locals: 7, #params: 5
    // Code length: 41 bytes, Code offset: 1188
    // Line Number Table found: 6 entries
    // Parameter  0 added: Name this Type Loracle/sql/CharacterSetAL32UTF8; At 0 41 Range 0 40 Init 0 fixed
    // Parameter  1 added: Name characterset Type Loracle/sql/CharacterSet; At 0 41 Range 0 40 Init 0
    // Parameter  2 added: Name abyte0 Type [B At 0 41 Range 0 40 Init 0
    // Parameter  3 added: Name i Type I At 0 41 Range 0 40 Init 0
    // Parameter  4 added: Name j Type I At 0 41 Range 0 40 Init 0
    // RetValue   7 added: Name <returnValue> Type [B At 0 41 Range 0 40 Init 0 fixed
    // LocalVar   5 added: Name abyte1 Type [B At 16 24 Range 16 39 Init 16
    // LocalVar   6 added: Name s Type Ljava/lang/String; At 29 4 Range 29 32 Init 29
    public byte[] convert(CharacterSet characterset, byte abyte0[], int i, int j)
        throws SQLException
    {
        byte abyte1[];
        if(characterset.rep == 6)
        {
            abyte1 = CharacterSet.useOrCopy(abyte0, i, j);
        } else
        {
            String s = characterset.toString(abyte0, i, j);
            abyte1 = CharacterSet.stringToAL32UTF8(s);
        }
        return abyte1;
    }

    // Decompiling method: convertWithReplacement  Signature: (Ljava/lang/String;)[B
    // Max stack: 1, #locals: 2, #params: 2
    // Code length: 5 bytes, Code offset: 1297
    // Line Number Table found: 1 entries
    // Parameter  0 added: Name this Type Loracle/sql/CharacterSetAL32UTF8; At 0 5 Range 0 4 Init 0 fixed
    // Parameter  1 added: Name s Type Ljava/lang/String; At 0 5 Range 0 4 Init 0
    // RetValue   2 added: Name <returnValue> Type [B At 0 5 Range 0 4 Init 0 fixed
    public byte[] convertWithReplacement(String s)
    {
        return CharacterSet.stringToAL32UTF8(s);
    }

    // Decompiling method: decode  Signature: (Loracle/sql/CharacterWalker;)I
    // Max stack: 4, #locals: 11, #params: 2
    // Code length: 432 bytes, Code offset: 1340
    // Line Number Table found: 58 entries
    // Parameter  0 added: Name this Type Loracle/sql/CharacterSetAL32UTF8; At 0 432 Range 0 431 Init 0 fixed
    // Parameter  1 added: Name characterwalker Type Loracle/sql/CharacterWalker; At 0 432 Range 0 431 Init 0
    // RetValue  11 added: Name <returnValue> Type I At 0 432 Range 0 431 Init 0 fixed
    // LocalVar   7 added: Name abyte0 Type [B At 4 301 Range 4 304 Init 4
    // LocalVar   8 added: Name i Type I At 10 416 Range 10 425 Init 10
    // LocalVar   9 added: Name j Type I At 16 261 Range 16 276 Init 16
    // LocalVar   2 added: Name byte0 Type B At 36 317 Range 36 352 Init 36
    // LocalVar   3 added: Name k Type I At 42 2 Range 42 43 Init 42
    // LocalVar  10 added: Name byte1 Type B At 125 306 Range 125 430 Init 125
    // LocalVar   4 added: Name byte2 Type B At 148 26 Range 148 173 Init 148
    // LocalVar  10 chged: Name c Oname byte1 Type C At 179 252 Range 125 430 Init 125
    // LocalVar   4 added: Name byte1 Type B At 204 48 Range 204 251 Init 204
    // LocalVar   5 added: Name byte3 Type B At 214 47 Range 214 260 Init 214
    // LocalVar   4 added: Name byte4 Type B At 291 84 Range 291 374 Init 291
    // LocalVar   5 added: Name byte5 Type B At 301 95 Range 301 395 Init 301
    // LocalVar   6 added: Name byte6 Type B At 311 93 Range 311 403 Init 311
    // LocalVar  10 chged: Name l Oname c Type I At 412 19 Range 125 430 Init 125
    int decode(CharacterWalker characterwalker)
        throws SQLException
    {
        byte abyte0[] = characterwalker.bytes;
        int j = characterwalker.next;
        int k = characterwalker.end;
        if(j >= k)
        {
            CharacterSet.failUTFConversion();
        }
        byte byte0 = abyte0[j++];
        int i = byte0 & 0xf0;
        int l;
        switch(i / 16)
        {
        case 0: // '\0'
        case 1: // '\001'
        case 2: // '\002'
        case 3: // '\003'
        case 4: // '\004'
        case 5: // '\005'
        case 6: // '\006'
        case 7: // '\007'
            l = byte0;
            break;

        case 12: // '\f'
        case 13: // '\r'
            if(j >= k)
            {
                CharacterSet.failUTFConversion();
            }
            byte byte1 = abyte0[j++];
            if((byte1 & 0xc0) != 128)
            {
                CharacterSet.failUTFConversion();
            }
            l = (char)((byte0 & 0x1f) << 6 | byte1 & 0x3f);
            break;

        case 14: // '\016'
            if(j + 1 >= k)
            {
                CharacterSet.failUTFConversion();
            }
            byte byte2 = abyte0[j++];
            byte byte4 = abyte0[j++];
            if((byte2 & 0xc0) != 128 || (byte4 & 0xc0) != 128)
            {
                CharacterSet.failUTFConversion();
            }
            l = (char)((byte0 & 0xf) << 12 | (byte2 & 0x3f) << 6 | byte4 & 0x3f);
            break;

        case 15: // '\017'
            if(j + 2 >= k)
            {
                CharacterSet.failUTFConversion();
            }
            byte byte3 = abyte0[j++];
            byte byte5 = abyte0[j++];
            byte byte6 = abyte0[j++];
            if((byte3 & 0xc0) != 128 || (byte5 & 0xc0) != 128 || (byte6 & 0xc0) != 128)
            {
                CharacterSet.failUTFConversion();
            }
            l = ((((byte0 & 0x7) << 2 | (byte3 >> 4 & 0x3) - 1) & 0xf) << 6 | (byte3 & 0xf) << 2 | byte5 >> 4 & 0x3 | 0xd800) << 16 | ((byte5 & 0xf) << 6 | byte6 & 0x3f | 0xdc00);
            break;

        case 8: // '\b'
        case 9: // '\t'
        case 10: // '\n'
        case 11: // '\013'
        default:
            CharacterSet.failUTFConversion();
            l = 0;
            break;
        }
        characterwalker.next = j;
        return l;
    }

    // Decompiling method: encode  Signature: (Loracle/sql/CharacterBuffer;I)V
    // Max stack: 5, #locals: 5, #params: 3
    // Code length: 54 bytes, Code offset: 2048
    // Line Number Table found: 8 entries
    // Parameter  0 added: Name this Type Loracle/sql/CharacterSetAL32UTF8; At 0 54 Range 0 53 Init 0 fixed
    // Parameter  1 added: Name characterbuffer Type Loracle/sql/CharacterBuffer; At 0 54 Range 0 53 Init 0
    // Parameter  2 added: Name i Type I At 0 54 Range 0 53 Init 0
    // RetValue   5 added: Name <returnValue> Type V At 0 54 Range 0 53 Init 0 fixed
    // LocalVar   3 added: Name ac Type [C At 25 2 Range 25 26 Init 25
    // LocalVar   4 added: Name j Type I At 40 9 Range 40 48 Init 40
    void encode(CharacterBuffer characterbuffer, int i)
        throws SQLException
    {
        if(i > 65535)
        {
            CharacterSet.failUTFConversion();
        } else
        {
            CharacterSet.need(characterbuffer, 3);
            char ac[] = {
                (char)i
            };
            int j = CharacterSet.javaCharsToAL32UTF8(ac, 0, 1, characterbuffer.bytes, characterbuffer.next);
            characterbuffer.next += j;
        }
        return;
    }

    // Decompiling method: isConvertibleFrom  Signature: (Loracle/sql/CharacterSet;)Z
    // Max stack: 2, #locals: 3, #params: 2
    // Code length: 18 bytes, Code offset: 2178
    // Line Number Table found: 2 entries
    // Parameter  0 added: Name this Type Loracle/sql/CharacterSetAL32UTF8; At 0 18 Range 0 17 Init 0 fixed
    // Parameter  1 added: Name characterset Type Loracle/sql/CharacterSet; At 0 18 Range 0 17 Init 0
    // RetValue   3 added: Name <returnValue> Type Z At 0 18 Range 0 17 Init 0 fixed
    // LocalVar   2 added: Name flag Type Z At 15 2 Range 15 16 Init 15
    public boolean isConvertibleFrom(CharacterSet characterset)
    {
        boolean flag = characterset.rep <= 1024;
        return flag;
    }

    // Decompiling method: isLossyFrom  Signature: (Loracle/sql/CharacterSet;)Z
    // Max stack: 2, #locals: 2, #params: 2
    // Code length: 7 bytes, Code offset: 2238
    // Line Number Table found: 1 entries
    // Parameter  0 added: Name this Type Loracle/sql/CharacterSetAL32UTF8; At 0 7 Range 0 6 Init 0 fixed
    // Parameter  1 added: Name characterset Type Loracle/sql/CharacterSet; At 0 7 Range 0 6 Init 0
    // RetValue   2 added: Name <returnValue> Type Z At 0 7 Range 0 6 Init 0 fixed
    public boolean isLossyFrom(CharacterSet characterset)
    {
        return characterset.isUnicode() ^ true;
    }

    // Decompiling method: isUnicode  Signature: ()Z
    // Max stack: 1, #locals: 1, #params: 1
    // Code length: 2 bytes, Code offset: 2283
    // Line Number Table found: 1 entries
    // Parameter  0 added: Name this Type Loracle/sql/CharacterSetAL32UTF8; At 0 2 Range 0 1 Init 0 fixed
    // RetValue   1 added: Name <returnValue> Type Z At 0 2 Range 0 1 Init 0 fixed
    public boolean isUnicode()
    {
        return true;
    }

    // Decompiling method: toString  Signature: ([BII)Ljava/lang/String;
    // Max stack: 3, #locals: 5, #params: 4
    // Code length: 18 bytes, Code offset: 2323
    // Line Number Table found: 2 entries
    // Parameter  0 added: Name this Type Loracle/sql/CharacterSetAL32UTF8; At 0 18 Range 0 17 Init 0 fixed
    // Parameter  1 added: Name abyte0 Type [B At 0 18 Range 0 17 Init 0
    // Parameter  2 added: Name i Type I At 0 18 Range 0 17 Init 0
    // Parameter  3 added: Name j Type I At 0 18 Range 0 17 Init 0
    // RetValue   5 added: Name <returnValue> Type Ljava/lang/String; At 0 18 Range 0 17 Init 0 fixed
    // LocalVar   4 added: Name ac Type [C At 6 8 Range 6 13 Init 6
    public String toString(byte abyte0[], int i, int j)
        throws SQLException
    {
        char ac[] = CharacterSet.AL32UTF8ToJavaChar(abyte0, i, j);
        return new String(ac);
    }

    // Decompiling method: toStringWithReplacement  Signature: ([BII)Ljava/lang/String;
    // Max stack: 5, #locals: 13, #params: 4
    // Code length: 561 bytes, Code offset: 2393
    // Line Number Table found: 69 entries
    // Parameter  0 added: Name this Type Loracle/sql/CharacterSetAL32UTF8; At 0 561 Range 0 560 Init 0 fixed
    // Parameter  1 added: Name abyte0 Type [B At 0 561 Range 0 560 Init 0
    // Parameter  2 added: Name i Type I At 0 561 Range 0 560 Init 0
    // Parameter  3 added: Name j Type I At 0 561 Range 0 560 Init 0
    // RetValue  13 added: Name <returnValue> Type Ljava/lang/String; At 0 561 Range 0 560 Init 0 fixed
    // LocalVar   4 added: Name k Type I At 1 545 Range 1 545 Init 1
    // LocalVar   5 added: Name l Type I At 6 542 Range 6 547 Init 6
    // LocalVar   6 added: Name ac Type [C At 27 530 Range 27 556 Init 27
    // LocalVar   7 added: Name flag Type Z At 30 511 Range 30 540 Init 30
    // LocalVar   8 added: Name byte0 Type B At 42 423 Range 42 464 Init 42
    // LocalVar   9 added: Name i1 Type I At 50 4 Range 50 53 Init 50
    // LocalVar   7 chged: Name j1 Oname flag Type I At 140 3 Range 30 540 Init 30
    // LocalVar  10 added: Name byte1 Type B At 185 44 Range 185 228 Init 185
    // LocalVar  10 added: Name byte2 Type B At 271 65 Range 271 335 Init 271
    // LocalVar  11 added: Name byte3 Type B At 280 65 Range 280 344 Init 280
    // LocalVar  10 added: Name byte4 Type B At 387 100 Range 387 486 Init 387
    // LocalVar  11 added: Name byte5 Type B At 396 118 Range 396 513 Init 396
    // LocalVar  12 added: Name byte6 Type B At 405 117 Range 405 521 Init 405
    public String toStringWithReplacement(byte abyte0[], int i, int j)
    {
        int k = i;
        int l = i + j;
        if(l > abyte0.length)
        {
            l = abyte0.length;
        }
        char ac[] = new char[CharacterSet.UTFStringLength(abyte0, i, j)];
        int i1 = 0;
        while(k < l) 
        {
            byte byte0 = abyte0[k++];
            int j1 = byte0 & 0xf0;
            switch(j1 / 16)
            {
            case 0: // '\0'
            case 1: // '\001'
            case 2: // '\002'
            case 3: // '\003'
            case 4: // '\004'
            case 5: // '\005'
            case 6: // '\006'
            case 7: // '\007'
                ac[i1++] = (char)(byte0 & 0xff);
                break;

            case 12: // '\f'
            case 13: // '\r'
                if(k >= l)
                {
                    ac[i1++] = '?';
                    k = l;
                    break;
                }
                byte byte1 = abyte0[k++];
                if((byte1 & 0xc0) != 128)
                {
                    ac[i1++] = '?';
                } else
                {
                    ac[i1++] = (char)((byte0 & 0x1f) << 6 | byte1 & 0x3f);
                }
                break;

            case 14: // '\016'
                if(k + 1 >= l)
                {
                    ac[i1++] = '?';
                    k = l;
                    break;
                }
                byte byte2 = abyte0[k++];
                byte byte4 = abyte0[k++];
                if((byte2 & 0xc0) != 128 || (byte4 & 0xc0) != 128)
                {
                    ac[i1++] = '?';
                } else
                {
                    ac[i1++] = (char)((byte0 & 0xf) << 12 | (byte2 & 0x3f) << 6 | byte4 & 0x3f);
                }
                break;

            case 15: // '\017'
                if(k + 2 >= l)
                {
                    ac[i1++] = '?';
                    k = l;
                    break;
                }
                byte byte3 = abyte0[k++];
                byte byte5 = abyte0[k++];
                byte byte6 = abyte0[k++];
                if((byte3 & 0xc0) != 128 || (byte5 & 0xc0) != 128 || (byte6 & 0xc0) != 128)
                {
                    ac[i1++] = '?';
                } else
                {
                    ac[i1++] = (char)((((byte0 & 0x7) << 2 | (byte3 >> 4 & 0x3) - 1) & 0xf) << 6 | (byte3 & 0xf) << 2 | byte5 >> 4 & 0x3 | 0xd800);
                    ac[i1++] = (char)((byte5 & 0xf) << 6 | byte6 & 0x3f | 0xdc00);
                }
                break;

            case 8: // '\b'
            case 9: // '\t'
            case 10: // '\n'
            case 11: // '\013'
            default:
                ac[i1++] = '?';
                break;
            }
        }
        return new String(ac);
    }
}
