(linenum→info "unix/slp.c:2238")

emacs/22.1/src/category.h

    1: /* Declarations having to do with Emacs category tables.
    2:    Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
    3:      2005, 2006, 2007
    4:      National Institute of Advanced Industrial Science and Technology (AIST)
    5:      Registration Number H14PRO021
    6: 
    7: This file is part of GNU Emacs.
    8: 
    9: GNU Emacs is free software; you can redistribute it and/or modify
   10: it under the terms of the GNU General Public License as published by
   11: the Free Software Foundation; either version 2, or (at your option)
   12: any later version.
   13: 
   14: GNU Emacs is distributed in the hope that it will be useful,
   15: but WITHOUT ANY WARRANTY; without even the implied warranty of
   16: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   17: GNU General Public License for more details.
   18: 
   19: You should have received a copy of the GNU General Public License
   20: along with GNU Emacs; see the file COPYING.  If not, write to
   21: the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
   22: Boston, MA 02110-1301, USA.  */
   23: 
   24: 
   25: /* We introduce here three types of object: category, category set,
   26:    and category table.
   27: 
   28:    A category is like syntax but differs in the following points:
   29: 
   30:    o A category is represented by a mnemonic character of the range
   31:    ` '(32)..`~'(126) (printable ASCII characters).
   32: 
   33:    o A category is not exclusive, i.e. a character has multiple
   34:    categories (category set).  Of course, there's a case that a
   35:    category set is empty, i.e. the character has no category.
   36: 
   37:    o In addition to the predefined categories, a user can define new
   38:    categories.  Total number of categories is limited to 95.
   39: 
   40:    A category set is a set of categories represented by Lisp
   41:    bool-vector of length 128 (only elements of 31th through 126th
   42:    are used).
   43: 
   44:    A category table is like syntax-table, represented by a Lisp
   45:    char-table.  The contents are category sets or nil.  It has two
   46:    extra slots, for a vector of doc string of each category and a
   47:    version number.
   48: 
   49:    The first extra slot is a vector of doc strings of categories, the
   50:    length is 95.  The Nth element corresponding to the category N+32.
   51: 
   52:    The second extra slot is a version number of the category table.
   53:    But, for the moment, we are not using this slot.  */
   54: 
   55: #define CATEGORYP(x) \
   56:   (INTEGERP ((x)) && XFASTINT ((x)) >= 0x20 && XFASTINT ((x)) <= 0x7E)
   57: 
   58: #define CHECK_CATEGORY(x) \
   59:   CHECK_TYPE (CATEGORYP (x), Qcategoryp, x)
   60: 
   61: #define XCATEGORY_SET XBOOL_VECTOR
   62: 
   63: #define CATEGORY_SET_P(x) \
   64:   (BOOL_VECTOR_P ((x)) && (EMACS_INT) (XBOOL_VECTOR ((x))->size) == 128)
   65: 
   66: /* Return a new empty category set.  */
   67: #define MAKE_CATEGORY_SET (Fmake_bool_vector (make_number (128), Qnil))
   68: 
   69: /* Make CATEGORY_SET includes (if VAL is t) or excludes (if VAL is
   70:    nil) CATEGORY.  */
   71: #define SET_CATEGORY_SET(category_set, category, val) \
   72:   (Faset (category_set, category, val))
   73: 
   74: #define CHECK_CATEGORY_SET(x) \
   75:   CHECK_TYPE (CATEGORY_SET_P (x), Qcategorysetp, x)
   76: 
   77: /* Return 1 if CATEGORY_SET contains CATEGORY, else return 0.
   78:    The faster version of `!NILP (Faref (category_set, category))'.  */
   79: #define CATEGORY_MEMBER(category, category_set)                        \
   80:   (XCATEGORY_SET (category_set)->data[(category) / 8]                   \
   81:    & (1 << ((category) % 8)))
   82: 
   83: /* Temporary internal variable used in macro CHAR_HAS_CATEGORY.  */
   84: extern Lisp_Object _temp_category_set;
   85: 
   86: /* Return 1 if category set of CH contains CATEGORY, elt return 0.  */
   87: #define CHAR_HAS_CATEGORY(ch, category) \
   88:   (_temp_category_set = CATEGORY_SET (ch),      \
   89:    CATEGORY_MEMBER (category, _temp_category_set))
   90: 
   91: /* The standard category table is stored where it will automatically
   92:    be used in all new buffers.  */
   93: #define Vstandard_category_table buffer_defaults.category_table
   94: 
   95: /* Return the category set of character C in the current category table.  */
   96: #ifdef __GNUC__
   97: #define CATEGORY_SET(c)                                                      \
   98:   ({ Lisp_Object table = current_buffer->category_table;                     \
   99:      Lisp_Object temp;                                                       \
  100:      if ((c) < CHAR_TABLE_SINGLE_BYTE_SLOTS)                                 \
  101:        while (NILP (temp = XCHAR_TABLE (table)->contents[(unsigned char) c]) \
  102:               && NILP (temp = XCHAR_TABLE (table)->defalt))                 \
  103:          table = XCHAR_TABLE (table)->parent;                               \
  104:      else                                                                    \
  105:        temp = Faref (table, make_number (c));                                \
  106:      temp; })
  107: #else
  108: #define CATEGORY_SET(c) \
  109:   Faref (current_buffer->category_table, make_number (c))
  110: #endif
  111: 
  112: /* Return the doc string of CATEGORY in category table TABLE.  */
  113: #define CATEGORY_DOCSTRING(table, category) \
  114:   XVECTOR (Fchar_table_extra_slot (table, make_number (0)))->contents[(category) - ' ']
  115: 
  116: /* Return the version number of category table TABLE.  Not used for
  117:    the moment.  */
  118: #define CATEGORY_TABLE_VERSION (table) \
  119:   Fchar_table_extra_slot (table, make_number (1))
  120: 
  121: /* Return 1 if there is a word boundary between two word-constituent
  122:    characters C1 and C2 if they appear in this order, else return 0.
  123:    There is no word boundary between two word-constituent ASCII
  124:    characters.  */
  125: #define WORD_BOUNDARY_P(c1, c2)                                 \
  126:   (!(SINGLE_BYTE_CHAR_P (c1) && SINGLE_BYTE_CHAR_P (c2))        \
  127:    && word_boundary_p (c1, c2))
  128: 
  129: extern int word_boundary_p P_ ((int, int));
  130: 
  131: /* arch-tag: 309dfe83-c3e2-4d22-8e81-faae5aece0ff
  132:    (do not change this comment) */
Syntax (Markdown)