Revision: miles@gnu.org--gnu-2005/emacs--unicode--0--patch-68
[bpt/emacs.git] / src / syntax.h
index 4b58b5d..34727af 100644 (file)
@@ -15,8 +15,8 @@ GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
 along with GNU Emacs; see the file COPYING.  If not, write to
-the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
+the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+Boston, MA 02110-1301, USA.  */
 
 
 extern Lisp_Object Qsyntax_table_p;
@@ -57,40 +57,17 @@ enum syntaxcode
 
 /* Set the syntax entry VAL for char C in table TABLE.  */
 
-#define SET_RAW_SYNTAX_ENTRY(table, c, val)                            \
-  ((c) < CHAR_TABLE_SINGLE_BYTE_SLOTS                                  \
-   ? (XCHAR_TABLE (table)->contents[(unsigned char) (c)] = (val))      \
-   : Faset ((table), make_number (c), (val)))
+#define SET_RAW_SYNTAX_ENTRY(table, c, val)    \
+  CHAR_TABLE_SET ((table), c, (val))
 
-/* Fetch the syntax entry for char C in syntax table TABLE.
-   This macro is called only when C is less than CHAR_TABLE_ORDINARY_SLOTS.
-   Do inheritance.  */
+/* Set the syntax entry VAL for char-range RANGE in table TABLE.
+   RANGE is a cons (FROM . TO) specifying the range of characters.  */
 
-#ifdef __GNUC__
-#define SYNTAX_ENTRY_FOLLOW_PARENT(table, c)                   \
-  ({ Lisp_Object tbl = table;                                  \
-     Lisp_Object temp = XCHAR_TABLE (tbl)->contents[(c)];      \
-     while (NILP (temp))                                       \
-       {                                                       \
-        tbl = XCHAR_TABLE (tbl)->parent;                       \
-        if (NILP (tbl))                                        \
-          break;                                               \
-        temp = XCHAR_TABLE (tbl)->contents[(c)];               \
-       }                                                       \
-     temp; })
-#else
-extern Lisp_Object syntax_temp;
-extern Lisp_Object syntax_parent_lookup P_ ((Lisp_Object, int));
-
-#define SYNTAX_ENTRY_FOLLOW_PARENT(table, c)           \
-  (syntax_temp = XCHAR_TABLE (table)->contents[(c)],   \
-   (NILP (syntax_temp)                                 \
-    ? syntax_parent_lookup (table, (c))                        \
-    : syntax_temp))
-#endif
+#define SET_RAW_SYNTAX_ENTRY_RANGE(table, range, val)  \
+  Fset_char_table_range ((table), (range), (val))
 
 /* SYNTAX_ENTRY fetches the information from the entry for character C
-   in syntax table TABLE, or from globally kept data (gl_state).  
+   in syntax table TABLE, or from globally kept data (gl_state).
    Does inheritance.  */
 /* CURRENT_SYNTAX_TABLE gives the syntax table valid for current
    position, it is either the buffer's syntax table, or syntax table
@@ -105,62 +82,61 @@ extern Lisp_Object syntax_parent_lookup P_ ((Lisp_Object, int));
 #  define CURRENT_SYNTAX_TABLE current_buffer->syntax_table
 #endif
 
-#define SYNTAX_ENTRY_INT(c)                                            \
-  ((c) < CHAR_TABLE_SINGLE_BYTE_SLOTS                          \
-   ? SYNTAX_ENTRY_FOLLOW_PARENT (CURRENT_SYNTAX_TABLE, \
-                                (unsigned char) (c))           \
-   : Faref (CURRENT_SYNTAX_TABLE, make_number ((c))))
+#define SYNTAX_ENTRY_INT(c) CHAR_TABLE_REF (CURRENT_SYNTAX_TABLE, (c))
 
 /* Extract the information from the entry for character C
    in the current syntax table.  */
 
 #ifdef __GNUC__
 #define SYNTAX(c)                                                      \
-  ({ Lisp_Object temp;                                                 \
-     temp = SYNTAX_ENTRY (c);                                          \
-     (CONSP (temp)                                                     \
-      ? (enum syntaxcode) (XINT (XCONS (temp)->car) & 0xff)            \
+  ({ Lisp_Object _syntax_temp;                                         \
+     _syntax_temp = SYNTAX_ENTRY (c);                                  \
+     (CONSP (_syntax_temp)                                             \
+      ? (enum syntaxcode) (XINT (XCAR (_syntax_temp)) & 0xff)          \
       : Swhitespace); })
 
 #define SYNTAX_WITH_FLAGS(c)                                           \
-  ({ Lisp_Object temp;                                                 \
-     temp = SYNTAX_ENTRY (c);                                          \
-     (CONSP (temp)                                                     \
-      ? XINT (XCONS (temp)->car)                                       \
+  ({ Lisp_Object _syntax_temp;                                         \
+     _syntax_temp = SYNTAX_ENTRY (c);                                  \
+     (CONSP (_syntax_temp)                                             \
+      ? XINT (XCAR (_syntax_temp))                                     \
       : (int) Swhitespace); })
 
 #define SYNTAX_MATCH(c)                                                        \
-  ({ Lisp_Object temp;                                                 \
-     temp = SYNTAX_ENTRY (c);                                          \
-     (CONSP (temp)                                                     \
-      ? XCONS (temp)->cdr                                              \
+  ({ Lisp_Object _syntax_temp;                                         \
+     _syntax_temp = SYNTAX_ENTRY (c);                                  \
+     (CONSP (_syntax_temp)                                             \
+      ? XCDR (_syntax_temp)                                            \
       : Qnil); })
 #else
+extern Lisp_Object syntax_temp;
 #define SYNTAX(c)                                                      \
   (syntax_temp = SYNTAX_ENTRY ((c)),                                   \
    (CONSP (syntax_temp)                                                        \
-    ? (enum syntaxcode) (XINT (XCONS (syntax_temp)->car) & 0xff)       \
+    ? (enum syntaxcode) (XINT (XCAR (syntax_temp)) & 0xff)     \
     : Swhitespace))
 
 #define SYNTAX_WITH_FLAGS(c)                                           \
   (syntax_temp = SYNTAX_ENTRY ((c)),                                   \
    (CONSP (syntax_temp)                                                        \
-    ? XINT (XCONS (syntax_temp)->car)                                  \
+    ? XINT (XCAR (syntax_temp))                                        \
     : (int) Swhitespace))
 
 #define SYNTAX_MATCH(c)                                                        \
   (syntax_temp = SYNTAX_ENTRY ((c)),                                   \
    (CONSP (syntax_temp)                                                        \
-    ? XCONS (syntax_temp)->cdr                                         \
+    ? XCDR (syntax_temp)                                               \
     : Qnil))
 #endif
 
-/* Then there are six single-bit flags that have the following meanings:
+/* Then there are seven single-bit flags that have the following meanings:
   1. This character is the first of a two-character comment-start sequence.
   2. This character is the second of a two-character comment-start sequence.
   3. This character is the first of a two-character comment-end sequence.
   4. This character is the second of a two-character comment-end sequence.
   5. This character is a prefix, for backward-prefix-chars.
+  6. see below
+  7. This character is part of a nestable comment sequence.
   Note that any two-character sequence whose first character has flag 1
   and whose second character has flag 2 will be interpreted as a comment start.
 
@@ -185,6 +161,8 @@ extern Lisp_Object syntax_parent_lookup P_ ((Lisp_Object, int));
 
 #define SYNTAX_COMMENT_STYLE(c) ((SYNTAX_WITH_FLAGS (c) >> 21) & 1)
 
+#define SYNTAX_COMMENT_NESTED(c) ((SYNTAX_WITH_FLAGS (c) >> 22) & 1)
+
 /* These macros extract specific flags from an integer
    that holds the syntax code and the flags.  */
 
@@ -200,6 +178,8 @@ extern Lisp_Object syntax_parent_lookup P_ ((Lisp_Object, int));
 
 #define SYNTAX_FLAGS_COMMENT_STYLE(flags) (((flags) >> 21) & 1)
 
+#define SYNTAX_FLAGS_COMMENT_NESTED(flags) (((flags) >> 22) & 1)
+
 /* This array, indexed by a character, contains the syntax code which that
  character signifies (as a char).  For example,
  (enum syntaxcode) syntax_spec_code['w'] is Sword.  */
@@ -245,7 +225,7 @@ extern char syntax_code_spec[16];
 
 #define UPDATE_SYNTAX_TABLE_BACKWARD(charpos)                  \
   (parse_sexp_lookup_properties                                        \
-   && (charpos) <= gl_state.b_property                         \
+   && (charpos) < gl_state.b_property                          \
    ? (update_syntax_table ((charpos) + gl_state.offset, -1, 0, \
                           gl_state.object),                    \
       1)                                                       \
@@ -255,7 +235,7 @@ extern char syntax_code_spec[16];
 
 #define UPDATE_SYNTAX_TABLE(charpos)                           \
   (parse_sexp_lookup_properties                                        \
-   && (charpos) <= gl_state.b_property                         \
+   && (charpos) < gl_state.b_property                          \
    ? (update_syntax_table ((charpos) + gl_state.offset, -1, 0, \
                           gl_state.object),                    \
       1)                                                       \
@@ -270,14 +250,14 @@ extern char syntax_code_spec[16];
    search, or after the last position of the backward search.  It
    makes sure that the first char is picked up with correct table, so
    one does not need to call UPDATE_SYNTAX_TABLE immediately after the
-   call. 
+   call.
    Sign of COUNT gives the direction of the search.
  */
 
 #define SETUP_SYNTAX_TABLE(FROM, COUNT)                                        \
 if (1)                                                                 \
   {                                                                    \
-    gl_state.b_property = BEGV - 1;                                    \
+    gl_state.b_property = BEGV;                                                \
     gl_state.e_property = ZV + 1;                                      \
     gl_state.object = Qnil;                                            \
     gl_state.use_global = 0;                                           \
@@ -304,26 +284,26 @@ if (1)                                                                    \
     if (BUFFERP (gl_state.object))                                     \
       {                                                                        \
        struct buffer *buf = XBUFFER (gl_state.object);                 \
-       gl_state.b_property = 0;                                        \
+       gl_state.b_property = 1;                                        \
        gl_state.e_property = BUF_ZV (buf) - BUF_BEGV (buf) + 1;        \
        gl_state.offset = BUF_BEGV (buf) - 1;                           \
       }                                                                        \
     else if (NILP (gl_state.object))                                   \
       {                                                                        \
-       gl_state.b_property = 0;                                        \
+       gl_state.b_property = 1;                                        \
        gl_state.e_property = ZV - BEGV + 1;                            \
        gl_state.offset = BEGV - 1;                                     \
       }                                                                        \
     else if (EQ (gl_state.object, Qt))                                 \
       {                                                                        \
-       gl_state.b_property = - 1;                                      \
+       gl_state.b_property = 0;                                        \
        gl_state.e_property = 1500000000;                               \
        gl_state.offset = 0;                                            \
       }                                                                        \
     else                                                               \
       {                                                                        \
-       gl_state.b_property = -1;                                       \
-       gl_state.e_property = 1 + XSTRING (gl_state.object)->size;      \
+       gl_state.b_property = 0;                                        \
+       gl_state.e_property = 1 + SCHARS (gl_state.object);             \
        gl_state.offset = 0;                                            \
       }                                                                        \
     gl_state.use_global = 0;                                           \
@@ -345,8 +325,7 @@ struct gl_state_s
   Lisp_Object global_code;             /* Syntax code of current char. */
   Lisp_Object current_syntax_table;    /* Syntax table for current pos. */
   Lisp_Object old_prop;                        /* Syntax-table prop at prev pos. */
-  int b_property;                      /* Last index where c_s_t is 
-                                          not valid. */
+  int b_property;                      /* First index where c_s_t is valid. */
   int e_property;                      /* First index where c_s_t is
                                           not valid. */
   INTERVAL forward_i;                  /* Where to start lookup on forward */
@@ -358,8 +337,6 @@ struct gl_state_s
                                           on: */
   /* Offset for positions specified to UPDATE_SYNTAX_TABLE.  */
   int offset;
-  char left_ok;
-  char right_ok;
 };
 
 extern struct gl_state_s gl_state;
@@ -367,3 +344,6 @@ extern int parse_sexp_lookup_properties;
 extern INTERVAL interval_of P_ ((int, Lisp_Object));
 
 extern int scan_words P_ ((int, int));
+
+/* arch-tag: 28833cca-cd73-4741-8c85-a3111166a0e0
+   (do not change this comment) */