summaryrefslogtreecommitdiffstats
path: root/match.c
diff options
context:
space:
mode:
Diffstat (limited to 'match.c')
-rw-r--r--match.c30
1 files changed, 19 insertions, 11 deletions
diff --git a/match.c b/match.c
index 2b1bd482..2b00c5cc 100644
--- a/match.c
+++ b/match.c
@@ -441,7 +441,9 @@ static val search_form(match_line_ctx *c, val needle_form, val from_end)
{
cons_bind (new_bindings, new_pos,
match_line(ml_specline_pos(*c, spec, pos)));
- if (new_pos) {
+ if (new_pos == t) {
+ return cons(pos, t);
+ } else if (new_pos) {
new_pos = minus(new_pos, c->base);
c->bindings = new_bindings;
return cons(pos, minus(new_pos, pos));
@@ -556,7 +558,7 @@ static val h_var(match_line_ctx *c)
}
LOG_MATCH("var delimiting form", fpos);
c->bindings = acons(sym, sub_str(c->dataline, c->pos, fpos), c->bindings);
- c->pos = plus(fpos, flen);
+ c->pos = if3(flen == t, t, plus(fpos, flen));
} else if (consp(pat)) {
/* Unbound var followed by var: the following one must either
be bound, or must specify a regex. */
@@ -636,7 +638,7 @@ static val h_skip(match_line_ctx *c)
if (!rest(c->specline)) {
debuglf(elem,
lit("skip to end of line ~a:~a"), c->file, c->data_lineno, nao);
- return cons(c->bindings, length_str(c->dataline));
+ return cons(c->bindings, t);
}
{
@@ -794,7 +796,7 @@ static val h_coll(match_line_ctx *c)
if (new_pos && !equal(new_pos, c->pos)) {
c->pos = new_pos;
- bug_unless (length_str_ge(c->dataline, c->pos));
+ bug_unless (new_pos != t && length_str_ge(c->dataline, c->pos));
timescounter++;
@@ -811,7 +813,7 @@ next_coll:
c->pos = plus(c->pos, one);
}
- if (length_str_le(c->dataline, c->pos))
+ if (c->pos == t || length_str_le(c->dataline, c->pos))
break;
}
@@ -907,7 +909,7 @@ static val h_parallel(match_line_ctx *c)
new_bindings = alist_remove(new_bindings, resolve_ub_vars);
}
- if (gt(new_pos, max_pos))
+ if (new_pos == t || gt(new_pos, max_pos))
max_pos = new_pos;
if (directive == choose_s) {
@@ -1059,8 +1061,7 @@ static val h_fun(match_line_ctx *c)
}
}
- if (fixnump(success))
- c->pos = success;
+ c->pos = success;
}
}
@@ -1101,6 +1102,9 @@ static val do_match_line(match_line_ctx *c, val completely)
if (c->specline == nil)
break;
+ if (c->pos == t)
+ c->pos = length_str(c->dataline);
+
consume_prefix(c);
elem = first(c->specline);
@@ -2044,7 +2048,7 @@ static val v_trailer(match_files_ctx *c)
}
}
-void freeform_prepare(val vals, match_files_ctx *c, match_line_ctx *mlc);
+val freeform_prepare(val vals, match_files_ctx *c, match_line_ctx *mlc);
static val v_freeform(match_files_ctx *c)
{
@@ -2062,7 +2066,7 @@ static val v_freeform(match_files_ctx *c)
return nil;
} else {
match_line_ctx mlc;
- freeform_prepare(vals, c, &mlc);
+ val lim = freeform_prepare(vals, c, &mlc);
c->data = nil;
{
@@ -2076,6 +2080,9 @@ static val v_freeform(match_files_ctx *c)
if (fixnump(success)) {
c->data = lazy_str_get_trailing_list(mlc.dataline, success);
c->data_lineno = plus(c->data_lineno, one);
+ } else if (success == t && lim) {
+ c->data = lazy_str_get_trailing_list(mlc.dataline, length_str(mlc.dataline));
+ c->data_lineno = plus(c->data_lineno, one);
}
c->bindings = new_bindings;
@@ -2085,7 +2092,7 @@ static val v_freeform(match_files_ctx *c)
return next_spec_k;
}
-void freeform_prepare(val vals, match_files_ctx *c, match_line_ctx *mlc)
+val freeform_prepare(val vals, match_files_ctx *c, match_line_ctx *mlc)
{
uses_or2;
val first_spec = first(c->spec);
@@ -2095,6 +2102,7 @@ void freeform_prepare(val vals, match_files_ctx *c, match_line_ctx *mlc)
if2(stringp(second(vals)), second(vals)));
val dataline = lazy_str(c->data, term, limit);
*mlc = ml_all(c->bindings, first_spec, dataline, zero, c->data_lineno, first(c->files));
+ return limit;
}