changeset 34890:f203e7623af7

(CCL_WRITE_CHAR): Check variable `extra_bytes'. (ccl_driver): New local variable `extra_bytes'.
author Kenichi Handa <handa@m17n.org>
date Thu, 28 Dec 2000 07:03:05 +0000
parents 883267e75fbb
children b9b14e62fe38
files src/ccl.c
diffstat 1 files changed, 25 insertions(+), 20 deletions(-) [+]
line wrap: on
line diff
--- a/src/ccl.c	Thu Dec 28 07:02:51 2000 +0000
+++ b/src/ccl.c	Thu Dec 28 07:03:05 2000 +0000
@@ -698,26 +698,26 @@
 
 /* Encode one character CH to multibyte form and write to the current
    output buffer.  If CH is less than 256, CH is written as is.  */
-#define CCL_WRITE_CHAR(ch)					\
-  do {								\
-    int bytes = SINGLE_BYTE_CHAR_P (ch) ? 1: CHAR_BYTES (ch);	\
-    if (!dst)							\
-      CCL_INVALID_CMD;						\
-    else if (dst + bytes <= (dst_bytes ? dst_end : src))	\
-      {								\
-	if (bytes == 1)						\
-	  {							\
-	    *dst++ = (ch);					\
-	    if ((ch) >= 0x80 && (ch) < 0xA0)			\
-	      /* We may have to convert this eight-bit char to	\
-		 multibyte form later.  */			\
-	      dst_end--;					\
-	  }							\
-	else							\
-	  dst += CHAR_STRING (ch, dst);				\
-      }								\
-    else							\
-      CCL_SUSPEND (CCL_STAT_SUSPEND_BY_DST);			\
+#define CCL_WRITE_CHAR(ch)						\
+  do {									\
+    int bytes = SINGLE_BYTE_CHAR_P (ch) ? 1: CHAR_BYTES (ch);		\
+    if (!dst)								\
+      CCL_INVALID_CMD;							\
+    else if (dst + bytes + extra_bytes < (dst_bytes ? dst_end : src))	\
+      {									\
+	if (bytes == 1)							\
+	  {								\
+	    *dst++ = (ch);						\
+	    if ((ch) >= 0x80 && (ch) < 0xA0)				\
+	      /* We may have to convert this eight-bit char to		\
+		 multibyte form later.  */				\
+	      extra_bytes++;						\
+	  }								\
+	else								\
+	  dst += CHAR_STRING (ch, dst);					\
+      }									\
+    else								\
+      CCL_SUSPEND (CCL_STAT_SUSPEND_BY_DST);				\
   } while (0)
 
 /* Write a string at ccl_prog[IC] of length LEN to the current output
@@ -840,6 +840,11 @@
   int stack_idx = ccl->stack_idx;
   /* Instruction counter of the current CCL code. */
   int this_ic;
+  /* CCL_WRITE_CHAR will produce 8-bit code of range 0x80..0x9F.  But,
+     each of them will be converted to multibyte form of 2-byte
+     sequence.  For that conversion, we remember how many more bytes
+     we must keep in DESTINATION in this variable.  */
+  int extra_bytes = 0;
 
   if (ic >= ccl->eof_ic)
     ic = CCL_HEADER_MAIN;