java.nio.charset.CoderResult# malformedForLength ( ) 源码实例Demo

下面列出了java.nio.charset.CoderResult# malformedForLength ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。

源代码1 项目: openjdk-8-source   文件: US_ASCII.java

private CoderResult decodeBufferLoop(ByteBuffer src,
                                     CharBuffer dst)
{
    int mark = src.position();
    try {
        while (src.hasRemaining()) {
            byte b = src.get();
            if (b >= 0) {
                if (!dst.hasRemaining())
                    return CoderResult.OVERFLOW;
                dst.put((char)b);
                mark++;
                continue;
            }
            return CoderResult.malformedForLength(1);
        }
        return CoderResult.UNDERFLOW;
    } finally {
        src.position(mark);
    }
}
 
源代码2 项目: jdk8u-dev-jdk   文件: UTF_8.java

private static CoderResult malformedForLength(ByteBuffer src,
                                              int mark,
                                              int malformedNB)
{
    src.position(mark);
    return CoderResult.malformedForLength(malformedNB);
}
 
源代码3 项目: openjdk-jdk8u-backup   文件: Surrogate.java

/**
 * Generates one or two UTF-16 characters to represent the given UCS-4
 * character.
 *
 * @param  uc   The UCS-4 character
 * @param  len  The number of input bytes from which the UCS-4 value
 *              was constructed (used when creating result objects)
 * @param  da   The destination array, to which one or two UTF-16
 *              characters will be written
 * @param  dp   The destination position
 * @param  dl   The destination limit
 *
 * @returns  Either a positive count of the number of UTF-16 characters
 *           written to the destination buffer, or -1, in which case
 *           error() will return a descriptive result object
 */
public int generate(int uc, int len, char[] da, int dp, int dl) {
    if (Character.isBmpCodePoint(uc)) {
        char c = (char) uc;
        if (Character.isSurrogate(c)) {
            error = CoderResult.malformedForLength(len);
            return -1;
        }
        if (dl - dp < 1) {
            error = CoderResult.OVERFLOW;
            return -1;
        }
        da[dp] = c;
        error = null;
        return 1;
    } else if (Character.isValidCodePoint(uc)) {
        if (dl - dp < 2) {
            error = CoderResult.OVERFLOW;
            return -1;
        }
        da[dp] = Character.highSurrogate(uc);
        da[dp + 1] = Character.lowSurrogate(uc);
        error = null;
        return 2;
    } else {
        error = CoderResult.unmappableForLength(len);
        return -1;
    }
}
 

private CoderResult decodeBufferLoop(ByteBuffer src, CharBuffer dst) {
    int mark = src.position();
    try {
        while (src.remaining() > 1) {
            int b1 = src.get() & 0xff;
            int b2 = src.get() & 0xff;

            if (!isValidDoubleByte(b1, b2)) {
                return CoderResult.malformedForLength(2);
            }
            // Lookup in the two level index
            int v = b1 * 256 + b2;
            char outputChar = index2.charAt(index1[((v & mask1) >> shift)]
                                            + (v & mask2));
            if (outputChar == REPLACE_CHAR)
                return CoderResult.unmappableForLength(2);

            if (!dst.hasRemaining())
                return CoderResult.OVERFLOW;
            dst.put(outputChar);
            mark += 2;
        }
        return CoderResult.UNDERFLOW;
    } finally {
        src.position(mark);
    }
}
 
源代码5 项目: openjdk-8-source   文件: Surrogate.java

/**
 * Generates one or two UTF-16 characters to represent the given UCS-4
 * character.
 *
 * @param  uc   The UCS-4 character
 * @param  len  The number of input bytes from which the UCS-4 value
 *              was constructed (used when creating result objects)
 * @param  dst  The destination buffer, to which one or two UTF-16
 *              characters will be written
 *
 * @returns  Either a positive count of the number of UTF-16 characters
 *           written to the destination buffer, or -1, in which case
 *           error() will return a descriptive result object
 */
public int generate(int uc, int len, CharBuffer dst) {
    if (Character.isBmpCodePoint(uc)) {
        char c = (char) uc;
        if (Character.isSurrogate(c)) {
            error = CoderResult.malformedForLength(len);
            return -1;
        }
        if (dst.remaining() < 1) {
            error = CoderResult.OVERFLOW;
            return -1;
        }
        dst.put(c);
        error = null;
        return 1;
    } else if (Character.isValidCodePoint(uc)) {
        if (dst.remaining() < 2) {
            error = CoderResult.OVERFLOW;
            return -1;
        }
        dst.put(Character.highSurrogate(uc));
        dst.put(Character.lowSurrogate(uc));
        error = null;
        return 2;
    } else {
        error = CoderResult.unmappableForLength(len);
        return -1;
    }
}
 

private CoderResult decodeBufferLoop(ByteBuffer src, CharBuffer dst) {
    int mark = src.position();
    try {
        while (src.remaining() > 1) {
            int b1 = src.get() & 0xff;
            int b2 = src.get() & 0xff;

            if (!isValidDoubleByte(b1, b2)) {
                return CoderResult.malformedForLength(2);
            }
            // Lookup in the two level index
            int v = b1 * 256 + b2;
            char outputChar = index2.charAt(index1[((v & mask1) >> shift)]
                                            + (v & mask2));
            if (outputChar == REPLACE_CHAR)
                return CoderResult.unmappableForLength(2);

            if (!dst.hasRemaining())
                return CoderResult.OVERFLOW;
            dst.put(outputChar);
            mark += 2;
        }
        return CoderResult.UNDERFLOW;
    } finally {
        src.position(mark);
    }
}
 
源代码7 项目: Bytecoder   文件: Surrogate.java

/**
 * Generates one or two UTF-16 characters to represent the given UCS-4
 * character.
 *
 * @param  uc   The UCS-4 character
 * @param  len  The number of input bytes from which the UCS-4 value
 *              was constructed (used when creating result objects)
 * @param  dst  The destination buffer, to which one or two UTF-16
 *              characters will be written
 *
 * @return  Either a positive count of the number of UTF-16 characters
 *          written to the destination buffer, or -1, in which case
 *          error() will return a descriptive result object
 */
public int generate(int uc, int len, CharBuffer dst) {
    if (Character.isBmpCodePoint(uc)) {
        char c = (char) uc;
        if (Character.isSurrogate(c)) {
            error = CoderResult.malformedForLength(len);
            return -1;
        }
        if (dst.remaining() < 1) {
            error = CoderResult.OVERFLOW;
            return -1;
        }
        dst.put(c);
        error = null;
        return 1;
    } else if (Character.isValidCodePoint(uc)) {
        if (dst.remaining() < 2) {
            error = CoderResult.OVERFLOW;
            return -1;
        }
        dst.put(Character.highSurrogate(uc));
        dst.put(Character.lowSurrogate(uc));
        error = null;
        return 2;
    } else {
        error = CoderResult.unmappableForLength(len);
        return -1;
    }
}
 
源代码8 项目: openjdk-8-source   文件: UTF_32Coder.java

protected CoderResult encodeLoop(CharBuffer src, ByteBuffer dst) {
    int mark = src.position();
    if (!doneBOM && src.hasRemaining()) {
        if (dst.remaining() < 4)
            return CoderResult.OVERFLOW;
        put(BOM_BIG, dst);
        doneBOM = true;
    }
    try {
        while (src.hasRemaining()) {
            char c = src.get();
            if (!Character.isSurrogate(c)) {
                if (dst.remaining() < 4)
                    return CoderResult.OVERFLOW;
                mark++;
                put(c, dst);
            } else if (Character.isHighSurrogate(c)) {
                if (!src.hasRemaining())
                    return CoderResult.UNDERFLOW;
                char low = src.get();
                if (Character.isLowSurrogate(low)) {
                    if (dst.remaining() < 4)
                        return CoderResult.OVERFLOW;
                    mark += 2;
                    put(Character.toCodePoint(c, low), dst);
                } else {
                    return CoderResult.malformedForLength(1);
                }
            } else {
                // assert Character.isLowSurrogate(c);
                return CoderResult.malformedForLength(1);
            }
        }
        return CoderResult.UNDERFLOW;
    } finally {
        src.position(mark);
    }
}
 
源代码9 项目: jdk8u60   文件: UTF_8.java

private static CoderResult malformedForLength(ByteBuffer src,
                                              int sp,
                                              CharBuffer dst,
                                              int dp,
                                              int malformedNB)
{
    updatePositions(src, sp, dst, dp);
    return CoderResult.malformedForLength(malformedNB);
}
 
源代码10 项目: openjdk-8   文件: ISO2022.java

private CoderResult decodeBufferLoop(ByteBuffer src,
                                     CharBuffer dst)
{
    int mark = src.position();
    int b1 = 0, b2 = 0, b3 = 0;

    try {
        while (src.hasRemaining()) {
            b1 = src.get();
            int inputSize = 1;
            switch (b1) {
                case ISO_SO:
                    shiftout = true;
                    break;
                case ISO_SI:
                    shiftout = false;
                    break;
                case ISO_ESC:
                    if (src.remaining() < minDesignatorLength)
                        return CoderResult.UNDERFLOW;

                    int desig = findDesigBuf(src, SODesig);
                    if (desig != -1) {
                        curSODes = desig;
                        inputSize = SODesig[desig].length + 1;
                        break;
                    }
                    desig = findDesigBuf(src, SS2Desig);
                    if (desig != -1) {
                        curSS2Des = desig;
                        inputSize = SS2Desig[desig].length + 1;
                        break;
                    }
                    desig = findDesigBuf(src, SS3Desig);
                    if (desig != -1) {
                        curSS3Des = desig;
                        inputSize = SS3Desig[desig].length + 1;
                        break;
                    }

                    if (src.remaining() < 1)
                        return CoderResult.UNDERFLOW;
                    b1 = src.get();
                    switch(b1) {
                        case ISO_SS2_7:
                            if (src.remaining() < 2)
                                return CoderResult.UNDERFLOW;
                            b2 = src.get();
                            b3 = src.get();
                            if (dst.remaining() < 1)
                                return CoderResult.OVERFLOW;
                            dst.put(decode((byte)b2,
                                           (byte)b3,
                                           SS2Flag));
                            inputSize = 4;
                            break;
                        case ISO_SS3_7:
                            if (src.remaining() < 2)
                                return CoderResult.UNDERFLOW;
                            b2 = src.get();
                            b3 = src.get();
                            if (dst.remaining() < 1)
                                return CoderResult.OVERFLOW;
                            dst.put(decode((byte)b2,
                                           (byte)b3,
                                           SS3Flag));
                            inputSize = 4;
                            break;
                        default:
                            return CoderResult.malformedForLength(2);
                    }
                    break;
                default:
                    if (dst.remaining() < 1)
                        return CoderResult.OVERFLOW;
                    if (!shiftout) {
                        dst.put((char)(b1 & 0xff));
                    } else {
                        if (dst.remaining() < 1)
                            return CoderResult.OVERFLOW;
                        if (src.remaining() < 1)
                            return CoderResult.UNDERFLOW;
                        b2 = src.get() & 0xff;
                        dst.put(decode((byte)b1,
                                              (byte)b2,
                                                SOFlag));
                        inputSize = 2;
                    }
                    break;
            }
            mark += inputSize;
        }
        return CoderResult.UNDERFLOW;
    } catch (Exception e) { e.printStackTrace(); return CoderResult.OVERFLOW; }
    finally {
        src.position(mark);
    }
}
 
源代码11 项目: jdk8u60   文件: EUC_TW.java

private CoderResult encodeArrayLoop(CharBuffer src,
                                    ByteBuffer dst)
{
    char[] sa = src.array();
    int sp = src.arrayOffset() + src.position();
    int sl = src.arrayOffset() + src.limit();

    byte[] da = dst.array();
    int dp = dst.arrayOffset() + dst.position();
    int dl = dst.arrayOffset() + dst.limit();

    int inSize;
    int outSize;

    try {
        while (sp < sl) {
            char c = sa[sp];
            inSize = 1;
            if (c < 0x80) {  // ASCII
                bb[0] = (byte)c;
                outSize = 1;
            } else {
                outSize = toEUC(c, bb);
                if (outSize == -1) {
                    // to check surrogates only after BMP failed
                    // has the benefit of improving the BMP encoding
                    // 10% faster, with the price of the slowdown of
                    // supplementary character encoding. given the use
                    // of supplementary characters is really rare, this
                    // is something worth doing.
                    if (Character.isHighSurrogate(c)) {
                        if ((sp + 1) == sl)
                            return CoderResult.UNDERFLOW;
                        if (!Character.isLowSurrogate(sa[sp + 1]))
                            return CoderResult.malformedForLength(1);
                        outSize = toEUC(c, sa[sp+1], bb);
                            inSize = 2;
                    } else if (Character.isLowSurrogate(c)) {
                        return CoderResult.malformedForLength(1);
                    }
                }
            }
            if (outSize == -1)
                return CoderResult.unmappableForLength(inSize);
            if ( dl - dp < outSize)
                return CoderResult.OVERFLOW;
            for (int i = 0; i < outSize; i++)
                da[dp++] = bb[i];
            sp  += inSize;
        }
        return CoderResult.UNDERFLOW;
    } finally {
        src.position(sp - src.arrayOffset());
        dst.position(dp - dst.arrayOffset());
    }
}
 
源代码12 项目: openjdk-jdk8u   文件: SJIS_0213.java

protected CoderResult encodeArrayLoop(CharBuffer src, ByteBuffer dst) {
    char[] sa = src.array();
    int sp = src.arrayOffset() + src.position();
    int sl = src.arrayOffset() + src.limit();
    byte[] da = dst.array();
    int dp = dst.arrayOffset() + dst.position();
    int dl = dst.arrayOffset() + dst.limit();

    try {
        while (sp < sl) {
            int db;
            char c = sa[sp];
            if (leftoverBase != 0) {
                boolean isComp = false;
                db = encodeComposite(leftoverBase, c);
                if (db == UNMAPPABLE)
                    db = encodeChar(leftoverBase);
                else
                    isComp = true;
                if (dl - dp < 2)
                    return CoderResult.OVERFLOW;
                da[dp++] = (byte)(db >> 8);
                da[dp++] = (byte)db;
                leftoverBase = 0;
                if (isComp) {
                    sp++;
                    continue;
                }
            }
            if (isCompositeBase(c)) {
                leftoverBase = c;
            } else {
                db = encodeChar(c);
                if (db <= MAX_SINGLEBYTE) {      // SingleByte
                    if (dl <= dp)
                        return CoderResult.OVERFLOW;
                    da[dp++] = (byte)db;
                } else if (db != UNMAPPABLE) {   // DoubleByte
                    if (dl - dp < 2)
                        return CoderResult.OVERFLOW;
                    da[dp++] = (byte)(db >> 8);
                    da[dp++] = (byte)db;
                } else if (Character.isHighSurrogate(c)) {
                    if ((sp + 1) == sl)
                        return CoderResult.UNDERFLOW;
                    char c2 = sa[sp + 1];
                    if (!Character.isLowSurrogate(c2))
                        return CoderResult.malformedForLength(1);
                    db = encodeSurrogate(c, c2);
                    if (db == UNMAPPABLE)
                        return CoderResult.unmappableForLength(2);
                    if (dl - dp < 2)
                        return CoderResult.OVERFLOW;
                    da[dp++] = (byte)(db >> 8);
                    da[dp++] = (byte)db;
                    sp++;
                } else if (Character.isLowSurrogate(c)) {
                    return CoderResult.malformedForLength(1);
                } else {
                    return CoderResult.unmappableForLength(1);
                }
            }
            sp++;
        }
        return CoderResult.UNDERFLOW;
    } finally {
        src.position(sp - src.arrayOffset());
        dst.position(dp - dst.arrayOffset());
    }
}
 
源代码13 项目: openjdk-8   文件: EUC_TW.java

private CoderResult encodeArrayLoop(CharBuffer src,
                                    ByteBuffer dst)
{
    char[] sa = src.array();
    int sp = src.arrayOffset() + src.position();
    int sl = src.arrayOffset() + src.limit();

    byte[] da = dst.array();
    int dp = dst.arrayOffset() + dst.position();
    int dl = dst.arrayOffset() + dst.limit();

    int inSize;
    int outSize;

    try {
        while (sp < sl) {
            char c = sa[sp];
            inSize = 1;
            if (c < 0x80) {  // ASCII
                bb[0] = (byte)c;
                outSize = 1;
            } else {
                outSize = toEUC(c, bb);
                if (outSize == -1) {
                    // to check surrogates only after BMP failed
                    // has the benefit of improving the BMP encoding
                    // 10% faster, with the price of the slowdown of
                    // supplementary character encoding. given the use
                    // of supplementary characters is really rare, this
                    // is something worth doing.
                    if (Character.isHighSurrogate(c)) {
                        if ((sp + 1) == sl)
                            return CoderResult.UNDERFLOW;
                        if (!Character.isLowSurrogate(sa[sp + 1]))
                            return CoderResult.malformedForLength(1);
                        outSize = toEUC(c, sa[sp+1], bb);
                            inSize = 2;
                    } else if (Character.isLowSurrogate(c)) {
                        return CoderResult.malformedForLength(1);
                    }
                }
            }
            if (outSize == -1)
                return CoderResult.unmappableForLength(inSize);
            if ( dl - dp < outSize)
                return CoderResult.OVERFLOW;
            for (int i = 0; i < outSize; i++)
                da[dp++] = bb[i];
            sp  += inSize;
        }
        return CoderResult.UNDERFLOW;
    } finally {
        src.position(sp - src.arrayOffset());
        dst.position(dp - dst.arrayOffset());
    }
}
 
源代码14 项目: jdk8u_jdk   文件: DoubleByte.java

protected CoderResult decodeArrayLoop(ByteBuffer src, CharBuffer dst) {
    byte[] sa = src.array();
    int sp = src.arrayOffset() + src.position();
    int sl = src.arrayOffset() + src.limit();
    char[] da = dst.array();
    int dp = dst.arrayOffset() + dst.position();
    int dl = dst.arrayOffset() + dst.limit();

    try {
        // don't check dp/dl together here, it's possible to
        // decdoe a SO/SI without space in output buffer.
        while (sp < sl) {
            int b1 = sa[sp] & 0xff;
            int inSize = 1;
            if (b1 == SO) {  // Shift out
                if (currentState != SBCS)
                    return CoderResult.malformedForLength(1);
                else
                    currentState = DBCS;
            } else if (b1 == SI) {
                if (currentState != DBCS)
                    return CoderResult.malformedForLength(1);
                else
                    currentState = SBCS;
            } else {
                char c =  UNMAPPABLE_DECODING;
                if (currentState == SBCS) {
                    c = b2cSB[b1];
                    if (c == UNMAPPABLE_DECODING)
                        return CoderResult.unmappableForLength(1);
                } else {
                    if (sl - sp < 2)
                        return CoderResult.UNDERFLOW;
                    int b2 = sa[sp + 1] & 0xff;
                    if (b2 < b2Min || b2 > b2Max ||
                        (c = b2c[b1][b2 - b2Min]) == UNMAPPABLE_DECODING) {
                        if (!isDoubleByte(b1, b2))
                            return CoderResult.malformedForLength(2);
                        return CoderResult.unmappableForLength(2);
                    }
                    inSize++;
                }
                if (dl - dp < 1)
                    return CoderResult.OVERFLOW;

                da[dp++] = c;
            }
            sp += inSize;
        }
        return CoderResult.UNDERFLOW;
    } finally {
        src.position(sp - src.arrayOffset());
        dst.position(dp - dst.arrayOffset());
    }
}
 
源代码15 项目: jdk8u_jdk   文件: SJIS_0213.java

protected CoderResult encodeArrayLoop(CharBuffer src, ByteBuffer dst) {
    char[] sa = src.array();
    int sp = src.arrayOffset() + src.position();
    int sl = src.arrayOffset() + src.limit();
    byte[] da = dst.array();
    int dp = dst.arrayOffset() + dst.position();
    int dl = dst.arrayOffset() + dst.limit();

    try {
        while (sp < sl) {
            int db;
            char c = sa[sp];
            if (leftoverBase != 0) {
                boolean isComp = false;
                db = encodeComposite(leftoverBase, c);
                if (db == UNMAPPABLE)
                    db = encodeChar(leftoverBase);
                else
                    isComp = true;
                if (dl - dp < 2)
                    return CoderResult.OVERFLOW;
                da[dp++] = (byte)(db >> 8);
                da[dp++] = (byte)db;
                leftoverBase = 0;
                if (isComp) {
                    sp++;
                    continue;
                }
            }
            if (isCompositeBase(c)) {
                leftoverBase = c;
            } else {
                db = encodeChar(c);
                if (db <= MAX_SINGLEBYTE) {      // SingleByte
                    if (dl <= dp)
                        return CoderResult.OVERFLOW;
                    da[dp++] = (byte)db;
                } else if (db != UNMAPPABLE) {   // DoubleByte
                    if (dl - dp < 2)
                        return CoderResult.OVERFLOW;
                    da[dp++] = (byte)(db >> 8);
                    da[dp++] = (byte)db;
                } else if (Character.isHighSurrogate(c)) {
                    if ((sp + 1) == sl)
                        return CoderResult.UNDERFLOW;
                    char c2 = sa[sp + 1];
                    if (!Character.isLowSurrogate(c2))
                        return CoderResult.malformedForLength(1);
                    db = encodeSurrogate(c, c2);
                    if (db == UNMAPPABLE)
                        return CoderResult.unmappableForLength(2);
                    if (dl - dp < 2)
                        return CoderResult.OVERFLOW;
                    da[dp++] = (byte)(db >> 8);
                    da[dp++] = (byte)db;
                    sp++;
                } else if (Character.isLowSurrogate(c)) {
                    return CoderResult.malformedForLength(1);
                } else {
                    return CoderResult.unmappableForLength(1);
                }
            }
            sp++;
        }
        return CoderResult.UNDERFLOW;
    } finally {
        src.position(sp - src.arrayOffset());
        dst.position(dp - dst.arrayOffset());
    }
}
 
源代码16 项目: jdk8u-jdk   文件: EUC_TW.java

private CoderResult encodeArrayLoop(CharBuffer src,
                                    ByteBuffer dst)
{
    char[] sa = src.array();
    int sp = src.arrayOffset() + src.position();
    int sl = src.arrayOffset() + src.limit();

    byte[] da = dst.array();
    int dp = dst.arrayOffset() + dst.position();
    int dl = dst.arrayOffset() + dst.limit();

    int inSize;
    int outSize;

    try {
        while (sp < sl) {
            char c = sa[sp];
            inSize = 1;
            if (c < 0x80) {  // ASCII
                bb[0] = (byte)c;
                outSize = 1;
            } else {
                outSize = toEUC(c, bb);
                if (outSize == -1) {
                    // to check surrogates only after BMP failed
                    // has the benefit of improving the BMP encoding
                    // 10% faster, with the price of the slowdown of
                    // supplementary character encoding. given the use
                    // of supplementary characters is really rare, this
                    // is something worth doing.
                    if (Character.isHighSurrogate(c)) {
                        if ((sp + 1) == sl)
                            return CoderResult.UNDERFLOW;
                        if (!Character.isLowSurrogate(sa[sp + 1]))
                            return CoderResult.malformedForLength(1);
                        outSize = toEUC(c, sa[sp+1], bb);
                            inSize = 2;
                    } else if (Character.isLowSurrogate(c)) {
                        return CoderResult.malformedForLength(1);
                    }
                }
            }
            if (outSize == -1)
                return CoderResult.unmappableForLength(inSize);
            if ( dl - dp < outSize)
                return CoderResult.OVERFLOW;
            for (int i = 0; i < outSize; i++)
                da[dp++] = bb[i];
            sp  += inSize;
        }
        return CoderResult.UNDERFLOW;
    } finally {
        src.position(sp - src.arrayOffset());
        dst.position(dp - dst.arrayOffset());
    }
}
 
源代码17 项目: jdk8u_jdk   文件: EUC_TW.java

private CoderResult encodeArrayLoop(CharBuffer src,
                                    ByteBuffer dst)
{
    char[] sa = src.array();
    int sp = src.arrayOffset() + src.position();
    int sl = src.arrayOffset() + src.limit();

    byte[] da = dst.array();
    int dp = dst.arrayOffset() + dst.position();
    int dl = dst.arrayOffset() + dst.limit();

    int inSize;
    int outSize;

    try {
        while (sp < sl) {
            char c = sa[sp];
            inSize = 1;
            if (c < 0x80) {  // ASCII
                bb[0] = (byte)c;
                outSize = 1;
            } else {
                outSize = toEUC(c, bb);
                if (outSize == -1) {
                    // to check surrogates only after BMP failed
                    // has the benefit of improving the BMP encoding
                    // 10% faster, with the price of the slowdown of
                    // supplementary character encoding. given the use
                    // of supplementary characters is really rare, this
                    // is something worth doing.
                    if (Character.isHighSurrogate(c)) {
                        if ((sp + 1) == sl)
                            return CoderResult.UNDERFLOW;
                        if (!Character.isLowSurrogate(sa[sp + 1]))
                            return CoderResult.malformedForLength(1);
                        outSize = toEUC(c, sa[sp+1], bb);
                            inSize = 2;
                    } else if (Character.isLowSurrogate(c)) {
                        return CoderResult.malformedForLength(1);
                    }
                }
            }
            if (outSize == -1)
                return CoderResult.unmappableForLength(inSize);
            if ( dl - dp < outSize)
                return CoderResult.OVERFLOW;
            for (int i = 0; i < outSize; i++)
                da[dp++] = bb[i];
            sp  += inSize;
        }
        return CoderResult.UNDERFLOW;
    } finally {
        src.position(sp - src.arrayOffset());
        dst.position(dp - dst.arrayOffset());
    }
}
 
源代码18 项目: jdk8u-jdk   文件: ISO2022.java

private CoderResult decodeBufferLoop(ByteBuffer src,
                                     CharBuffer dst)
{
    int mark = src.position();
    int b1 = 0, b2 = 0, b3 = 0;

    try {
        while (src.hasRemaining()) {
            b1 = src.get();
            int inputSize = 1;
            switch (b1) {
                case ISO_SO:
                    shiftout = true;
                    break;
                case ISO_SI:
                    shiftout = false;
                    break;
                case ISO_ESC:
                    if (src.remaining() < minDesignatorLength)
                        return CoderResult.UNDERFLOW;

                    int desig = findDesigBuf(src, SODesig);
                    if (desig != -1) {
                        curSODes = desig;
                        inputSize = SODesig[desig].length + 1;
                        break;
                    }
                    desig = findDesigBuf(src, SS2Desig);
                    if (desig != -1) {
                        curSS2Des = desig;
                        inputSize = SS2Desig[desig].length + 1;
                        break;
                    }
                    desig = findDesigBuf(src, SS3Desig);
                    if (desig != -1) {
                        curSS3Des = desig;
                        inputSize = SS3Desig[desig].length + 1;
                        break;
                    }

                    if (src.remaining() < 1)
                        return CoderResult.UNDERFLOW;
                    b1 = src.get();
                    switch(b1) {
                        case ISO_SS2_7:
                            if (src.remaining() < 2)
                                return CoderResult.UNDERFLOW;
                            b2 = src.get();
                            b3 = src.get();
                            if (dst.remaining() < 1)
                                return CoderResult.OVERFLOW;
                            dst.put(decode((byte)b2,
                                           (byte)b3,
                                           SS2Flag));
                            inputSize = 4;
                            break;
                        case ISO_SS3_7:
                            if (src.remaining() < 2)
                                return CoderResult.UNDERFLOW;
                            b2 = src.get();
                            b3 = src.get();
                            if (dst.remaining() < 1)
                                return CoderResult.OVERFLOW;
                            dst.put(decode((byte)b2,
                                           (byte)b3,
                                           SS3Flag));
                            inputSize = 4;
                            break;
                        default:
                            return CoderResult.malformedForLength(2);
                    }
                    break;
                default:
                    if (dst.remaining() < 1)
                        return CoderResult.OVERFLOW;
                    if (!shiftout) {
                        dst.put((char)(b1 & 0xff));
                    } else {
                        if (dst.remaining() < 1)
                            return CoderResult.OVERFLOW;
                        if (src.remaining() < 1)
                            return CoderResult.UNDERFLOW;
                        b2 = src.get() & 0xff;
                        dst.put(decode((byte)b1,
                                              (byte)b2,
                                                SOFlag));
                        inputSize = 2;
                    }
                    break;
            }
            mark += inputSize;
        }
        return CoderResult.UNDERFLOW;
    } catch (Exception e) { e.printStackTrace(); return CoderResult.OVERFLOW; }
    finally {
        src.position(mark);
    }
}
 
源代码19 项目: dragonwell8_jdk   文件: DoubleByte.java

protected CoderResult decodeArrayLoop(ByteBuffer src, CharBuffer dst) {
    byte[] sa = src.array();
    int sp = src.arrayOffset() + src.position();
    int sl = src.arrayOffset() + src.limit();
    char[] da = dst.array();
    int dp = dst.arrayOffset() + dst.position();
    int dl = dst.arrayOffset() + dst.limit();

    try {
        // don't check dp/dl together here, it's possible to
        // decdoe a SO/SI without space in output buffer.
        while (sp < sl) {
            int b1 = sa[sp] & 0xff;
            int inSize = 1;
            if (b1 == SO) {  // Shift out
                if (currentState != SBCS)
                    return CoderResult.malformedForLength(1);
                else
                    currentState = DBCS;
            } else if (b1 == SI) {
                if (currentState != DBCS)
                    return CoderResult.malformedForLength(1);
                else
                    currentState = SBCS;
            } else {
                char c =  UNMAPPABLE_DECODING;
                if (currentState == SBCS) {
                    c = b2cSB[b1];
                    if (c == UNMAPPABLE_DECODING)
                        return CoderResult.unmappableForLength(1);
                } else {
                    if (sl - sp < 2)
                        return CoderResult.UNDERFLOW;
                    int b2 = sa[sp + 1] & 0xff;
                    if (b2 < b2Min || b2 > b2Max ||
                        (c = b2c[b1][b2 - b2Min]) == UNMAPPABLE_DECODING) {
                        if (!isDoubleByte(b1, b2))
                            return CoderResult.malformedForLength(2);
                        return CoderResult.unmappableForLength(2);
                    }
                    inSize++;
                }
                if (dl - dp < 1)
                    return CoderResult.OVERFLOW;

                da[dp++] = c;
            }
            sp += inSize;
        }
        return CoderResult.UNDERFLOW;
    } finally {
        src.position(sp - src.arrayOffset());
        dst.position(dp - dst.arrayOffset());
    }
}
 
源代码20 项目: openjdk-8   文件: SimpleEUCDecoder.java

private CoderResult decodeArrayLoop(ByteBuffer src, CharBuffer dst) {
    byte[] sa = src.array();
    int sp = src.arrayOffset() + src.position();
    int sl = src.arrayOffset() + src.limit();
    assert (sp <= sl);
    sp = (sp <= sl ? sp : sl);
    char[] da = dst.array();
    int dp = dst.arrayOffset() + dst.position();
    int dl = dst.arrayOffset() + dst.limit();
    assert (dp <= dl);
    dp = (dp <= dl ? dp : dl);

    try {
        while (sp < sl) {
            int byte1, byte2;
            int inputSize = 1;
            char outputChar = '\uFFFD';

            byte1 = sa[sp] & 0xff;

            if ( byte1 <= 0x9f ) {  // < 0x9f has its own table (G0)
                if (byte1 == SS2 || byte1 == SS3 ) {
                    // No support provided for G2/G3 at this time.
                    return CoderResult.malformedForLength(1);
                }
                outputChar = byteToCharTable.charAt(byte1);
            } else if (byte1 < 0xa1 || byte1 > 0xfe) {  // invalid range?
                return CoderResult.malformedForLength(1);
            } else {                                        // (G1)
                if (sl - sp < 2) {
                    return CoderResult.UNDERFLOW;
                }
                byte2 = sa[sp + 1] & 0xff;
                inputSize++;
                if ( byte2 < 0xa1 || byte2 > 0xfe) {
                    return CoderResult.malformedForLength(2);
                }
                outputChar = mappingTableG1.charAt(((byte1 - 0xa1) * 94) + byte2 - 0xa1);
            }
            if  (outputChar == '\uFFFD') {
                return CoderResult.unmappableForLength(inputSize);
            }
            if (dl - dp < 1)
                return CoderResult.OVERFLOW;
            da[dp++] = outputChar;
            sp += inputSize;
        }
        return CoderResult.UNDERFLOW;
    } finally {
        src.position(sp - src.arrayOffset());
        dst.position(dp - dst.arrayOffset());
    }
}