From d9da2f452d42a1be3b7edd0fd2f346f1ff5632c4 Mon Sep 17 00:00:00 2001 From: Kenichi Handa Date: Tue, 25 Aug 2009 00:48:59 +0000 Subject: [PATCH] (CHAR_TABLE_REF_ASCII): New macor. (CHAR_TABLE_REF): Use it. --- src/ChangeLog | 5 +++++ src/lisp.h | 34 +++++++++++++++++++++++++++++----- 2 files changed, 34 insertions(+), 5 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index cdb12b68846..ef1d9b1d5e3 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,8 @@ +2009-08-25 Kenichi Handa + + * lisp.h (CHAR_TABLE_REF_ASCII): New macro. + (CHAR_TABLE_REF): Use it. + 2009-08-23 Ken Raeburn * Makefile.in (emacs${EXEEXT}) [CANNOT_DUMP]: Set EMACSLOADPATH diff --git a/src/lisp.h b/src/lisp.h index 15de8d9e74f..385e0ad4d1e 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -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 -- 2.11.4.GIT