X-Git-Url: http://git.hcoop.net/bpt/emacs.git/blobdiff_plain/58980a95f8b5f5b1e32f279262ebad27101134c9..f32b54d420f23e5da7b9b89f06daff69d7b31511:/src/syntax.c diff --git a/src/syntax.c b/src/syntax.c index c16c371f0c..c06cb4bd6e 100644 --- a/src/syntax.c +++ b/src/syntax.c @@ -18,7 +18,7 @@ along with GNU Emacs; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include "config.h" +#include #include #include "lisp.h" #include "commands.h" @@ -84,7 +84,7 @@ find_defun_start (pos) return find_start_value; /* Back up to start of line. */ - tem = scan_buffer ('\n', pos, -1, &shortage); + tem = scan_buffer ('\n', pos, -1, &shortage, 1); while (tem > BEGV) { @@ -92,7 +92,7 @@ find_defun_start (pos) if (SYNTAX (FETCH_CHAR (tem)) == Sopen) break; /* Move to beg of previous line. */ - tem = scan_buffer ('\n', tem, -2, &shortage); + tem = scan_buffer ('\n', tem, -2, &shortage, 1); } /* Record what we found, for the next try. */ @@ -197,7 +197,7 @@ unsigned char syntax_spec_code[0400] = 0377, 0377, 0377, 0377, 0377, 0377, 0377, 0377, 0377, 0377, 0377, 0377, (char) Scomment, 0377, (char) Sendcomment, 0377, - 0377, 0377, 0377, 0377, 0377, 0377, 0377, 0377, /* @, A, ... */ + (char) Sinherit, 0377, 0377, 0377, 0377, 0377, 0377, 0377, /* @, A ... */ 0377, 0377, 0377, 0377, 0377, 0377, 0377, 0377, 0377, 0377, 0377, 0377, 0377, 0377, 0377, (char) Sword, 0377, 0377, 0377, 0377, (char) Sescape, 0377, 0377, (char) Ssymbol, @@ -209,9 +209,9 @@ unsigned char syntax_spec_code[0400] = /* Indexed by syntax code, give the letter that describes it. */ -char syntax_code_spec[13] = +char syntax_code_spec[14] = { - ' ', '.', 'w', '_', '(', ')', '\'', '\"', '$', '\\', '/', '<', '>' + ' ', '.', 'w', '_', '(', ')', '\'', '\"', '$', '\\', '/', '<', '>', '@' }; DEFUN ("char-syntax", Fchar_syntax, Schar_syntax, 1, 1, 0, @@ -240,8 +240,9 @@ The first character of S should be one of the following:\n\ ( open-parenthesis. ) close-parenthesis.\n\ \" string quote. \\ escape.\n\ $ paired delimiter. ' expression quote or prefix operator.\n\ - < comment starter. > comment ender.\n\ - / character-quote.\n\ + < comment starter. > comment ender.\n\ + / character-quote. @ inherit from `standard-syntax-table'.\n\ +\n\ Only single-character comment start and end sequences are represented thus.\n\ Two-character sequences are represented as described below.\n\ The second character of S is the matching parenthesis,\n\ @@ -255,8 +256,8 @@ Defined flags are the characters 1, 2, 3, 4, b, and p.\n\ \n\ There can be up to two orthogonal comment sequences. This is to support\n\ language modes such as C++. By default, all comment sequences are of style\n\ -a, but you can set the comment sequence style to b (on the second character of a\n\ -comment-start, or the first character of a comment-end sequence) by using\n\ +a, but you can set the comment sequence style to b (on the second character\n\ +of a comment-start, or the first character of a comment-end sequence) using\n\ this flag:\n\ b means C is part of comment sequence b.\n\ \n\ @@ -419,6 +420,8 @@ describe_syntax (value) insert_string ("comment"); break; case Sendcomment: insert_string ("endcomment"); break; + case Sinherit: + insert_string ("inherit"); break; default: insert_string ("invalid"); return; @@ -596,8 +599,13 @@ between them, return t; otherwise return nil.") while (count1 > 0) { stop = ZV; - while (from < stop) + do { + if (from == stop) + { + SET_PT (from); + return Qnil; + } c = FETCH_CHAR (from); code = SYNTAX (c); from++; @@ -605,54 +613,49 @@ between them, return t; otherwise return nil.") if (from < stop && SYNTAX_COMSTART_FIRST (c) && SYNTAX_COMSTART_SECOND (FETCH_CHAR (from))) { - /* we have encountered a comment start sequence and we - are ignoring all text inside comments. we must record + /* We have encountered a comment start sequence and we + are ignoring all text inside comments. We must record the comment style this sequence begins so that later, only a comment end of the same style actually ends - the comment section */ + the comment section. */ code = Scomment; comstyle = SYNTAX_COMMENT_STYLE (FETCH_CHAR (from)); from++; } - - if (code == Scomment) - { - while (1) - { - if (from == stop) - { - immediate_quit = 0; - SET_PT (from); - return Qnil; - } - c = FETCH_CHAR (from); - if (SYNTAX (c) == Sendcomment - && SYNTAX_COMMENT_STYLE (c) == comstyle) - /* we have encountered a comment end of the same style - as the comment sequence which began this comment - section */ - break; - from++; - if (from < stop && SYNTAX_COMEND_FIRST (c) - && SYNTAX_COMEND_SECOND (FETCH_CHAR (from)) - && SYNTAX_COMMENT_STYLE (c) == comstyle) - /* we have encountered a comment end of the same style - as the comment sequence which began this comment - section */ - { from++; break; } - } - /* We have skipped one comment. */ - break; - } - else if (code != Swhitespace && code != Sendcomment) + } + while (code == Swhitespace || code == Sendcomment); + if (code != Scomment) + { + immediate_quit = 0; + SET_PT (from - 1); + return Qnil; + } + /* We're at the start of a comment. */ + while (1) + { + if (from == stop) { immediate_quit = 0; - SET_PT (from - 1); + SET_PT (from); return Qnil; } + c = FETCH_CHAR (from); + if (SYNTAX (c) == Sendcomment + && SYNTAX_COMMENT_STYLE (c) == comstyle) + /* we have encountered a comment end of the same style + as the comment sequence which began this comment + section */ + break; + from++; + if (from < stop && SYNTAX_COMEND_FIRST (c) + && SYNTAX_COMEND_SECOND (FETCH_CHAR (from)) + && SYNTAX_COMMENT_STYLE (c) == comstyle) + /* we have encountered a comment end of the same style + as the comment sequence which began this comment + section */ + { from++; break; } } - - /* End of comment reached */ + /* We have skipped one comment. */ count1--; } @@ -670,13 +673,15 @@ between them, return t; otherwise return nil.") c = FETCH_CHAR (from); code = SYNTAX (c); comstyle = 0; + if (code == Sendcomment) + comstyle = SYNTAX_COMMENT_STYLE (c); if (from > stop && SYNTAX_COMEND_SECOND (c) && SYNTAX_COMEND_FIRST (FETCH_CHAR (from - 1)) && !char_quoted (from - 1)) { - /* we must record the comment style encountered so that + /* We must record the comment style encountered so that later, we can match only the proper comment begin - sequence of the same style */ + sequence of the same style. */ code = Sendcomment; comstyle = SYNTAX_COMMENT_STYLE (FETCH_CHAR (from - 1)); from--; @@ -819,6 +824,8 @@ between them, return t; otherwise return nil.") from = comment_end; } } + /* We have skipped one comment. */ + break; } else if ((code != Swhitespace && code != Scomment) || quoted) { @@ -1013,6 +1020,9 @@ scan_lists (from, count, depth, sexpflag) from--; c = FETCH_CHAR (from); code = SYNTAX (c); + comstyle = 0; + if (code == Sendcomment) + comstyle = SYNTAX_COMMENT_STYLE (c); if (from > stop && SYNTAX_COMEND_SECOND (c) && SYNTAX_COMEND_FIRST (FETCH_CHAR (from - 1)) && !char_quoted (from - 1) @@ -1589,20 +1599,20 @@ Parsing stops at TO or when certain criteria are met;\n\ If fifth arg STATE is omitted or nil,\n\ parsing assumes that FROM is the beginning of a function.\n\ Value is a list of eight elements describing final state of parsing:\n\ - 1. depth in parens.\n\ - 2. character address of start of innermost containing list; nil if none.\n\ - 3. character address of start of last complete sexp terminated.\n\ - 4. non-nil if inside a string.\n\ + 0. depth in parens.\n\ + 1. character address of start of innermost containing list; nil if none.\n\ + 2. character address of start of last complete sexp terminated.\n\ + 3. non-nil if inside a string.\n\ (it is the character that will terminate the string.)\n\ - 5. t if inside a comment.\n\ - 6. t if following a quote character.\n\ - 7. the minimum paren-depth encountered during this scan.\n\ - 8. t if in a comment of style `b'.\n\ + 4. t if inside a comment.\n\ + 5. t if following a quote character.\n\ + 6. the minimum paren-depth encountered during this scan.\n\ + 7. t if in a comment of style `b'.\n\ If third arg TARGETDEPTH is non-nil, parsing stops if the depth\n\ in parentheses becomes equal to TARGETDEPTH.\n\ Fourth arg STOPBEFORE non-nil means stop when come to\n\ any character that starts a sexp.\n\ -Fifth arg STATE is a seven-list like what this function returns.\n\ +Fifth arg STATE is an eight-list like what this function returns.\n\ It is used to initialize the state of the parse. Its second and third elements are ignored. Sixth args COMMENTSTOP non-nil means stop at the start of a comment.")