summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKenichi Handa <handa@m17n.org>1998-09-25 07:32:05 +0000
committerKenichi Handa <handa@m17n.org>1998-09-25 07:32:05 +0000
commitfdfcf19d011ff49e5191da329e992150c89b05b7 (patch)
tree6408bdd4d60c46bbf93db70a833e28c8190c87bf
parentf695b4b18a5c2c9a55e3a87167278f3e582505ff (diff)
downloademacs-fdfcf19d011ff49e5191da329e992150c89b05b7.tar.gz
(decode_eol): While decoding DOS-like eol, handle a
single CR code correctly. (shrink_decoding_region) <CODING_CATEGORY_IDX_ISO_7 or CODING_CATEGORY_IDX_ISO_7_TIGHT>: Skip also 8-bit codes.
-rw-r--r--src/coding.c30
1 files changed, 23 insertions, 7 deletions
diff --git a/src/coding.c b/src/coding.c
index 47268d340bf..fa2bbc620a0 100644
--- a/src/coding.c
+++ b/src/coding.c
@@ -2529,18 +2529,20 @@ decode_eol (coding, source, destination, src_bytes, dst_bytes)
if (c == '\r')
{
ONE_MORE_BYTE (c);
- if (c != '\n')
+ if (c == '\n')
+ *dst++ = c;
+ else
{
if (coding->mode & CODING_MODE_INHIBIT_INCONSISTENT_EOL)
{
result = CODING_FINISH_INCONSISTENT_EOL;
goto label_end_of_loop_2;
}
+ src--;
*dst++ = '\r';
if (BASE_LEADING_CODE_P (c))
coding->fake_multibyte = 1;
}
- *dst++ = c;
}
else if (c == '\n'
&& (coding->mode & CODING_MODE_INHIBIT_INCONSISTENT_EOL))
@@ -2562,9 +2564,23 @@ decode_eol (coding, source, destination, src_bytes, dst_bytes)
src = src_base;
break;
}
- if (result == CODING_FINISH_NORMAL
- && src < src_end)
- result = CODING_FINISH_INSUFFICIENT_DST;
+ if (src < src_end)
+ {
+ if (result == CODING_FINISH_NORMAL)
+ result = CODING_FINISH_INSUFFICIENT_DST;
+ else if (result != CODING_FINISH_INCONSISTENT_EOL
+ && coding->mode & CODING_MODE_LAST_BLOCK)
+ {
+ /* This is the last block of the text to be decoded.
+ We flush out all remaining codes. */
+ src_bytes = src_end - src;
+ if (dst_bytes && (dst_end - dst < src_bytes))
+ src_bytes = dst_end - dst;
+ bcopy (src, dst, src_bytes);
+ dst += src_bytes;
+ src += src_bytes;
+ }
+ }
}
break;
@@ -3926,11 +3942,11 @@ shrink_decoding_region (beg, end, coding, str)
the following 2-byte at the tail. */
if (eol_conversion)
while (begp < endp
- && (c = endp[-1]) < 0x80 && c != ISO_CODE_ESC && c != '\r')
+ && (c = endp[-1]) != ISO_CODE_ESC && c != '\r')
endp--;
else
while (begp < endp
- && (c = endp[-1]) < 0x80 && c != ISO_CODE_ESC)
+ && (c = endp[-1]) != ISO_CODE_ESC)
endp--;
/* Do not consider LF as ascii if preceded by CR, since that
confuses eol decoding. */