summaryrefslogtreecommitdiffstats
path: root/Modules/cjkcodecs/_codecs_jp.c
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@gmail.com>2013-10-28 22:18:39 (GMT)
committerVictor Stinner <victor.stinner@gmail.com>2013-10-28 22:18:39 (GMT)
commit11bdf91a5f408a447c4c03db820e437d250e7999 (patch)
treebc77a3f21c3643a24884e15e86411b6f7d5a77d5 /Modules/cjkcodecs/_codecs_jp.c
parent33aaa73cade0acee374139f855af2a167d139d89 (diff)
downloadcpython-11bdf91a5f408a447c4c03db820e437d250e7999.zip
cpython-11bdf91a5f408a447c4c03db820e437d250e7999.tar.gz
cpython-11bdf91a5f408a447c4c03db820e437d250e7999.tar.bz2
Issue #18509: handle PyUnicode_Writer() error
Diffstat (limited to 'Modules/cjkcodecs/_codecs_jp.c')
-rw-r--r--Modules/cjkcodecs/_codecs_jp.c68
1 files changed, 39 insertions, 29 deletions
diff --git a/Modules/cjkcodecs/_codecs_jp.c b/Modules/cjkcodecs/_codecs_jp.c
index 7ab318b..a08aa15 100644
--- a/Modules/cjkcodecs/_codecs_jp.c
+++ b/Modules/cjkcodecs/_codecs_jp.c
@@ -85,6 +85,7 @@ DECODER(cp932)
{
while (inleft > 0) {
unsigned char c = INBYTE1, c2;
+ Py_UCS4 decoded;
if (c <= 0x80) {
OUTCHAR(c);
@@ -109,7 +110,8 @@ DECODER(cp932)
REQUIRE_INBUF(2)
c2 = INBYTE2;
- TRYMAP_DEC(cp932ext, writer, c, c2);
+ if (TRYMAP_DEC(cp932ext, decoded, c, c2))
+ OUTCHAR(decoded);
else if ((c >= 0x81 && c <= 0x9f) || (c >= 0xe0 && c <= 0xea)){
if (c2 < 0x40 || (c2 > 0x7e && c2 < 0x80) || c2 > 0xfc)
return 1;
@@ -119,8 +121,10 @@ DECODER(cp932)
c = (2 * c + (c2 < 0x5e ? 0 : 1) + 0x21);
c2 = (c2 < 0x5e ? c2 : c2 - 0x5e) + 0x21;
- TRYMAP_DEC(jisx0208, writer, c, c2);
- else return 1;
+ if (TRYMAP_DEC(jisx0208, decoded, c, c2))
+ OUTCHAR(decoded);
+ else
+ return 1;
}
else if (c >= 0xf0 && c <= 0xf9) {
if ((c2 >= 0x40 && c2 <= 0x7e) ||
@@ -235,7 +239,7 @@ DECODER(euc_jis_2004)
{
while (inleft > 0) {
unsigned char c = INBYTE1;
- Py_UCS4 code;
+ Py_UCS4 code, decoded;
if (c < 0x80) {
OUTCHAR(c);
@@ -265,13 +269,15 @@ DECODER(euc_jis_2004)
/* JIS X 0213 Plane 2 or JIS X 0212 (see NOTES) */
EMULATE_JISX0213_2000_DECODE_PLANE2(writer, c2, c3)
- else TRYMAP_DEC(jisx0213_2_bmp, writer, c2, c3) ;
- else TRYMAP_DEC_CHAR(jisx0213_2_emp, code, c2, c3) {
+ else if (TRYMAP_DEC(jisx0213_2_bmp, decoded, c2, c3))
+ OUTCHAR(decoded);
+ else if (TRYMAP_DEC(jisx0213_2_emp, code, c2, c3)) {
OUTCHAR(EMPBASE | code);
NEXT_IN(3);
continue;
}
- else TRYMAP_DEC(jisx0212, writer, c2, c3) ;
+ else if (TRYMAP_DEC(jisx0212, decoded, c2, c3))
+ OUTCHAR(decoded);
else return 1;
NEXT_IN(3);
}
@@ -286,14 +292,16 @@ DECODER(euc_jis_2004)
EMULATE_JISX0213_2000_DECODE_PLANE1(writer, c, c2)
else if (c == 0x21 && c2 == 0x40) OUTCHAR(0xff3c);
else if (c == 0x22 && c2 == 0x32) OUTCHAR(0xff5e);
- else TRYMAP_DEC(jisx0208, writer, c, c2);
- else TRYMAP_DEC(jisx0213_1_bmp, writer, c, c2);
- else TRYMAP_DEC_CHAR(jisx0213_1_emp, code, c, c2) {
+ else if (TRYMAP_DEC(jisx0208, decoded, c, c2))
+ OUTCHAR(decoded);
+ else if (TRYMAP_DEC(jisx0213_1_bmp, decoded, c, c2))
+ OUTCHAR(decoded);
+ else if (TRYMAP_DEC(jisx0213_1_emp, code, c, c2)) {
OUTCHAR(EMPBASE | code);
NEXT_IN(2);
continue;
}
- else TRYMAP_DEC_CHAR(jisx0213_pair, code, c, c2) {
+ else if (TRYMAP_DEC(jisx0213_pair, code, c, c2)) {
OUTCHAR2(code >> 16, code & 0xffff);
NEXT_IN(2);
continue;
@@ -367,6 +375,7 @@ DECODER(euc_jp)
{
while (inleft > 0) {
unsigned char c = INBYTE1;
+ Py_UCS4 decoded;
if (c < 0x80) {
OUTCHAR(c);
@@ -394,7 +403,8 @@ DECODER(euc_jp)
c2 = INBYTE2;
c3 = INBYTE3;
/* JIS X 0212 */
- TRYMAP_DEC(jisx0212, writer, c2 ^ 0x80, c3 ^ 0x80) {
+ if (TRYMAP_DEC(jisx0212, decoded, c2 ^ 0x80, c3 ^ 0x80)) {
+ OUTCHAR(decoded);
NEXT_IN(3);
}
else
@@ -412,9 +422,10 @@ DECODER(euc_jp)
OUTCHAR(0xff3c);
else
#endif
- TRYMAP_DEC(jisx0208, writer,
- c ^ 0x80, c2 ^ 0x80) ;
- else return 1;
+ if (TRYMAP_DEC(jisx0208, decoded, c ^ 0x80, c2 ^ 0x80))
+ OUTCHAR(decoded);
+ else
+ return 1;
NEXT_IN(2);
}
}
@@ -486,6 +497,7 @@ DECODER(shift_jis)
{
while (inleft > 0) {
unsigned char c = INBYTE1;
+ Py_UCS4 decoded;
#ifdef STRICT_BUILD
JISX0201_R_DECODE(c, writer)
@@ -514,7 +526,8 @@ DECODER(shift_jis)
continue;
}
#endif
- TRYMAP_DEC(jisx0208, writer, c1, c2) {
+ if (TRYMAP_DEC(jisx0208, decoded, c1, c2)) {
+ OUTCHAR(decoded);
NEXT_IN(2);
continue;
}
@@ -636,7 +649,7 @@ DECODER(shift_jis_2004)
JISX0201_DECODE(c, writer)
else if ((c >= 0x81 && c <= 0x9f) || (c >= 0xe0 && c <= 0xfc)){
unsigned char c1, c2;
- Py_UCS4 code;
+ Py_UCS4 code, decoded;
REQUIRE_INBUF(2)
c2 = INBYTE2;
@@ -652,17 +665,14 @@ DECODER(shift_jis_2004)
c1 += 0x21;
EMULATE_JISX0213_2000_DECODE_PLANE1(writer,
c1, c2)
- else TRYMAP_DEC(jisx0208, writer, c1, c2) {
- }
- else TRYMAP_DEC(jisx0213_1_bmp, writer,
- c1, c2) {
- }
- else TRYMAP_DEC_CHAR(jisx0213_1_emp, code, c1, c2) {
+ else if (TRYMAP_DEC(jisx0208, decoded, c1, c2))
+ OUTCHAR(decoded);
+ else if (TRYMAP_DEC(jisx0213_1_bmp, decoded, c1, c2))
+ OUTCHAR(decoded);
+ else if (TRYMAP_DEC(jisx0213_1_emp, code, c1, c2))
OUTCHAR(EMPBASE | code);
- }
- else TRYMAP_DEC_CHAR(jisx0213_pair, code, c1, c2) {
+ else if (TRYMAP_DEC(jisx0213_pair, code, c1, c2))
OUTCHAR2(code >> 16, code & 0xffff);
- }
else
return 1;
NEXT_IN(2);
@@ -674,9 +684,9 @@ DECODER(shift_jis_2004)
EMULATE_JISX0213_2000_DECODE_PLANE2(writer,
c1, c2)
- else TRYMAP_DEC(jisx0213_2_bmp, writer,
- c1, c2) {
- } else TRYMAP_DEC_CHAR(jisx0213_2_emp, code, c1, c2) {
+ else if (TRYMAP_DEC(jisx0213_2_bmp, decoded, c1, c2))
+ OUTCHAR(decoded);
+ else if (TRYMAP_DEC(jisx0213_2_emp, code, c1, c2)) {
OUTCHAR(EMPBASE | code);
NEXT_IN(2);
continue;