summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard M. Stallman <rms@gnu.org>1998-06-08 04:29:46 +0000
committerRichard M. Stallman <rms@gnu.org>1998-06-08 04:29:46 +0000
commit036930d04a0e7bf3ae08fedaeb5d89b9a6d23841 (patch)
treefd811ada495244fe00d2e9d3778ab5847795a95f
parent8013640a1227840832a4e0edfa03d9ff3fe275b1 (diff)
downloademacs-036930d04a0e7bf3ae08fedaeb5d89b9a6d23841.tar.gz
(struct lisp_parse_state): New field, levelstarts.
(scan_sexps_forward): Use 10th elt of STATE to set levelstarts. (parse-partial-sexp): Add 10th elt to return value.
-rw-r--r--src/syntax.c23
1 files changed, 21 insertions, 2 deletions
diff --git a/src/syntax.c b/src/syntax.c
index efa4bf3d271..b2d14576839 100644
--- a/src/syntax.c
+++ b/src/syntax.c
@@ -64,6 +64,8 @@ struct lisp_parse_state
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.
@@ -2361,6 +2363,18 @@ do { prev_from = from; \
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;
@@ -2596,6 +2610,10 @@ do { prev_from = from; \
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;
@@ -2611,7 +2629,7 @@ Parsing stops at TO or when certain criteria are met;\n\
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\
+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\
@@ -2624,6 +2642,7 @@ Value is a list of nine elements describing final state of parsing:\n\
7. t if in a comment of style b; `syntax-table' if the comment\n\
should be terminated by a generic comment delimiter.\n\
8. character address of start of comment or string; nil if not in one.\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\
@@ -2678,7 +2697,7 @@ DEFUN ("parse-partial-sexp", Fparse_partial_sexp, Sparse_partial_sexp, 2, 6, 0,
Fcons ((state.incomment || state.instring
? make_number (state.comstr_start)
: Qnil),
- Qnil)))))))));
+ Fcons (state.levelstarts, Qnil))))))))));
}
void