emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] Changes to emacs/src/ccl.c


From: Kenichi Handa
Subject: [Emacs-diffs] Changes to emacs/src/ccl.c
Date: Fri, 27 May 2005 07:27:50 -0400

Index: emacs/src/ccl.c
diff -c emacs/src/ccl.c:1.87 emacs/src/ccl.c:1.88
*** emacs/src/ccl.c:1.87        Sun Jun 13 00:22:19 2004
--- emacs/src/ccl.c     Fri May 27 11:27:50 2005
***************
*** 49,58 ****
  Lisp_Object Qccl_program_idx;
  
  /* Table of registered CCL programs.  Each element is a vector of
!    NAME, CCL_PROG, and RESOLVEDP where NAME (symbol) is the name of
!    the program, CCL_PROG (vector) is the compiled code of the program,
!    RESOLVEDP (t or nil) is the flag to tell if symbols in CCL_PROG is
!    already resolved to index numbers or not.  */
  Lisp_Object Vccl_program_table;
  
  /* Vector of registered hash tables for translation.  */
--- 49,60 ----
  Lisp_Object Qccl_program_idx;
  
  /* Table of registered CCL programs.  Each element is a vector of
!    NAME, CCL_PROG, RESOLVEDP, and UPDATEDP, where NAME (symbol) is the
!    name of the program, CCL_PROG (vector) is the compiled code of the
!    program, RESOLVEDP (t or nil) is the flag to tell if symbols in
!    CCL_PROG is already resolved to index numbers or not, UPDATEDP (t
!    or nil) is the flat to tell if the CCL program is updated after it
!    was once used.  */
  Lisp_Object Vccl_program_table;
  
  /* Vector of registered hash tables for translation.  */
***************
*** 2028,2041 ****
     symbols, return Qnil.  */
  
  static Lisp_Object
! ccl_get_compiled_code (ccl_prog)
       Lisp_Object ccl_prog;
  {
    Lisp_Object val, slot;
  
    if (VECTORP (ccl_prog))
      {
        val = resolve_symbol_ccl_program (ccl_prog);
        return (VECTORP (val) ? val : Qnil);
      }
    if (!SYMBOLP (ccl_prog))
--- 2030,2045 ----
     symbols, return Qnil.  */
  
  static Lisp_Object
! ccl_get_compiled_code (ccl_prog, idx)
       Lisp_Object ccl_prog;
+      int *idx;
  {
    Lisp_Object val, slot;
  
    if (VECTORP (ccl_prog))
      {
        val = resolve_symbol_ccl_program (ccl_prog);
+       *idx = -1;
        return (VECTORP (val) ? val : Qnil);
      }
    if (!SYMBOLP (ccl_prog))
***************
*** 2047,2055 ****
      return Qnil;
    slot = AREF (Vccl_program_table, XINT (val));
    if (! VECTORP (slot)
!       || ASIZE (slot) != 3
        || ! VECTORP (AREF (slot, 1)))
      return Qnil;
    if (NILP (AREF (slot, 2)))
      {
        val = resolve_symbol_ccl_program (AREF (slot, 1));
--- 2051,2060 ----
      return Qnil;
    slot = AREF (Vccl_program_table, XINT (val));
    if (! VECTORP (slot)
!       || ASIZE (slot) != 4
        || ! VECTORP (AREF (slot, 1)))
      return Qnil;
+   *idx = XINT (val);
    if (NILP (AREF (slot, 2)))
      {
        val = resolve_symbol_ccl_program (AREF (slot, 1));
***************
*** 2078,2084 ****
      {
        struct Lisp_Vector *vp;
  
!       ccl_prog = ccl_get_compiled_code (ccl_prog);
        if (! VECTORP (ccl_prog))
        return -1;
        vp = XVECTOR (ccl_prog);
--- 2083,2089 ----
      {
        struct Lisp_Vector *vp;
  
!       ccl_prog = ccl_get_compiled_code (ccl_prog, &ccl->idx);
        if (! VECTORP (ccl_prog))
        return -1;
        vp = XVECTOR (ccl_prog);
***************
*** 2086,2091 ****
--- 2091,2103 ----
        ccl->prog = vp->contents;
        ccl->eof_ic = XINT (vp->contents[CCL_HEADER_EOF]);
        ccl->buf_magnification = XINT (vp->contents[CCL_HEADER_BUF_MAG]);
+       if (ccl->idx >= 0)
+       {
+         Lisp_Object slot;
+ 
+         slot = AREF (Vccl_program_table, ccl->idx);
+         ASET (slot, 3, Qnil);
+       }
      }
    ccl->ic = CCL_HEADER_MAIN;
    for (i = 0; i < 8; i++)
***************
*** 2100,2105 ****
--- 2112,2144 ----
    return 0;
  }
  
+ 
+ /* Check if CCL is updated or not.  If not, re-setup members of CCL.  */
+ 
+ int
+ check_ccl_update (ccl)
+      struct ccl_program *ccl;
+ {
+   struct Lisp_Vector *vp;
+   Lisp_Object slot, ccl_prog;
+ 
+   if (ccl->idx < 0)
+     return 0;
+   slot = AREF (Vccl_program_table, ccl->idx);
+   if (NILP (AREF (slot, 3)))
+     return 0;
+   ccl_prog = ccl_get_compiled_code (AREF (slot, 0), &ccl->idx);
+   if (! VECTORP (ccl_prog))
+     return -1;
+   ccl->size = ASIZE (ccl_prog);
+   ccl->prog = XVECTOR (ccl_prog)->contents;
+   ccl->eof_ic = XINT (AREF (ccl_prog, CCL_HEADER_EOF));
+   ccl->buf_magnification = XINT (AREF (ccl_prog, CCL_HEADER_BUF_MAG));
+   ASET (slot, 3, Qnil);
+   return 0;
+ }
+ 
+ 
  DEFUN ("ccl-program-p", Fccl_program_p, Sccl_program_p, 1, 1, 0,
         doc: /* Return t if OBJECT is a CCL program name or a compiled CCL 
program code.
  See the documentation of  `define-ccl-program' for the detail of CCL program. 
 */)
***************
*** 2298,2305 ****
        if (EQ (name, AREF (slot, 0)))
        {
          /* Update this slot.  */
!         AREF (slot, 1) = ccl_prog;
!         AREF (slot, 2) = resolved;
          return make_number (idx);
        }
      }
--- 2337,2345 ----
        if (EQ (name, AREF (slot, 0)))
        {
          /* Update this slot.  */
!         ASET (slot, 1, ccl_prog);
!         ASET (slot, 2, resolved);
!         ASET (slot, 3, Qt);
          return make_number (idx);
        }
      }
***************
*** 2312,2330 ****
  
        new_table = Fmake_vector (make_number (len * 2), Qnil);
        for (j = 0; j < len; j++)
!       AREF (new_table, j)
!         = AREF (Vccl_program_table, j);
        Vccl_program_table = new_table;
      }
  
    {
      Lisp_Object elt;
  
!     elt = Fmake_vector (make_number (3), Qnil);
!     AREF (elt, 0) = name;
!     AREF (elt, 1) = ccl_prog;
!     AREF (elt, 2) = resolved;
!     AREF (Vccl_program_table, idx) = elt;
    }
  
    Fput (name, Qccl_program_idx, make_number (idx));
--- 2352,2370 ----
  
        new_table = Fmake_vector (make_number (len * 2), Qnil);
        for (j = 0; j < len; j++)
!       ASET (new_table, j, AREF (Vccl_program_table, j));
        Vccl_program_table = new_table;
      }
  
    {
      Lisp_Object elt;
  
!     elt = Fmake_vector (make_number (4), Qnil);
!     ASET (elt, 0, name);
!     ASET (elt, 1, ccl_prog);
!     ASET (elt, 2, resolved);
!     ASET (elt, 3, Qt);
!     ASET (Vccl_program_table, idx, elt);
    }
  
    Fput (name, Qccl_program_idx, make_number (idx));




reply via email to

[Prev in Thread] Current Thread [Next in Thread]