summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKenichi Handa <handa@m17n.org>1997-07-31 05:55:12 +0000
committerKenichi Handa <handa@m17n.org>1997-07-31 05:55:12 +0000
commitd5e95a4c965e1dc8fc2d519d795cf88019b2d1df (patch)
tree2f155dc7232c4971bef7c3a586866363999c8e3e
parent5796b3b7af226cb59b486dafaaa3fb06dfa8eaaf (diff)
downloademacs-d5e95a4c965e1dc8fc2d519d795cf88019b2d1df.tar.gz
(encode_coding_iso2022): Write out invalid multibyte
forms in a buffer as is. (detect_coding_mask): If ISO_CODE_CSI appears in an invalid sequence, ignore it.
-rw-r--r--src/coding.c52
1 files changed, 46 insertions, 6 deletions
diff --git a/src/coding.c b/src/coding.c
index bd824bceee2..2ebf0a2eade 100644
--- a/src/coding.c
+++ b/src/coding.c
@@ -1495,12 +1495,26 @@ encode_coding_iso2022 (coding, source, destination,
case EMACS_leading_code_2:
ONE_MORE_BYTE (c2);
- ENCODE_ISO_CHARACTER (c1, c2, /* dummy */ c3);
+ if (c2 < 0xA0)
+ {
+ /* invalid sequence */
+ *dst++ = c1;
+ *dst++ = c2;
+ }
+ else
+ ENCODE_ISO_CHARACTER (c1, c2, /* dummy */ c3);
break;
case EMACS_leading_code_3:
TWO_MORE_BYTES (c2, c3);
- if (c1 < LEADING_CODE_PRIVATE_11)
+ if (c2 < 0xA0 || c3 < 0xA0)
+ {
+ /* invalid sequence */
+ *dst++ = c1;
+ *dst++ = c2;
+ *dst++ = c3;
+ }
+ else if (c1 < LEADING_CODE_PRIVATE_11)
ENCODE_ISO_CHARACTER (c1, c2, c3);
else
ENCODE_ISO_CHARACTER (c2, c3, /* dummy */ c4);
@@ -1508,12 +1522,27 @@ encode_coding_iso2022 (coding, source, destination,
case EMACS_leading_code_4:
THREE_MORE_BYTES (c2, c3, c4);
- ENCODE_ISO_CHARACTER (c2, c3, c4);
+ if (c2 < 0xA0 || c3 < 0xA0 || c4 < 0xA0)
+ {
+ /* invalid sequence */
+ *dst++ = c1;
+ *dst++ = c2;
+ *dst++ = c3;
+ *dst++ = c4;
+ }
+ else
+ ENCODE_ISO_CHARACTER (c2, c3, c4);
break;
case EMACS_leading_code_composition:
- ONE_MORE_BYTE (c1);
- if (c1 == 0xFF)
+ ONE_MORE_BYTE (c2);
+ if (c2 < 0xA0)
+ {
+ /* invalid sequence */
+ *dst++ = c1;
+ *dst++ = c2;
+ }
+ else if (c2 == 0xFF)
{
coding->composing = COMPOSING_WITH_RULE_HEAD;
ENCODE_COMPOSITION_WITH_RULE_START;
@@ -2555,7 +2584,7 @@ detect_coding_mask (src, src_bytes)
/* 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)
+ else if (c == ISO_CODE_SS2 || c == ISO_CODE_SS3)
/* C is an ISO2022 specific control code of C1,
or the first byte of SJIS's 2-byte character code,
or a leading code of Emacs. */
@@ -2563,6 +2592,17 @@ detect_coding_mask (src, src_bytes)
| detect_coding_sjis (src, src_end)
| detect_coding_emacs_mule (src, src_end));
+ else if (c == ISO_CODE_CSI
+ && (src < src_end
+ && (*src == ']'
+ || (src + 1 < src_end
+ && src[1] == ']'
+ && (*src == '0' || *src == '1' || *src == '2')))))
+ /* C is an ISO2022's control-sequence-introducer. */
+ mask = (detect_coding_iso2022 (src, src_end)
+ | detect_coding_sjis (src, src_end)
+ | detect_coding_emacs_mule (src, src_end));
+
else if (c < 0xA0)
/* C is the first byte of SJIS character code,
or a leading-code of Emacs. */