Some remote dive sites have no populated places (towns, cities) nearby. For such sites, we now fall back to looking up unpopulated place names, such as the reef or island name. Also some code refactorisation: the actual network access is now encapsulated in its own function removing some duplicated code handling in the reverseGeoLookup function and making it more readable. Furthermore, reverseGeoLookup() was completely refactored as most of its functionality was due to legacy requirements; the current code-base only calls this function from a single location and only with an empty taxonomy_data object. This makes the function more focussed and much simpler and more readable. Finally, a resource leak in reverseGeocde introduced in 4f3b26f9b6296273e37ec317bc68f32f94f546dc was fixed. Signed-off-by: Michael Werle <micha@michaelwerle.com>
110 lines
2.6 KiB
C
110 lines
2.6 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
#include "taxonomy.h"
|
|
#include "gettext.h"
|
|
#include "subsurface-string.h"
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
|
|
char *taxonomy_category_names[TC_NR_CATEGORIES] = {
|
|
QT_TRANSLATE_NOOP("gettextFromC", "None"),
|
|
QT_TRANSLATE_NOOP("gettextFromC", "Ocean"),
|
|
QT_TRANSLATE_NOOP("gettextFromC", "Country"),
|
|
QT_TRANSLATE_NOOP("gettextFromC", "State"),
|
|
QT_TRANSLATE_NOOP("gettextFromC", "County"),
|
|
QT_TRANSLATE_NOOP("gettextFromC", "Town"),
|
|
QT_TRANSLATE_NOOP("gettextFromC", "City")
|
|
};
|
|
|
|
// these are the names for geoname.org
|
|
char *taxonomy_api_names[TC_NR_CATEGORIES] = {
|
|
"none",
|
|
"name",
|
|
"countryName",
|
|
"adminName1",
|
|
"adminName2",
|
|
"toponymName",
|
|
"adminName3"
|
|
};
|
|
|
|
struct taxonomy *alloc_taxonomy()
|
|
{
|
|
return calloc(TC_NR_CATEGORIES, sizeof(struct taxonomy));
|
|
}
|
|
|
|
void free_taxonomy(struct taxonomy_data *t)
|
|
{
|
|
if (t) {
|
|
for (int i = 0; i < t->nr; i++)
|
|
free((void *)t->category[i].value);
|
|
free(t->category);
|
|
t->category = NULL;
|
|
t->nr = 0;
|
|
}
|
|
}
|
|
|
|
void copy_taxonomy(const struct taxonomy_data *orig, struct taxonomy_data *copy)
|
|
{
|
|
if (orig->category == NULL) {
|
|
free_taxonomy(copy);
|
|
} else {
|
|
if (copy->category == NULL)
|
|
copy->category = alloc_taxonomy();
|
|
for (int i = 0; i < TC_NR_CATEGORIES; i++) {
|
|
if (i < copy->nr) {
|
|
free((void *)copy->category[i].value);
|
|
copy->category[i].value = NULL;
|
|
}
|
|
if (i < orig->nr) {
|
|
copy->category[i] = orig->category[i];
|
|
copy->category[i].value = copy_string(orig->category[i].value);
|
|
}
|
|
}
|
|
copy->nr = orig->nr;
|
|
}
|
|
}
|
|
|
|
int taxonomy_index_for_category(const struct taxonomy_data *t, enum taxonomy_category cat)
|
|
{
|
|
for (int i = 0; i < t->nr; i++)
|
|
if (t->category[i].category == cat)
|
|
return i;
|
|
return -1;
|
|
}
|
|
|
|
const char *taxonomy_get_country(struct taxonomy_data *t)
|
|
{
|
|
for (int i = 0; i < t->nr; i++) {
|
|
if (t->category[i].category == TC_COUNTRY)
|
|
return t->category[i].value;
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
void taxonomy_set_country(struct taxonomy_data *t, const char *country, enum taxonomy_origin origin)
|
|
{
|
|
int idx = -1;
|
|
|
|
// make sure we have taxonomy data allocated
|
|
if (!t->category)
|
|
t->category = alloc_taxonomy();
|
|
|
|
for (int i = 0; i < t->nr; i++) {
|
|
if (t->category[i].category == TC_COUNTRY) {
|
|
idx = i;
|
|
break;
|
|
}
|
|
}
|
|
if (idx == -1) {
|
|
if (t->nr == TC_NR_CATEGORIES - 1) {
|
|
// can't add another one
|
|
fprintf(stderr, "Error adding country taxonomy\n");
|
|
return;
|
|
}
|
|
idx = t->nr++;
|
|
}
|
|
t->category[idx].value = country;
|
|
t->category[idx].origin = origin;
|
|
t->category[idx].category = TC_COUNTRY;
|
|
fprintf(stderr, "%s: set the taxonomy country to %s\n", __func__, country);
|
|
}
|