changeset 23315:86a8b8566369

(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.
author Kenichi Handa <handa@m17n.org>
date Fri, 25 Sep 1998 07:32:05 +0000
parents 87acd2b6ce97
children 308cd9d90647
files src/coding.c
diffstat 1 files changed, 23 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/src/coding.c	Thu Sep 24 02:14:55 1998 +0000
+++ b/src/coding.c	Fri Sep 25 07:32:05 1998 +0000
@@ -2529,18 +2529,20 @@
 	    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 @@
 	    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 @@
              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. */