From 1fd3172dd4819524d0b63337e525cd48e062e0f5 Mon Sep 17 00:00:00 2001 From: "Richard M. Stallman" Date: Wed, 18 Mar 1998 00:11:33 +0000 Subject: [PATCH] (Fbackward_prefix_chars): Set point properly while scanning. (scan_sexps_forward): Make INC_FROM do UPDATE_SYNTAX_TABLE_FORWARD. Delete the explicit calls to UPDATE_SYNTAX_TABLE_FORWARD. Also set prev_from_syntax (new local var). Test that in the loop, instead of fetching syntax of the previous char. --- src/syntax.c | 43 ++++++++++++++++++++++++++----------------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/src/syntax.c b/src/syntax.c index 4ac1c8d1b83..02357671608 100644 --- a/src/syntax.c +++ b/src/syntax.c @@ -2174,12 +2174,16 @@ This includes chars with \"quote\" or \"prefix\" syntax (' or p).") DEC_BOTH (pos, pos_byte); - while (pos + 1 > beg && !char_quoted (pos, pos_byte) + while (!char_quoted (pos, pos_byte) /* Previous statement updates syntax table. */ && ((c = FETCH_CHAR (pos_byte), SYNTAX (c) == Squote) || SYNTAX_PREFIX (c))) { - DEC_BOTH (pos, pos_byte); + opoint = pos; + opoint_byte = pos_byte; + + if (pos + 1 > beg) + DEC_BOTH (pos, pos_byte); } SET_PT_BOTH (opoint, opoint_byte); @@ -2220,6 +2224,7 @@ scan_sexps_forward (stateptr, from, from_byte, end, targetdepth, Lisp_Object tem; int prev_from; /* Keep one character before FROM. */ int prev_from_byte; + int prev_from_syntax; int boundary_stop = commentstop == -1; int nofence; @@ -2232,14 +2237,15 @@ scan_sexps_forward (stateptr, from, from_byte, end, targetdepth, #define INC_FROM \ do { prev_from = from; \ prev_from_byte = from_byte; \ + prev_from_syntax \ + = SYNTAX_WITH_FLAGS (FETCH_CHAR (prev_from_byte)); \ INC_BOTH (from, from_byte); \ + UPDATE_SYNTAX_TABLE_FORWARD (from); \ } while (0) immediate_quit = 1; QUIT; - SETUP_SYNTAX_TABLE (from, 1); - if (NILP (oldstate)) { depth = 0; @@ -2302,11 +2308,15 @@ do { prev_from = from; \ } if (start_quoted) goto startquoted; + + SETUP_SYNTAX_TABLE (prev_from, 1); + prev_from_syntax = SYNTAX_WITH_FLAGS (FETCH_CHAR (prev_from_byte)); + UPDATE_SYNTAX_TABLE_FORWARD (from); + while (from < end) { - UPDATE_SYNTAX_TABLE_FORWARD (from); - code = SYNTAX (FETCH_CHAR (from_byte)); INC_FROM; + code = prev_from_syntax & 0xff; if (code == Scomment) state.comstr_start = prev_from; @@ -2319,13 +2329,14 @@ do { prev_from = from; \ ? ST_COMMENT_STYLE : SYNTAX_COMMENT_STYLE (FETCH_CHAR (from_byte))); state.comstr_start = prev_from; - if (code != Scomment_fence) INC_FROM; + if (code != Scomment_fence) + INC_FROM; code = Scomment; } else if (from < end) - if (SYNTAX_COMSTART_FIRST (FETCH_CHAR (prev_from_byte))) + if (SYNTAX_FLAGS_COMSTART_FIRST (prev_from_syntax)) if (SYNTAX_COMSTART_SECOND (FETCH_CHAR (from_byte))) - /* Duplicate code to avoid a very complex if-expression + /* Duplicate code to avoid a complex if-expression which causes trouble for the SGI compiler. */ { /* Record the comment style we have entered so that only @@ -2335,11 +2346,12 @@ do { prev_from = from; \ ? ST_COMMENT_STYLE : SYNTAX_COMMENT_STYLE (FETCH_CHAR (from_byte))); state.comstr_start = prev_from; - if (code != Scomment_fence) INC_FROM; + if (code != Scomment_fence) + INC_FROM; code = Scomment; } - if (SYNTAX_PREFIX (FETCH_CHAR (prev_from_byte))) + if (SYNTAX_FLAGS_PREFIX (prev_from_syntax)) continue; switch (SWITCH_ENUM_CAST (code)) { @@ -2359,7 +2371,6 @@ do { prev_from = from; \ symstarted: while (from < end) { - UPDATE_SYNTAX_TABLE_FORWARD (from); switch (SWITCH_ENUM_CAST (SYNTAX (FETCH_CHAR (from_byte)))) { case Scharquote: @@ -2387,7 +2398,6 @@ do { prev_from = from; \ { /* Enter the loop in the middle so that we find a 2-char comment ender if we start in the middle of it. */ - prev = FETCH_CHAR (prev_from_byte); goto startincomment_1; } /* At beginning of buffer, enter the loop the ordinary way. */ @@ -2401,7 +2411,6 @@ do { prev_from = from; \ while (1) { if (from == end) goto done; - UPDATE_SYNTAX_TABLE_FORWARD (from); prev = FETCH_CHAR (from_byte); if (SYNTAX (prev) == Sendcomment && SYNTAX_COMMENT_STYLE (prev) == state.comstyle) @@ -2414,9 +2423,10 @@ do { prev_from = from; \ break; INC_FROM; startincomment_1: - if (from < end && SYNTAX_COMEND_FIRST (prev) + if (from < end && SYNTAX_FLAGS_COMEND_FIRST (prev_from_syntax) && SYNTAX_COMEND_SECOND (FETCH_CHAR (from_byte)) - && SYNTAX_COMMENT_STYLE (prev) == state.comstyle) + && (SYNTAX_FLAGS_COMMENT_STYLE (prev_from_syntax) + == state.comstyle)) /* Only terminate the comment section if the end-comment sequence of the same style as the start sequence has been encountered. */ @@ -2470,7 +2480,6 @@ do { prev_from = from; \ if (from >= end) goto done; c = FETCH_CHAR (from_byte); if (nofence && c == state.instring) break; - UPDATE_SYNTAX_TABLE_FORWARD (from); switch (SWITCH_ENUM_CAST (SYNTAX (c))) { case Sstring_fence: -- 2.39.5