(setup_raw_text_coding_system): New function.

(decode_coding_sjis_big5): Bug for handling invalid code fixed.
This commit is contained in:
Kenichi Handa 1998-06-26 03:29:15 +00:00
parent e5ff4bc29e
commit 54f7817141

View file

@ -1990,7 +1990,7 @@ encode_coding_iso2022 (coding, source, destination, src_bytes, dst_bytes)
(character set) (range)
ASCII 0x00 .. 0x7F
KATAKANA-JISX0201 0xA0 .. 0xDF
JISX0208 (1st byte) 0x80 .. 0x9F and 0xE0 .. 0xFF
JISX0208 (1st byte) 0x80 .. 0x9F and 0xE0 .. 0xEF
(2nd byte) 0x40 .. 0xFF
-------------------------------
@ -2236,69 +2236,47 @@ decode_coding_sjis_big5 (coding, source, destination,
}
else if (c1 < 0x80)
DECODE_SJIS_BIG5_CHARACTER (charset_ascii, c1, /* dummy */ c2);
else if (c1 < 0xA0)
else
{
/* SJIS -> JISX0208 */
if (sjis_p)
{
ONE_MORE_BYTE (c2);
if (c2 >= 0x40)
if (c1 < 0xA0 || (c1 >= 0xE0 && c1 < 0xF0))
{
DECODE_SJIS (c1, c2, c3, c4);
DECODE_SJIS_BIG5_CHARACTER (charset_jisx0208, c3, c4);
/* SJIS -> JISX0208 */
ONE_MORE_BYTE (c2);
if (c2 >= 0x40)
{
DECODE_SJIS (c1, c2, c3, c4);
DECODE_SJIS_BIG5_CHARACTER (charset_jisx0208, c3, c4);
}
else
goto label_invalid_code_2;
}
else if (c1 < 0xE0)
/* SJIS -> JISX0201-Kana */
DECODE_SJIS_BIG5_CHARACTER (charset_katakana_jisx0201, c1,
/* dummy */ c2);
else
goto label_invalid_code_2;
goto label_invalid_code_1;
}
else
goto label_invalid_code_1;
}
else if (c1 < 0xE0)
{
/* SJIS -> JISX0201-Kana, BIG5 -> Big5 */
if (sjis_p)
DECODE_SJIS_BIG5_CHARACTER (charset_katakana_jisx0201, c1,
/* dummy */ c2);
else
{
int charset;
/* BIG5 -> Big5 */
if (c1 >= 0xA1 && c1 <= 0xFE)
{
ONE_MORE_BYTE (c2);
if ((c2 >= 0x40 && c2 <= 0x7E) || (c2 >= 0xA1 && c2 <= 0xFE))
{
int charset;
ONE_MORE_BYTE (c2);
if ((c2 >= 0x40 && c2 <= 0x7E) || (c2 >= 0xA1 && c2 <= 0xFE))
{
DECODE_BIG5 (c1, c2, charset, c3, c4);
DECODE_SJIS_BIG5_CHARACTER (charset, c3, c4);
DECODE_BIG5 (c1, c2, charset, c3, c4);
DECODE_SJIS_BIG5_CHARACTER (charset, c3, c4);
}
else
goto label_invalid_code_2;
}
else
goto label_invalid_code_2;
}
}
else /* C1 >= 0xE0 */
{
/* SJIS -> JISX0208, BIG5 -> Big5 */
if (sjis_p)
{
ONE_MORE_BYTE (c2);
if (c2 >= 0x40)
{
DECODE_SJIS (c1, c2, c3, c4);
DECODE_SJIS_BIG5_CHARACTER (charset_jisx0208, c3, c4);
}
else
goto label_invalid_code_2;
}
else
{
int charset;
ONE_MORE_BYTE (c2);
if ((c2 >= 0x40 && c2 <= 0x7E) || (c2 >= 0xA1 && c2 <= 0xFE))
{
DECODE_BIG5 (c1, c2, charset, c3, c4);
DECODE_SJIS_BIG5_CHARACTER (charset, c3, c4);
}
else
goto label_invalid_code_2;
goto label_invalid_code_1;
}
}
continue;
@ -3087,6 +3065,32 @@ setup_coding_system (coding_system, coding)
return -1;
}
/* Setup raw-text or one of its subsidiaries in the structure
coding_system CODING according to the already setup value eol_type
in CODING. CODING should be setup for some coding system in
advance. */
void
setup_raw_text_coding_system (coding)
struct coding_system *coding;
{
if (coding->type != coding_type_raw_text)
{
coding->symbol = Qraw_text;
coding->type = coding_type_raw_text;
if (coding->eol_type != CODING_EOL_UNDECIDED)
{
Lisp_Object subsidiaries = Fget (Qraw_text, Qeol_type);
if (VECTORP (subsidiaries)
&& XVECTOR (subsidiaries)->size == 3)
coding->symbol
= XVECTOR (subsidiaries)->contents[coding->eol_type];
}
}
return;
}
/* Emacs has a mechanism to automatically detect a coding system if it
is one of Emacs' internal format, ISO2022, SJIS, and BIG5. But,
it's impossible to distinguish some coding systems accurately