diff options
Diffstat (limited to 'src/basic/prioq.c')
-rw-r--r-- | src/basic/prioq.c | 24 |
1 files changed, 12 insertions, 12 deletions
diff --git a/src/basic/prioq.c b/src/basic/prioq.c index ef28a086d1..cfd08d5d23 100644 --- a/src/basic/prioq.c +++ b/src/basic/prioq.c @@ -32,11 +32,14 @@ struct Prioq { Prioq *prioq_new(compare_func_t compare_func) { Prioq *q; - q = new0(Prioq, 1); + q = new(Prioq, 1); if (!q) return q; - q->compare_func = compare_func; + *q = (Prioq) { + .compare_func = compare_func, + }; + return q; } @@ -62,9 +65,6 @@ int prioq_ensure_allocated(Prioq **q, compare_func_t compare_func) { } static void swap(Prioq *q, unsigned j, unsigned k) { - void *saved_data; - unsigned *saved_idx; - assert(q); assert(j < q->n_items); assert(k < q->n_items); @@ -72,12 +72,8 @@ static void swap(Prioq *q, unsigned j, unsigned k) { assert(!q->items[j].idx || *(q->items[j].idx) == j); assert(!q->items[k].idx || *(q->items[k].idx) == k); - saved_data = q->items[j].data; - saved_idx = q->items[j].idx; - q->items[j].data = q->items[k].data; - q->items[j].idx = q->items[k].idx; - q->items[k].data = saved_data; - q->items[k].idx = saved_idx; + SWAP_TWO(q->items[j].data, q->items[k].data); + SWAP_TWO(q->items[j].idx, q->items[k].idx); if (q->items[j].idx) *q->items[j].idx = j; @@ -88,6 +84,7 @@ static void swap(Prioq *q, unsigned j, unsigned k) { static unsigned shuffle_up(Prioq *q, unsigned idx) { assert(q); + assert(idx < q->n_items); while (idx > 0) { unsigned k; @@ -211,9 +208,12 @@ _pure_ static struct prioq_item* find_item(Prioq *q, void *data, unsigned *idx) assert(q); + if (q->n_items <= 0) + return NULL; + if (idx) { if (*idx == PRIOQ_IDX_NULL || - *idx > q->n_items) + *idx >= q->n_items) return NULL; i = q->items + *idx; |