]> git.ipfire.org Git - people/ms/libloc.git/commitdiff
writer: Use country list internally
authorMichael Tremer <michael.tremer@ipfire.org>
Wed, 9 Mar 2022 10:26:41 +0000 (10:26 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Wed, 9 Mar 2022 10:26:41 +0000 (10:26 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/country-list.c
src/libloc.sym
src/libloc/country-list.h
src/writer.c

index 4d5ef08126bf256da11aa6f2ea117c1644fecfa4..b2aea8b043477be11d2f6832dd57f12e607ab6eb 100644 (file)
@@ -168,3 +168,12 @@ LOC_EXPORT int loc_country_list_contains_code(
 
        return r;
 }
+
+static int __loc_country_cmp(const void* country1, const void* country2) {
+       return loc_country_cmp(*(struct loc_country**)country1, *(struct loc_country**)country2);
+}
+
+LOC_EXPORT void loc_country_list_sort(struct loc_country_list* list) {
+       // Sort everything
+       qsort(list->elements, list->size, sizeof(*list->elements), __loc_country_cmp);
+}
index 02df5ae65f151450f6ac8c6eecdfd10fed0bfbc3..29e17f0caad20a54206cf7721d2bd9eaff006b79 100644 (file)
@@ -53,6 +53,7 @@ global:
        loc_country_list_new;
        loc_country_list_ref;
        loc_country_list_size;
+       loc_country_list_sort;
        loc_country_list_unref;
 
        # Database
index c42b66fdf7cbe1dd797094765d44c3f0f4bbcf78..a479aeda9f244de4e425ff9e9eb9bebd19e76e6d 100644 (file)
@@ -40,4 +40,6 @@ int loc_country_list_contains(
 int loc_country_list_contains_code(
        struct loc_country_list* list, const char* code);
 
+void loc_country_list_sort(struct loc_country_list* list);
+
 #endif
index 523cb0475dfd2aa9a064520f7ff8f2668e7c47c0..67676a48374e94c1e6c382252be41ee308f1ad4f 100644 (file)
@@ -36,6 +36,7 @@
 #include <libloc/as-list.h>
 #include <libloc/compat.h>
 #include <libloc/country.h>
+#include <libloc/country-list.h>
 #include <libloc/database.h>
 #include <libloc/format.h>
 #include <libloc/network.h>
@@ -61,12 +62,10 @@ struct loc_writer {
        char signature2[LOC_SIGNATURE_MAX_LENGTH];
        size_t signature2_length;
 
-       struct loc_country** countries;
-       size_t countries_count;
-
        struct loc_network_tree* networks;
 
        struct loc_as_list* as_list;
+       struct loc_country_list* country_list;
 };
 
 static int parse_private_key(struct loc_writer* writer, EVP_PKEY** private_key, FILE* f) {
@@ -158,12 +157,8 @@ static void loc_writer_free(struct loc_writer* writer) {
                loc_as_list_unref(writer->as_list);
 
        // Unref all countries
-       if (writer->countries) {
-               for (unsigned int i = 0; i < writer->countries_count; i++) {
-                       loc_country_unref(writer->countries[i]);
-               }
-               free(writer->countries);
-       }
+       if (writer->country_list)
+               loc_country_list_unref(writer->country_list);
 
        // Release network tree
        if (writer->networks)
@@ -249,30 +244,14 @@ LOC_EXPORT int loc_writer_add_network(struct loc_writer* writer, struct loc_netw
        return loc_network_tree_add_network(writer->networks, *network);
 }
 
-static int __loc_country_cmp(const void* country1, const void* country2) {
-       return loc_country_cmp(*(struct loc_country**)country1, *(struct loc_country**)country2);
-}
-
 LOC_EXPORT int loc_writer_add_country(struct loc_writer* writer, struct loc_country** country, const char* country_code) {
+       // Allocate a new country
        int r = loc_country_new(writer->ctx, country, country_code);
        if (r)
                return r;
 
-       // We have a new country to add
-       writer->countries_count++;
-
-       // Make space
-       writer->countries = realloc(writer->countries, sizeof(*writer->countries) * writer->countries_count);
-       if (!writer->countries)
-               return -ENOMEM;
-
-       // Add as last element
-       writer->countries[writer->countries_count - 1] = loc_country_ref(*country);
-
-       // Sort everything
-       qsort(writer->countries, writer->countries_count, sizeof(*writer->countries), __loc_country_cmp);
-
-       return 0;
+       // Append it to the list
+       return loc_country_list_append(writer->country_list, *country);
 }
 
 static void make_magic(struct loc_writer* writer, struct loc_database_magic* magic,
@@ -524,20 +503,24 @@ static int loc_database_write_countries(struct loc_writer* writer,
        DEBUG(writer->ctx, "Countries section starts at %jd bytes\n", (intmax_t)*offset);
        header->countries_offset = htobe32(*offset);
 
-       size_t countries_length = 0;
+       const size_t countries_count = loc_country_list_size(writer->country_list);
+
+       struct loc_database_country_v1 block;
+       size_t block_length = 0;
+
+       for (unsigned int i = 0; i < countries_count; i++) {
+               struct loc_country* country = loc_country_list_get(writer->country_list, i);
 
-       struct loc_database_country_v1 country;
-       for (unsigned int i = 0; i < writer->countries_count; i++) {
                // Convert country into database format
-               loc_country_to_database_v1(writer->countries[i], writer->pool, &country);
+               loc_country_to_database_v1(country, writer->pool, &block);
 
                // Write to disk
-               *offset += fwrite(&country, 1, sizeof(country), f);
-               countries_length += sizeof(country);
+               *offset += fwrite(&block, 1, sizeof(block), f);
+               block_length += sizeof(block);
        }
 
-       DEBUG(writer->ctx, "Countries section has a length of %zu bytes\n", countries_length);
-       header->countries_length = htobe32(countries_length);
+       DEBUG(writer->ctx, "Countries section has a length of %zu bytes\n", block_length);
+       header->countries_length = htobe32(block_length);
 
        align_page_boundary(offset, f);