]> code.delx.au - gnu-emacs/blobdiff - src/ccl.c
(XMenuActivate): Fix call to lookup_derived_face.
[gnu-emacs] / src / ccl.c
index e82eea542c2821141c87a879c2ed4a426e3f7f3a..5bff1f3a0ad97f50679734fa280439468ad8586f 100644 (file)
--- 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,6 +713,8 @@ while (0)
 
 /* 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 @@ do                                 \
   }                                    \
 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)                                             \
@@ -730,7 +748,7 @@ while(0)
        if (bytes == 1)                                                 \
          {                                                             \
            *dst++ = (ch);                                              \
-           if ((ch) >= 0x80 && (ch) < 0xA0)                            \
+           if (extra_bytes && (ch) >= 0x80 && (ch) < 0xA0)             \
              /* We may have to convert this eight-bit char to          \
                 multibyte form later.  */                              \
              extra_bytes++;                                            \
@@ -809,7 +827,8 @@ while(0)
       }                                                        \
     else if (ccl->last_block)                          \
       {                                                        \
-        ic = ccl->eof_ic;                              \
+       REG = -1;                                       \
+        ic = eof_ic;                                   \
         goto ccl_repeat;                               \
       }                                                        \
     else                                               \
@@ -854,12 +873,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.  */
@@ -887,9 +914,11 @@ ccl_driver (ccl, source, destination, src_bytes, dst_bytes, consumed)
      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;
+  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 +1122,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 +1163,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 +1402,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
@@ -1872,7 +1908,7 @@ ccl_driver (ccl, source, destination, src_bytes, dst_bytes, consumed)
          break;
 
        default:
-         sprintf(msg, "\nCCL: Unknown error type (%d).", ccl->status);
+         sprintf(msg, "\nCCL: Unknown error type (%d)", ccl->status);
        }
 
       msglen = strlen (msg);
@@ -1905,7 +1941,7 @@ ccl_driver (ccl, source, destination, src_bytes, dst_bytes, consumed)
   ccl->ic = ic;
   ccl->stack_idx = stack_idx;
   ccl->prog = ccl_prog;
-  ccl->eight_bit_control = (extra_bytes > 0);
+  ccl->eight_bit_control = (extra_bytes > 1);
   if (consumed)
     *consumed = src - source;
   return (dst ? dst - destination : 0);
@@ -2060,6 +2096,7 @@ setup_ccl_program (ccl, ccl_prog)
   ccl->stack_idx = 0;
   ccl->eol_type = CODING_EOL_LF;
   ccl->suppress_error = 0;
+  ccl->eight_bit_control = 0;
   return 0;
 }
 
@@ -2195,8 +2232,8 @@ See the documentation of `define-ccl-program' for the detail of CCL program.  */
   produced = ccl_driver (&ccl, SDATA (str), outbuf,
                         SBYTES (str), outbufsize, (int *) 0);
   for (i = 0; i < 8; i++)
-    XSET (AREF (status, i), Lisp_Int, ccl.reg[i]);
-  XSETINT (AREF (status, 8), ccl.ic);
+    ASET (status, i, make_number (ccl.reg[i]));
+  ASET (status, 8, make_number (ccl.ic));
   UNGCPRO;
 
   if (NILP (unibyte_p))
@@ -2402,3 +2439,6 @@ used by CCL.  */);
   defsubr (&Sregister_ccl_program);
   defsubr (&Sregister_code_conversion_map);
 }
+
+/* arch-tag: bb9a37be-68ce-4576-8d3d-15d750e4a860
+   (do not change this comment) */