[expand] adding method for checking phrase is in multiple dictionaries, and a helper method for determining whether an address phrase has a canonical interpretation
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
#include <dirent.h>
|
||||
#include <limits.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
#include "address_dictionary.h"
|
||||
|
||||
@@ -54,6 +55,20 @@ bool address_phrase_in_dictionary(phrase_t phrase, uint16_t dictionary_id) {
|
||||
}
|
||||
|
||||
|
||||
bool address_phrase_in_dictionaries(phrase_t phrase, size_t n, ...) {
|
||||
va_list args;
|
||||
va_start(args, n);
|
||||
bool in_dictionary = false;
|
||||
for (size_t i = 0; i < n; i++) {
|
||||
uint16_t dictionary_id = va_arg(args, uint16_t);
|
||||
in_dictionary = address_phrase_in_dictionary(phrase, dictionary_id);
|
||||
if (in_dictionary) break;
|
||||
}
|
||||
va_end(args);
|
||||
return in_dictionary;
|
||||
}
|
||||
|
||||
|
||||
int32_t address_dictionary_next_canonical_index(void) {
|
||||
if (address_dict == NULL || address_dict->canonical == NULL) {
|
||||
log_error(ADDRESS_DICTIONARY_SETUP_ERROR);
|
||||
@@ -81,6 +96,32 @@ char *address_dictionary_get_canonical(uint32_t index) {
|
||||
return cstring_array_get_string(address_dict->canonical, index);
|
||||
}
|
||||
|
||||
inline bool address_expansions_have_canonical_interpretation(address_expansion_array *expansions) {
|
||||
if (expansions == NULL) return false;
|
||||
|
||||
address_expansion_t *expansions_array = expansions->a;
|
||||
|
||||
for (size_t i = 0; i < expansions->n; i++) {
|
||||
address_expansion_t expansion = expansions_array[i];
|
||||
if (expansion.canonical_index == NULL_CANONICAL_INDEX) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
inline bool address_phrase_has_canonical_interpretation(phrase_t phrase) {
|
||||
address_expansion_value_t *value = address_dictionary_get_expansions(phrase.data);
|
||||
if (value == NULL) return false;
|
||||
|
||||
address_expansion_array *expansions = value->expansions;
|
||||
|
||||
return address_expansions_have_canonical_interpretation(expansions);
|
||||
}
|
||||
|
||||
|
||||
|
||||
address_expansion_value_t *address_expansion_value_new(void) {
|
||||
address_expansion_value_t *self = malloc(sizeof(address_expansion_value_t));
|
||||
|
||||
|
||||
@@ -70,10 +70,13 @@ phrase_t search_address_dictionaries_suffix(char *str, size_t len, char *lang);
|
||||
address_expansion_value_t *address_dictionary_get_expansions(uint32_t i);
|
||||
bool address_expansion_in_dictionary(address_expansion_t expansion, uint16_t dictionary_id);
|
||||
bool address_phrase_in_dictionary(phrase_t phrase, uint16_t dictionary_id);
|
||||
bool address_phrase_in_dictionaries(phrase_t phrase, size_t n, ...);
|
||||
char *address_dictionary_get_canonical(uint32_t index);
|
||||
int32_t address_dictionary_next_canonical_index(void);
|
||||
bool address_dictionary_add_canonical(char *canonical);
|
||||
bool address_dictionary_add_expansion(char *key, char *language, address_expansion_t expansion);
|
||||
bool address_expansions_have_canonical_interpretation(address_expansion_array *expansions);
|
||||
bool address_phrase_has_canonical_interpretation(phrase_t phrase);
|
||||
|
||||
void address_dictionary_destroy(address_dictionary_t *self);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user