From 248b682c84f9bf89ea0d434040df5f8dd9764180 Mon Sep 17 00:00:00 2001 From: Adam Sutton Date: Fri, 6 Jun 2014 10:08:08 +0100 Subject: [PATCH] util: added a reverse insert (sorted) routine to TAILQ This changes the way in which equal objects are handled. Previously they'd be added to the HEAD and with this they add to the TAIL, which is what I need in network scanning code. --- src/queue.h | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/queue.h b/src/queue.h index 889fdca5..74d4c84b 100644 --- a/src/queue.h +++ b/src/queue.h @@ -129,6 +129,24 @@ } \ } while(0) +#define TAILQ_INSERT_SORTED_R(head, headname, elm, field, cmpfunc) do { \ + if(TAILQ_FIRST(head) == NULL) { \ + TAILQ_INSERT_HEAD(head, elm, field); \ + } else { \ + typeof(elm) _tmp; \ + TAILQ_FOREACH_REVERSE(_tmp,head,headname,field) { \ + if(cmpfunc(elm,_tmp) >= 0) { \ + TAILQ_INSERT_AFTER(head,_tmp,elm,field); \ + break; \ + } \ + if(!TAILQ_PREV(_tmp,headname,field)) { \ + TAILQ_INSERT_BEFORE(_tmp,elm,field); \ + break; \ + } \ + } \ + } \ +} while(0) + #define TAILQ_MOVE(newhead, oldhead, field) do { \ if(TAILQ_FIRST(oldhead)) { \ TAILQ_FIRST(oldhead)->field.tqe_prev = &(newhead)->tqh_first; \