(CHAR_TABLE_REF_ASCII): New macor.
authorKenichi Handa <handa@m17n.org>
Tue, 25 Aug 2009 00:48:59 +0000 (00:48 +0000)
committerKenichi Handa <handa@m17n.org>
Tue, 25 Aug 2009 00:48:59 +0000 (00:48 +0000)
(CHAR_TABLE_REF): Use it.

src/ChangeLog
src/lisp.h

index cdb12b6..ef1d9b1 100644 (file)
@@ -1,3 +1,8 @@
+2009-08-25  Kenichi Handa  <handa@m17n.org>
+
+       * lisp.h (CHAR_TABLE_REF_ASCII): New macro.
+       (CHAR_TABLE_REF): Use it.
+
 2009-08-23  Ken Raeburn  <raeburn@raeburn.org>
 
        * Makefile.in (emacs${EXEEXT}) [CANNOT_DUMP]: Set EMACSLOADPATH
index 15de8d9..385e0ad 100644 (file)
@@ -793,13 +793,37 @@ struct Lisp_Vector
 #define CHAR_TABLE_EXTRA_SLOTS(CT)     \
   (((CT)->size & PSEUDOVECTOR_SIZE_MASK) - CHAR_TABLE_STANDARD_SLOTS)
 
+#ifdef __GNUC__
+
+#define CHAR_TABLE_REF_ASCII(CT, IDX)                                  \
+  ({struct Lisp_Char_Table *_tbl = NULL;                               \
+    Lisp_Object _val;                                                  \
+    do {                                                               \
+      _tbl = _tbl ? XCHAR_TABLE (_tbl->parent) : XCHAR_TABLE (CT);     \
+      _val = (! SUB_CHAR_TABLE_P (_tbl->ascii) ? _tbl->ascii           \
+             : XSUB_CHAR_TABLE (_tbl->ascii)->contents[IDX]);          \
+      if (NILP (_val))                                                 \
+       _val = _tbl->defalt;                                            \
+    } while (NILP (_val) && ! NILP (_tbl->parent));                    \
+    _val; })
+      
+#else  /* not __GNUC__ */
+
+#define CHAR_TABLE_REF_ASCII(CT, IDX)                                    \
+  (! NILP (XCHAR_TABLE (CT)->ascii)                                      \
+   ? (! SUB_CHAR_TABLE_P (XCHAR_TABLE (CT)->ascii)                       \
+      ? XCHAR_TABLE (CT)->ascii                                                  \
+      : ! NILP (XSUB_CHAR_TABLE (XCHAR_TABLE (CT)->ascii)->contents[IDX]) \
+      ? XSUB_CHAR_TABLE (XCHAR_TABLE (CT)->ascii)->contents[IDX]         \
+      : char_table_ref ((CT), (IDX)))                                    \
+   :  char_table_ref ((CT), (IDX)))
+
+#endif /* not __GNUC__ */
+
 /* Almost equivalent to Faref (CT, IDX) with optimization for ASCII
    characters.  Do not check validity of CT.  */
-#define CHAR_TABLE_REF(CT, IDX)                                                 \
-  ((ASCII_CHAR_P (IDX)                                                  \
-    && SUB_CHAR_TABLE_P (XCHAR_TABLE (CT)->ascii)                       \
-    && !NILP (XSUB_CHAR_TABLE (XCHAR_TABLE (CT)->ascii)->contents[IDX])) \
-   ? XSUB_CHAR_TABLE (XCHAR_TABLE (CT)->ascii)->contents[IDX]           \
+#define CHAR_TABLE_REF(CT, IDX)                                        \
+  (ASCII_CHAR_P (IDX) ? CHAR_TABLE_REF_ASCII ((CT), (IDX))     \
    : char_table_ref ((CT), (IDX)))
 
 /* Almost equivalent to Faref (CT, IDX).  However, if the result is