This patch enables repeated calls to `parse-partial-sexp' with correct
(nth 1 state). It is w.r.t. version of 19.33 with my patch for syntax-assist
applied.
*** ./src/syntax.c 1998/06/07 20:35:02 1.3
--- ./src/syntax.c 1998/06/07 21:24:00
*************** struct lisp_parse_state
*** 65,70 ****
--- 65,72 ----
int location; /* Char number at which parsing stopped. */
int mindepth; /* Minimum depth seen while scanning. */
int comstr_start; /* Position just after last comment/string starter. */
+ Lisp_Object levelstarts; /* Char numbers of starts-of-expression
+ of levels (starting from outermost). */
};
/* These variables are a cache for finding the start of a defun.
*************** scan_sexps_forward (stateptr, from, end,
*** 2160,2165 ****
--- 2163,2180 ----
oldstate = Fcdr (oldstate);
tem = Fcar (oldstate);
state.comstr_start = NILP (tem) ? -1 : XINT (tem) ;
+ oldstate = Fcdr (oldstate);
+ tem = Fcar (oldstate);
+ while (!NILP (tem)) /* >= second enclosing sexps. */
+ {
+ /* curlevel++->last ran into compiler bug on Apollo */
+ curlevel->last = XINT (Fcar (tem));
+ if (++curlevel == endlevel)
+ error ("Nesting too deep for parser");
+ curlevel->prev = -1;
+ curlevel->last = -1;
+ tem = Fcdr (tem);
+ }
}
state.quoted = 0;
mindepth = depth;
*************** scan_sexps_forward (stateptr, from, end,
*** 2371,2376 ****
--- 2386,2395 ----
state.prevlevelstart
= (curlevel == levelstart) ? -1 : (curlevel - 1)->last;
state.location = from;
+ state.levelstarts = Qnil;
+ while (--curlevel >= levelstart)
+ state.levelstarts = Fcons (make_number (curlevel->last),
+ state.levelstarts);
immediate_quit = 0;
*stateptr = state;
*************** Parsing stops at TO or when certain crit
*** 2386,2392 ****
point is set to where parsing stops.\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 nine elements describing final state of parsing:\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\
--- 2405,2411 ----
point is set to where parsing stops.\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 ten elements describing final state of parsing:\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\
*************** Value is a list of nine elements describ
*** 2400,2405 ****
--- 2419,2425 ----
7. t if in a comment of style `b'; `syntax-table' if given by an explicit\n\
`syntax-table' property.\n\
8. character address of start of last comment or string; nil if none.\n\
+ 9. Intermediate data for continuation of parsing (subject to change).\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\
*************** DEFUN ("parse-partial-sexp", Fparse_part
*** 2450,2456 ****
? (state.comstyle == ST_COMMENT_STYLE
? Qsyntax_table : Qt) : Qnil,
Fcons (state.comstr_start != -1 ? make_number (state.comstr_start) : Qnil,
! Qnil)))))))));
}
init_syntax_once ()
--- 2470,2476 ----
? (state.comstyle == ST_COMMENT_STYLE
? Qsyntax_table : Qt) : Qnil,
Fcons (state.comstr_start != -1 ? make_number (state.comstr_start) : Qnil,
! Fcons (state.levelstarts, Qnil))))))))));
}
init_syntax_once ()