summaryrefslogtreecommitdiff
path: root/src/ccl.c
diff options
context:
space:
mode:
authorKenichi Handa <handa@m17n.org>2004-06-12 02:33:39 +0000
committerKenichi Handa <handa@m17n.org>2004-06-12 02:33:39 +0000
commit9eaa8e651174852fae9da81b9ce5f9d1c9c89238 (patch)
treef61e2e719796cb35d9ae0ed3671296bbabb5ab5a /src/ccl.c
parent60d334c36712e5a0fe5e12ef96b8bfc243b36ff0 (diff)
downloademacs-9eaa8e651174852fae9da81b9ce5f9d1c9c89238.tar.gz
(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.
Diffstat (limited to 'src/ccl.c')
-rw-r--r--src/ccl.c41
1 files changed, 38 insertions, 3 deletions
diff --git a/src/ccl.c b/src/ccl.c
index 4c3528075b4..69beb2141e5 100644
--- a/src/ccl.c
+++ b/src/ccl.c
@@ -626,14 +626,17 @@ do \
{ \
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,14 +713,29 @@ while (0)
/* Terminate CCL program because of invalid command. Should not occur
in the normal case. */
+#ifndef CCL_DEBUG
+
+#define CCL_INVALID_CMD \
+do \
+ { \
+ ccl->status = CCL_STAT_INVALID_CMD; \
+ goto ccl_error_handler; \
+ } \
+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 @@ while(0)
} \
else if (ccl->last_block) \
{ \
- ic = ccl->eof_ic; \
+ ic = eof_ic; \
goto ccl_repeat; \
} \
else \
@@ -854,12 +872,20 @@ while(0)
#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 @@ ccl_driver (ccl, source, destination, src_bytes, dst_bytes, consumed)
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_driver (ccl, source, destination, src_bytes, dst_bytes, consumed)
{
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 @@ ccl_driver (ccl, source, destination, src_bytes, dst_bytes, consumed)
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 @@ ccl_driver (ccl, source, destination, src_bytes, dst_bytes, consumed)
src--;
if (ccl->last_block)
{
- ic = ccl->eof_ic;
+ ic = eof_ic;
+ eof_hit = 1;
goto ccl_repeat;
}
else