# HG changeset patch # User Kenichi Handa # Date 1087007619 0 # Node ID bcdeaf1d58fc7aaa306cfad1f08e997ce9af5491 # Parent 13758b690c5c0e78b7b0babdc2357346ec440aa6 (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. diff -r 13758b690c5c -r bcdeaf1d58fc src/ccl.c --- 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