Mercurial > hg > xemacs-beta
diff src/font-lock.c @ 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 | 183866b06e0b |
line wrap: on
line diff
--- a/src/font-lock.c Mon Aug 13 11:42:27 2007 +0200 +++ b/src/font-lock.c Mon Aug 13 11:43:24 2007 +0200 @@ -59,7 +59,9 @@ context_none, context_string, context_comment, - context_block_comment + context_block_comment, + context_generic_comment, + context_generic_string }; enum block_comment_context @@ -333,6 +335,8 @@ context_cache.style = comment_style_none; context_cache.scontext = '\000'; context_cache.depth = 0; + /* #### shouldn't this be checking the character's syntax instead of + explicitly testing for backslash characters? */ context_cache.backslash_p = ((pt > 1) && (BUF_FETCH_CHAR (buf, pt - 1) == '\\')); /* Note that the BOL context cache may not be at the beginning @@ -387,24 +391,24 @@ } } -#define SYNTAX_START_STYLE(table, c1, c2) \ - (SYNTAX_STYLES_MATCH_START_P (table, c1, c2, SYNTAX_COMMENT_STYLE_A) ? \ - comment_style_a : \ - SYNTAX_STYLES_MATCH_START_P (table, c1, c2, SYNTAX_COMMENT_STYLE_B) ? \ - comment_style_b : \ - comment_style_none) - -#define SYNTAX_END_STYLE(table, c1, c2) \ - (SYNTAX_STYLES_MATCH_END_P (table, c1, c2, SYNTAX_COMMENT_STYLE_A) ? \ +#define SYNTAX_START_STYLE(c1, c2) \ + (SYNTAX_CODES_MATCH_START_P (c1, c2, SYNTAX_COMMENT_STYLE_A) ? \ comment_style_a : \ - SYNTAX_STYLES_MATCH_END_P (table, c1, c2, SYNTAX_COMMENT_STYLE_B) ? \ + SYNTAX_CODES_MATCH_START_P (c1, c2, SYNTAX_COMMENT_STYLE_B) ? \ comment_style_b : \ comment_style_none) -#define SINGLE_SYNTAX_STYLE(table, c) \ - (SYNTAX_STYLES_MATCH_1CHAR_P (table, c, SYNTAX_COMMENT_STYLE_A) ? \ +#define SYNTAX_END_STYLE(c1, c2) \ + (SYNTAX_CODES_MATCH_END_P (c1, c2, SYNTAX_COMMENT_STYLE_A) ? \ + comment_style_a : \ + SYNTAX_CODES_MATCH_END_P (c1, c2, SYNTAX_COMMENT_STYLE_B) ? \ + comment_style_b : \ + comment_style_none) + +#define SINGLE_SYNTAX_STYLE(c) \ + (SYNTAX_CODE_MATCHES_1CHAR_P (c, SYNTAX_COMMENT_STYLE_A) ? \ comment_style_a : \ - SYNTAX_STYLES_MATCH_1CHAR_P (table, c, SYNTAX_COMMENT_STYLE_B) ? \ + SYNTAX_CODE_MATCHES_1CHAR_P (c, SYNTAX_COMMENT_STYLE_B) ? \ comment_style_b : \ comment_style_none) @@ -414,17 +418,27 @@ find_context (struct buffer *buf, Bufpos pt) { /* This function can GC */ +#ifndef emacs Lisp_Char_Table *mirrortab = XCHAR_TABLE (buf->mirror_syntax_table); Lisp_Object syntaxtab = buf->syntax_table; +#endif Emchar prev_c, c; + int prev_syncode, syncode; Bufpos target = pt; setup_context_cache (buf, pt); pt = context_cache.cur_point; + SETUP_SYNTAX_CACHE (pt - 1, 1); if (pt > BUF_BEGV (buf)) - c = BUF_FETCH_CHAR (buf, pt - 1); + { + c = BUF_FETCH_CHAR (buf, pt - 1); + syncode = SYNTAX_CODE_FROM_CACHE (mirrortab, c); + } else - c = '\n'; /* to get bol_context_cache at point-min */ + { + c = '\n'; /* to get bol_context_cache at point-min */ + syncode = Swhitespace; + } for (; pt < target; pt++, context_cache.cur_point = pt) { @@ -459,8 +473,11 @@ } } + UPDATE_SYNTAX_CACHE_FORWARD (pt); prev_c = c; + prev_syncode = syncode; c = BUF_FETCH_CHAR (buf, pt); + syncode = SYNTAX_CODE_FROM_CACHE (mirrortab, c); if (prev_c == '\n') bol_context_cache = context_cache; @@ -471,7 +488,7 @@ continue; } - switch (SYNTAX (mirrortab, c)) + switch (SYNTAX_FROM_CACHE (mirrortab, c)) { case Sescape: context_cache.backslash_p = 1; @@ -492,13 +509,13 @@ { context_cache.context = context_comment; context_cache.ccontext = ccontext_none; - context_cache.style = SINGLE_SYNTAX_STYLE (mirrortab, c); + context_cache.style = SINGLE_SYNTAX_STYLE (syncode); if (context_cache.style == comment_style_none) abort (); } break; case Sendcomment: - if (context_cache.style != SINGLE_SYNTAX_STYLE (mirrortab, c)) + if (context_cache.style != SINGLE_SYNTAX_STYLE (syncode)) ; else if (context_cache.context == context_comment) { @@ -525,7 +542,8 @@ } else if (context_cache.context == context_none) { - Lisp_Object stringtermobj = syntax_match (syntaxtab, c); + Lisp_Object stringtermobj = + syntax_match (syntax_cache.current_syntax_table, c); Emchar stringterm; if (CHARP (stringtermobj)) @@ -538,6 +556,35 @@ } break; } + + case Scomment_fence: + { + if (context_cache.context == context_generic_comment) + { + context_cache.context = context_none; + } + else if (context_cache.context == context_none) + { + context_cache.context = context_generic_comment; + context_cache.ccontext = ccontext_none; + } + break; + } + + case Sstring_fence: + { + if (context_cache.context == context_generic_string) + { + context_cache.context = context_none; + } + else if (context_cache.context == context_none) + { + context_cache.context = context_generic_string; + context_cache.ccontext = ccontext_none; + } + break; + } + default: ; } @@ -546,18 +593,18 @@ Now we've got to hack multi-char sequences that start and end block comments. */ - if ((SYNTAX_COMMENT_BITS (mirrortab, c) & + if ((SYNTAX_CODE_COMMENT_BITS (syncode) & SYNTAX_SECOND_CHAR_START) && context_cache.context == context_none && context_cache.ccontext == ccontext_start1 && - SYNTAX_START_P (mirrortab, prev_c, c) /* the two chars match */ + SYNTAX_CODES_START_P (prev_syncode, syncode) /* the two chars match */ ) { context_cache.ccontext = ccontext_start2; - context_cache.style = SYNTAX_START_STYLE (mirrortab, prev_c, c); + context_cache.style = SYNTAX_START_STYLE (prev_syncode, syncode); if (context_cache.style == comment_style_none) abort (); } - else if ((SYNTAX_COMMENT_BITS (mirrortab, c) & + else if ((SYNTAX_CODE_COMMENT_BITS (syncode) & SYNTAX_FIRST_CHAR_START) && context_cache.context == context_none && (context_cache.ccontext == ccontext_none || @@ -566,29 +613,30 @@ context_cache.ccontext = ccontext_start1; context_cache.style = comment_style_none; /* should be this already*/ } - else if ((SYNTAX_COMMENT_BITS (mirrortab, c) & + else if ((SYNTAX_CODE_COMMENT_BITS (syncode) & SYNTAX_SECOND_CHAR_END) && context_cache.context == context_block_comment && context_cache.ccontext == ccontext_end1 && - SYNTAX_END_P (mirrortab, prev_c, c) && + SYNTAX_CODES_END_P (prev_syncode, syncode) && /* the two chars match */ context_cache.style == - SYNTAX_END_STYLE (mirrortab, prev_c, c) + SYNTAX_END_STYLE (prev_syncode, syncode) ) { context_cache.context = context_none; context_cache.ccontext = ccontext_none; context_cache.style = comment_style_none; } - else if ((SYNTAX_COMMENT_BITS (mirrortab, c) & + else if ((SYNTAX_CODE_COMMENT_BITS (syncode) & SYNTAX_FIRST_CHAR_END) && context_cache.context == context_block_comment && - (context_cache.style == - SYNTAX_END_STYLE (mirrortab, c, - BUF_FETCH_CHAR (buf, pt+1))) && + context_cache.style == SINGLE_SYNTAX_STYLE (syncode) && (context_cache.ccontext == ccontext_start2 || context_cache.ccontext == ccontext_end1)) - /* #### is it right to check for end1 here?? */ + /* #### is it right to check for end1 here?? + yes, because this might be a repetition of the first char + of a comment-end sequence. ie, '/xxx foo xxx/' or + '/xxx foo x/', where 'x' = '*' -- mct */ { if (context_cache.style == comment_style_none) abort (); context_cache.ccontext = ccontext_end1; @@ -627,10 +675,12 @@ { switch (context) { - case context_none: return Qnil; - case context_string: return Qstring; - case context_comment: return Qcomment; - case context_block_comment: return Qblock_comment; + case context_none: return Qnil; + case context_string: return Qstring; + case context_comment: return Qcomment; + case context_block_comment: return Qblock_comment; + case context_generic_comment: return Qblock_comment; + case context_generic_string: return Qstring; default: abort (); return Qnil; /* suppress compiler warning */ } } @@ -721,7 +771,9 @@ if (this_context == context_block_comment && context_cache.ccontext == ccontext_start2) estart -= 2; - else if (this_context == context_comment) + else if (this_context == context_comment + || this_context == context_generic_comment + ) estart -= 1; edepth = context_cache.depth; @@ -737,7 +789,9 @@ a part of the comment. */ if ((this_context == context_block_comment || - this_context == context_comment) + this_context == context_comment + || this_context == context_generic_comment + ) && pt < e) eend++;