]> git.ipfire.org Git - people/ms/libloc.git/blobdiff - src/as-list.c
importer: Reformat the large SQL query
[people/ms/libloc.git] / src / as-list.c
index 76620c76b04359e06c2491a1b2310c9992a7d6ad..50805e771b2d7c09ada7bf94b93bf511b1c4ad7e 100644 (file)
        Lesser General Public License for more details.
 */
 
-#include <errno.h>
 #include <stdlib.h>
 
-#include <loc/as.h>
-#include <loc/as-list.h>
-#include <loc/private.h>
+#include <libloc/as.h>
+#include <libloc/as-list.h>
+#include <libloc/compat.h>
+#include <libloc/private.h>
 
 struct loc_as_list {
        struct loc_ctx* ctx;
@@ -31,14 +31,18 @@ struct loc_as_list {
        size_t size;
 };
 
-static int loc_as_list_grow(struct loc_as_list* list, size_t size) {
+static int loc_as_list_grow(struct loc_as_list* list) {
+       size_t size = list->elements_size * 2;
+       if (size < 1024)
+               size = 1024;
+
        DEBUG(list->ctx, "Growing AS list %p by %zu to %zu\n",
                list, size, list->elements_size + size);
 
        struct loc_as** elements = reallocarray(list->elements,
                        list->elements_size + size, sizeof(*list->elements));
        if (!elements)
-               return -errno;
+               return 1;
 
        list->elements = elements;
        list->elements_size += size;
@@ -50,7 +54,7 @@ LOC_EXPORT int loc_as_list_new(struct loc_ctx* ctx,
                struct loc_as_list** list) {
        struct loc_as_list* l = calloc(1, sizeof(*l));
        if (!l)
-               return -ENOMEM;
+               return 1;
 
        l->ctx = loc_ref(ctx);
        l->refcount = 1;
@@ -103,6 +107,7 @@ LOC_EXPORT void loc_as_list_clear(struct loc_as_list* list) {
                loc_as_unref(list->elements[i]);
 
        free(list->elements);
+       list->elements = NULL;
        list->elements_size = 0;
 
        list->size = 0;
@@ -123,7 +128,7 @@ LOC_EXPORT int loc_as_list_append(
 
        // Check if we have space left
        if (list->size >= list->elements_size) {
-               int r = loc_as_list_grow(list, 64);
+               int r = loc_as_list_grow(list);
                if (r)
                        return r;
        }
@@ -158,3 +163,12 @@ LOC_EXPORT int loc_as_list_contains_number(
 
        return r;
 }
+
+static int __loc_as_cmp(const void* as1, const void* as2) {
+       return loc_as_cmp(*(struct loc_as**)as1, *(struct loc_as**)as2);
+}
+
+LOC_EXPORT void loc_as_list_sort(struct loc_as_list* list) {
+       // Sort everything
+       qsort(list->elements, list->size, sizeof(*list->elements), __loc_as_cmp);
+}