aboutsummaryrefslogtreecommitdiff
path: root/sam.c
diff options
context:
space:
mode:
Diffstat (limited to 'sam.c')
-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;
}