428
|
1 /* Declarations having to do with XEmacs syntax tables.
|
|
2 Copyright (C) 1985, 1992, 1993 Free Software Foundation, Inc.
|
|
3
|
|
4 This file is part of XEmacs.
|
|
5
|
|
6 XEmacs is free software; you can redistribute it and/or modify it
|
|
7 under the terms of the GNU General Public License as published by the
|
|
8 Free Software Foundation; either version 2, or (at your option) any
|
|
9 later version.
|
|
10
|
|
11 XEmacs is distributed in the hope that it will be useful, but WITHOUT
|
|
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
14 for more details.
|
|
15
|
|
16 You should have received a copy of the GNU General Public License
|
|
17 along with XEmacs; see the file COPYING. If not, write to
|
|
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
19 Boston, MA 02111-1307, USA. */
|
|
20
|
|
21 /* Synched up with: FSF 19.28. */
|
|
22
|
440
|
23 #ifndef INCLUDED_syntax_h_
|
|
24 #define INCLUDED_syntax_h_
|
428
|
25
|
|
26 #include "chartab.h"
|
|
27
|
|
28 /* A syntax table is a type of char table.
|
|
29
|
|
30 The low 7 bits of the integer is a code, as follows. The 8th bit is
|
|
31 used as the prefix bit flag (see below).
|
|
32
|
|
33 The values in a syntax table are either integers or conses of
|
|
34 integers and chars. The lowest 7 bits of the integer are the syntax
|
|
35 class. If this is Sinherit, then the actual syntax value needs to
|
|
36 be retrieved from the standard syntax table.
|
|
37
|
|
38 Since the logic involved in finding the actual integer isn't very
|
|
39 complex, you'd think the time required to retrieve it is not a
|
|
40 factor. If you thought that, however, you'd be wrong, due to the
|
|
41 high number of times (many per character) that the syntax value is
|
|
42 accessed in functions such as scan_lists(). To speed this up,
|
|
43 we maintain a mirror syntax table that contains the actual
|
|
44 integers. We can do this successfully because syntax tables are
|
|
45 now an abstract type, where we control all access.
|
|
46 */
|
|
47
|
|
48 enum syntaxcode
|
|
49 {
|
|
50 Swhitespace, /* whitespace character */
|
|
51 Spunct, /* random punctuation character */
|
|
52 Sword, /* word constituent */
|
|
53 Ssymbol, /* symbol constituent but not word constituent */
|
|
54 Sopen, /* a beginning delimiter */
|
|
55 Sclose, /* an ending delimiter */
|
|
56 Squote, /* a prefix character like Lisp ' */
|
|
57 Sstring, /* a string-grouping character like Lisp " */
|
|
58 Smath, /* delimiters like $ in TeX. */
|
|
59 Sescape, /* a character that begins a C-style escape */
|
|
60 Scharquote, /* a character that quotes the following character */
|
|
61 Scomment, /* a comment-starting character */
|
|
62 Sendcomment, /* a comment-ending character */
|
|
63 Sinherit, /* use the standard syntax table for this character */
|
460
|
64 Scomment_fence, /* Starts/ends comment which is delimited on the
|
|
65 other side by a char with the same syntaxcode. */
|
|
66 Sstring_fence, /* Starts/ends string which is delimited on the
|
|
67 other side by a char with the same syntaxcode. */
|
428
|
68 Smax /* Upper bound on codes that are meaningful */
|
|
69 };
|
|
70
|
|
71 enum syntaxcode charset_syntax (struct buffer *buf, Lisp_Object charset,
|
|
72 int *multi_p_out);
|
|
73
|
|
74 /* Return the syntax code for a particular character and mirror table. */
|
|
75
|
|
76 #define SYNTAX_CODE_UNSAFE(table, c) \
|
|
77 XINT (CHAR_TABLE_VALUE_UNSAFE (table, c))
|
|
78
|
442
|
79 INLINE_HEADER int SYNTAX_CODE (Lisp_Char_Table *table, Emchar c);
|
|
80 INLINE_HEADER int
|
440
|
81 SYNTAX_CODE (Lisp_Char_Table *table, Emchar c)
|
428
|
82 {
|
|
83 return SYNTAX_CODE_UNSAFE (table, c);
|
|
84 }
|
|
85
|
|
86 #define SYNTAX_UNSAFE(table, c) \
|
|
87 ((enum syntaxcode) (SYNTAX_CODE_UNSAFE (table, c) & 0177))
|
|
88
|
|
89 #define SYNTAX_FROM_CODE(code) ((enum syntaxcode) ((code) & 0177))
|
|
90 #define SYNTAX(table, c) SYNTAX_FROM_CODE (SYNTAX_CODE (table, c))
|
|
91
|
442
|
92 INLINE_HEADER int WORD_SYNTAX_P (Lisp_Char_Table *table, Emchar c);
|
|
93 INLINE_HEADER int
|
440
|
94 WORD_SYNTAX_P (Lisp_Char_Table *table, Emchar c)
|
428
|
95 {
|
|
96 return SYNTAX (table, c) == Sword;
|
|
97 }
|
|
98
|
|
99 /* OK, here's a graphic diagram of the format of the syntax values:
|
|
100
|
|
101 Bit number:
|
|
102
|
|
103 [ 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 ]
|
|
104 [ 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 ]
|
|
105
|
|
106 <-----> <-----> <-------------> <-------------> ^ <----------->
|
|
107 ELisp unused |comment bits | unused | syntax code
|
|
108 tag | | | | | | | | |
|
|
109 stuff | | | | | | | | |
|
|
110 | | | | | | | | |
|
|
111 | | | | | | | | `--> prefix flag
|
|
112 | | | | | | | |
|
|
113 | | | | | | | `--> comment end style B, second char
|
|
114 | | | | | | `----> comment end style A, second char
|
|
115 | | | | | `------> comment end style B, first char
|
|
116 | | | | `--------> comment end style A, first char
|
|
117 | | | `----------> comment start style B, second char
|
|
118 | | `------------> comment start style A, second char
|
|
119 | `--------------> comment start style B, first char
|
|
120 `----------------> comment start style A, first char
|
|
121
|
|
122 In a 64-bit integer, there would be 32 more unused bits between
|
|
123 the tag and the comment bits.
|
|
124
|
|
125 Clearly, such a scheme will not work for Mule, because the matching
|
|
126 paren could be any character and as such requires 19 bits, which
|
|
127 we don't got.
|
|
128
|
|
129 Remember that under Mule we use char tables instead of vectors.
|
|
130 So what we do is use another char table for the matching paren
|
|
131 and store a pointer to it in the first char table. (This frees
|
|
132 code from having to worry about passing two tables around.)
|
|
133 */
|
|
134
|
|
135
|
|
136 /* The prefix flag bit for backward-prefix-chars is now put into bit 7. */
|
|
137
|
|
138 #define SYNTAX_PREFIX_UNSAFE(table, c) \
|
|
139 ((SYNTAX_CODE_UNSAFE (table, c) >> 7) & 1)
|
|
140 #define SYNTAX_PREFIX(table, c) \
|
|
141 ((SYNTAX_CODE (table, c) >> 7) & 1)
|
|
142
|
|
143 /* Bits 23-16 are used to implement up to two comment styles
|
|
144 in a single buffer. They have the following meanings:
|
|
145
|
|
146 1. first of a one or two character comment-start sequence of style a.
|
|
147 2. first of a one or two character comment-start sequence of style b.
|
|
148 3. second of a two-character comment-start sequence of style a.
|
|
149 4. second of a two-character comment-start sequence of style b.
|
|
150 5. first of a one or two character comment-end sequence of style a.
|
|
151 6. first of a one or two character comment-end sequence of style b.
|
|
152 7. second of a two-character comment-end sequence of style a.
|
|
153 8. second of a two-character comment-end sequence of style b.
|
|
154 */
|
|
155
|
|
156 #define SYNTAX_COMMENT_BITS(table, c) \
|
|
157 ((SYNTAX_CODE (table, c) >> 16) &0xff)
|
|
158
|
|
159 #define SYNTAX_FIRST_OF_START_A 0x80
|
|
160 #define SYNTAX_FIRST_OF_START_B 0x40
|
|
161 #define SYNTAX_SECOND_OF_START_A 0x20
|
|
162 #define SYNTAX_SECOND_OF_START_B 0x10
|
|
163 #define SYNTAX_FIRST_OF_END_A 0x08
|
|
164 #define SYNTAX_FIRST_OF_END_B 0x04
|
|
165 #define SYNTAX_SECOND_OF_END_A 0x02
|
|
166 #define SYNTAX_SECOND_OF_END_B 0x01
|
|
167
|
|
168 #define SYNTAX_COMMENT_STYLE_A 0xaa
|
|
169 #define SYNTAX_COMMENT_STYLE_B 0x55
|
|
170 #define SYNTAX_FIRST_CHAR_START 0xc0
|
|
171 #define SYNTAX_FIRST_CHAR_END 0x0c
|
|
172 #define SYNTAX_FIRST_CHAR 0xcc
|
|
173 #define SYNTAX_SECOND_CHAR_START 0x30
|
|
174 #define SYNTAX_SECOND_CHAR_END 0x03
|
|
175 #define SYNTAX_SECOND_CHAR 0x33
|
|
176
|
|
177
|
442
|
178 /* #### These are now more or less equivalent to
|
|
179 SYNTAX_COMMENT_MATCH_START ...*/
|
|
180 /* a and b must be first and second start chars for a common type */
|
|
181 #define SYNTAX_START_P(table, a, b) \
|
|
182 (((SYNTAX_COMMENT_BITS (table, a) & SYNTAX_FIRST_CHAR_START) >> 2) \
|
|
183 & (SYNTAX_COMMENT_BITS (table, b) & SYNTAX_SECOND_CHAR_START))
|
|
184
|
|
185 /* ... and SYNTAX_COMMENT_MATCH_END */
|
|
186 /* a and b must be first and second end chars for a common type */
|
|
187 #define SYNTAX_END_P(table, a, b) \
|
|
188 (((SYNTAX_COMMENT_BITS (table, a) & SYNTAX_FIRST_CHAR_END) >> 2) \
|
|
189 & (SYNTAX_COMMENT_BITS (table, b) & SYNTAX_SECOND_CHAR_END))
|
428
|
190
|
|
191 #define SYNTAX_STYLES_MATCH_START_P(table, a, b, mask) \
|
|
192 ((SYNTAX_COMMENT_BITS (table, a) & SYNTAX_FIRST_CHAR_START & (mask)) \
|
|
193 && (SYNTAX_COMMENT_BITS (table, b) & SYNTAX_SECOND_CHAR_START & (mask)))
|
|
194
|
|
195 #define SYNTAX_STYLES_MATCH_END_P(table, a, b, mask) \
|
|
196 ((SYNTAX_COMMENT_BITS (table, a) & SYNTAX_FIRST_CHAR_END & (mask)) \
|
|
197 && (SYNTAX_COMMENT_BITS (table, b) & SYNTAX_SECOND_CHAR_END & (mask)))
|
|
198
|
|
199 #define SYNTAX_STYLES_MATCH_1CHAR_P(table, a, mask) \
|
|
200 ((SYNTAX_COMMENT_BITS (table, a) & (mask)))
|
|
201
|
|
202 #define STYLE_FOUND_P(table, a, b, startp, style) \
|
|
203 ((SYNTAX_COMMENT_BITS (table, a) & \
|
|
204 ((startp) ? SYNTAX_FIRST_CHAR_START : \
|
|
205 SYNTAX_FIRST_CHAR_END) & (style)) \
|
|
206 && (SYNTAX_COMMENT_BITS (table, b) & \
|
|
207 ((startp) ? SYNTAX_SECOND_CHAR_START : \
|
|
208 SYNTAX_SECOND_CHAR_END) & (style)))
|
|
209
|
|
210 #define SYNTAX_COMMENT_MASK_START(table, a, b) \
|
|
211 ((STYLE_FOUND_P (table, a, b, 1, SYNTAX_COMMENT_STYLE_A) \
|
|
212 ? SYNTAX_COMMENT_STYLE_A \
|
|
213 : (STYLE_FOUND_P (table, a, b, 1, SYNTAX_COMMENT_STYLE_B) \
|
|
214 ? SYNTAX_COMMENT_STYLE_B \
|
|
215 : 0)))
|
|
216
|
|
217 #define SYNTAX_COMMENT_MASK_END(table, a, b) \
|
|
218 ((STYLE_FOUND_P (table, a, b, 0, SYNTAX_COMMENT_STYLE_A) \
|
|
219 ? SYNTAX_COMMENT_STYLE_A \
|
|
220 : (STYLE_FOUND_P (table, a, b, 0, SYNTAX_COMMENT_STYLE_B) \
|
|
221 ? SYNTAX_COMMENT_STYLE_B \
|
|
222 : 0)))
|
|
223
|
|
224 #define STYLE_FOUND_1CHAR_P(table, a, style) \
|
|
225 ((SYNTAX_COMMENT_BITS (table, a) & (style)))
|
|
226
|
|
227 #define SYNTAX_COMMENT_1CHAR_MASK(table, a) \
|
|
228 ((STYLE_FOUND_1CHAR_P (table, a, SYNTAX_COMMENT_STYLE_A) \
|
|
229 ? SYNTAX_COMMENT_STYLE_A \
|
|
230 : (STYLE_FOUND_1CHAR_P (table, a, SYNTAX_COMMENT_STYLE_B) \
|
|
231 ? SYNTAX_COMMENT_STYLE_B \
|
|
232 : 0)))
|
|
233
|
|
234 EXFUN (Fchar_syntax, 2);
|
|
235 EXFUN (Fforward_word, 2);
|
|
236
|
|
237 /* The standard syntax table is stored where it will automatically
|
|
238 be used in all new buffers. */
|
|
239 extern Lisp_Object Vstandard_syntax_table;
|
|
240
|
|
241 /* This array, indexed by a character, contains the syntax code which
|
|
242 that character signifies (as a char).
|
|
243 For example, (enum syntaxcode) syntax_spec_code['w'] is Sword. */
|
|
244
|
442
|
245 extern const unsigned char syntax_spec_code[0400];
|
428
|
246
|
|
247 /* Indexed by syntax code, give the letter that describes it. */
|
|
248
|
442
|
249 extern const unsigned char syntax_code_spec[];
|
428
|
250
|
665
|
251 Lisp_Object scan_lists (struct buffer *buf, Charbpos from, int count,
|
428
|
252 int depth, int sexpflag, int no_error);
|
665
|
253 int char_quoted (struct buffer *buf, Charbpos pos);
|
428
|
254
|
|
255 /* NOTE: This does not refer to the mirror table, but to the
|
|
256 syntax table itself. */
|
|
257 Lisp_Object syntax_match (Lisp_Object table, Emchar ch);
|
|
258
|
|
259 extern int no_quit_in_re_search;
|
|
260 extern struct buffer *regex_emacs_buffer;
|
460
|
261
|
|
262 /* This is the string or buffer in which we are matching. It is used
|
|
263 for looking up syntax properties. */
|
|
264 extern Lisp_Object regex_match_object;
|
428
|
265
|
440
|
266 void update_syntax_table (Lisp_Char_Table *ct);
|
428
|
267
|
460
|
268 #ifdef emacs
|
|
269
|
|
270 extern int lookup_syntax_properties;
|
|
271
|
|
272 struct syntax_cache
|
|
273 {
|
|
274 int use_code; /* Whether to use syntax_code
|
|
275 or current_syntax_table. */
|
|
276 struct buffer* buffer; /* The buffer the current syntax cache
|
|
277 applies to. */
|
|
278 Lisp_Object object; /* The buffer or string the current
|
|
279 syntax cache applies to. */
|
|
280 int syntax_code; /* Syntax code of current char. */
|
|
281 Lisp_Object current_syntax_table; /* Syntax table for current pos. */
|
|
282 Lisp_Object old_prop; /* Syntax-table prop at prev pos. */
|
|
283
|
665
|
284 Charbpos next_change; /* Position of the next extent
|
460
|
285 change. */
|
665
|
286 Charbpos prev_change; /* Position of the previous
|
460
|
287 extent change. */
|
|
288 };
|
|
289 extern struct syntax_cache syntax_cache;
|
|
290
|
|
291 void update_syntax_cache (int pos, int count, int init);
|
|
292
|
|
293 /* Make syntax cache state good for CHARPOS, assuming it is
|
|
294 currently good for a position before CHARPOS. */
|
|
295 #define UPDATE_SYNTAX_CACHE_FORWARD(pos) \
|
|
296 (lookup_syntax_properties \
|
|
297 ? (update_syntax_cache ((pos), 1, 0), 1) \
|
|
298 : 0)
|
|
299
|
|
300 /* Make syntax cache state good for CHARPOS, assuming it is
|
|
301 currently good for a position after CHARPOS. */
|
|
302 #define UPDATE_SYNTAX_CACHE_BACKWARD(pos) \
|
|
303 (lookup_syntax_properties \
|
|
304 ? (update_syntax_cache ((pos), -1, 0), 1) \
|
|
305 : 0)
|
|
306
|
|
307 /* Make syntax cache state good for CHARPOS */
|
|
308 #define UPDATE_SYNTAX_CACHE(pos) \
|
|
309 (lookup_syntax_properties \
|
|
310 ? (update_syntax_cache ((pos), 0, 0), 1) \
|
|
311 : 0)
|
|
312
|
|
313 #define SYNTAX_FROM_CACHE(table, c) \
|
|
314 SYNTAX_FROM_CODE (SYNTAX_CODE_FROM_CACHE (table, c))
|
|
315
|
|
316 #define SYNTAX_CODE_FROM_CACHE(table, c) \
|
|
317 ( syntax_cache.use_code \
|
|
318 ? syntax_cache.syntax_code \
|
|
319 : SYNTAX_CODE (XCHAR_TABLE (syntax_cache.current_syntax_table), \
|
|
320 c) \
|
|
321 )
|
|
322
|
|
323 /* Convert the byte offset BYTEPOS into a character position,
|
|
324 for the object recorded in syntax_cache with SETUP_SYNTAX_TABLE_FOR_OBJECT.
|
|
325
|
|
326 The value is meant for use in the UPDATE_SYNTAX_TABLE... macros.
|
|
327 These macros do nothing when parse_sexp_lookup_properties is 0,
|
|
328 so we return 0 in that case, for speed. */
|
|
329 #define SYNTAX_CACHE_BYTE_TO_CHAR(bytepos) \
|
|
330 (! lookup_syntax_properties \
|
|
331 ? 0 \
|
|
332 : STRINGP (syntax_cache.object) \
|
|
333 ? bytecount_to_charcount (XSTRING_DATA (syntax_cache.object), bytepos) \
|
|
334 : (BUFFERP (syntax_cache.object) || NILP (syntax_cache.object)) \
|
665
|
335 ? bytebpos_to_charbpos (syntax_cache.buffer, \
|
460
|
336 bytepos + BI_BUF_BEGV (syntax_cache.buffer)) \
|
|
337 : (bytepos))
|
|
338
|
|
339 #define SYNTAX_CACHE_OBJECT_BYTE_TO_CHAR(obj, buf, bytepos) \
|
|
340 (! lookup_syntax_properties \
|
|
341 ? 0 \
|
|
342 : STRINGP (obj) \
|
|
343 ? bytecount_to_charcount (XSTRING_DATA (obj), bytepos) \
|
|
344 : (BUFFERP (obj) || NILP (obj)) \
|
665
|
345 ? bytebpos_to_charbpos (buf, bytepos + BI_BUF_BEGV (buf)) \
|
460
|
346 : (bytepos))
|
|
347
|
|
348 #else /* not emacs */
|
|
349
|
|
350 #define update_syntax_cache(pos, count, init)
|
|
351 #define UPDATE_SYNTAX_CACHE_FORWARD(pos)
|
|
352 #define UPDATE_SYNTAX_CACHE_BACKWARD(pos)
|
|
353 #define UPDATE_SYNTAX_CACHE(pos)
|
|
354 #define SYNTAX_FROM_CACHE SYNTAX
|
|
355 #define SYNTAX_CODE_FROM_CACHE SYNTAX_CODE
|
|
356
|
|
357 #endif /* emacs */
|
|
358
|
|
359 #define SETUP_SYNTAX_CACHE(FROM, COUNT) \
|
|
360 do { \
|
|
361 syntax_cache.buffer = current_buffer; \
|
|
362 syntax_cache.object = Qnil; \
|
|
363 syntax_cache.current_syntax_table \
|
|
364 = current_buffer->mirror_syntax_table; \
|
|
365 syntax_cache.use_code = 0; \
|
|
366 if (lookup_syntax_properties) \
|
|
367 update_syntax_cache ((COUNT) > 0 ? (FROM) : (FROM) - 1, \
|
|
368 (COUNT), 1); \
|
|
369 } while (0)
|
|
370
|
|
371 #define SETUP_SYNTAX_CACHE_FOR_BUFFER(BUFFER, FROM, COUNT) \
|
|
372 do { \
|
|
373 syntax_cache.buffer = (BUFFER); \
|
|
374 syntax_cache.object = Qnil; \
|
|
375 syntax_cache.current_syntax_table = \
|
|
376 syntax_cache.buffer->mirror_syntax_table; \
|
|
377 syntax_cache.use_code = 0; \
|
|
378 if (lookup_syntax_properties) \
|
|
379 update_syntax_cache ((FROM) + ((COUNT) > 0 ? 0 : -1), \
|
|
380 (COUNT), 1); \
|
|
381 } while (0)
|
|
382
|
|
383 #define SETUP_SYNTAX_CACHE_FOR_OBJECT(OBJECT, BUFFER, FROM, COUNT) \
|
|
384 do { \
|
|
385 syntax_cache.buffer = (BUFFER); \
|
|
386 syntax_cache.object = (OBJECT); \
|
|
387 if (NILP (syntax_cache.object)) \
|
|
388 { \
|
|
389 /* do nothing */; \
|
|
390 } \
|
|
391 else if (EQ (syntax_cache.object, Qt)) \
|
|
392 { \
|
|
393 /* do nothing */; \
|
|
394 } \
|
|
395 else if (STRINGP (syntax_cache.object)) \
|
|
396 { \
|
|
397 /* do nothing */; \
|
|
398 } \
|
|
399 else if (BUFFERP (syntax_cache.object)) \
|
|
400 { \
|
|
401 syntax_cache.buffer = XBUFFER (syntax_cache.object); \
|
|
402 } \
|
|
403 else \
|
|
404 { \
|
|
405 /* OBJECT must be buffer/string/t/nil */ \
|
|
406 assert(0); \
|
|
407 } \
|
|
408 syntax_cache.current_syntax_table \
|
|
409 = syntax_cache.buffer->mirror_syntax_table; \
|
|
410 syntax_cache.use_code = 0; \
|
|
411 if (lookup_syntax_properties) \
|
|
412 update_syntax_cache ((FROM) + ((COUNT) > 0 ? 0 : -1), \
|
|
413 (COUNT), 1); \
|
|
414 } while (0)
|
|
415
|
|
416 #define SYNTAX_CODE_PREFIX(c) \
|
|
417 ((c >> 7) & 1)
|
|
418
|
|
419 #define SYNTAX_CODE_COMMENT_BITS(c) \
|
|
420 ((c >> 16) &0xff)
|
|
421
|
|
422 #define SYNTAX_CODES_START_P(a, b) \
|
|
423 (((SYNTAX_CODE_COMMENT_BITS (a) & SYNTAX_FIRST_CHAR_START) >> 2) \
|
|
424 & (SYNTAX_CODE_COMMENT_BITS (b) & SYNTAX_SECOND_CHAR_START))
|
|
425
|
|
426 #define SYNTAX_CODES_END_P(a, b) \
|
|
427 (((SYNTAX_CODE_COMMENT_BITS (a) & SYNTAX_FIRST_CHAR_END) >> 2) \
|
|
428 & (SYNTAX_CODE_COMMENT_BITS (b) & SYNTAX_SECOND_CHAR_END))
|
|
429
|
|
430 #define SYNTAX_CODES_COMMENT_MASK_START(a, b) \
|
|
431 (SYNTAX_CODES_MATCH_START_P (a, b, SYNTAX_COMMENT_STYLE_A) \
|
|
432 ? SYNTAX_COMMENT_STYLE_A \
|
|
433 : (SYNTAX_CODES_MATCH_START_P (a, b, SYNTAX_COMMENT_STYLE_B) \
|
|
434 ? SYNTAX_COMMENT_STYLE_B \
|
|
435 : 0))
|
|
436 #define SYNTAX_CODES_COMMENT_MASK_END(a, b) \
|
|
437 (SYNTAX_CODES_MATCH_END_P (a, b, SYNTAX_COMMENT_STYLE_A) \
|
|
438 ? SYNTAX_COMMENT_STYLE_A \
|
|
439 : (SYNTAX_CODES_MATCH_END_P (a, b, SYNTAX_COMMENT_STYLE_B) \
|
|
440 ? SYNTAX_COMMENT_STYLE_B \
|
|
441 : 0))
|
|
442
|
|
443 #define SYNTAX_CODE_START_FIRST_P(a) \
|
|
444 (SYNTAX_CODE_COMMENT_BITS (a) & SYNTAX_FIRST_CHAR_START)
|
|
445
|
|
446 #define SYNTAX_CODE_START_SECOND_P(a) \
|
|
447 (SYNTAX_CODE_COMMENT_BITS (a) & SYNTAX_SECOND_CHAR_START)
|
|
448
|
|
449 #define SYNTAX_CODE_END_FIRST_P(a) \
|
|
450 (SYNTAX_CODE_COMMENT_BITS (a) & SYNTAX_FIRST_CHAR_END)
|
|
451
|
|
452 #define SYNTAX_CODE_END_SECOND_P(a) \
|
|
453 (SYNTAX_CODE_COMMENT_BITS (a) & SYNTAX_SECOND_CHAR_END)
|
|
454
|
|
455
|
|
456 #define SYNTAX_CODES_MATCH_START_P(a, b, mask) \
|
|
457 ((SYNTAX_CODE_COMMENT_BITS (a) & SYNTAX_FIRST_CHAR_START & (mask)) \
|
|
458 && (SYNTAX_CODE_COMMENT_BITS (b) \
|
|
459 & SYNTAX_SECOND_CHAR_START & (mask)))
|
|
460
|
|
461 #define SYNTAX_CODES_MATCH_END_P(a, b, mask) \
|
|
462 ((SYNTAX_CODE_COMMENT_BITS (a) & SYNTAX_FIRST_CHAR_END & (mask)) \
|
|
463 && (SYNTAX_CODE_COMMENT_BITS (b) & SYNTAX_SECOND_CHAR_END & (mask)))
|
|
464
|
|
465 #define SYNTAX_CODE_MATCHES_1CHAR_P(a, mask) \
|
|
466 ((SYNTAX_CODE_COMMENT_BITS (a) & (mask)))
|
|
467
|
|
468 #define SYNTAX_CODE_COMMENT_1CHAR_MASK(a) \
|
|
469 ((SYNTAX_CODE_MATCHES_1CHAR_P (a, SYNTAX_COMMENT_STYLE_A) \
|
|
470 ? SYNTAX_COMMENT_STYLE_A \
|
|
471 : (SYNTAX_CODE_MATCHES_1CHAR_P (a, SYNTAX_COMMENT_STYLE_B) \
|
|
472 ? SYNTAX_COMMENT_STYLE_B \
|
|
473 : 0)))
|
|
474
|
|
475
|
440
|
476 #endif /* INCLUDED_syntax_h_ */
|