aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/coding.c68
1 files changed, 46 insertions, 22 deletions
diff --git a/src/coding.c b/src/coding.c
index 4fcc48e3533..06e5f83742e 100644
--- a/src/coding.c
+++ b/src/coding.c
@@ -3998,6 +3998,7 @@ decode_coding_sjis (coding)
3998 int consumed_chars = 0, consumed_chars_base; 3998 int consumed_chars = 0, consumed_chars_base;
3999 int multibytep = coding->src_multibyte; 3999 int multibytep = coding->src_multibyte;
4000 struct charset *charset_roman, *charset_kanji, *charset_kana; 4000 struct charset *charset_roman, *charset_kanji, *charset_kana;
4001 struct charset *charset_kanji2;
4001 Lisp_Object attrs, charset_list, val; 4002 Lisp_Object attrs, charset_list, val;
4002 int char_offset = coding->produced_char; 4003 int char_offset = coding->produced_char;
4003 int last_offset = char_offset; 4004 int last_offset = char_offset;
@@ -4008,7 +4009,8 @@ decode_coding_sjis (coding)
4008 val = charset_list; 4009 val = charset_list;
4009 charset_roman = CHARSET_FROM_ID (XINT (XCAR (val))), val = XCDR (val); 4010 charset_roman = CHARSET_FROM_ID (XINT (XCAR (val))), val = XCDR (val);
4010 charset_kana = CHARSET_FROM_ID (XINT (XCAR (val))), val = XCDR (val); 4011 charset_kana = CHARSET_FROM_ID (XINT (XCAR (val))), val = XCDR (val);
4011 charset_kanji = CHARSET_FROM_ID (XINT (XCAR (val))); 4012 charset_kanji = CHARSET_FROM_ID (XINT (XCAR (val))), val = XCDR (val);
4013 charset_kanji2 = NILP (val) ? NULL : CHARSET_FROM_ID (XINT (XCAR (val)));
4012 4014
4013 while (1) 4015 while (1)
4014 { 4016 {
@@ -4026,31 +4028,36 @@ decode_coding_sjis (coding)
4026 goto invalid_code; 4028 goto invalid_code;
4027 if (c < 0x80) 4029 if (c < 0x80)
4028 charset = charset_roman; 4030 charset = charset_roman;
4029 else if (c == 0x80) 4031 else if (c == 0x80 || c == 0xA0)
4030 goto invalid_code; 4032 goto invalid_code;
4031 else 4033 else if (c >= 0xA1 && c <= 0xDF)
4032 { 4034 {
4033 if (c >= 0xF0) 4035 /* SJIS -> JISX0201-Kana */
4036 c &= 0x7F;
4037 charset = charset_kana;
4038 }
4039 else if (c <= 0xEF)
4040 {
4041 /* SJIS -> JISX0208 */
4042 ONE_MORE_BYTE (c1);
4043 if (c1 < 0x40 || c1 == 0x7F || c1 > 0xFC)
4034 goto invalid_code; 4044 goto invalid_code;
4035 if (c < 0xA0 || c >= 0xE0) 4045 c = (c << 8) | c1;
4036 { 4046 SJIS_TO_JIS (c);
4037 /* SJIS -> JISX0208 */ 4047 charset = charset_kanji;
4038 ONE_MORE_BYTE (c1); 4048 }
4039 if (c1 < 0x40 || c1 == 0x7F || c1 > 0xFC) 4049 else if (c <= 0xFC && charset_kanji2)
4040 goto invalid_code; 4050 {
4041 c = (c << 8) | c1; 4051 /* SJIS -> JISX0212 */
4042 SJIS_TO_JIS (c); 4052 ONE_MORE_BYTE (c1);
4043 charset = charset_kanji; 4053 if (c1 < 0x40 || c1 == 0x7F || c1 > 0xFC)
4044 }
4045 else if (c > 0xA0)
4046 {
4047 /* SJIS -> JISX0201-Kana */
4048 c &= 0x7F;
4049 charset = charset_kana;
4050 }
4051 else
4052 goto invalid_code; 4054 goto invalid_code;
4055 c = (c << 8) | c1;
4056 SJIS_TO_JIS2 (c);
4057 charset = charset_kanji2;
4053 } 4058 }
4059 else
4060 goto invalid_code;
4054 if (charset->id != charset_ascii 4061 if (charset->id != charset_ascii
4055 && last_id != charset->id) 4062 && last_id != charset->id)
4056 { 4063 {
@@ -4183,13 +4190,15 @@ encode_coding_sjis (coding)
4183 Lisp_Object attrs, charset_list, val; 4190 Lisp_Object attrs, charset_list, val;
4184 int ascii_compatible; 4191 int ascii_compatible;
4185 struct charset *charset_roman, *charset_kanji, *charset_kana; 4192 struct charset *charset_roman, *charset_kanji, *charset_kana;
4193 struct charset *charset_kanji2;
4186 int c; 4194 int c;
4187 4195
4188 CODING_GET_INFO (coding, attrs, charset_list); 4196 CODING_GET_INFO (coding, attrs, charset_list);
4189 val = charset_list; 4197 val = charset_list;
4190 charset_roman = CHARSET_FROM_ID (XINT (XCAR (val))), val = XCDR (val); 4198 charset_roman = CHARSET_FROM_ID (XINT (XCAR (val))), val = XCDR (val);
4191 charset_kana = CHARSET_FROM_ID (XINT (XCAR (val))), val = XCDR (val); 4199 charset_kana = CHARSET_FROM_ID (XINT (XCAR (val))), val = XCDR (val);
4192 charset_kanji = CHARSET_FROM_ID (XINT (XCAR (val))); 4200 charset_kanji = CHARSET_FROM_ID (XINT (XCAR (val))), val = XCDR (val);
4201 charset_kanji2 = NILP (val) ? NULL : CHARSET_FROM_ID (XINT (XCAR (val)));
4193 4202
4194 ascii_compatible = ! NILP (CODING_ATTR_ASCII_COMPAT (attrs)); 4203 ascii_compatible = ! NILP (CODING_ATTR_ASCII_COMPAT (attrs));
4195 4204
@@ -4234,6 +4243,21 @@ encode_coding_sjis (coding)
4234 } 4243 }
4235 else if (charset == charset_kana) 4244 else if (charset == charset_kana)
4236 EMIT_ONE_BYTE (code | 0x80); 4245 EMIT_ONE_BYTE (code | 0x80);
4246 else if (charset_kanji2 && charset == charset_kanji2)
4247 {
4248 int c1, c2;
4249
4250 c1 = code >> 8;
4251 if (c1 == 0x21 || (c1 >= 0x23 && c1 < 0x25)
4252 || (c1 >= 0x2C && c1 <= 0x2F) || c1 >= 0x6E)
4253 {
4254 JIS_TO_SJIS2 (code);
4255 c1 = code >> 8, c2 = code & 0xFF;
4256 EMIT_TWO_BYTES (c1, c2);
4257 }
4258 else
4259 EMIT_ONE_ASCII_BYTE (code & 0x7F);
4260 }
4237 else 4261 else
4238 EMIT_ONE_ASCII_BYTE (code & 0x7F); 4262 EMIT_ONE_ASCII_BYTE (code & 0x7F);
4239 } 4263 }