if ((dc1) == 0xa1 && (dc2) == 0xaa) OUTCHAR(0x2014); \
else if ((dc1) == 0xa8 && (dc2) == 0x44) OUTCHAR(0x2015); \
else if ((dc1) == 0xa1 && (dc2) == 0xa4) OUTCHAR(0x00b7); \
- else TRYMAP_DEC(gb2312, writer, dc1 ^ 0x80, dc2 ^ 0x80); \
- else TRYMAP_DEC(gbkext, writer, dc1, dc2);
+ else if (TRYMAP_DEC(gb2312, decoded, dc1 ^ 0x80, dc2 ^ 0x80)) \
+ OUTCHAR(decoded); \
+ else if (TRYMAP_DEC(gbkext, decoded, dc1, dc2)) \
+ OUTCHAR(decoded);
#define GBK_ENCODE(code, assi) \
if ((code) == 0x2014) (assi) = 0xa1aa; \
{
while (inleft > 0) {
unsigned char c = **inbuf;
+ Py_UCS4 decoded;
if (c < 0x80) {
OUTCHAR(c);
}
REQUIRE_INBUF(2)
- TRYMAP_DEC(gb2312, writer, c ^ 0x80, INBYTE2 ^ 0x80) {
+ if (TRYMAP_DEC(gb2312, decoded, c ^ 0x80, INBYTE2 ^ 0x80)) {
+ OUTCHAR(decoded);
NEXT_IN(2);
}
else return 1;
{
while (inleft > 0) {
unsigned char c = INBYTE1;
+ Py_UCS4 decoded;
if (c < 0x80) {
OUTCHAR(c);
{
while (inleft > 0) {
unsigned char c = INBYTE1, c2;
+ Py_UCS4 decoded;
if (c < 0x80) {
OUTCHAR(c);
}
GBK_DECODE(c, c2, writer)
- else TRYMAP_DEC(gb18030ext, writer, c, c2);
+ else if (TRYMAP_DEC(gb18030ext, decoded, c, c2))
+ OUTCHAR(decoded);
else return 1;
NEXT_IN(2);
{
while (inleft > 0) {
unsigned char c = INBYTE1;
+ Py_UCS4 decoded;
if (c == '~') {
unsigned char c2 = INBYTE2;
}
else { /* GB mode */
REQUIRE_INBUF(2)
- TRYMAP_DEC(gb2312, writer, c, INBYTE2) {
+ if (TRYMAP_DEC(gb2312, decoded, c, INBYTE2)) {
+ OUTCHAR(decoded);
NEXT_IN(2);
}
else
REQUIRE_INBUF(2)
if (0xc6 > c || c > 0xc8 || (c < 0xc7 && INBYTE2 < 0xa1)) {
- TRYMAP_DEC(big5, writer, c, INBYTE2) {
+ if (TRYMAP_DEC(big5, decoded, c, INBYTE2)) {
+ OUTCHAR(decoded);
NEXT_IN(2);
continue;
}
}
- TRYMAP_DEC_CHAR(big5hkscs, decoded, c, INBYTE2)
+ if (TRYMAP_DEC(big5hkscs, decoded, c, INBYTE2))
{
int s = BH2S(c, INBYTE2);
const unsigned char *hintbase;
ksx1001_decoder(const unsigned char *data)
{
Py_UCS4 u;
- TRYMAP_DEC_CHAR(ksx1001, u, data[0], data[1])
+ if (TRYMAP_DEC(ksx1001, u, data[0], data[1]))
return u;
else
return MAP_UNMAPPABLE;
Py_UCS4 u;
if (data[0] == 0x21 && data[1] == 0x40) /* F/W REVERSE SOLIDUS */
return 0xff3c;
- else TRYMAP_DEC_CHAR(jisx0208, u, data[0], data[1])
+ else if (TRYMAP_DEC(jisx0208, u, data[0], data[1]))
return u;
else
return MAP_UNMAPPABLE;
jisx0212_decoder(const unsigned char *data)
{
Py_UCS4 u;
- TRYMAP_DEC_CHAR(jisx0212, u, data[0], data[1])
+ if (TRYMAP_DEC(jisx0212, u, data[0], data[1]))
return u;
else
return MAP_UNMAPPABLE;
EMULATE_JISX0213_2000_DECODE_PLANE1(u, data[0], data[1])
else if (data[0] == 0x21 && data[1] == 0x40) /* F/W REVERSE SOLIDUS */
return 0xff3c;
- else TRYMAP_DEC_CHAR(jisx0208, u, data[0], data[1]);
- else TRYMAP_DEC_CHAR(jisx0213_1_bmp, u, data[0], data[1]);
- else TRYMAP_DEC_CHAR(jisx0213_1_emp, u, data[0], data[1])
+ else if (TRYMAP_DEC(jisx0208, u, data[0], data[1]));
+ else if (TRYMAP_DEC(jisx0213_1_bmp, u, data[0], data[1]));
+ else if (TRYMAP_DEC(jisx0213_1_emp, u, data[0], data[1]))
u |= 0x20000;
- else TRYMAP_DEC_CHAR(jisx0213_pair, u, data[0], data[1]);
+ else if (TRYMAP_DEC(jisx0213_pair, u, data[0], data[1]));
else
return MAP_UNMAPPABLE;
return u;
{
Py_UCS4 u;
EMULATE_JISX0213_2000_DECODE_PLANE2_CHAR(u, data[0], data[1])
- TRYMAP_DEC_CHAR(jisx0213_2_bmp, u, data[0], data[1]);
- else TRYMAP_DEC_CHAR(jisx0213_2_emp, u, data[0], data[1])
+ if (TRYMAP_DEC(jisx0213_2_bmp, u, data[0], data[1]));
+ else if (TRYMAP_DEC(jisx0213_2_emp, u, data[0], data[1]))
u |= 0x20000;
else
return MAP_UNMAPPABLE;
Py_UCS4 u;
if (data[0] == 0x21 && data[1] == 0x40) /* F/W REVERSE SOLIDUS */
return 0xff3c;
- else TRYMAP_DEC_CHAR(jisx0208, u, data[0], data[1]);
- else TRYMAP_DEC_CHAR(jisx0213_1_bmp, u, data[0], data[1]);
- else TRYMAP_DEC_CHAR(jisx0213_1_emp, u, data[0], data[1])
+ else if (TRYMAP_DEC(jisx0208, u, data[0], data[1]));
+ else if (TRYMAP_DEC(jisx0213_1_bmp, u, data[0], data[1]));
+ else if (TRYMAP_DEC(jisx0213_1_emp, u, data[0], data[1]))
u |= 0x20000;
- else TRYMAP_DEC_CHAR(jisx0213_pair, u, data[0], data[1]);
+ else if (TRYMAP_DEC(jisx0213_pair, u, data[0], data[1]));
else
return MAP_UNMAPPABLE;
return u;
jisx0213_2004_2_decoder(const unsigned char *data)
{
Py_UCS4 u;
- TRYMAP_DEC_CHAR(jisx0213_2_bmp, u, data[0], data[1]);
- else TRYMAP_DEC_CHAR(jisx0213_2_emp, u, data[0], data[1])
+ if (TRYMAP_DEC(jisx0213_2_bmp, u, data[0], data[1]));
+ else if (TRYMAP_DEC(jisx0213_2_emp, u, data[0], data[1]))
u |= 0x20000;
else
return MAP_UNMAPPABLE;
gb2312_decoder(const unsigned char *data)
{
Py_UCS4 u;
- TRYMAP_DEC_CHAR(gb2312, u, data[0], data[1])
+ if (TRYMAP_DEC(gb2312, u, data[0], data[1]))
return u;
else
return MAP_UNMAPPABLE;
{
while (inleft > 0) {
unsigned char c = INBYTE1, c2;
+ Py_UCS4 decoded;
if (c <= 0x80) {
OUTCHAR(c);
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;
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) ||
{
while (inleft > 0) {
unsigned char c = INBYTE1;
- Py_UCS4 code;
+ Py_UCS4 code, decoded;
if (c < 0x80) {
OUTCHAR(c);
/* 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);
}
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;
{
while (inleft > 0) {
unsigned char c = INBYTE1;
+ Py_UCS4 decoded;
if (c < 0x80) {
OUTCHAR(c);
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
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);
}
}
{
while (inleft > 0) {
unsigned char c = INBYTE1;
+ Py_UCS4 decoded;
#ifdef STRICT_BUILD
JISX0201_R_DECODE(c, writer)
continue;
}
#endif
- TRYMAP_DEC(jisx0208, writer, c1, c2) {
+ if (TRYMAP_DEC(jisx0208, decoded, c1, c2)) {
+ OUTCHAR(decoded);
NEXT_IN(2);
continue;
}
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;
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);
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;
{
while (inleft > 0) {
unsigned char c = INBYTE1;
+ Py_UCS4 decoded;
if (c < 0x80) {
OUTCHAR(c);
OUTCHAR(0xac00 + cho*588 + jung*28 + jong);
NEXT_IN(8);
}
- else TRYMAP_DEC(ksx1001, writer, c ^ 0x80, INBYTE2 ^ 0x80) {
+ else if (TRYMAP_DEC(ksx1001, decoded, c ^ 0x80, INBYTE2 ^ 0x80)) {
+ OUTCHAR(decoded);
NEXT_IN(2);
}
else
{
while (inleft > 0) {
unsigned char c = INBYTE1;
+ Py_UCS4 decoded;
if (c < 0x80) {
OUTCHAR(c);
}
REQUIRE_INBUF(2)
- TRYMAP_DEC(ksx1001, writer, c ^ 0x80, INBYTE2 ^ 0x80);
- else TRYMAP_DEC(cp949ext, writer, c, INBYTE2);
+ if (TRYMAP_DEC(ksx1001, decoded, c ^ 0x80, INBYTE2 ^ 0x80))
+ OUTCHAR(decoded);
+ else if (TRYMAP_DEC(cp949ext, decoded, c, INBYTE2))
+ OUTCHAR(decoded);
else return 1;
NEXT_IN(2);
DECODER(johab)
{
while (inleft > 0) {
- unsigned char c = INBYTE1, c2;
+ unsigned char c = INBYTE1, c2;
+ Py_UCS4 decoded;
if (c < 0x80) {
OUTCHAR(c);
t1 = t1 + (t2 < 0x5e ? 0 : 1) + 0x21;
t2 = (t2 < 0x5e ? t2 : t2 - 0x5e) + 0x21;
- TRYMAP_DEC(ksx1001, writer, t1, t2);
- else return 1;
- NEXT_IN(2);
+ if (TRYMAP_DEC(ksx1001, decoded, t1, t2)) {
+ OUTCHAR(decoded);
+ NEXT_IN(2);
+ }
+ else {
+ return 1;
+ }
}
}
}
{
while (inleft > 0) {
unsigned char c = INBYTE1;
+ Py_UCS4 decoded;
if (c < 0x80) {
OUTCHAR(c);
}
REQUIRE_INBUF(2)
- TRYMAP_DEC(big5, writer, c, INBYTE2) {
+ if (TRYMAP_DEC(big5, decoded, c, INBYTE2)) {
+ OUTCHAR(decoded);
NEXT_IN(2);
}
else return 1;
{
while (inleft > 0) {
unsigned char c = INBYTE1;
+ Py_UCS4 decoded;
if (c < 0x80) {
OUTCHAR(c);
REQUIRE_INBUF(2)
- TRYMAP_DEC(cp950ext, writer, c, INBYTE2);
- else TRYMAP_DEC(big5, writer, c, INBYTE2);
- else return 1;
+ if (TRYMAP_DEC(cp950ext, decoded, c, INBYTE2))
+ OUTCHAR(decoded);
+ else if (TRYMAP_DEC(big5, decoded, c, INBYTE2))
+ OUTCHAR(decoded);
+ else
+ return 1;
NEXT_IN(2);
}
#define TRYMAP_ENC(charset, assi, uni) \
if TRYMAP_ENC_COND(charset, assi, uni)
-Py_LOCAL_INLINE(int)
-_TRYMAP_DEC_WRITE(_PyUnicodeWriter *writer, Py_UCS4 c)
-{
- if (c == UNIINV || _PyUnicodeWriter_WriteChar(writer, c) < 0)
- return UNIINV;
- else
- return c;
-}
-
-#define _TRYMAP_DEC(m, writer, val) \
- ((m)->map != NULL && \
- (val) >= (m)->bottom && \
- (val)<= (m)->top && \
- _TRYMAP_DEC_WRITE(writer, (m)->map[(val) - (m)->bottom]) != UNIINV)
-#define _TRYMAP_DEC_CHAR(m, assi, val) \
+#define _TRYMAP_DEC(m, assi, val) \
((m)->map != NULL && \
(val) >= (m)->bottom && \
(val)<= (m)->top && \
((assi) = (m)->map[(val) - (m)->bottom]) != UNIINV)
-#define TRYMAP_DEC(charset, writer, c1, c2) \
- if _TRYMAP_DEC(&charset##_decmap[c1], writer, c2)
-#define TRYMAP_DEC_CHAR(charset, assi, c1, c2) \
- if _TRYMAP_DEC_CHAR(&charset##_decmap[c1], assi, c2)
+#define TRYMAP_DEC(charset, assi, c1, c2) \
+ _TRYMAP_DEC(&charset##_decmap[c1], assi, c2)
#define _TRYMAP_ENC_MPLANE(m, assplane, asshi, asslo, val) \
((m)->map != NULL && (val) >= (m)->bottom && \
#define TRYMAP_ENC_MPLANE(charset, assplane, asshi, asslo, uni) \
if _TRYMAP_ENC_MPLANE(&charset##_encmap[(uni) >> 8], \
assplane, asshi, asslo, (uni) & 0xff)
-#define TRYMAP_DEC_MPLANE(charset, writer, plane, c1, c2) \
- if _TRYMAP_DEC(&charset##_decmap[plane][c1], writer, c2)
#define BEGIN_MAPPINGS_LIST static const struct dbcs_map _mapping_list[] = {
#define MAPPING_ENCONLY(enc) {#enc, (void*)enc##_encmap, NULL},