xref: /aosp_15_r20/external/cronet/third_party/icu/patches/iso2022jp.patch (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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