2 * _iso2022_jp_ext.c: the ISO-2022-JP-EXT codec (RFC2237 + alpha)
4 * Written by Hye-Shik Chang <perky@FreeBSD.org>
5 * $CJKCodecs: _iso2022_jp_ext.c,v 1.3 2003/12/31 05:46:55 perky Exp $
8 #define ISO2022_DESIGNATIONS \
9 CHARSET_ASCII, CHARSET_JISX0201_R, CHARSET_JISX0201_K, \
10 CHARSET_JISX0208, CHARSET_JISX0208_O, CHARSET_JISX0212
11 #define ISO2022_NO_SHIFT
12 #define ISO2022_USE_JISX0208EXT
14 #include "codeccommon.h"
15 #include "iso2022common.h"
16 #include "alg_jisx0201.h"
22 #define HAVE_ENCODER_INIT
23 ENCODER_INIT(iso2022_jp_ext
)
25 STATE_CLEARFLAGS(state
)
26 STATE_SETG0(state
, CHARSET_ASCII
)
27 STATE_SETG1(state
, CHARSET_ASCII
)
31 #define HAVE_ENCODER_RESET
32 ENCODER_RESET(iso2022_jp_ext
)
34 if (STATE_GETG0(state
) != CHARSET_ASCII
) {
37 STATE_SETG0(state
, CHARSET_ASCII
)
43 ENCODER(iso2022_jp_ext
)
46 Py_UNICODE c
= **inbuf
;
50 switch (STATE_GETG0(state
)) {
52 WRITE1((unsigned char)c
)
55 case CHARSET_JISX0201_R
:
56 JISX0201_R_ENCODE(c
, code
)
57 else { /* FALLTHROUGH (yay!) */
61 STATE_SETG0(state
, CHARSET_ASCII
)
64 WRITE1((unsigned char)code
)
69 STATE_CLEARFLAG(state
, F_SHIFTED
)
73 unsigned char charset
;
75 charset
= STATE_GETG0(state
);
76 if (charset
== CHARSET_JISX0201_R
) {
78 JISX0201_R_ENCODE(c
, code
)
80 WRITE1((unsigned char)code
)
86 TRYMAP_ENC(jisxcommon
, code
, c
) {
87 if (code
& 0x8000) { /* MSB set: JIS X 0212 */
88 if (charset
!= CHARSET_JISX0212
) {
89 WRITE4(ESC
, '$', '(', 'D')
90 STATE_SETG0(state
, CHARSET_JISX0212
)
93 WRITE2((code
>> 8) & 0x7f, code
& 0x7f)
94 } else { /* MSB unset: JIS X 0208 */
95 jisx0208encode
: if (charset
!= CHARSET_JISX0208
) {
97 STATE_SETG0(state
, CHARSET_JISX0208
)
100 WRITE2(code
>> 8, code
& 0xff)
103 } else if (c
== 0xff3c) { /* FULL-WIDTH REVERSE SOLIDUS */
107 JISX0201_ENCODE(c
, code
)
111 if (code
< 0x80) { /* JIS X 0201 Roman */
112 /* if (charset == CHARSET_JISX0201_R) : already checked */
113 WRITE4(ESC
, '(', 'J', (unsigned char)code
)
114 STATE_SETG0(state
, CHARSET_JISX0201_R
)
116 } else { /* JIS X 0201 Katakana */
117 if (charset
!= CHARSET_JISX0201_K
) {
118 WRITE3(ESC
, '(', 'I')
119 STATE_SETG0(state
, CHARSET_JISX0201_K
)
132 #define HAVE_DECODER_INIT
133 DECODER_INIT(iso2022_jp_ext
)
135 STATE_CLEARFLAGS(state
)
136 STATE_SETG0(state
, CHARSET_ASCII
)
137 STATE_SETG1(state
, CHARSET_ASCII
)
141 #define HAVE_DECODER_RESET
142 DECODER_RESET(iso2022_jp_ext
)
144 STATE_CLEARFLAG(state
, F_SHIFTED
)
148 DECODER(iso2022_jp_ext
)
151 unsigned char charset
, c2
;
153 ISO2022_GETCHARSET(charset
, c
)
155 if (charset
& CHARSET_DOUBLEBYTE
) {
159 if (charset
== CHARSET_JISX0208
|| charset
== CHARSET_JISX0208_O
) {
160 if (c
== 0x21 && c2
== 0x40) /* FULL-WIDTH REVERSE SOLIDUS */
162 else TRYMAP_DEC(jisx0208
, **outbuf
, c
, c2
);
164 } else if (charset
== CHARSET_JISX0212
) {
165 TRYMAP_DEC(jisx0212
, **outbuf
, c
, c2
);
168 return MBERR_INTERNAL
;
170 } else if (charset
== CHARSET_ASCII
) {
174 } else if (charset
== CHARSET_JISX0201_R
) {
176 JISX0201_R_DECODE(c
, **outbuf
)
180 } else if (charset
== CHARSET_JISX0201_K
) {
182 JISX0201_K_DECODE(c
^ 0x80, **outbuf
)
187 return MBERR_INTERNAL
;
193 #include "codecentry.h"
194 BEGIN_CODEC_REGISTRY(iso2022_jp_ext
)
196 IMPORTMAP_DEC(jisx0208
)
197 IMPORTMAP_DEC(jisx0212
)
198 IMPORTMAP_ENC(jisxcommon
)
200 END_CODEC_REGISTRY(iso2022_jp_ext
)