src/java.base/share/classes/sun/nio/cs/DoubleByte.java

Print this page




 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) {