aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc André Tanner <mat@brain-dump.org>2016-04-04 12:51:44 +0200
committerMarc André Tanner <mat@brain-dump.org>2016-04-04 13:01:27 +0200
commit1c1bf5b321f57dd6df728b483a848c6000c9ddb0 (patch)
treef92bcf2833bf8f08af2daea81f2e103385811ea0
parent371c50e7c4a760448545e30705df92be2a88103a (diff)
downloadvis-1c1bf5b321f57dd6df728b483a848c6000c9ddb0.tar.gz
vis-1c1bf5b321f57dd6df728b483a848c6000c9ddb0.tar.xz
sam: fix x command with default pattern
The end range should still be respected, previously it would continue looping for all lines until the end of file.
-rw-r--r--sam.c23
1 files changed, 15 insertions, 8 deletions
diff --git a/sam.c b/sam.c
index 4077509..143c506 100644
--- a/sam.c
+++ b/sam.c
@@ -873,16 +873,23 @@ static bool cmd_extract(Vis *vis, Win *win, Command *cmd, const char *argv[], Cu
}
}
} else {
- size_t start = range->start;
- for (;;) {
- size_t end = text_line_next(txt, start);
- Filerange line = text_range_new(start, end);
- if (start == end || !text_range_valid(&line))
+ size_t start = range->start, end = range->end;
+ while (start < end) {
+ size_t next = text_line_next(txt, start);
+ if (next > end)
+ next = end;
+ Filerange r = text_range_new(start, next);
+ if (start == next || !text_range_valid(&r))
break;
+ start = next;
+ Mark mark_start = text_mark_set(txt, start);
Mark mark_end = text_mark_set(txt, end);
- ret &= sam_execute(vis, win, cmd->cmd, NULL, &line);
- start = text_mark_get(txt, mark_end);
- if (start == EPOS) {
+ ret &= sam_execute(vis, win, cmd->cmd, NULL, &r);
+ start = text_mark_get(txt, mark_start);
+ if (start == EPOS)
+ start = r.end;
+ end = text_mark_get(txt, mark_end);
+ if (end == EPOS) {
ret = false;
break;
}