]> code.delx.au - gnu-emacs/blobdiff - src/syntax.h
Add #pragma alloca.
[gnu-emacs] / src / syntax.h
index 005b2a2cd989a15c0e530cbe1b391901b72ca549..32847fc76ada937efdb03314e6eef04fbe84b04a 100644 (file)
@@ -1,11 +1,11 @@
 /* Declarations having to do with GNU Emacs syntax tables.
-   Copyright (C) 1985 Free Software Foundation, Inc.
+   Copyright (C) 1985, 1993, 1994 Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
 
 GNU Emacs is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 1, or (at your option)
+the Free Software Foundation; either version 2, or (at your option)
 any later version.
 
 GNU Emacs is distributed in the hope that it will be useful,
@@ -25,10 +25,11 @@ extern Lisp_Object Fsyntax_table_p (), Fsyntax_table (), Fset_syntax_table ();
    be used in all new buffers.  */
 #define Vstandard_syntax_table buffer_defaults.syntax_table
 
-/* A syntax table is a Lisp vector of length 0400, whose elements are integers.
+/* A syntax table is a chartable whose elements are cons cells
+   (CODE+FLAGS . MATCHING-CHAR).  MATCHING-CHAR can be nil if the char
+   is not a kind of parenthesis.
 
-The low 8 bits of the integer is a code, as follows:
-*/
+   The low 8 bits of CODE+FLAGS is a code, as follows:  */
 
 enum syntaxcode
   {
@@ -45,17 +46,100 @@ enum syntaxcode
     Scharquote,  /* for a character that quotes the following character */
     Scomment,    /* for a comment-starting character */
     Sendcomment, /* for a comment-ending character */
+    Sinherit,    /* use the standard syntax table for this character */
     Smax        /* Upper bound on codes that are meaningful */
   };
 
-#define SYNTAX(c) \
-  ((enum syntaxcode) (XINT (XVECTOR (current_buffer->syntax_table)->contents[(unsigned char) (c)]) & 0377))
-
-/* The next 8 bits of the number is a character,
- the matching delimiter in the case of Sopen or Sclose. */
-
-#define SYNTAX_MATCH(c) \
-  ((XINT (XVECTOR (current_buffer->syntax_table)->contents[(unsigned char) (c)]) >> 8) & 0377)
+/* Fetch the syntax entry for char C from table TABLE.
+   This returns the whole entry (normally a cons cell)
+   and does not do any kind of inheritance.  */
+
+#if 1
+#define RAW_SYNTAX_ENTRY(table, c)                             \
+  (XCHAR_TABLE (table)->contents[(unsigned char) (c)])
+
+#define SET_RAW_SYNTAX_ENTRY(table, c, val)                    \
+  (XCHAR_TABLE (table)->contents[(unsigned char) (c)] = (val))
+#else
+#define RAW_SYNTAX_ENTRY(table, c)                             \
+  ((c) >= 128                                                  \
+   ? raw_syntax_table_lookup (table, c)                                \
+   : XCHAR_TABLE (table)->contents[(unsigned char) (c)])
+
+#define SET_RAW_SYNTAX_ENTRY(table, c, val)                    \
+  ((c) >= 128                                                  \
+   ? set_raw_syntax_table_lookup (table, c, (val))             \
+   : XCHAR_TABLE (table)->contents[(unsigned char) (c)] = (val))
+#endif
+
+/* Extract the information from the entry for character C
+   in syntax table TABLE.  Do inheritance.  */
+
+#ifdef __GNUC__
+#define SYNTAX_ENTRY(c)                                                        \
+  ({ Lisp_Object temp, table;                                          \
+     unsigned char cc = (c);                                           \
+     table = current_buffer->syntax_table;                             \
+     while (!NILP (table))                                             \
+       {                                                               \
+        temp = RAW_SYNTAX_ENTRY (table, cc);                           \
+        if (!NILP (temp))                                              \
+          break;                                                       \
+        table = XCHAR_TABLE (table)->parent;                           \
+       }                                                               \
+     temp; })
+
+#define SYNTAX(c)                                                      \
+  ({ Lisp_Object temp;                                                 \
+     temp = SYNTAX_ENTRY (c);                                          \
+     (CONSP (temp)                                                     \
+      ? (enum syntaxcode) (XINT (XCONS (temp)->car) & 0xff)            \
+      : wrong_type_argument (Qconsp, temp)); })
+
+#define SYNTAX_WITH_FLAGS(c)                                           \
+  ({ Lisp_Object temp;                                                 \
+     temp = SYNTAX_ENTRY (c);                                          \
+     (CONSP (temp)                                                     \
+      ? XINT (XCONS (temp)->car)                                       \
+      : wrong_type_argument (Qconsp, temp)); })
+
+#define SYNTAX_MATCH(c)                                                        \
+  ({ Lisp_Object temp;                                                 \
+     temp = SYNTAX_ENTRY (c);                                          \
+     (CONSP (temp)                                                     \
+      ? XINT (XCONS (temp)->cdr)                                       \
+      : wrong_type_argument (Qconsp, temp)); })
+#else
+extern Lisp_Object syntax_temp;
+extern Lisp_Object syntax_parent_lookup ();
+
+#define SYNTAX_ENTRY(c)                                                        \
+  (syntax_temp                                                         \
+     = RAW_SYNTAX_ENTRY (current_buffer->syntax_table, (c)),           \
+   (NILP (syntax_temp)                                                 \
+    ? (syntax_temp                                                     \
+       = syntax_parent_lookup (current_buffer->syntax_table,           \
+                              (unsigned char) (c)))                    \
+    : syntax_temp))
+
+#define SYNTAX(c)                                                      \
+  (syntax_temp = SYNTAX_ENTRY ((c)),                                   \
+   (CONSP (syntax_temp)                                                        \
+    ? (enum syntaxcode) (XINT (XCONS (syntax_temp)->car) & 0xff)       \
+    : wrong_type_argument (Qconsp, syntax_temp)))
+
+#define SYNTAX_WITH_FLAGS(c)                                           \
+  (syntax_temp = SYNTAX_ENTRY ((c)),                                   \
+   (CONSP (syntax_temp)                                                        \
+    ? XINT (XCONS (syntax_temp)->car)                                  \
+    : wrong_type_argument (Qconsp, syntax_temp)))
+
+#define SYNTAX_MATCH(c)                                                        \
+  (syntax_temp = SYNTAX_ENTRY ((c)),                                   \
+   (CONSP (syntax_temp)                                                        \
+    ? XINT (XCONS (syntax_temp)->cdr)                                  \
+    : wrong_type_argument (Qconsp, syntax_temp)))
+#endif
 
 /* Then there are six single-bit flags that have the following meanings:
   1. This character is the first of a two-character comment-start sequence.
@@ -73,24 +157,18 @@ enum syntaxcode
   Style a is always the default.
   */
 
-#define SYNTAX_COMSTART_FIRST(c) \
-  ((XINT (XVECTOR (current_buffer->syntax_table)->contents[(unsigned char) (c)]) >> 16) & 1)
+#define SYNTAX_COMSTART_FIRST(c) ((SYNTAX_WITH_FLAGS (c) >> 16) & 1)
 
-#define SYNTAX_COMSTART_SECOND(c) \
-  ((XINT (XVECTOR (current_buffer->syntax_table)->contents[(unsigned char) (c)]) >> 17) & 1)
+#define SYNTAX_COMSTART_SECOND(c) ((SYNTAX_WITH_FLAGS (c) >> 17) & 1)
 
-#define SYNTAX_COMEND_FIRST(c) \
-  ((XINT (XVECTOR (current_buffer->syntax_table)->contents[(unsigned char) (c)]) >> 18) & 1)
+#define SYNTAX_COMEND_FIRST(c) ((SYNTAX_WITH_FLAGS (c) >> 18) & 1)
 
-#define SYNTAX_COMEND_SECOND(c) \
-  ((XINT (XVECTOR (current_buffer->syntax_table)->contents[(unsigned char) (c)]) >> 19) & 1)
+#define SYNTAX_COMEND_SECOND(c) ((SYNTAX_WITH_FLAGS (c) >> 19) & 1)
 
-#define SYNTAX_PREFIX(c) \
-  ((XINT (XVECTOR (current_buffer->syntax_table)->contents[(unsigned char) (c)]) >> 20) & 1)
+#define SYNTAX_PREFIX(c) ((SYNTAX_WITH_FLAGS (c) >> 20) & 1)
 
 /* extract the comment style bit from the syntax table entry */
-#define SYNTAX_COMMENT_STYLE(c) \
-  ((XINT (XVECTOR (current_buffer->syntax_table)->contents[c]) >> 21) & 1)
+#define SYNTAX_COMMENT_STYLE(c) ((SYNTAX_WITH_FLAGS (c) >> 21) & 1)
 
 /* This array, indexed by a character, contains the syntax code which that
  character signifies (as a char).  For example,
@@ -100,4 +178,4 @@ extern unsigned char syntax_spec_code[0400];
 
 /* Indexed by syntax code, give the letter that describes it. */
 
-extern char syntax_code_spec[13];
+extern char syntax_code_spec[14];