mirror of
https://github.com/Eaglercraft-TeaVM-Fork/eagler-teavm.git
synced 2024-12-22 16:14:10 -08:00
Initial charset classes
This commit is contained in:
parent
e7db80fe2b
commit
59b2d0b21e
|
@ -0,0 +1,30 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2015 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.teavm.classlib.java.nio.charset;
|
||||||
|
|
||||||
|
import org.teavm.classlib.java.lang.TRuntimeException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Alexey Andreev
|
||||||
|
*/
|
||||||
|
public class TBufferOverflowException extends TRuntimeException {
|
||||||
|
private static final long serialVersionUID = -94154470269902198L;
|
||||||
|
|
||||||
|
public TBufferOverflowException() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,28 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2015 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.teavm.classlib.java.nio.charset;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Alexey Andreev
|
||||||
|
*/
|
||||||
|
public class TBufferUnderflowException extends RuntimeException {
|
||||||
|
private static final long serialVersionUID = 1162643612868888150L;
|
||||||
|
|
||||||
|
public TBufferUnderflowException() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,30 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2015 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.teavm.classlib.java.nio.charset;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Alexey Andreev
|
||||||
|
*/
|
||||||
|
public class TCharacterCodingException extends IOException {
|
||||||
|
private static final long serialVersionUID = -2432441010404243409L;
|
||||||
|
|
||||||
|
public TCharacterCodingException() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,66 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2015 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.teavm.classlib.java.nio.charset;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Alexey Andreev
|
||||||
|
*/
|
||||||
|
public abstract class TCharset implements Comparable<TCharset> {
|
||||||
|
private String canonicalName;
|
||||||
|
private String[] aliases;
|
||||||
|
private Set<String> aliasSet;
|
||||||
|
|
||||||
|
protected TCharset(String canonicalName, String[] aliases) {
|
||||||
|
this.canonicalName = canonicalName;
|
||||||
|
this.aliases = aliases.clone();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static TCharset forName(String charsetName) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public final String name() {
|
||||||
|
return canonicalName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public final Set<String> aliases() {
|
||||||
|
if (aliasSet == null) {
|
||||||
|
aliasSet = new HashSet<>();
|
||||||
|
for (String alias : aliases) {
|
||||||
|
aliasSet.add(alias);
|
||||||
|
}
|
||||||
|
aliasSet = Collections.unmodifiableSet(aliasSet);
|
||||||
|
}
|
||||||
|
return aliasSet;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String displayName() {
|
||||||
|
return canonicalName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract TCharsetDecoder newDecoder();
|
||||||
|
|
||||||
|
public abstract TCharsetEncoder newEncoder();
|
||||||
|
|
||||||
|
public boolean canEncode() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2015 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.teavm.classlib.java.nio.charset;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Alexey Andreev
|
||||||
|
*/
|
||||||
|
public class TCharsetDecoder {
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,293 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2015 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.teavm.classlib.java.nio.charset;
|
||||||
|
|
||||||
|
import org.teavm.classlib.java.nio.TByteBuffer;
|
||||||
|
import org.teavm.classlib.java.nio.TCharBuffer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Alexey Andreev
|
||||||
|
*/
|
||||||
|
public abstract class TCharsetEncoder {
|
||||||
|
private static final int READY = 0;
|
||||||
|
private static final int ONGOING = 1;
|
||||||
|
private static final int END = 2;
|
||||||
|
private static final int FLUSH = 3;
|
||||||
|
private static final int INIT = 4;
|
||||||
|
private TCharset charset;
|
||||||
|
private byte[] replacement;
|
||||||
|
private float averageBytesPerChar;
|
||||||
|
private float maxBytesPerChar;
|
||||||
|
private TCodingErrorAction malformedAction = TCodingErrorAction.REPORT;
|
||||||
|
private TCodingErrorAction unmappableAction = TCodingErrorAction.REPORT;
|
||||||
|
private int status;
|
||||||
|
private boolean finished;
|
||||||
|
|
||||||
|
protected TCharsetEncoder(TCharset cs, float averageBytesPerChar, float maxBytesPerChar, byte[] replacement) {
|
||||||
|
checkReplacement(replacement);
|
||||||
|
this.charset = cs;
|
||||||
|
this.replacement = replacement.clone();
|
||||||
|
this.averageBytesPerChar = averageBytesPerChar;
|
||||||
|
this.maxBytesPerChar = maxBytesPerChar;
|
||||||
|
status = INIT;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected TCharsetEncoder(TCharset cs, float averageBytesPerChar, float maxBytesPerChar) {
|
||||||
|
this(cs, averageBytesPerChar, maxBytesPerChar, new byte[] { (byte)'?' });
|
||||||
|
}
|
||||||
|
|
||||||
|
public final TCharset charset() {
|
||||||
|
return charset;
|
||||||
|
}
|
||||||
|
|
||||||
|
public final byte[] replacement() {
|
||||||
|
return replacement.clone();
|
||||||
|
}
|
||||||
|
|
||||||
|
public final TCharsetEncoder replaceWith(byte[] newReplacement) {
|
||||||
|
checkReplacement(newReplacement);
|
||||||
|
this.replacement = newReplacement.clone();
|
||||||
|
implReplaceWith(newReplacement);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void checkReplacement(byte[] replacement) {
|
||||||
|
if (replacement == null || replacement.length == 0 || replacement.length < maxBytesPerChar) {
|
||||||
|
throw new IllegalArgumentException("Replacement preconditions do not hold");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void implReplaceWith(@SuppressWarnings("unused") byte[] newReplacement) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public TCodingErrorAction malformedInputAction() {
|
||||||
|
return malformedAction;
|
||||||
|
}
|
||||||
|
|
||||||
|
public final TCharsetEncoder onMalformedInput(TCodingErrorAction newAction) {
|
||||||
|
if (newAction == null) {
|
||||||
|
throw new IllegalArgumentException("Action must be non-null");
|
||||||
|
}
|
||||||
|
malformedAction = newAction;
|
||||||
|
implOnMalformedInput(newAction);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void implOnMalformedInput(@SuppressWarnings("unused") TCodingErrorAction newAction) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public TCodingErrorAction unmappableCharacterAction() {
|
||||||
|
return unmappableAction;
|
||||||
|
}
|
||||||
|
|
||||||
|
public final TCharsetEncoder onUnmappableCharacter(TCodingErrorAction newAction) {
|
||||||
|
if (newAction == null) {
|
||||||
|
throw new IllegalArgumentException("Action must be non-null");
|
||||||
|
}
|
||||||
|
unmappableAction = newAction;
|
||||||
|
implOnUnmappableCharacter(newAction);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void implOnUnmappableCharacter(@SuppressWarnings("unused") TCodingErrorAction newAction) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public final float averageBytesPerChar() {
|
||||||
|
return averageBytesPerChar;
|
||||||
|
}
|
||||||
|
|
||||||
|
public final float maxBytesPerChar() {
|
||||||
|
return maxBytesPerChar;
|
||||||
|
}
|
||||||
|
|
||||||
|
public final TCoderResult encode(TCharBuffer in, TByteBuffer out, boolean endOfInput) {
|
||||||
|
if (status == READY && finished && !endOfInput) {
|
||||||
|
throw new IllegalStateException();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (status == FLUSH || !endOfInput && status == END) {
|
||||||
|
throw new IllegalStateException();
|
||||||
|
}
|
||||||
|
|
||||||
|
TCoderResult result;
|
||||||
|
while (true) {
|
||||||
|
try {
|
||||||
|
result = encodeLoop(in, out);
|
||||||
|
} catch (TBufferOverflowException e) {
|
||||||
|
throw new TCoderMalfunctionError(e);
|
||||||
|
} catch (TBufferUnderflowException e) {
|
||||||
|
throw new TCoderMalfunctionError(e);
|
||||||
|
}
|
||||||
|
if (result == TCoderResult.UNDERFLOW) {
|
||||||
|
status = endOfInput ? END : ONGOING;
|
||||||
|
if (endOfInput) {
|
||||||
|
int remaining = in.remaining();
|
||||||
|
if (remaining > 0) {
|
||||||
|
result = TCoderResult.malformedForLength(remaining);
|
||||||
|
} else {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
} else if (result == TCoderResult.OVERFLOW) {
|
||||||
|
status = endOfInput ? END : ONGOING;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
TCodingErrorAction action = malformedAction;
|
||||||
|
if (result.isUnmappable()) {
|
||||||
|
action = unmappableAction;
|
||||||
|
}
|
||||||
|
if (action == TCodingErrorAction.REPLACE) {
|
||||||
|
if (out.remaining() < replacement.length) {
|
||||||
|
return TCoderResult.OVERFLOW;
|
||||||
|
}
|
||||||
|
out.put(replacement);
|
||||||
|
} else {
|
||||||
|
if (action != TCodingErrorAction.IGNORE) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
in.position(in.position() + result.length());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public final TByteBuffer encode(TCharBuffer in) throws TCharacterCodingException {
|
||||||
|
if (in.remaining() == 0) {
|
||||||
|
return TByteBuffer.allocate(0);
|
||||||
|
}
|
||||||
|
reset();
|
||||||
|
int length = (int)(in.remaining() * averageBytesPerChar);
|
||||||
|
TByteBuffer output = TByteBuffer.allocate(length);
|
||||||
|
TCoderResult result = null;
|
||||||
|
while (true) {
|
||||||
|
result = encode(in, output, false);
|
||||||
|
if (result == TCoderResult.UNDERFLOW) {
|
||||||
|
break;
|
||||||
|
} else if (result == TCoderResult.OVERFLOW) {
|
||||||
|
output = allocateMore(output);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
checkCoderResult(result);
|
||||||
|
}
|
||||||
|
result = encode(in, output, true);
|
||||||
|
checkCoderResult(result);
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
result = flush(output);
|
||||||
|
if (result == TCoderResult.UNDERFLOW) {
|
||||||
|
output.flip();
|
||||||
|
break;
|
||||||
|
} else if (result == TCoderResult.OVERFLOW) {
|
||||||
|
output = allocateMore(output);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
checkCoderResult(result);
|
||||||
|
output.flip();
|
||||||
|
if (result.isMalformed()) {
|
||||||
|
throw new TMalformedInputException(result.length());
|
||||||
|
} else if (result.isUnmappable()) {
|
||||||
|
throw new TUnmappableCharacterException(result.length());
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
status = READY;
|
||||||
|
finished = true;
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected abstract TCoderResult encodeLoop(TCharBuffer in, TByteBuffer out);
|
||||||
|
|
||||||
|
public boolean canEncode(char c) {
|
||||||
|
return implCanEncode(TCharBuffer.wrap(new char[] { c }));
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean implCanEncode(TCharBuffer cb) {
|
||||||
|
if (status == FLUSH || status == INIT) {
|
||||||
|
status = READY;
|
||||||
|
}
|
||||||
|
if (status != READY) {
|
||||||
|
throw new IllegalStateException();
|
||||||
|
}
|
||||||
|
TCodingErrorAction malformBak = malformedAction;
|
||||||
|
TCodingErrorAction unmapBak = unmappableAction;
|
||||||
|
onMalformedInput(TCodingErrorAction.REPORT);
|
||||||
|
onUnmappableCharacter(TCodingErrorAction.REPORT);
|
||||||
|
boolean result = true;
|
||||||
|
try {
|
||||||
|
encode(cb);
|
||||||
|
} catch (TCharacterCodingException e) {
|
||||||
|
result = false;
|
||||||
|
}
|
||||||
|
onMalformedInput(malformBak);
|
||||||
|
onUnmappableCharacter(unmapBak);
|
||||||
|
reset();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean canEncode(CharSequence sequence) {
|
||||||
|
TCharBuffer cb;
|
||||||
|
if (sequence instanceof TCharBuffer) {
|
||||||
|
cb = ((TCharBuffer)sequence).duplicate();
|
||||||
|
} else {
|
||||||
|
cb = TCharBuffer.wrap(sequence);
|
||||||
|
}
|
||||||
|
return implCanEncode(cb);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void checkCoderResult(TCoderResult result) throws TCharacterCodingException {
|
||||||
|
if (malformedAction == TCodingErrorAction.REPORT && result.isMalformed()) {
|
||||||
|
throw new TMalformedInputException(result.length());
|
||||||
|
} else if (unmappableAction == TCodingErrorAction.REPORT && result.isUnmappable()) {
|
||||||
|
throw new TUnmappableCharacterException(result.length());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private TByteBuffer allocateMore(TByteBuffer output) {
|
||||||
|
if (output.capacity() == 0) {
|
||||||
|
return TByteBuffer.allocate(1);
|
||||||
|
}
|
||||||
|
TByteBuffer result = TByteBuffer.allocate(output.capacity() * 2);
|
||||||
|
output.flip();
|
||||||
|
result.put(output);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public final TCoderResult flush(TByteBuffer out) {
|
||||||
|
if (status != END && status != READY) {
|
||||||
|
throw new IllegalStateException();
|
||||||
|
}
|
||||||
|
TCoderResult result = implFlush(out);
|
||||||
|
if (result == TCoderResult.UNDERFLOW) {
|
||||||
|
status = FLUSH;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected TCoderResult implFlush(@SuppressWarnings("unused") TByteBuffer out) {
|
||||||
|
return TCoderResult.UNDERFLOW;
|
||||||
|
}
|
||||||
|
|
||||||
|
public final TCharsetEncoder reset() {
|
||||||
|
status = INIT;
|
||||||
|
implReset();
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void implReset() {
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,28 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2015 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.teavm.classlib.java.nio.charset;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Alexey Andreev
|
||||||
|
*/
|
||||||
|
public class TCoderMalfunctionError extends Error {
|
||||||
|
private static final long serialVersionUID = 8030591981317653860L;
|
||||||
|
|
||||||
|
public TCoderMalfunctionError(Throwable cause) {
|
||||||
|
super(cause);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,81 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2015 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.teavm.classlib.java.nio.charset;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Alexey Andreev
|
||||||
|
*/
|
||||||
|
public class TCoderResult {
|
||||||
|
public static final TCoderResult UNDERFLOW = new TCoderResult((byte)0, 0);
|
||||||
|
public static final TCoderResult OVERFLOW = new TCoderResult((byte)1, 0);
|
||||||
|
private byte kind;
|
||||||
|
private int length;
|
||||||
|
|
||||||
|
TCoderResult(byte kind, int length) {
|
||||||
|
super();
|
||||||
|
this.kind = kind;
|
||||||
|
this.length = length;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isUnderflow() {
|
||||||
|
return kind == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isOverflow() {
|
||||||
|
return kind == 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isError() {
|
||||||
|
return isMalformed() || isUnmappable();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isMalformed() {
|
||||||
|
return kind == 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isUnmappable() {
|
||||||
|
return kind == 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int length() {
|
||||||
|
if (!isError()) {
|
||||||
|
throw new UnsupportedOperationException();
|
||||||
|
}
|
||||||
|
return length;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static TCoderResult malformedForLength(int length) {
|
||||||
|
return new TCoderResult((byte)2, length);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static TCoderResult unmappableForLength(int length) {
|
||||||
|
return new TCoderResult((byte)3, length);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void throwException() throws TCharacterCodingException {
|
||||||
|
switch (kind) {
|
||||||
|
case 0:
|
||||||
|
throw new TBufferUnderflowException();
|
||||||
|
case 1:
|
||||||
|
throw new TBufferOverflowException();
|
||||||
|
case 2:
|
||||||
|
throw new TMalformedInputException(length);
|
||||||
|
case 3:
|
||||||
|
throw new TUnmappableCharacterException(length);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,36 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2015 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.teavm.classlib.java.nio.charset;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Alexey Andreev
|
||||||
|
*/
|
||||||
|
public class TCodingErrorAction {
|
||||||
|
public static final TCodingErrorAction IGNORE = new TCodingErrorAction("IGNORE");
|
||||||
|
public static final TCodingErrorAction REPLACE = new TCodingErrorAction("REPLACE");
|
||||||
|
public static final TCodingErrorAction REPORT = new TCodingErrorAction("REPORT");
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
public TCodingErrorAction(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,38 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2015 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.teavm.classlib.java.nio.charset;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Alexey Andreev
|
||||||
|
*/
|
||||||
|
public class TMalformedInputException extends TCharacterCodingException {
|
||||||
|
private static final long serialVersionUID = -7677315548693161814L;
|
||||||
|
private int length;
|
||||||
|
|
||||||
|
public TMalformedInputException(int length) {
|
||||||
|
this.length = length;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getLength() {
|
||||||
|
return length;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getMessage() {
|
||||||
|
return "Malformed input of length " + length;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,38 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2015 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.teavm.classlib.java.nio.charset;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Alexey Andreev
|
||||||
|
*/
|
||||||
|
public class TUnmappableCharacterException extends TCharacterCodingException {
|
||||||
|
private static final long serialVersionUID = 4225770757749997199L;
|
||||||
|
private int length;
|
||||||
|
|
||||||
|
public TUnmappableCharacterException(int length) {
|
||||||
|
this.length = length;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getLength() {
|
||||||
|
return length;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getMessage() {
|
||||||
|
return "Unmappable characters of length " + length;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user