From 8d777f12f7ffa4df1b28d197563888296803b727 Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Fri, 13 Nov 2020 11:38:15 +0000 Subject: [PATCH] network: Add function to pop first element from stack Signed-off-by: Michael Tremer --- src/database.c | 6 ++---- src/libloc.sym | 1 + src/loc/network.h | 1 + src/network.c | 19 +++++++++++++++++++ 4 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/database.c b/src/database.c index 6849d97..b9d870f 100644 --- a/src/database.c +++ b/src/database.c @@ -1315,15 +1315,13 @@ static int __loc_database_enumerator_next_network_flattened( goto END; } - // Reverse the list - loc_network_list_reverse(excluded); - // Replace network with the first one loc_network_unref(*network); - *network = loc_network_list_pop(excluded); + *network = loc_network_list_pop_first(excluded); // Push the rest onto the stack + loc_network_list_reverse(excluded); loc_network_list_merge(enumerator->stack, excluded); loc_network_list_unref(excluded); diff --git a/src/libloc.sym b/src/libloc.sym index bcd11be..6139db6 100644 --- a/src/libloc.sym +++ b/src/libloc.sym @@ -113,6 +113,7 @@ global: loc_network_list_merge; loc_network_list_new; loc_network_list_pop; + loc_network_list_pop_first; loc_network_list_push; loc_network_list_ref; loc_network_list_reverse; diff --git a/src/loc/network.h b/src/loc/network.h index 40712b9..203e61c 100644 --- a/src/loc/network.h +++ b/src/loc/network.h @@ -76,6 +76,7 @@ void loc_network_list_dump(struct loc_network_list* list); struct loc_network* loc_network_list_get(struct loc_network_list* list, size_t index); int loc_network_list_push(struct loc_network_list* list, struct loc_network* network); struct loc_network* loc_network_list_pop(struct loc_network_list* list); +struct loc_network* loc_network_list_pop_first(struct loc_network_list* list); int loc_network_list_contains(struct loc_network_list* list, struct loc_network* network); void loc_network_list_sort(struct loc_network_list* list); void loc_network_list_reverse(struct loc_network_list* list); diff --git a/src/network.c b/src/network.c index 9d02bf8..e7dc97e 100644 --- a/src/network.c +++ b/src/network.c @@ -1231,6 +1231,25 @@ LOC_EXPORT struct loc_network* loc_network_list_pop(struct loc_network_list* lis return network; } +LOC_EXPORT struct loc_network* loc_network_list_pop_first(struct loc_network_list* list) { + // Return nothing when empty + if (loc_network_list_empty(list)) { + DEBUG(list->ctx, "%p: Popped empty stack\n", list); + return NULL; + } + + struct loc_network* network = list->list[0]; + + // Move all elements to the top of the stack + for (unsigned int i = 0; i < --list->size; i++) { + list->list[i] = list->list[i+1]; + } + + DEBUG(list->ctx, "%p: Popping network %p from stack\n", list, network); + + return network; +} + LOC_EXPORT int loc_network_list_contains(struct loc_network_list* list, struct loc_network* network) { for (unsigned int i = 0; i < list->size; i++) { if (loc_network_eq(list->list[i], network)) -- 2.39.2