diff src/ccl.c @ 56041:bcdeaf1d58fc

(CCL_CALL_FOR_MAP_INSTRUCTION): Save eof_ic in ccl_prog_stack_struct and update it. (CCL_INVALID_CMD): If CCL_DEBUG is defined, call ccl_debug_hook. (CCL_READ_CHAR): Get instruction counter from eof_ic, not from ccl->eof_ic on EOF. (ccl_debug_hook): New function. (struct ccl_prog_stack): New member eof_ic. (ccl_driver): Handle EOF in subrountine call correctly.
author Kenichi Handa <handa@m17n.org>
date Sat, 12 Jun 2004 02:33:39 +0000
parents 9ef8d3f3973e
children 960da0ce1319
line wrap: on
line diff
--- a/src/ccl.c	Sat Jun 12 02:21:21 2004 +0000
+++ b/src/ccl.c	Sat Jun 12 02:33:39 2004 +0000
@@ -626,14 +626,17 @@
 	  {							\
 	    ccl_prog = ccl_prog_stack_struct[0].ccl_prog;	\
 	    ic = ccl_prog_stack_struct[0].ic;			\
+	    eof_ic = ccl_prog_stack_struct[0].eof_ic;		\
 	  }							\
 	CCL_INVALID_CMD;					\
       }								\
     ccl_prog_stack_struct[stack_idx].ccl_prog = ccl_prog;	\
     ccl_prog_stack_struct[stack_idx].ic = (ret_ic);		\
+    ccl_prog_stack_struct[stack_idx].eof_ic = eof_ic;		\
     stack_idx++;						\
     ccl_prog = called_ccl.prog;					\
     ic = CCL_HEADER_MAIN;					\
+    eof_ic = XFASTINT (ccl_prog[CCL_HEADER_EOF]);		\
     goto ccl_repeat;						\
   }								\
 while (0)
@@ -710,6 +713,8 @@
 
 /* Terminate CCL program because of invalid command.  Should not occur
    in the normal case.  */
+#ifndef CCL_DEBUG
+
 #define CCL_INVALID_CMD		     	\
 do					\
   {				     	\
@@ -718,6 +723,19 @@
   }					\
 while(0)
 
+#else
+
+#define CCL_INVALID_CMD		     	\
+do					\
+  {				     	\
+    ccl_debug_hook (this_ic);		\
+    ccl->status = CCL_STAT_INVALID_CMD;	\
+    goto ccl_error_handler;	     	\
+  }					\
+while(0)
+
+#endif
+
 /* 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)						\
@@ -809,7 +827,7 @@
       }							\
     else if (ccl->last_block)				\
       {							\
-        ic = ccl->eof_ic;				\
+        ic = eof_ic;					\
         goto ccl_repeat;				\
       }							\
     else						\
@@ -854,12 +872,20 @@
 #define CCL_DEBUG_BACKTRACE_LEN 256
 int ccl_backtrace_table[CCL_DEBUG_BACKTRACE_LEN];
 int ccl_backtrace_idx;
+
+int
+ccl_debug_hook (int ic)
+{
+  return ic;
+}
+
 #endif
 
 struct ccl_prog_stack
   {
     Lisp_Object *ccl_prog;	/* Pointer to an array of CCL code.  */
     int ic;			/* Instruction Counter.  */
+    int eof_ic;			/* Instruction Counter to jump on EOF.  */
   };
 
 /* For the moment, we only support depth 256 of stack.  */
@@ -888,8 +914,10 @@
      sequence.  For that conversion, we remember how many more bytes
      we must keep in DESTINATION in this variable.  */
   int extra_bytes = ccl->eight_bit_control;
+  int eof_ic = ccl->eof_ic;
+  int eof_hit = 0;
 
-  if (ic >= ccl->eof_ic)
+  if (ic >= eof_ic)
     ic = CCL_HEADER_MAIN;
 
   if (ccl->buf_magnification == 0) /* We can't produce any bytes.  */
@@ -1093,15 +1121,18 @@
 		  {
 		    ccl_prog = ccl_prog_stack_struct[0].ccl_prog;
 		    ic = ccl_prog_stack_struct[0].ic;
+		    eof_ic = ccl_prog_stack_struct[0].eof_ic;
 		  }
 		CCL_INVALID_CMD;
 	      }
 
 	    ccl_prog_stack_struct[stack_idx].ccl_prog = ccl_prog;
 	    ccl_prog_stack_struct[stack_idx].ic = ic;
+	    ccl_prog_stack_struct[stack_idx].eof_ic = eof_ic;
 	    stack_idx++;
 	    ccl_prog = XVECTOR (AREF (slot, 1))->contents;
 	    ic = CCL_HEADER_MAIN;
+	    eof_ic = XFASTINT (ccl_prog[CCL_HEADER_EOF]);
 	  }
 	  break;
 
@@ -1131,6 +1162,9 @@
 	      stack_idx--;
 	      ccl_prog = ccl_prog_stack_struct[stack_idx].ccl_prog;
 	      ic = ccl_prog_stack_struct[stack_idx].ic;
+	      eof_ic = ccl_prog_stack_struct[stack_idx].eof_ic;
+	      if (eof_hit)
+		ic = eof_ic;
 	      break;
 	    }
 	  if (src)
@@ -1367,7 +1401,8 @@
 	      src--;
 	      if (ccl->last_block)
 		{
-		  ic = ccl->eof_ic;
+		  ic = eof_ic;
+		  eof_hit = 1;
 		  goto ccl_repeat;
 		}
 	      else