From c17753766956d1c904150065f052800000195881 Mon Sep 17 00:00:00 2001 From: Werner Lemberg Date: Sun, 22 Oct 2017 08:51:43 +0200 Subject: [PATCH] [numberset] Make `number_set_insert' completely merge adjacent ranges. --- lib/numberset.c | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/lib/numberset.c b/lib/numberset.c index deea097..dc916c6 100644 --- a/lib/numberset.c +++ b/lib/numberset.c @@ -124,26 +124,35 @@ number_set_insert(number_range* list, return NUMBERSET_OVERLAPPING_RANGES; /* merge adjacent ranges */ - if (element->start == nr->end + 1) - { - nr->end = element->end; - - free(element); - - return list; - } if (element->end + 1 == nr->start) { nr->start = element->start; free(element); + if (nr->next + && nr->next->end + 1 == nr->start) + { + element = nr->next; + element->end = nr->end; + free(nr); + return element; + } + return list; } /* insert element */ if (element->start > nr->end) { + /* merge adjacent ranges */ + if (nr->end + 1 == element->start) + { + nr->end = element->end; + free(element); + return list; + } + if (prev) prev->next = element; element->next = nr; @@ -155,7 +164,7 @@ number_set_insert(number_range* list, nr = nr->next; } - /* append element */ + /* prepend element */ prev->next = element; element->next = NULL; -- 2.11.4.GIT