219 public CoderResult decodeLoop(ByteBuffer src, CharBuffer dst) {
220 if (src.hasArray() && dst.hasArray())
221 return decodeArrayLoop(src, dst);
222 else
223 return decodeBufferLoop(src, dst);
224 }
225
226 @Override
227 public int decode(byte[] src, int sp, int len, char[] dst) {
228 int dp = 0;
229 int sl = sp + len;
230 char repl = replacement().charAt(0);
231 while (sp < sl) {
232 int b1 = src[sp++] & 0xff;
233 char c = b2cSB[b1];
234 if (c == UNMAPPABLE_DECODING) {
235 if (sp < sl) {
236 int b2 = src[sp++] & 0xff;
237 if (b2 < b2Min || b2 > b2Max ||
238 (c = b2c[b1][b2 - b2Min]) == UNMAPPABLE_DECODING) {
239 if (b2c[b1] == B2C_UNMAPPABLE || // isNotLeadingByte
240 b2c[b2] != B2C_UNMAPPABLE || // isLeadingByte
241 decodeSingle(b2) != UNMAPPABLE_DECODING) {
242 sp--;
243 }
244 }
245 }
246 if (c == UNMAPPABLE_DECODING) {
247 c = repl;
248 }
249 }
250 dst[dp++] = c;
251 }
252 return dp;
253 }
254
255 @Override
256 public boolean isASCIICompatible() {
257 return isASCIICompatible;
258 }
259
260 public void implReset() {
261 super.implReset();
455 if (b2 < b2Min || b2 > b2Max ||
456 (c = b2c[b1][b2 - b2Min]) == UNMAPPABLE_DECODING) {
457 c = repl;
458 }
459 }
460 }
461 dst[dp++] = c;
462 }
463 }
464 return dp;
465 }
466 }
467
468 // DBCS_ONLY
469 public static class Decoder_DBCSONLY extends Decoder {
470 static final char[] b2cSB_UNMAPPABLE;
471 static {
472 b2cSB_UNMAPPABLE = new char[0x100];
473 Arrays.fill(b2cSB_UNMAPPABLE, UNMAPPABLE_DECODING);
474 }
475 public Decoder_DBCSONLY(Charset cs, char[][] b2c, char[] b2cSB, int b2Min, int b2Max,
476 boolean isASCIICompatible) {
477 super(cs, 0.5f, 1.0f, b2c, b2cSB_UNMAPPABLE, b2Min, b2Max, isASCIICompatible);
478 }
479
480 public Decoder_DBCSONLY(Charset cs, char[][] b2c, char[] b2cSB, int b2Min, int b2Max) {
481 super(cs, 0.5f, 1.0f, b2c, b2cSB_UNMAPPABLE, b2Min, b2Max, false);
482 }
483 }
484
485 // EUC_SIMPLE
486 // The only thing we need to "override" is to check SS2/SS3 and
487 // return "malformed" if found
488 public static class Decoder_EUC_SIM extends Decoder {
489 private final int SS2 = 0x8E;
490 private final int SS3 = 0x8F;
491
492 public Decoder_EUC_SIM(Charset cs,
493 char[][] b2c, char[] b2cSB, int b2Min, int b2Max,
494 boolean isASCIICompatible) {
|
219 public CoderResult decodeLoop(ByteBuffer src, CharBuffer dst) {
220 if (src.hasArray() && dst.hasArray())
221 return decodeArrayLoop(src, dst);
222 else
223 return decodeBufferLoop(src, dst);
224 }
225
226 @Override
227 public int decode(byte[] src, int sp, int len, char[] dst) {
228 int dp = 0;
229 int sl = sp + len;
230 char repl = replacement().charAt(0);
231 while (sp < sl) {
232 int b1 = src[sp++] & 0xff;
233 char c = b2cSB[b1];
234 if (c == UNMAPPABLE_DECODING) {
235 if (sp < sl) {
236 int b2 = src[sp++] & 0xff;
237 if (b2 < b2Min || b2 > b2Max ||
238 (c = b2c[b1][b2 - b2Min]) == UNMAPPABLE_DECODING) {
239 if (crMalformedOrUnmappable(b1, b2).length() == 1) {
240 sp--;
241 }
242 }
243 }
244 if (c == UNMAPPABLE_DECODING) {
245 c = repl;
246 }
247 }
248 dst[dp++] = c;
249 }
250 return dp;
251 }
252
253 @Override
254 public boolean isASCIICompatible() {
255 return isASCIICompatible;
256 }
257
258 public void implReset() {
259 super.implReset();
453 if (b2 < b2Min || b2 > b2Max ||
454 (c = b2c[b1][b2 - b2Min]) == UNMAPPABLE_DECODING) {
455 c = repl;
456 }
457 }
458 }
459 dst[dp++] = c;
460 }
461 }
462 return dp;
463 }
464 }
465
466 // DBCS_ONLY
467 public static class Decoder_DBCSONLY extends Decoder {
468 static final char[] b2cSB_UNMAPPABLE;
469 static {
470 b2cSB_UNMAPPABLE = new char[0x100];
471 Arrays.fill(b2cSB_UNMAPPABLE, UNMAPPABLE_DECODING);
472 }
473
474 // always returns unmappableForLenth(2) for doublebyte_only
475 @Override
476 protected CoderResult crMalformedOrUnmappable(int b1, int b2) {
477 return CoderResult.unmappableForLength(2);
478 }
479
480 public Decoder_DBCSONLY(Charset cs, char[][] b2c, char[] b2cSB, int b2Min, int b2Max,
481 boolean isASCIICompatible) {
482 super(cs, 0.5f, 1.0f, b2c, b2cSB_UNMAPPABLE, b2Min, b2Max, isASCIICompatible);
483 }
484
485 public Decoder_DBCSONLY(Charset cs, char[][] b2c, char[] b2cSB, int b2Min, int b2Max) {
486 super(cs, 0.5f, 1.0f, b2c, b2cSB_UNMAPPABLE, b2Min, b2Max, false);
487 }
488 }
489
490 // EUC_SIMPLE
491 // The only thing we need to "override" is to check SS2/SS3 and
492 // return "malformed" if found
493 public static class Decoder_EUC_SIM extends Decoder {
494 private final int SS2 = 0x8E;
495 private final int SS3 = 0x8F;
496
497 public Decoder_EUC_SIM(Charset cs,
498 char[][] b2c, char[] b2cSB, int b2Min, int b2Max,
499 boolean isASCIICompatible) {
|