]> git.ipfire.org Git - location/libloc.git/commitdiff
network: Add function to pop first element from stack
authorMichael Tremer <michael.tremer@ipfire.org>
Fri, 13 Nov 2020 11:38:15 +0000 (11:38 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Fri, 13 Nov 2020 11:38:15 +0000 (11:38 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/database.c
src/libloc.sym
src/loc/network.h
src/network.c

index 6849d97abb9dadb02eaea94a9e8cc45e76993fb7..b9d870f44a7dd8ffc84b310f46624d1a040804e0 100644 (file)
@@ -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);
index bcd11be97336691fe1d8819b9a9a4d66945a0d69..6139db61aff5693603c0ab3397431e681c26c4c0 100644 (file)
@@ -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;
index 40712b96be5ff449506a5f83e0474d342dab19ec..203e61c268cde7bfb637ac57191631375de12c14 100644 (file)
@@ -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);
index 9d02bf82cc012e85e5f026010cf631d5d2b6cd33..e7dc97eca090e3be19fb202fec9e9ba1e7a3dcb9 100644 (file)
@@ -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))