#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>
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) {
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)
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,
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);