(CCL_WRITE_CHAR): Check if CH is valid or not. If
authorKenichi Handa <handa@m17n.org>
Mon, 5 Feb 2001 01:20:55 +0000 (01:20 +0000)
committerKenichi Handa <handa@m17n.org>
Mon, 5 Feb 2001 01:20:55 +0000 (01:20 +0000)
invalid, execute CCL_INVALID_CMD.
(ccl_driver): If the CCL program is terminated because of
CCL_STAT_INVALID_CMD, copy the remaining source data to the
destination instead of throwing them away.

src/ccl.c

index f5f024b..45cc525 100644 (file)
--- a/src/ccl.c
+++ b/src/ccl.c
@@ -721,8 +721,10 @@ else
                 multibyte form later.  */                              \
              extra_bytes++;                                            \
          }                                                             \
-       else                                                            \
+       else if (CHAR_VALID_P (ch, 0))                                  \
          dst += CHAR_STRING (ch, dst);                                 \
+       else                                                            \
+         CCL_INVALID_CMD;                                              \
       }                                                                        \
     else                                                               \
       CCL_SUSPEND (CCL_STAT_SUSPEND_BY_DST);                           \
@@ -1781,6 +1783,16 @@ ccl_driver (ccl, source, destination, src_bytes, dst_bytes, consumed)
          bcopy (msg, dst, msglen);
          dst += msglen;
        }
+      if (ccl->status == CCL_STAT_INVALID_CMD)
+       {
+         /* Copy the remaining source data.  */
+         int i = src_end - src;
+         if (dst_bytes && (dst_end - dst) < i)
+           i = dst_end - dst;
+         bcopy (src, dst, i);
+         src += i;
+         dst += i;
+       }
     }
 
  ccl_finish: