diff src/syntax.h @ 0:376386a54a3c r19-14

Import from CVS: tag r19-14
author cvs
date Mon, 13 Aug 2007 08:45:50 +0200
parents
children ac2d302a0011
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/syntax.h	Mon Aug 13 08:45:50 2007 +0200
@@ -0,0 +1,231 @@
+/* Declarations having to do with XEmacs syntax tables.
+   Copyright (C) 1985, 1992, 1993 Free Software Foundation, Inc.
+
+This file is part of XEmacs.
+
+XEmacs 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 2, or (at your option) any
+later version.
+
+XEmacs is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with XEmacs; see the file COPYING.  If not, write to
+the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+/* Synched up with: FSF 19.28. */
+
+#ifndef _XEMACS_SYNTAX_H_
+#define _XEMACS_SYNTAX_H_
+
+/* The standard syntax table is stored where it will automatically
+   be used in all new buffers.  */
+extern Lisp_Object Vstandard_syntax_table;
+
+/* A syntax table is a Lisp vector of length 0400, whose elements are integers.
+
+The low 7 bits of the integer is a code, as follows. The 8th bit is
+used as the prefix bit flag (see below).
+*/
+
+enum syntaxcode
+  {
+    Swhitespace, /* for a whitespace character */
+    Spunct,	 /* for random punctuation characters */
+    Sword,	 /* for a word constituent */
+    Ssymbol,	 /* symbol constituent but not word constituent */
+    Sopen,	 /* for a beginning delimiter */
+    Sclose,      /* for an ending delimiter */
+    Squote,	 /* for a prefix character like Lisp ' */
+    Sstring,	 /* for a string-grouping character like Lisp " */
+    Smath,	 /* for delimiters like $ in Tex. */
+    Sescape,	 /* for a character that begins a C-style escape */
+    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 */
+    Sextword,	 /* extended word; works mostly like a word constituent.
+		    See the comment in syntax.c. */
+    Smax	 /* Upper bound on codes that are meaningful */
+  };
+
+extern Lisp_Object Qsyntax_table_p;
+Lisp_Object Fsyntax_table_p (Lisp_Object);
+Lisp_Object Fsyntax_table (Lisp_Object);
+Lisp_Object Fset_syntax_table (Lisp_Object, Lisp_Object);
+
+/* Return the raw syntax code for a particular character and table */
+#define RAW_SYNTAX_CODE_UNSAFE(table, c) \
+  (XINT (vector_data (XVECTOR (table))[(unsigned char) (c)]))
+
+/* Return the syntax code for a particular character and table, taking
+   into account inheritance. */
+
+/* Unfortunately, we cannot write SYNTAX_CODE() as a safe macro in
+   general.  I tried just using an inline function but that causes
+   significant slowdown (esp. in regex routines) because this macro
+   is called so many millions of times.  So instead we resort to
+   SYNTAX_CODE_UNSAFE(), which is used most of the time.  Under
+   GCC we can actually write this as a safe macro, and we do because
+   it's likely to lead to speedups. */
+
+#ifdef __GNUC__
+#define SYNTAX_CODE_UNSAFE(table, c)					 \
+ ({ Emchar _ch_ = (c);							 \
+    int _rawcode_ = RAW_SYNTAX_CODE_UNSAFE (table, _ch_);		 \
+    if ((enum syntaxcode) (_rawcode_ & 0177) == Sinherit)		 \
+      _rawcode_ = RAW_SYNTAX_CODE_UNSAFE (Vstandard_syntax_table, _ch_); \
+    _rawcode_; })
+#else
+#define SYNTAX_CODE_UNSAFE(table, c)			\
+  (RAW_SYNTAX_CODE_UNSAFE (table, c) == Sinherit	\
+   ? RAW_SYNTAX_CODE_UNSAFE (Vstandard_syntax_table, c)	\
+   : RAW_SYNTAX_CODE_UNSAFE (table, c))
+#endif
+
+INLINE int SYNTAX_CODE (Lisp_Object table, Emchar c);
+INLINE int
+SYNTAX_CODE (Lisp_Object table, Emchar c)
+{
+  return SYNTAX_CODE_UNSAFE (table, c);
+}
+      
+#define SYNTAX_UNSAFE(table, c) \
+  ((enum syntaxcode) (SYNTAX_CODE_UNSAFE (table, c) & 0177))
+
+#define SYNTAX_FROM_CODE(code) ((enum syntaxcode) ((code) & 0177))
+#define SYNTAX(table, c) SYNTAX_FROM_CODE (SYNTAX_CODE (table, c))
+
+INLINE int WORD_SYNTAX_P (Lisp_Object table, Emchar c);
+INLINE int
+WORD_SYNTAX_P (Lisp_Object table, Emchar c)
+{
+  int syncode = SYNTAX (table, c);
+  return syncode == Sword || syncode == Sextword;
+}
+
+/* The prefix flag bit for backward-prefix-chars is now put into bit 7. */
+
+#define SYNTAX_PREFIX_UNSAFE(table, c) \
+  ((SYNTAX_CODE_UNSAFE (table, c) >> 7) & 1)
+#define SYNTAX_PREFIX(table, c) \
+  ((SYNTAX_CODE (table, c) >> 7) & 1)
+
+/* The next 8 bits of the number is a character,
+ the matching delimiter in the case of Sopen or Sclose. */
+
+#define SYNTAX_MATCH(table, c) \
+  ((SYNTAX_CODE (table, c) >> 8) & 0377)
+
+/* The next 8 bits are used to implement up to two comment styles
+   in a single buffer. They have the following meanings:
+
+  1. first of a one or two character comment-start sequence of style a.
+  2. first of a one or two character comment-start sequence of style b.
+  3. second of a two-character comment-start sequence of style a.
+  4. second of a two-character comment-start sequence of style b.
+  5. first of a one or two character comment-end sequence of style a.
+  6. first of a one or two character comment-end sequence of style b.
+  7. second of a two-character comment-end sequence of style a.
+  8. second of a two-character comment-end sequence of style b.
+ */
+
+#define SYNTAX_COMMENT_BITS(table, c) \
+  ((SYNTAX_CODE (table, c) >> 16) &0xff)
+
+#define SYNTAX_FIRST_OF_START_A  0x80
+#define SYNTAX_FIRST_OF_START_B  0x40
+#define SYNTAX_SECOND_OF_START_A 0x20
+#define SYNTAX_SECOND_OF_START_B 0x10
+#define SYNTAX_FIRST_OF_END_A    0x08
+#define SYNTAX_FIRST_OF_END_B    0x04
+#define SYNTAX_SECOND_OF_END_A   0x02
+#define SYNTAX_SECOND_OF_END_B   0x01
+
+#define SYNTAX_COMMENT_STYLE_A   0xaa
+#define SYNTAX_COMMENT_STYLE_B   0x55
+#define SYNTAX_FIRST_CHAR_START  0xc0
+#define SYNTAX_FIRST_CHAR_END    0x0c
+#define SYNTAX_FIRST_CHAR        0xcc
+#define SYNTAX_SECOND_CHAR_START 0x30
+#define SYNTAX_SECOND_CHAR_END   0x03
+#define SYNTAX_SECOND_CHAR       0x33
+
+#define SYNTAX_START_P(table, a, b)					\
+  ((SYNTAX_COMMENT_BITS (table, a) & SYNTAX_FIRST_CHAR_START)		\
+   && (SYNTAX_COMMENT_BITS (table, b) & SYNTAX_SECOND_CHAR_START))
+
+#define SYNTAX_END_P(table, a, b)					\
+  ((SYNTAX_COMMENT_BITS (table, a) & SYNTAX_FIRST_CHAR_END)		\
+   && (SYNTAX_COMMENT_BITS (table, b) & SYNTAX_SECOND_CHAR_END))
+
+#define SYNTAX_STYLES_MATCH_START_P(table, a, b, mask)			    \
+  ((SYNTAX_COMMENT_BITS (table, a) & SYNTAX_FIRST_CHAR_START & (mask))	    \
+   && (SYNTAX_COMMENT_BITS (table, b) & SYNTAX_SECOND_CHAR_START & (mask)))
+
+#define SYNTAX_STYLES_MATCH_END_P(table, a, b, mask)			  \
+  ((SYNTAX_COMMENT_BITS (table, a) & SYNTAX_FIRST_CHAR_END & (mask))	  \
+   && (SYNTAX_COMMENT_BITS (table, b) & SYNTAX_SECOND_CHAR_END & (mask)))
+
+#define SYNTAX_STYLES_MATCH_1CHAR_P(table, a, mask)	\
+  ((SYNTAX_COMMENT_BITS (table, a) & (mask)))
+
+#define STYLE_FOUND_P(table, a, b, startp, style)	\
+  ((SYNTAX_COMMENT_BITS (table, a) &			\
+    ((startp) ? SYNTAX_FIRST_CHAR_START :		\
+     SYNTAX_FIRST_CHAR_END) & (style))			\
+   && (SYNTAX_COMMENT_BITS (table, b) &			\
+    ((startp) ? SYNTAX_SECOND_CHAR_START : 		\
+     SYNTAX_SECOND_CHAR_END) & (style)))
+
+#define SYNTAX_COMMENT_MASK_START(table, a, b)			\
+  ((STYLE_FOUND_P (table, a, b, 1, SYNTAX_COMMENT_STYLE_A)	\
+    ? SYNTAX_COMMENT_STYLE_A					\
+    : (STYLE_FOUND_P (table, a, b, 1, SYNTAX_COMMENT_STYLE_B)	\
+         ? SYNTAX_COMMENT_STYLE_B				\
+	 : 0)))
+
+#define SYNTAX_COMMENT_MASK_END(table, a, b)			\
+  ((STYLE_FOUND_P (table, a, b, 0, SYNTAX_COMMENT_STYLE_A)	\
+   ? SYNTAX_COMMENT_STYLE_A					\
+   : (STYLE_FOUND_P (table, a, b, 0, SYNTAX_COMMENT_STYLE_B)	\
+      ? SYNTAX_COMMENT_STYLE_B					\
+      : 0)))
+
+#define STYLE_FOUND_1CHAR_P(table, a, style)	\
+  ((SYNTAX_COMMENT_BITS (table, a) & (style)))
+
+#define SYNTAX_COMMENT_1CHAR_MASK(table, a)			\
+  ((STYLE_FOUND_1CHAR_P (table, a, SYNTAX_COMMENT_STYLE_A)	\
+   ? SYNTAX_COMMENT_STYLE_A					\
+   : (STYLE_FOUND_1CHAR_P (table, a, SYNTAX_COMMENT_STYLE_B)	\
+      ? SYNTAX_COMMENT_STYLE_B					\
+	 : 0)))
+
+/* 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. */
+
+extern CONST unsigned char syntax_spec_code[0400];
+
+/* Indexed by syntax code, give the letter that describes it. */
+
+extern CONST unsigned char syntax_code_spec[];
+
+Lisp_Object scan_lists (struct buffer *buf, int from, int count,
+			int depth, int sexpflag, int no_error);
+int char_quoted (struct buffer *buf, int pos);
+
+/* NOTE: This does not refer to the mirror table, but to the
+   syntax table itself. */
+Lisp_Object syntax_match (Lisp_Object table, Emchar ch);
+
+extern int no_quit_in_re_search;
+extern struct buffer *regex_emacs_buffer;
+
+#endif /* _XEMACS_SYNTAX_H_ */