blob: a74a1f75e73971b0fd26ecc0d2e7acf9c80520f8 [file] [log] [blame]
/**
*******************************************************************************
* Copyright (C) 2006-2008, International Business Machines Corporation and *
* others. All Rights Reserved. *
*******************************************************************************
*/
package com.ibm.icu.charset;
import java.nio.BufferOverflowException;
import java.nio.BufferUnderflowException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.CharsetDecoder;
import java.nio.charset.CharsetEncoder;
import java.nio.charset.CoderResult;
import com.ibm.icu.text.UnicodeSet;
class Charset88591 extends CharsetASCII {
public Charset88591(String icuCanonicalName, String javaCanonicalName, String[] aliases) {
super(icuCanonicalName, javaCanonicalName, aliases);
}
class CharsetDecoder88591 extends CharsetDecoderASCII {
public CharsetDecoder88591(CharsetICU cs) {
super(cs);
}
protected CoderResult decodeLoopCoreOptimized(ByteBuffer source, CharBuffer target,
byte[] sourceArray, char[] targetArray, int oldSource, int offset, int limit) {
/*
* perform 88591 conversion from the source array to the target array. no range check is
* necessary.
*/
for (int i = oldSource; i < limit; i++)
targetArray[i + offset] = (char) (sourceArray[i] & 0xff);
return null;
}
protected CoderResult decodeLoopCoreUnoptimized(ByteBuffer source, CharBuffer target)
throws BufferUnderflowException, BufferOverflowException {
/*
* perform 88591 conversion from the source buffer to the target buffer. no range check
* is necessary (an exception will be generated to end the loop).
*/
while (true)
target.put((char) (source.get() & 0xff));
}
}
class CharsetEncoder88591 extends CharsetEncoderASCII {
public CharsetEncoder88591(CharsetICU cs) {
super(cs);
}
protected final CoderResult encodeLoopCoreOptimized(CharBuffer source, ByteBuffer target,
char[] sourceArray, byte[] targetArray, int oldSource, int offset, int limit,
boolean flush) {
int i, ch = 0;
/*
* perform 88591 conversion from the source array to the target array, making sure each
* char in the source is within the correct range
*/
for (i = oldSource; i < limit; i++) {
ch = (int) sourceArray[i];
if ((ch & 0xff00) == 0) {
targetArray[i + offset] = (byte) ch;
} else {
break;
}
}
/*
* if some byte was not in the correct range, we need to deal with this byte by calling
* encodeMalformedOrUnmappable and move the source and target positions to reflect the
* early termination of the loop
*/
if ((ch & 0xff00) != 0) {
source.position(i + 1);
target.position(i + offset);
return encodeMalformedOrUnmappable(source, ch, flush);
} else
return null;
}
protected final CoderResult encodeLoopCoreUnoptimized(CharBuffer source, ByteBuffer target,
boolean flush) throws BufferUnderflowException, BufferOverflowException {
int ch;
/*
* perform 88591 conversion from the source buffer to the target buffer, making sure
* each char in the source is within the correct range
*/
while (true) {
ch = (int) source.get();
if ((ch & 0xff00) == 0) {
target.put((byte) ch);
} else {
break;
}
}
/*
* if we reach here, it's because a character was not in the correct range, and we need
* to deak with this by calling encodeMalformedOrUnmappable.
*/
return encodeMalformedOrUnmappable(source, ch, flush);
}
}
public CharsetDecoder newDecoder() {
return new CharsetDecoder88591(this);
}
public CharsetEncoder newEncoder() {
return new CharsetEncoder88591(this);
}
void getUnicodeSetImpl( UnicodeSet setFillIn, int which){
setFillIn.add(0,0xff);
}
}