# HG changeset patch # User Richard M. Stallman # Date 897164413 0 # Node ID 1f0dc0251be382db1d74a6482cff54506e1b8dc7 # Parent 6c4756ecd4a29e672ad42f515209b51831afb670 (scan_lists): Properly skip the comment-fence character that ends a comment, when moving forward. (Fbackward_prefix_chars): Return immediately if point is at BEGV. (prev_char_comend_first): New function. (back_comment): Use that. Carefully update syntax table position for each character that is fetched. (Fforward_comment): Likewise. (scan_lists): Likewise. (prev_char_comstart_first): New function. diff -r 6c4756ecd4a2 -r 1f0dc0251be3 src/syntax.c --- a/src/syntax.c Sat Jun 06 17:52:43 1998 +0000 +++ b/src/syntax.c Sat Jun 06 20:20:13 1998 +0000 @@ -130,7 +130,7 @@ invalidate = 0; if (NULL_INTERVAL_P (i)) return; - /* interval_of () updates only ->position of the return value, + /* interval_of updates only ->position of the return value, so update the parents manually to speed up update_interval. */ while (!NULL_PARENT (i)) { @@ -158,7 +158,7 @@ else if (charpos < i->position) /* Move left. */ { if (count > 0) - error ("Error in syntax_table logic for intervals <-."); + error ("Error in syntax_table logic for intervals <-"); /* Update the interval. */ i = update_interval (i, charpos); if (oldi->position != INTERVAL_LAST_POS (i)) @@ -172,7 +172,7 @@ else if (charpos >= INTERVAL_LAST_POS (i)) /* Move right. */ { if (count < 0) - error ("Error in syntax_table logic for intervals ->."); + error ("Error in syntax_table logic for intervals ->"); /* Update the interval. */ i = update_interval (i, charpos); if (i->position != INTERVAL_LAST_POS (oldi)) @@ -394,6 +394,38 @@ return find_start_value; } +/* Return the SYNTAX_COMEND_FIRST of the character before POS, POS_BYTE. */ + +static int +prev_char_comend_first (pos, pos_byte) + int pos, pos_byte; +{ + int c, val; + + DEC_BOTH (pos, pos_byte); + UPDATE_SYNTAX_TABLE_BACKWARD (pos); + c = FETCH_CHAR (pos_byte); + val = SYNTAX_COMEND_FIRST (c); + UPDATE_SYNTAX_TABLE_FORWARD (pos + 1); + return val; +} + +/* Return the SYNTAX_COMSTART_FIRST of the character before POS, POS_BYTE. */ + +static int +prev_char_comstart_first (pos, pos_byte) + int pos, pos_byte; +{ + int c, val; + + DEC_BOTH (pos, pos_byte); + UPDATE_SYNTAX_TABLE_BACKWARD (pos); + c = FETCH_CHAR (pos_byte); + val = SYNTAX_COMSTART_FIRST (c); + UPDATE_SYNTAX_TABLE_FORWARD (pos + 1); + return val; +} + /* Checks whether charpos FROM is at the end of a comment. FROM_BYTE is the bytepos corresponding to FROM. Do not move back before STOP. @@ -444,7 +476,7 @@ that determines quote parity to the comment-end. */ while (from != stop) { - int temp_byte; + int temp_byte, prev_comend_second; /* Move back and examine a character. */ DEC_BOTH (from, from_byte); @@ -456,23 +488,25 @@ /* If this char is the second of a 2-char comment end sequence, back up and give the pair the appropriate syntax. */ if (from > stop && SYNTAX_COMEND_SECOND (c) - && (temp_byte = dec_bytepos (from_byte), - SYNTAX_COMEND_FIRST (FETCH_CHAR (temp_byte)))) + && prev_char_comend_first (from, from_byte)) { code = Sendcomment; DEC_BOTH (from, from_byte); - /* This is apparently the best we can do: */ UPDATE_SYNTAX_TABLE_BACKWARD (from); c = FETCH_CHAR (from_byte); } /* If this char starts a 2-char comment start sequence, treat it like a 1-char comment starter. */ - if (from < scanstart && SYNTAX_COMSTART_FIRST (c) - && (temp_byte = inc_bytepos (from_byte), - (SYNTAX_COMSTART_SECOND (FETCH_CHAR (temp_byte)) - && comstyle == SYNTAX_COMMENT_STYLE (FETCH_CHAR (temp_byte))))) - code = Scomment; + if (from < scanstart && SYNTAX_COMSTART_FIRST (c)) + { + temp_byte = inc_bytepos (from_byte); + UPDATE_SYNTAX_TABLE_FORWARD (from + 1); + if (SYNTAX_COMSTART_SECOND (FETCH_CHAR (temp_byte)) + && comstyle == SYNTAX_COMMENT_STYLE (FETCH_CHAR (temp_byte))) + code = Scomment; + UPDATE_SYNTAX_TABLE_BACKWARD (from); + } /* Ignore escaped characters, except comment-enders. */ if (code != Sendcomment && char_quoted (from, from_byte)) @@ -1590,6 +1624,8 @@ { do { + int comstart_first; + if (from == stop) { SET_PT_BOTH (from, from_byte); @@ -1599,9 +1635,11 @@ UPDATE_SYNTAX_TABLE_FORWARD (from); c = FETCH_CHAR (from_byte); code = SYNTAX (c); + comstart_first = SYNTAX_COMSTART_FIRST (c); INC_BOTH (from, from_byte); + UPDATE_SYNTAX_TABLE_FORWARD (from); comstyle = 0; - if (from < stop && SYNTAX_COMSTART_FIRST (c) + if (from < stop && comstart_first && (c1 = FETCH_CHAR (from_byte), SYNTAX_COMSTART_SECOND (c1))) { @@ -1649,9 +1687,10 @@ section. */ break; if (from < stop && SYNTAX_COMEND_FIRST (c) + && SYNTAX_COMMENT_STYLE (c) == comstyle && (c1 = FETCH_CHAR (from_byte), - SYNTAX_COMEND_SECOND (c1)) - && SYNTAX_COMMENT_STYLE (c) == comstyle) + UPDATE_SYNTAX_TABLE_FORWARD (from), + SYNTAX_COMEND_SECOND (c1))) /* we have encountered a comment end of the same style as the comment sequence which began this comment section */ @@ -1668,7 +1707,8 @@ { while (1) { - int quoted; + int quoted, comstart_second; + if (from <= stop) { SET_PT_BOTH (BEGV, BEGV_BYTE); @@ -1677,34 +1717,34 @@ } DEC_BOTH (from, from_byte); + /* char_quoted does UPDATE_SYNTAX_TABLE_BACKWARD (from). */ quoted = char_quoted (from, from_byte); if (quoted) { DEC_BOTH (from, from_byte); goto leave; } - UPDATE_SYNTAX_TABLE_BACKWARD (from); c = FETCH_CHAR (from_byte); code = SYNTAX (c); comstyle = 0; if (code == Sendcomment) comstyle = SYNTAX_COMMENT_STYLE (c); - temp_pos = dec_bytepos (from_byte); + comstart_second = SYNTAX_COMSTART_SECOND (c); if (from > stop && SYNTAX_COMEND_SECOND (c) - && (c1 = FETCH_CHAR (temp_pos), - SYNTAX_COMEND_FIRST (c1)) + && prev_char_comend_first (from, from_byte) && !char_quoted (from - 1, temp_pos)) { /* We must record the comment style encountered so that later, we can match only the proper comment begin sequence of the same style. */ + DEC_BOTH (from, from_byte); code = Sendcomment; - comstyle = SYNTAX_COMMENT_STYLE (c1); - DEC_BOTH (from, from_byte); + /* Calling char_quoted, above, set up global syntax position + at the new value of FROM. */ + comstyle = SYNTAX_COMMENT_STYLE (FETCH_CHAR (from_byte)); } - if (from > stop && SYNTAX_COMSTART_SECOND (c) - && (c1 = FETCH_CHAR (temp_pos), - SYNTAX_COMSTART_FIRST (c1)) + if (from > stop && comstart_second + && prev_char_comstart_first (from, from_byte) && !char_quoted (from - 1, temp_pos)) { /* We must record the comment style encountered so that @@ -1798,14 +1838,17 @@ { while (from < stop) { + int comstart_first, prefix; UPDATE_SYNTAX_TABLE_FORWARD (from); c = FETCH_CHAR (from_byte); code = SYNTAX (c); + comstart_first = SYNTAX_COMSTART_FIRST (c); + prefix = SYNTAX_PREFIX (c); if (depth == min_depth) last_good = from; INC_BOTH (from, from_byte); UPDATE_SYNTAX_TABLE_FORWARD (from); - if (from < stop && SYNTAX_COMSTART_FIRST (c) + if (from < stop && comstart_first && SYNTAX_COMSTART_SECOND (FETCH_CHAR (from_byte)) && parse_sexp_ignore_comments) { @@ -1817,10 +1860,10 @@ code = Scomment; comstyle = SYNTAX_COMMENT_STYLE (FETCH_CHAR (from_byte)); INC_BOTH (from, from_byte); + UPDATE_SYNTAX_TABLE_FORWARD (from); } - UPDATE_SYNTAX_TABLE_FORWARD (from); - if (SYNTAX_PREFIX (c)) + if (prefix) continue; switch (SWITCH_ENUM_CAST (code)) @@ -1871,6 +1914,7 @@ } UPDATE_SYNTAX_TABLE_FORWARD (from); c = FETCH_CHAR (from_byte); + INC_BOTH (from, from_byte); if (code == Scomment ? (SYNTAX (c) == Sendcomment && SYNTAX_COMMENT_STYLE (c) == comstyle) @@ -1879,10 +1923,10 @@ as the comment sequence which began this comment section */ break; - INC_BOTH (from, from_byte); if (from < stop && SYNTAX_COMEND_FIRST (c) - && SYNTAX_COMEND_SECOND (FETCH_CHAR (from_byte)) && SYNTAX_COMMENT_STYLE (c) == comstyle + && (UPDATE_SYNTAX_TABLE_FORWARD (from), + SYNTAX_COMEND_SECOND (FETCH_CHAR (from_byte))) && code == Scomment) /* we have encountered a comment end of the same style as the comment sequence which began this comment @@ -1975,25 +2019,22 @@ comstyle = 0; if (code == Sendcomment) comstyle = SYNTAX_COMMENT_STYLE (c); - temp_pos = from_byte; - if (! NILP (current_buffer->enable_multibyte_characters)) - DEC_POS (temp_pos); - else - temp_pos--; if (from > stop && SYNTAX_COMEND_SECOND (c) - && (c1 = FETCH_CHAR (temp_pos), SYNTAX_COMEND_FIRST (c1)) + && prev_char_comstart_first (from, from_byte) && parse_sexp_ignore_comments) { - /* 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. */ + DEC_BOTH (from, from_byte); + UPDATE_SYNTAX_TABLE_BACKWARD (from); code = Sendcomment; - comstyle = SYNTAX_COMMENT_STYLE (c1); - DEC_BOTH (from, from_byte); + comstyle = SYNTAX_COMMENT_STYLE (FETCH_CHAR (from_byte)); } /* Quoting turns anything except a comment-ender - into a word character. */ + into a word character. Note that this if cannot be true + if we decremented FROM in the if-statement above. */ if (code != Sendcomment && char_quoted (from, from_byte)) code = Sword; else if (SYNTAX_PREFIX (c)) @@ -2192,11 +2233,15 @@ int pos_byte = PT_BYTE; int c; - if (pos > beg) + if (pos <= beg) { - SETUP_SYNTAX_TABLE (pos, -1); + SET_PT_BOTH (opoint, opoint_byte); + + return Qnil; } + SETUP_SYNTAX_TABLE (pos, -1); + DEC_BOTH (pos, pos_byte); while (!char_quoted (pos, pos_byte)