comparison src/syntax.h @ 460:223736d75acb r21-2-45

Import from CVS: tag r21-2-45
author cvs
date Mon, 13 Aug 2007 11:43:24 +0200
parents abe6d1db359e
children fdefd0186b75
comparison
equal deleted inserted replaced
459:9d4fd877b885 460:223736d75acb
59 Sescape, /* a character that begins a C-style escape */ 59 Sescape, /* a character that begins a C-style escape */
60 Scharquote, /* a character that quotes the following character */ 60 Scharquote, /* a character that quotes the following character */
61 Scomment, /* a comment-starting character */ 61 Scomment, /* a comment-starting character */
62 Sendcomment, /* a comment-ending character */ 62 Sendcomment, /* a comment-ending character */
63 Sinherit, /* use the standard syntax table for this character */ 63 Sinherit, /* use the standard syntax table for this character */
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. */
64 Smax /* Upper bound on codes that are meaningful */ 68 Smax /* Upper bound on codes that are meaningful */
65 }; 69 };
66 70
67 enum syntaxcode charset_syntax (struct buffer *buf, Lisp_Object charset, 71 enum syntaxcode charset_syntax (struct buffer *buf, Lisp_Object charset,
68 int *multi_p_out); 72 int *multi_p_out);
252 syntax table itself. */ 256 syntax table itself. */
253 Lisp_Object syntax_match (Lisp_Object table, Emchar ch); 257 Lisp_Object syntax_match (Lisp_Object table, Emchar ch);
254 258
255 extern int no_quit_in_re_search; 259 extern int no_quit_in_re_search;
256 extern struct buffer *regex_emacs_buffer; 260 extern struct buffer *regex_emacs_buffer;
257 extern int regex_emacs_buffer_p; 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;
258 265
259 void update_syntax_table (Lisp_Char_Table *ct); 266 void update_syntax_table (Lisp_Char_Table *ct);
260 267
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
284 Bufpos next_change; /* Position of the next extent
285 change. */
286 Bufpos prev_change; /* Position of the previous
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)) \
335 ? bytind_to_bufpos (syntax_cache.buffer, \
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)) \
345 ? bytind_to_bufpos (buf, bytepos + BI_BUF_BEGV (buf)) \
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
261 #endif /* INCLUDED_syntax_h_ */ 476 #endif /* INCLUDED_syntax_h_ */