1*6777b538SAndroid Build Coastguard Workerdiff --git a/source/common/ucnv2022.cpp b/source/common/ucnv2022.cpp 2*6777b538SAndroid Build Coastguard Workerindex 5989c1b4..9d6d111f 100644 3*6777b538SAndroid Build Coastguard Worker--- a/source/common/ucnv2022.cpp 4*6777b538SAndroid Build Coastguard Worker+++ b/source/common/ucnv2022.cpp 5*6777b538SAndroid Build Coastguard Worker@@ -513,7 +513,7 @@ _ISO2022Open(UConverter *cnv, UConverterLoadArgs *pArgs, UErrorCode *errorCode){ 6*6777b538SAndroid Build Coastguard Worker ucnv_loadSharedData("ISO8859_7", &stackPieces, &stackArgs, errorCode); 7*6777b538SAndroid Build Coastguard Worker } 8*6777b538SAndroid Build Coastguard Worker myConverterData->myConverterArray[JISX208] = 9*6777b538SAndroid Build Coastguard Worker- ucnv_loadSharedData("Shift-JIS", &stackPieces, &stackArgs, errorCode); 10*6777b538SAndroid Build Coastguard Worker+ ucnv_loadSharedData("EUC-JP", &stackPieces, &stackArgs, errorCode); 11*6777b538SAndroid Build Coastguard Worker if(jpCharsetMasks[version]&CSM(JISX212)) { 12*6777b538SAndroid Build Coastguard Worker myConverterData->myConverterArray[JISX212] = 13*6777b538SAndroid Build Coastguard Worker ucnv_loadSharedData("jisx-212", &stackPieces, &stackArgs, errorCode); 14*6777b538SAndroid Build Coastguard Worker@@ -1514,79 +1514,6 @@ jisx201FromU(uint32_t value) { 15*6777b538SAndroid Build Coastguard Worker return 0xfffe; 16*6777b538SAndroid Build Coastguard Worker } 17*6777b538SAndroid Build Coastguard Worker 18*6777b538SAndroid Build Coastguard Worker-/* 19*6777b538SAndroid Build Coastguard Worker- * Take a valid Shift-JIS byte pair, check that it is in the range corresponding 20*6777b538SAndroid Build Coastguard Worker- * to JIS X 0208, and convert it to a pair of 21..7E bytes. 21*6777b538SAndroid Build Coastguard Worker- * Return 0 if the byte pair is out of range. 22*6777b538SAndroid Build Coastguard Worker- */ 23*6777b538SAndroid Build Coastguard Worker-static inline uint32_t 24*6777b538SAndroid Build Coastguard Worker-_2022FromSJIS(uint32_t value) { 25*6777b538SAndroid Build Coastguard Worker- uint8_t trail; 26*6777b538SAndroid Build Coastguard Worker- 27*6777b538SAndroid Build Coastguard Worker- if(value > 0xEFFC) { 28*6777b538SAndroid Build Coastguard Worker- return 0; /* beyond JIS X 0208 */ 29*6777b538SAndroid Build Coastguard Worker- } 30*6777b538SAndroid Build Coastguard Worker- 31*6777b538SAndroid Build Coastguard Worker- trail = (uint8_t)value; 32*6777b538SAndroid Build Coastguard Worker- 33*6777b538SAndroid Build Coastguard Worker- value &= 0xff00; /* lead byte */ 34*6777b538SAndroid Build Coastguard Worker- if(value <= 0x9f00) { 35*6777b538SAndroid Build Coastguard Worker- value -= 0x7000; 36*6777b538SAndroid Build Coastguard Worker- } else /* 0xe000 <= value <= 0xef00 */ { 37*6777b538SAndroid Build Coastguard Worker- value -= 0xb000; 38*6777b538SAndroid Build Coastguard Worker- } 39*6777b538SAndroid Build Coastguard Worker- value <<= 1; 40*6777b538SAndroid Build Coastguard Worker- 41*6777b538SAndroid Build Coastguard Worker- if(trail <= 0x9e) { 42*6777b538SAndroid Build Coastguard Worker- value -= 0x100; 43*6777b538SAndroid Build Coastguard Worker- if(trail <= 0x7e) { 44*6777b538SAndroid Build Coastguard Worker- value |= trail - 0x1f; 45*6777b538SAndroid Build Coastguard Worker- } else { 46*6777b538SAndroid Build Coastguard Worker- value |= trail - 0x20; 47*6777b538SAndroid Build Coastguard Worker- } 48*6777b538SAndroid Build Coastguard Worker- } else /* trail <= 0xfc */ { 49*6777b538SAndroid Build Coastguard Worker- value |= trail - 0x7e; 50*6777b538SAndroid Build Coastguard Worker- } 51*6777b538SAndroid Build Coastguard Worker- return value; 52*6777b538SAndroid Build Coastguard Worker-} 53*6777b538SAndroid Build Coastguard Worker- 54*6777b538SAndroid Build Coastguard Worker-/* 55*6777b538SAndroid Build Coastguard Worker- * Convert a pair of JIS X 0208 21..7E bytes to Shift-JIS. 56*6777b538SAndroid Build Coastguard Worker- * If either byte is outside 21..7E make sure that the result is not valid 57*6777b538SAndroid Build Coastguard Worker- * for Shift-JIS so that the converter catches it. 58*6777b538SAndroid Build Coastguard Worker- * Some invalid byte values already turn into equally invalid Shift-JIS 59*6777b538SAndroid Build Coastguard Worker- * byte values and need not be tested explicitly. 60*6777b538SAndroid Build Coastguard Worker- */ 61*6777b538SAndroid Build Coastguard Worker-static inline void 62*6777b538SAndroid Build Coastguard Worker-_2022ToSJIS(uint8_t c1, uint8_t c2, char bytes[2]) { 63*6777b538SAndroid Build Coastguard Worker- if(c1&1) { 64*6777b538SAndroid Build Coastguard Worker- ++c1; 65*6777b538SAndroid Build Coastguard Worker- if(c2 <= 0x5f) { 66*6777b538SAndroid Build Coastguard Worker- c2 += 0x1f; 67*6777b538SAndroid Build Coastguard Worker- } else if(c2 <= 0x7e) { 68*6777b538SAndroid Build Coastguard Worker- c2 += 0x20; 69*6777b538SAndroid Build Coastguard Worker- } else { 70*6777b538SAndroid Build Coastguard Worker- c2 = 0; /* invalid */ 71*6777b538SAndroid Build Coastguard Worker- } 72*6777b538SAndroid Build Coastguard Worker- } else { 73*6777b538SAndroid Build Coastguard Worker- if((uint8_t)(c2-0x21) <= ((0x7e)-0x21)) { 74*6777b538SAndroid Build Coastguard Worker- c2 += 0x7e; 75*6777b538SAndroid Build Coastguard Worker- } else { 76*6777b538SAndroid Build Coastguard Worker- c2 = 0; /* invalid */ 77*6777b538SAndroid Build Coastguard Worker- } 78*6777b538SAndroid Build Coastguard Worker- } 79*6777b538SAndroid Build Coastguard Worker- c1 >>= 1; 80*6777b538SAndroid Build Coastguard Worker- if(c1 <= 0x2f) { 81*6777b538SAndroid Build Coastguard Worker- c1 += 0x70; 82*6777b538SAndroid Build Coastguard Worker- } else if(c1 <= 0x3f) { 83*6777b538SAndroid Build Coastguard Worker- c1 += 0xb0; 84*6777b538SAndroid Build Coastguard Worker- } else { 85*6777b538SAndroid Build Coastguard Worker- c1 = 0; /* invalid */ 86*6777b538SAndroid Build Coastguard Worker- } 87*6777b538SAndroid Build Coastguard Worker- bytes[0] = (char)c1; 88*6777b538SAndroid Build Coastguard Worker- bytes[1] = (char)c2; 89*6777b538SAndroid Build Coastguard Worker-} 90*6777b538SAndroid Build Coastguard Worker- 91*6777b538SAndroid Build Coastguard Worker /* 92*6777b538SAndroid Build Coastguard Worker * JIS X 0208 has fallbacks from Unicode half-width Katakana to full-width (DBCS) 93*6777b538SAndroid Build Coastguard Worker * Katakana. 94*6777b538SAndroid Build Coastguard Worker@@ -1857,8 +1784,13 @@ getTrail: 95*6777b538SAndroid Build Coastguard Worker converterData->myConverterArray[cs0], 96*6777b538SAndroid Build Coastguard Worker sourceChar, &value, 97*6777b538SAndroid Build Coastguard Worker useFallback, MBCS_OUTPUT_2); 98*6777b538SAndroid Build Coastguard Worker- if(len2 == 2 || (len2 == -2 && len == 0)) { /* only accept DBCS: abs(len)==2 */ 99*6777b538SAndroid Build Coastguard Worker- value = _2022FromSJIS(value); 100*6777b538SAndroid Build Coastguard Worker+ // Only accept DBCS char (abs(len2) == 2). 101*6777b538SAndroid Build Coastguard Worker+ // With EUC-JP table for JIS X 208, half-width Kana 102*6777b538SAndroid Build Coastguard Worker+ // represented with DBCS starting with 0x8E has to be 103*6777b538SAndroid Build Coastguard Worker+ // filtered out so that they can be converted with 104*6777b538SAndroid Build Coastguard Worker+ // hwkana_fb table. 105*6777b538SAndroid Build Coastguard Worker+ if((len2 == 2 && ((value & 0xFF00) != 0x8E00)) || (len2 == -2 && len == 0)) { 106*6777b538SAndroid Build Coastguard Worker+ value &= 0x7F7F; 107*6777b538SAndroid Build Coastguard Worker if(value != 0) { 108*6777b538SAndroid Build Coastguard Worker targetValue = value; 109*6777b538SAndroid Build Coastguard Worker len = len2; 110*6777b538SAndroid Build Coastguard Worker@@ -2250,18 +2182,13 @@ getTrailByte: 111*6777b538SAndroid Build Coastguard Worker if (leadIsOk && trailIsOk) { 112*6777b538SAndroid Build Coastguard Worker ++mySource; 113*6777b538SAndroid Build Coastguard Worker tmpSourceChar = (mySourceChar << 8) | trailByte; 114*6777b538SAndroid Build Coastguard Worker- if(cs == JISX208) { 115*6777b538SAndroid Build Coastguard Worker- _2022ToSJIS((uint8_t)mySourceChar, trailByte, tempBuf); 116*6777b538SAndroid Build Coastguard Worker- mySourceChar = tmpSourceChar; 117*6777b538SAndroid Build Coastguard Worker- } else { 118*6777b538SAndroid Build Coastguard Worker- /* Copy before we modify tmpSourceChar so toUnicodeCallback() sees the correct bytes. */ 119*6777b538SAndroid Build Coastguard Worker- mySourceChar = tmpSourceChar; 120*6777b538SAndroid Build Coastguard Worker- if (cs == KSC5601) { 121*6777b538SAndroid Build Coastguard Worker- tmpSourceChar += 0x8080; /* = _2022ToGR94DBCS(tmpSourceChar) */ 122*6777b538SAndroid Build Coastguard Worker- } 123*6777b538SAndroid Build Coastguard Worker- tempBuf[0] = (char)(tmpSourceChar >> 8); 124*6777b538SAndroid Build Coastguard Worker- tempBuf[1] = (char)(tmpSourceChar); 125*6777b538SAndroid Build Coastguard Worker+ /* Copy before we modify tmpSourceChar so toUnicodeCallback() sees the correct bytes. */ 126*6777b538SAndroid Build Coastguard Worker+ mySourceChar = tmpSourceChar; 127*6777b538SAndroid Build Coastguard Worker+ if (cs == JISX208 || cs == KSC5601) { 128*6777b538SAndroid Build Coastguard Worker+ tmpSourceChar += 0x8080; /* = _2022ToGR94DBCS(tmpSourceChar) */ 129*6777b538SAndroid Build Coastguard Worker } 130*6777b538SAndroid Build Coastguard Worker+ tempBuf[0] = (char)(tmpSourceChar >> 8); 131*6777b538SAndroid Build Coastguard Worker+ tempBuf[1] = (char)(tmpSourceChar); 132*6777b538SAndroid Build Coastguard Worker targetUniChar = ucnv_MBCSSimpleGetNextUChar(myData->myConverterArray[cs], tempBuf, 2, false); 133*6777b538SAndroid Build Coastguard Worker } else if (!(trailIsOk || IS_2022_CONTROL(trailByte))) { 134*6777b538SAndroid Build Coastguard Worker /* report a pair of illegal bytes if the second byte is not a DBCS starter */ 135