Commit 3df5f70a authored by Michael Tremer's avatar Michael Tremer

writer: Use country list internally

Signed-off-by: default avatarMichael Tremer <michael.tremer@ipfire.org>
parent 7db88f1b
......@@ -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);
}
......@@ -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
......
......@@ -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
......@@ -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);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment