From 55fe473fb5afd99bfaac28021e3452938cfd0b7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Andr=C3=A9=20Tanner?= Date: Thu, 15 Jun 2017 14:08:24 +0200 Subject: vis: normalize selections after pairwise combination --- main.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) (limited to 'main.c') diff --git a/main.c b/main.c index b3d760f..bbba81c 100644 --- a/main.c +++ b/main.c @@ -1688,6 +1688,31 @@ static const char *selections_restore(Vis *vis, const char *keys, const Arg *arg return keys; } +static int ranges_comparator(const void *a, const void *b) { + const Filerange *r1 = a, *r2 = b; + if (!text_range_valid(r1)) + return text_range_valid(r2) ? 1 : 0; + if (!text_range_valid(r2)) + return -1; + return (r1->start < r2->start || (r1->start == r2->start && r1->end < r2->end)) ? -1 : 1; +} + +static void normalize(Array *a) { + array_sort(a, ranges_comparator); + Filerange *prev = NULL, *r = array_get(a, 0); + for (size_t i = 0; r; r = array_get(a, i)) { + if (text_range_size(r) == 0) { + array_remove(a, i); + } else if (prev && text_range_overlap(prev, r)) { + *prev = text_range_union(prev, r); + array_remove(a, i); + } else { + prev = r; + i++; + } + } +} + static const char *selections_union(Vis *vis, const char *keys, const Arg *arg) { View *view = vis_view(vis); enum VisRegister reg = vis_register_used(vis); @@ -1898,6 +1923,7 @@ static const char *selections_combine(Vis *vis, const char *keys, const Arg *arg array_add(&sel, &new); } + normalize(&sel); view_selections_set_all(view, &sel); vis_cancel(vis); -- cgit v1.2.3