/* Declarations having to do with XEmacs syntax tables.
Copyright (C) 1985, 1992, 1993 Free Software Foundation, Inc.
+ Copyright (C) 2001,2003,2004 MORIOKA Tomohiko
This file is part of XEmacs.
now an abstract type, where we control all access.
*/
+/* The standard syntax table is stored where it will automatically
+ be used in all new buffers. */
+extern Lisp_Object Vstandard_syntax_table;
+
enum syntaxcode
{
Swhitespace, /* whitespace character */
/* Return the syntax code for a particular character and mirror table. */
+#ifdef UTF2000
+INLINE_HEADER enum syntaxcode
+SYNTAX_CODE_UNSAFE (Lisp_Char_Table *table, Emchar c);
+INLINE_HEADER enum syntaxcode
+SYNTAX_CODE_UNSAFE (Lisp_Char_Table *table, Emchar c)
+{
+ Lisp_Object code = CHAR_TABLE_VALUE_UNSAFE (table, c);
+ enum syntaxcode ret = Spunct;
+
+ if (CONSP (code))
+ code = XCAR (code);
+ ret = XINT (code);
+
+ if (ret == Sinherit)
+ {
+ code = CHAR_TABLE_VALUE_UNSAFE (XCHAR_TABLE
+ (Vstandard_syntax_table), c);
+ if (CONSP (code))
+ code = XCAR (code);
+ return XINT (code);
+ }
+ else
+ return ret;
+}
+#else
#define SYNTAX_CODE_UNSAFE(table, c) \
- XINT (CHAR_TABLE_VALUE_UNSAFE (table, c))
+ ((enum syntaxcode) XINT (CHAR_TABLE_VALUE_UNSAFE (table, c)))
+#endif
-INLINE_HEADER int SYNTAX_CODE (Lisp_Char_Table *table, Emchar c);
-INLINE_HEADER int
+INLINE_HEADER enum syntaxcode SYNTAX_CODE (Lisp_Char_Table *table, Emchar c);
+INLINE_HEADER enum syntaxcode
SYNTAX_CODE (Lisp_Char_Table *table, Emchar c)
{
return SYNTAX_CODE_UNSAFE (table, c);
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.
+
+From the internals manual:
+
+Syntax codes are implemented as bitfields in an int. Bits 0-6 contain
+the syntax code itself, bit 7 is a special prefix flag used for Lisp,
+and bits 16-23 contain comment syntax flags. From the Lisp programmer's
+point of view, there are 11 flags: 2 styles X 2 characters X @{start,
+end@} flags for two-character comment delimiters, 2 style flags for
+one-character comment delimiters, and the prefix flag.
+
+Internally, however, the characters used in multi-character delimiters
+will have non-comment-character syntax classes (@emph{e.g.}, the
+@samp{/} in C's @samp{/}@samp{*} comment-start delimiter has ``punctuation''
+\(here meaning ``operator-like'') class in C modes). Thus in a mixed
+comment style, such as C++'s @samp{//} to end of line, is represented by
+giving @samp{/} the ``punctuation'' class and the ``style b first
+character of start sequence'' and ``style b second character of start
+sequence'' flags. The fact that class is @emph{not} punctuation allows
+the syntax scanner to recognize that this is a multi-character
+delimiter. The @samp{newline} character is given (single-character)
+``comment-end'' @emph{class} and the ``style b first character of end
+sequence'' @emph{flag}. The ``comment-end'' class allows the scanner to
+determine that no second character is needed to terminate the comment.
*/
-#define SYNTAX_COMMENT_BITS(table, c) \
- ((SYNTAX_CODE (table, c) >> 16) &0xff)
+#define SYNTAX_COMMENT_BITS(c) \
+ ((SYNTAX_CODE (mirrortab, c) >> 16) &0xff)
#define SYNTAX_FIRST_OF_START_A 0x80
#define SYNTAX_FIRST_OF_START_B 0x40
/* #### These are now more or less equivalent to
SYNTAX_COMMENT_MATCH_START ...*/
/* a and b must be first and second start chars for a common type */
-#define SYNTAX_START_P(table, a, b) \
- (((SYNTAX_COMMENT_BITS (table, a) & SYNTAX_FIRST_CHAR_START) >> 2) \
- & (SYNTAX_COMMENT_BITS (table, b) & SYNTAX_SECOND_CHAR_START))
+#define SYNTAX_START_P(a, b) \
+ (((SYNTAX_COMMENT_BITS (a) & SYNTAX_FIRST_CHAR_START) >> 2) \
+ & (SYNTAX_COMMENT_BITS (b) & SYNTAX_SECOND_CHAR_START))
/* ... and SYNTAX_COMMENT_MATCH_END */
/* a and b must be first and second end chars for a common type */
-#define SYNTAX_END_P(table, a, b) \
- (((SYNTAX_COMMENT_BITS (table, a) & SYNTAX_FIRST_CHAR_END) >> 2) \
- & (SYNTAX_COMMENT_BITS (table, b) & SYNTAX_SECOND_CHAR_END))
+#define SYNTAX_END_P(a, b) \
+ (((SYNTAX_COMMENT_BITS (a) & SYNTAX_FIRST_CHAR_END) >> 2) \
+ & (SYNTAX_COMMENT_BITS (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_START_P(a, b, mask) \
+ ((SYNTAX_COMMENT_BITS (a) & SYNTAX_FIRST_CHAR_START & (mask)) \
+ && (SYNTAX_COMMENT_BITS (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_END_P(a, b, mask) \
+ ((SYNTAX_COMMENT_BITS (a) & SYNTAX_FIRST_CHAR_END & (mask)) \
+ && (SYNTAX_COMMENT_BITS (b) & SYNTAX_SECOND_CHAR_END & (mask)))
-#define SYNTAX_STYLES_MATCH_1CHAR_P(table, a, mask) \
- ((SYNTAX_COMMENT_BITS (table, a) & (mask)))
+#define SYNTAX_STYLES_MATCH_1CHAR_P(a, mask) \
+ ((SYNTAX_COMMENT_BITS (a) & (mask)))
-#define STYLE_FOUND_P(table, a, b, startp, style) \
- ((SYNTAX_COMMENT_BITS (table, a) & \
+#define STYLE_FOUND_P(a, b, startp, style) \
+ ((SYNTAX_COMMENT_BITS (a) & \
((startp) ? SYNTAX_FIRST_CHAR_START : \
SYNTAX_FIRST_CHAR_END) & (style)) \
- && (SYNTAX_COMMENT_BITS (table, b) & \
+ && (SYNTAX_COMMENT_BITS (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 \
+#define SYNTAX_COMMENT_MASK_START(a, b) \
+ ((STYLE_FOUND_P (a, b, 1, SYNTAX_COMMENT_STYLE_A) \
+ ? SYNTAX_COMMENT_STYLE_A \
+ : (STYLE_FOUND_P (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 \
+#define SYNTAX_COMMENT_MASK_END(a, b) \
+ ((STYLE_FOUND_P (a, b, 0, SYNTAX_COMMENT_STYLE_A) \
+ ? SYNTAX_COMMENT_STYLE_A \
+ : (STYLE_FOUND_P (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 STYLE_FOUND_1CHAR_P(a, style) \
+ ((SYNTAX_COMMENT_BITS (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 \
+#define SYNTAX_COMMENT_1CHAR_MASK(a) \
+ ((STYLE_FOUND_1CHAR_P (a, SYNTAX_COMMENT_STYLE_A) \
+ ? SYNTAX_COMMENT_STYLE_A \
+ : (STYLE_FOUND_1CHAR_P (a, SYNTAX_COMMENT_STYLE_B) \
+ ? SYNTAX_COMMENT_STYLE_B \
: 0)))
EXFUN (Fchar_syntax, 2);
EXFUN (Fforward_word, 2);
-/* The standard syntax table is stored where it will automatically
- be used in all new buffers. */
-extern Lisp_Object Vstandard_syntax_table;
-
/* 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 int no_quit_in_re_search;
extern struct buffer *regex_emacs_buffer;
-/* This is the string or buffer in which we are matching. It is used
- for looking up syntax properties. */
+/* Target text (string or buffer), used for syntax-table properties. */
extern Lisp_Object regex_match_object;
+#ifndef UTF2000
void update_syntax_table (Lisp_Char_Table *ct);
+#endif
+
+/* The syntax table cache */
+
+/*
+ The *-single-property-change versions turn out to be unbearably slow.
+ Do not enable them in a production or distribution version.
+*/
+#define NEXT_SINGLE_PROPERTY_CHANGE 0
+#define PREVIOUS_SINGLE_PROPERTY_CHANGE 0
+
+/* Test instruments, used in macros below.
+ Define SYNTAX_CACHE_STATISTICS to enable them. */
+/* #undef SYNTAX_CACHE_STATISTICS */
+
+#ifdef SYNTAX_CACHE_STATISTICS
+#define SYNTAX_CACHE_STATISTICS_REPORT_INTERVAL 100000
+
+enum syntax_cache_statistics_functions {
+ scs_no_function = -1,
+ scs_find_context = 0,
+ scs_find_defun_start,
+ scs_scan_words,
+ scs_Fforward_comment,
+ scs_scan_lists,
+ scs_Fbackward_prefix_characters,
+ scs_scan_sexps_forward,
+ scs_number_of_functions
+};
+
+/* keep this in synch with syntax.c */
+extern char* syntax_cache_statistics_function_names[scs_number_of_functions];
+
+struct syntax_cache_statistics {
+ /* inits + misses_hi + misses_lo + #HITS = total_updates */
+ int total_updates;
+ int inits;
+ int misses_lo;
+ int misses_hi;
+ int min_length;
+ int max_length;
+ double mean_length;
+ double mean_length_on_miss;
+ enum syntax_cache_statistics_functions this_function;
+ int functions[scs_number_of_functions];
+};
+
+extern struct syntax_cache_statistics scs_statistics;
+
+#define SCS_STATISTICS_SET_FUNCTION(fndx) scs_statistics.this_function = fndx
+/* used in macros below */
+#define SYNTAX_CACHE_STATISTICS_COUNT_INIT scs_statistics.inits++
-#ifdef emacs
+#else
+
+#define SCS_STATISTICS_SET_FUNCTION(fndx)
+#define SYNTAX_CACHE_STATISTICS_COUNT_INIT
+
+#endif /* SYNTAX_CACHE_STATISTICS */
+
+/* Theory of the syntax table cache
+
+ This cache cooperates with but is conceptually different from the
+ mirror table. The mirror table precomputes (and caches, if you like)
+ the syntax codes for characters in a given syntax table, taking into
+ account possible inheritance from a table given by a parent text object.
+ The syntax table cache checks for overriding tables defined by
+ _subobjects_.
+
+ This implementation defines the "subobjects" by _extent properties_.
+ We may restrict them to _text_ properties. There are two lookup
+ styles for the cache, "single code" and "full table". In the "single
+ code" style, a given syntax code, kept in the `syntax_code' member, is
+ applied to the entire range (#### check this). In the "full table"
+ style, a syntax table kept in the `current_syntax_table' member is
+ checked for each character in the range. If the flag `use_code' is
+ non-zero, the "single code" is used, otherwise the "full table".
+
+ The cache is valid for the range `[prev_change, next_change)' in the
+ text object (buffer or string) `object'.
+
+ If the current position is outside the range valid for the cache, the
+ cache is updated by checking for the text property `syntax-table'. If
+ present, its value is either a syntax code or a syntax table, and the
+ appropriate member and `use_code' are updated accordingly. If absent
+ or nil, the default syntax table from the `buffer' member is used. The
+ extent of the property is used to reinitialize the cache's validity
+ range. (We would like to improve this by checking the property value
+ against `old_prop', and if the same, extend the validity range of the
+ cache by the extent of the property.)
+
+ Note: the values Qt and Qnil for `object' are not supported in this
+ implementation. GNU Emacs uses them for reasons not yet (####) clear.
+*/
extern int lookup_syntax_properties;
{
int use_code; /* Whether to use syntax_code
or current_syntax_table. */
- struct buffer* buffer; /* The buffer the current syntax cache
- applies to. */
+ struct buffer* buffer; /* The buffer providing the default
+ syntax table to the cache. */
Lisp_Object object; /* The buffer or string the current
syntax cache applies to. */
- int syntax_code; /* Syntax code of current char. */
+ enum syntaxcode syntax_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. */
};
extern struct syntax_cache syntax_cache;
-void update_syntax_cache (int pos, int count, int init);
+/*
+ The macros below handle the internal structure of the cache.
+ ALWAYS USE THE MACROS TO MANIPULATE THE CACHE.
+
+ o Use the SETUP_SYNTAX_CACHE* macros to set the object and buffer members.
+
+ OBJECT is either a Lisp buffer or a Lisp string. BUFFER is a
+ pointer to struct buffer. If OBJECT is a buffer, it must refer to
+ BUFFER. If OBJECT is a string, then BUFFER will supply the default
+ syntax table when the `syntax-table' property is nil.
+
+ For convenience and backward compatibility, the values Qt and Qnil are
+ accepted for OBJECT. These are taken to refer to the current buffer,
+ and that substitution is made immediately. The value Qt is treated
+ specially in the *BYTE_TO_CHAR macros below. This appears (####) to
+ be a GNU kludge related to `enable-multibyte-characters' and was used
+ only in dired.c.
+
+ FROM is the starting character position in OBJECT.
+ COUNT is currently used only as a flag. If positive, we are proceeding
+ forward through OBJECT, otherwise in reverse.
+ o All other members are updated using the update_syntax_cache
+ function, normally wrapped in the UPDATE_SYNTAX_CACHE* macros.
+*/
+
+void update_syntax_cache (int pos, int count);
+
+/* in one example the high misses vastly outweigh the low ones
+ seems plausible, since we typically are moving forward through the buffer */
+#define UPDATE_SYNTAX_CACHE_INTERNAL(pos, dir) \
+ ((lookup_syntax_properties && \
+ (pos >= syntax_cache.next_change || \
+ pos < syntax_cache.prev_change)) \
+ ? (update_syntax_cache ((pos), dir), 1) \
+ : 0)
+
+/* In the current implementation, all of the following are identical. */
/* Make syntax cache state good for CHARPOS, assuming it is
currently good for a position before CHARPOS. */
-#define UPDATE_SYNTAX_CACHE_FORWARD(pos) \
- (lookup_syntax_properties \
- ? (update_syntax_cache ((pos), 1, 0), 1) \
- : 0)
+#define UPDATE_SYNTAX_CACHE_FORWARD(pos) UPDATE_SYNTAX_CACHE_INTERNAL(pos, 1)
/* Make syntax cache state good for CHARPOS, assuming it is
currently good for a position after CHARPOS. */
-#define UPDATE_SYNTAX_CACHE_BACKWARD(pos) \
- (lookup_syntax_properties \
- ? (update_syntax_cache ((pos), -1, 0), 1) \
- : 0)
+#define UPDATE_SYNTAX_CACHE_BACKWARD(pos) UPDATE_SYNTAX_CACHE_INTERNAL(pos, -1)
/* Make syntax cache state good for CHARPOS */
-#define UPDATE_SYNTAX_CACHE(pos) \
- (lookup_syntax_properties \
- ? (update_syntax_cache ((pos), 0, 0), 1) \
- : 0)
+#define UPDATE_SYNTAX_CACHE(pos) UPDATE_SYNTAX_CACHE_INTERNAL(pos, 0)
#define SYNTAX_FROM_CACHE(table, c) \
SYNTAX_FROM_CODE (SYNTAX_CODE_FROM_CACHE (table, c))
)
/* Convert the byte offset BYTEPOS into a character position,
- for the object recorded in syntax_cache with SETUP_SYNTAX_TABLE_FOR_OBJECT.
-
- The value is meant for use in the UPDATE_SYNTAX_TABLE... macros.
- These macros do nothing when parse_sexp_lookup_properties is 0,
- so we return 0 in that case, for speed. */
-#define SYNTAX_CACHE_BYTE_TO_CHAR(bytepos) \
- (! lookup_syntax_properties \
- ? 0 \
- : STRINGP (syntax_cache.object) \
- ? bytecount_to_charcount (XSTRING_DATA (syntax_cache.object), bytepos) \
- : (BUFFERP (syntax_cache.object) || NILP (syntax_cache.object)) \
- ? bytind_to_bufpos (syntax_cache.buffer, \
- bytepos + BI_BUF_BEGV (syntax_cache.buffer)) \
- : (bytepos))
+ for the object recorded in syntax_cache with SETUP_SYNTAX_CACHE*.
+ The value is meant for use in the UPDATE_SYNTAX_CACHE... macros.
+ These macros do nothing when lookup_syntax_properties is 0,
+ so we return 0 in that case, for speed.
+
+ The default case does no conversion; this seems (####) to be an
+ evil hangover from GNU Emacs. */
#define SYNTAX_CACHE_OBJECT_BYTE_TO_CHAR(obj, buf, bytepos) \
(! lookup_syntax_properties \
? 0 \
? bytind_to_bufpos (buf, bytepos + BI_BUF_BEGV (buf)) \
: (bytepos))
-#else /* not emacs */
-
-#define update_syntax_cache(pos, count, init)
-#define UPDATE_SYNTAX_CACHE_FORWARD(pos)
-#define UPDATE_SYNTAX_CACHE_BACKWARD(pos)
-#define UPDATE_SYNTAX_CACHE(pos)
-#define SYNTAX_FROM_CACHE SYNTAX
-#define SYNTAX_CODE_FROM_CACHE SYNTAX_CODE
-
-#endif /* emacs */
+#define SYNTAX_CACHE_BYTE_TO_CHAR(bytepos) \
+ SYNTAX_CACHE_OBJECT_BYTE_TO_CHAR (syntax_cache.object, syntax_cache.buffer, \
+ (bytepos))
#define SETUP_SYNTAX_CACHE(FROM, COUNT) \
- do { \
- syntax_cache.buffer = current_buffer; \
- syntax_cache.object = Qnil; \
- syntax_cache.current_syntax_table \
- = current_buffer->mirror_syntax_table; \
- syntax_cache.use_code = 0; \
- if (lookup_syntax_properties) \
- update_syntax_cache ((COUNT) > 0 ? (FROM) : (FROM) - 1, \
- (COUNT), 1); \
- } while (0)
+ SETUP_SYNTAX_CACHE_FOR_BUFFER (current_buffer, (FROM), (COUNT))
#define SETUP_SYNTAX_CACHE_FOR_BUFFER(BUFFER, FROM, COUNT) \
- do { \
- syntax_cache.buffer = (BUFFER); \
- syntax_cache.object = Qnil; \
- syntax_cache.current_syntax_table = \
- syntax_cache.buffer->mirror_syntax_table; \
- syntax_cache.use_code = 0; \
- if (lookup_syntax_properties) \
- update_syntax_cache ((FROM) + ((COUNT) > 0 ? 0 : -1), \
- (COUNT), 1); \
- } while (0)
+ SETUP_SYNTAX_CACHE_FOR_OBJECT (Qnil, (BUFFER), (FROM), (COUNT))
+#ifdef UTF2000
#define SETUP_SYNTAX_CACHE_FOR_OBJECT(OBJECT, BUFFER, FROM, COUNT) \
do { \
syntax_cache.buffer = (BUFFER); \
syntax_cache.object = (OBJECT); \
if (NILP (syntax_cache.object)) \
{ \
- /* do nothing */; \
+ XSETBUFFER (syntax_cache.object, syntax_cache.buffer); \
} \
else if (EQ (syntax_cache.object, Qt)) \
{ \
+ XSETBUFFER (syntax_cache.object, syntax_cache.buffer); \
+ } \
+ else if (STRINGP (syntax_cache.object)) \
+ { \
/* do nothing */; \
} \
+ else if (BUFFERP (syntax_cache.object)) \
+ { \
+ syntax_cache.buffer = XBUFFER (syntax_cache.object); \
+ } \
+ else \
+ { \
+ /* OBJECT must be buffer/string/t/nil */ \
+ assert(0); \
+ } \
+ syntax_cache.current_syntax_table \
+ = syntax_cache.buffer->syntax_table; \
+ syntax_cache.use_code = 0; \
+ if (lookup_syntax_properties) \
+ { \
+ SYNTAX_CACHE_STATISTICS_COUNT_INIT; \
+ update_syntax_cache ((FROM) + ((COUNT) > 0 ? 0 : -1), (COUNT)); \
+ } \
+ } while (0)
+#else
+#define SETUP_SYNTAX_CACHE_FOR_OBJECT(OBJECT, BUFFER, FROM, COUNT) \
+ do { \
+ syntax_cache.buffer = (BUFFER); \
+ syntax_cache.object = (OBJECT); \
+ if (NILP (syntax_cache.object)) \
+ { \
+ XSETBUFFER (syntax_cache.object, syntax_cache.buffer); \
+ } \
+ else if (EQ (syntax_cache.object, Qt)) \
+ { \
+ XSETBUFFER (syntax_cache.object, syntax_cache.buffer); \
+ } \
else if (STRINGP (syntax_cache.object)) \
{ \
/* do nothing */; \
= syntax_cache.buffer->mirror_syntax_table; \
syntax_cache.use_code = 0; \
if (lookup_syntax_properties) \
- update_syntax_cache ((FROM) + ((COUNT) > 0 ? 0 : -1), \
- (COUNT), 1); \
+ { \
+ SYNTAX_CACHE_STATISTICS_COUNT_INIT; \
+ update_syntax_cache ((FROM) + ((COUNT) > 0 ? 0 : -1), (COUNT)); \
+ } \
} while (0)
+#endif
#define SYNTAX_CODE_PREFIX(c) \
((c >> 7) & 1)
#define SYNTAX_CODES_MATCH_START_P(a, b, mask) \
((SYNTAX_CODE_COMMENT_BITS (a) & SYNTAX_FIRST_CHAR_START & (mask)) \
- && (SYNTAX_CODE_COMMENT_BITS (b) \
- & SYNTAX_SECOND_CHAR_START & (mask)))
+ && (SYNTAX_CODE_COMMENT_BITS (b) & SYNTAX_SECOND_CHAR_START & (mask)))
#define SYNTAX_CODES_MATCH_END_P(a, b, mask) \
((SYNTAX_CODE_COMMENT_BITS (a) & SYNTAX_FIRST_CHAR_END & (mask)) \
? SYNTAX_COMMENT_STYLE_B \
: 0)))
+#if 0
+/* These are the things that need to be #defined away to create a
+ no syntax-table property version. */
+
+/* This should be entirely encapsulated in macros
+#define update_syntax_cache(pos, count)
+*/
+#define lookup_syntax_properties 0
+
+#define SETUP_SYNTAX_CACHE(FROM, COUNT)
+#define SETUP_SYNTAX_CACHE_FOR_BUFFER(BUFFER, FROM, COUNT)
+#define SETUP_SYNTAX_CACHE_FOR_OBJECT(OBJECT, BUFFER, FROM, COUNT)
+#define UPDATE_SYNTAX_CACHE_FORWARD(pos)
+#define UPDATE_SYNTAX_CACHE_BACKWARD(pos)
+#define UPDATE_SYNTAX_CACHE(pos)
+
+#define SYNTAX_FROM_CACHE SYNTAX
+#define SYNTAX_CODE_FROM_CACHE SYNTAX_CODE
+
+#define SYNTAX_CACHE_BYTE_TO_CHAR(x) 0
+
+/* cache statistics */
+#define SCS_STATISTICS_SET_FUNCTION(fndx)
+#define SYNTAX_CACHE_STATISTICS_COUNT_INIT
+#endif /* 0 */
#endif /* INCLUDED_syntax_h_ */