summaryrefslogtreecommitdiffstats
path: root/match.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2012-03-01 22:00:11 -0800
committerKaz Kylheku <kaz@kylheku.com>2012-03-01 22:04:54 -0800
commited157718223eaca5f02a5fff4a801643a07dff0b (patch)
treed23554e176df3877c71e4316cd195d8ce091a92a /match.c
parentd4830e29da794cdb5704109343dbe4d0f0d97105 (diff)
downloadtxr-ed157718223eaca5f02a5fff4a801643a07dff0b.tar.gz
txr-ed157718223eaca5f02a5fff4a801643a07dff0b.tar.bz2
txr-ed157718223eaca5f02a5fff4a801643a07dff0b.zip
* match.c (search_form): search_form works with relative positions now,
but match_line returns absolute, and so needs to be offset by -c->base. (h_trailer, h_fun): Bugfix: return the absolute position, rather than relative c->pos. The return value of these functions becomes the return value of do_match_line, so the semantics has to agree.
Diffstat (limited to 'match.c')
-rw-r--r--match.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/match.c b/match.c
index 7b22b51d..2b1bd482 100644
--- a/match.c
+++ b/match.c
@@ -442,6 +442,7 @@ 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) {
+ new_pos = minus(new_pos, c->base);
c->bindings = new_bindings;
return cons(pos, minus(new_pos, pos));
}
@@ -979,7 +980,7 @@ static val h_trailer(match_line_ctx *c)
}
LOG_MATCH("trailer", new_pos);
- return cons(c->bindings, c->pos);
+ return cons(c->bindings, plus(c->pos, c->base));
}
static val h_fun(match_line_ctx *c)
@@ -1075,7 +1076,7 @@ static val h_eol(match_line_ctx *c)
if (length_str_le(c->dataline, c->pos)) {
LOG_MATCH("eol", c->pos);
- return cons(c->bindings, c->pos);
+ return cons(c->bindings, plus(c->pos, c->base));
}
LOG_MISMATCH("eol");
return nil;