changeset 23881:20d595402dea

(DECODE_DESIGNATION): Jump to label_invalid_code if final_char is invalid. (decode_coding): If coding->type is coding_type_ccl, call ccl_coding_driver even if SRC_BYTES is zero. (code_convert_region): Update `inserted' correctly after calling coding->post_read_conversion. Even after the code converter consumed all source text, call it once more if it is coding_type_ccl to flush out data.
author Kenichi Handa <handa@m17n.org>
date Tue, 15 Dec 1998 04:35:38 +0000
parents 522ac99a666d
children 16d0232006fb
files src/coding.c
diffstat 1 files changed, 17 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/src/coding.c	Tue Dec 15 04:35:38 1998 +0000
+++ b/src/coding.c	Tue Dec 15 04:35:38 1998 +0000
@@ -937,9 +937,13 @@
 /* Set designation state into CODING.  */
 #define DECODE_DESIGNATION(reg, dimension, chars, final_char)		   \
   do {									   \
-    int charset = ISO_CHARSET_TABLE (make_number (dimension),		   \
-				     make_number (chars),		   \
-				     make_number (final_char));		   \
+    int charset;							   \
+    									   \
+    if (final_char < '0' || final_char >= 128)				   \
+      goto label_invalid_code;						   \
+    charset = ISO_CHARSET_TABLE (make_number (dimension),		   \
+				 make_number (chars),			   \
+				 make_number (final_char));		   \
     if (charset >= 0							   \
 	&& (CODING_SPEC_ISO_REQUESTED_DESIGNATION (coding, charset) == reg \
 	    || coding->safe_charsets[charset]))				   \
@@ -3694,6 +3698,7 @@
   int result;
 
   if (src_bytes <= 0
+      && coding->type != coding_type_ccl
       && ! (coding->mode & CODING_MODE_LAST_BLOCK
 	    && CODING_REQUIRE_FLUSHING (coding)))
     {
@@ -4310,6 +4315,7 @@
       move_gap_both (from, from_byte);
     SHRINK_CONVERSION_REGION (&from_byte, &to_byte, coding, NULL, encodep);
     if (from_byte == to_byte
+	&& coding->type != coding_type_ccl
 	&& ! (coding->mode & CODING_MODE_LAST_BLOCK
 	      && CODING_REQUIRE_FLUSHING (coding)))
       {
@@ -4452,7 +4458,13 @@
 	  continue;
 	}
       if (len_byte <= 0)
-	break;
+	{
+	  if (coding->type != coding_type_ccl
+	      || coding->mode & CODING_MODE_LAST_BLOCK)
+	    break;
+	  coding->mode |= CODING_MODE_LAST_BLOCK;
+	  continue;
+	}
       if (result == CODING_FINISH_INSUFFICIENT_SRC)
 	{
 	  /* The source text ends in invalid codes.  Let's just
@@ -4547,7 +4559,7 @@
       prev_Z = Z;
       val = call1 (coding->post_read_conversion, make_number (inserted));
       CHECK_NUMBER (val, 0);
-      inserted = Z - prev_Z;
+      inserted += Z - prev_Z;
     }
 
   if (orig_point >= from)