diff options
| author | Marc André Tanner <mat@brain-dump.org> | 2016-03-13 21:23:30 +0100 |
|---|---|---|
| committer | Marc André Tanner <mat@brain-dump.org> | 2016-04-03 13:22:14 +0200 |
| commit | fda69a4886367f040ea59a3bcacef0372690598a (patch) | |
| tree | e7acaeb46f33b6952a64decb404d97c7400d29d8 /sam.c | |
| parent | ae9f7e9a55a7ebb7e0ccc67b6b063274efbc2cc3 (diff) | |
| download | vis-fda69a4886367f040ea59a3bcacef0372690598a.tar.gz vis-fda69a4886367f040ea59a3bcacef0372690598a.tar.xz | |
sam: fix empty regexp matches
This fixes x/^.*$/i/FOO
Diffstat (limited to 'sam.c')
| -rw-r--r-- | sam.c | 19 |
1 files changed, 13 insertions, 6 deletions
@@ -655,30 +655,37 @@ static bool cmd_extract(Vis *vis, Win *win, Command *cmd, Filerange *range) { bool ret = true; Text *txt = win->file->text; if (cmd->regex) { - size_t start = range->start, end = range->end; + size_t start = range->start, end = range->end, last_start = EPOS; RegexMatch match[1]; while (start < end) { bool found = text_search_range_forward(txt, start, - end - start, cmd->regex, 1, match, 0) == 0 && - match[0].start != match[0].end; + end - start, cmd->regex, 1, match, 0) == 0; Filerange r = text_range_empty(); if (found) { if (cmd->name == 'x') r = text_range_new(match[0].start, match[0].end); else r = text_range_new(start, match[0].start); - start = match[0].end; + if (match[0].start == match[0].end) { + if (last_start == match[0].start) { + start++; + continue; + } + start = match[0].end+1; + } else { + start = match[0].end; + } } else { if (cmd->name == 'y') r = text_range_new(start, end); start = end; } - if (text_range_valid(&r) && r.start != r.end) { + if (text_range_valid(&r)) { Mark mark_start = text_mark_set(txt, start); Mark mark_end = text_mark_set(txt, end); ret &= sam_execute(vis, win, cmd->cmd, &r); - start = text_mark_get(txt, mark_start); + last_start = start = text_mark_get(txt, mark_start); end = text_mark_get(txt, mark_end); if (start == EPOS || end == EPOS) return false; |
