Mercurial > emacs
changeset 17320:9d15bec5f47e
(detect_coding_iso2022, detect_coding_mask): Ignore
invalid ESC sequence for ISO 2022.
(Fencode_sjis_char, Fencode_big5_char): Adjusted for the change of
SPLIT_CHAR.
author | Kenichi Handa <handa@m17n.org> |
---|---|
date | Mon, 07 Apr 1997 07:12:13 +0000 |
parents | a58d6ceeb370 |
children | 9f837bea89e3 |
files | src/coding.c |
diffstat | 1 files changed, 26 insertions(+), 19 deletions(-) [+] |
line wrap: on
line diff
--- a/src/coding.c Mon Apr 07 07:12:13 1997 +0000 +++ b/src/coding.c Mon Apr 07 07:12:13 1997 +0000 @@ -581,13 +581,9 @@ detect_coding_iso2022 (src, src_end) unsigned char *src, *src_end; { - unsigned char c, g1 = 0; - int mask = (CODING_CATEGORY_MASK_ISO_7 - | CODING_CATEGORY_MASK_ISO_8_1 - | CODING_CATEGORY_MASK_ISO_8_2); - /* We may look ahead at most 4 bytes. */ - unsigned char *adjusted_src_end = src_end - 4; - int i; + int mask = CODING_CATEGORY_MASK_ANY; + int g1 = 0; /* 1 iff designating to G1. */ + int c, i; while (src < src_end) { @@ -598,14 +594,21 @@ if (src >= src_end) break; c = *src++; - if (src + 2 >= src_end + if (src < src_end && ((c >= '(' && c <= '/') || c == '$' && ((*src >= '(' && *src <= '/') || (*src >= '@' && *src <= 'B')))) { /* Valid designation sequence. */ + mask &= (CODING_CATEGORY_MASK_ISO_7 + | CODING_CATEGORY_MASK_ISO_8_1 + | CODING_CATEGORY_MASK_ISO_8_2 + | CODING_CATEGORY_MASK_ISO_ELSE); if (c == ')' || (c == '$' && *src == ')')) - g1 = 1; + { + g1 = 1; + mask &= ~CODING_CATEGORY_MASK_ISO_7; + } src++; break; } @@ -2362,6 +2365,7 @@ /* At first, skip all ASCII characters and control characters except for three ISO2022 specific control characters. */ + label_loop_detect_coding: while (src < src_end) { c = *src; @@ -2378,10 +2382,15 @@ /* The text seems to be encoded in some multilingual coding system. Now, try to find in which coding system the text is encoded. */ if (c < 0x80) - /* i.e. (c == ISO_CODE_ESC || c == ISO_CODE_SI || c == ISO_CODE_SO) */ - /* C is an ISO2022 specific control code of C0. */ - mask = detect_coding_iso2022 (src, src_end); - + { + /* i.e. (c == ISO_CODE_ESC || c == ISO_CODE_SI || c == ISO_CODE_SO) */ + /* C is an ISO2022 specific control code of C0. */ + mask = detect_coding_iso2022 (src, src_end); + src++; + if (mask == CODING_CATEGORY_MASK_ANY) + /* No valid ISO2022 code follows C. Try again. */ + goto label_loop_detect_coding; + } else if (c == ISO_CODE_SS2 || c == ISO_CODE_SS3 || c == ISO_CODE_CSI) /* C is an ISO2022 specific control code of C1, or the first byte of SJIS's 2-byte character code, @@ -3225,8 +3234,7 @@ (ch) Lisp_Object ch; { - int charset; - unsigned char c1, c2, s1, s2; + int charset, c1, c2, s1, s2; Lisp_Object val; CHECK_NUMBER (ch, 0); @@ -3234,7 +3242,7 @@ if (charset == charset_jisx0208) { ENCODE_SJIS (c1, c2, s1, s2); - XSETFASTINT (val, ((int)s1 << 8) | s2); + XSETFASTINT (val, (s1 << 8) | s2); } else XSETFASTINT (val, 0); @@ -3265,8 +3273,7 @@ (ch) Lisp_Object ch; { - int charset; - unsigned char c1, c2, b1, b2; + int charset, c1, c2, b1, b2; Lisp_Object val; CHECK_NUMBER (ch, 0); @@ -3274,7 +3281,7 @@ if (charset == charset_big5_1 || charset == charset_big5_2) { ENCODE_BIG5 (charset, c1, c2, b1, b2); - XSETFASTINT (val, ((int)b1 << 8) | b2); + XSETFASTINT (val, (b1 << 8) | b2); } else XSETFASTINT (val, 0);