From: Michael Tremer Date: Wed, 9 Mar 2022 10:26:41 +0000 (+0000) Subject: writer: Use country list internally X-Git-Tag: 0.9.12~5 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3df5f70a270bcf6de693cfc1dab51597420f34a2;p=location%2Flibloc.git writer: Use country list internally Signed-off-by: Michael Tremer --- diff --git a/src/country-list.c b/src/country-list.c index 4d5ef08..b2aea8b 100644 --- a/src/country-list.c +++ b/src/country-list.c @@ -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); +} diff --git a/src/libloc.sym b/src/libloc.sym index 02df5ae..29e17f0 100644 --- a/src/libloc.sym +++ b/src/libloc.sym @@ -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 diff --git a/src/libloc/country-list.h b/src/libloc/country-list.h index c42b66f..a479aed 100644 --- a/src/libloc/country-list.h +++ b/src/libloc/country-list.h @@ -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 diff --git a/src/writer.c b/src/writer.c index 523cb04..67676a4 100644 --- a/src/writer.c +++ b/src/writer.c @@ -36,6 +36,7 @@ #include #include #include +#include #include #include #include @@ -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);