From 7d3ef39463e592db084f543d7b6683f51bf9a026 Mon Sep 17 00:00:00 2001 From: Al Date: Thu, 4 Jun 2015 03:14:44 -0400 Subject: [PATCH] [numex] struct/method changes for new ordinal indicators --- src/numex.c | 51 ++++++++++++++++++++++++++++++++++++++++++++------- src/numex.h | 23 ++++++++++++++++++++--- 2 files changed, 64 insertions(+), 10 deletions(-) diff --git a/src/numex.c b/src/numex.c index f0a4bd79..0321c20d 100644 --- a/src/numex.c +++ b/src/numex.c @@ -3,6 +3,8 @@ #define NUMEX_TABLE_SIGNATURE 0xBBBBBBBB +#define LATIN_LANGUAGE_CODE "la" + #define SEPARATOR_TOKENS "-" numex_table_t *numex_table = NULL; @@ -218,6 +220,10 @@ bool numex_rule_read(FILE *f, numex_rule_t *rule) { return false; } + if (!file_read_uint64(f, (uint64_t *)&rule->category)) { + return false; + } + if (!file_read_uint32(f, &rule->radix)) { return false; } @@ -246,6 +252,10 @@ bool numex_rule_write(numex_rule_t rule, FILE *f) { return false; } + if (!file_write_uint64(f, (uint64_t)rule.category)) { + return false; + } + if (!file_write_uint32(f, (uint32_t)rule.radix)) { return false; } @@ -260,6 +270,10 @@ bool numex_rule_write(numex_rule_t rule, FILE *f) { void ordinal_indicator_destroy(ordinal_indicator_t *self) { if (self == NULL) return; + if (self->key != NULL) { + free(self->key); + } + if (self->suffix != NULL) { free(self->suffix); } @@ -267,27 +281,39 @@ void ordinal_indicator_destroy(ordinal_indicator_t *self) { free(self); } -ordinal_indicator_t *ordinal_indicator_new(uint8_t number, gender_t gender, char *suffix) { +ordinal_indicator_t *ordinal_indicator_new(char *key, gender_t gender, grammatical_category_t category, char *suffix) { ordinal_indicator_t *ordinal = malloc(sizeof(ordinal_indicator_t)); if (ordinal == NULL) { return NULL; } + ordinal->key = strdup(key); + if (ordinal->key == NULL) { + ordinal_indicator_destroy(ordinal); + return NULL; + } + ordinal->suffix = strdup(suffix); if (ordinal->suffix == NULL) { ordinal_indicator_destroy(ordinal); return NULL; } - ordinal->number = number; + ordinal->category = category; ordinal->gender = gender; return ordinal; } ordinal_indicator_t *ordinal_indicator_read(FILE *f) { - uint8_t number; - if (!file_read_uint8(f, &number)) { + size_t key_len; + if (!file_read_uint64(f, (uint64_t *)&key_len)) { + return NULL; + } + + char key[key_len]; + + if (!file_read_chars(f, key, key_len)) { return NULL; } @@ -296,6 +322,11 @@ ordinal_indicator_t *ordinal_indicator_read(FILE *f) { return NULL; } + grammatical_category_t category; + if (!file_read_uint64(f, (uint64_t *)&category)) { + return NULL; + } + size_t ordinal_suffix_len; if (!file_read_uint64(f, (uint64_t *)&ordinal_suffix_len)) { return NULL; @@ -307,12 +338,14 @@ ordinal_indicator_t *ordinal_indicator_read(FILE *f) { return NULL; } - return ordinal_indicator_new(number, gender, ordinal_suffix); + return ordinal_indicator_new(key, gender, category, ordinal_suffix); } bool ordinal_indicator_write(ordinal_indicator_t *ordinal, FILE *f) { - if (!file_write_uint8(f, ordinal->number)) { + size_t key_len = strlen(ordinal->key) + 1; + if (!file_write_uint64(f, key_len) || + !file_write_chars(f, ordinal->key, key_len)) { return false; } @@ -320,6 +353,10 @@ bool ordinal_indicator_write(ordinal_indicator_t *ordinal, FILE *f) { return false; } + if (!file_write_uint64(f, (uint64_t)ordinal->category)) { + return false; + } + size_t name_len = strlen(ordinal->suffix) + 1; if (!file_write_uint64(f, name_len) || !file_write_chars(f, ordinal->suffix, name_len)) { @@ -511,4 +548,4 @@ the end of a main method) */ void numex_module_teardown(void) { numex_table_destroy(); -} \ No newline at end of file +} diff --git a/src/numex.h b/src/numex.h index 5ef23bba..77e0de09 100644 --- a/src/numex.h +++ b/src/numex.h @@ -21,6 +21,11 @@ extern "C" { #define DEFAULT_NUMEX_PATH LIBPOSTAL_DATA_DIR "/numex/numex.dat" +#define GENDER_MASCULINE_PREFIX "m" +#define GENDER_FEMININE_PREFIX "f" +#define GENDER_NEUTER_PREFIX "n" +#define GENDER_NONE_PREFIX "d" + typedef enum { GENDER_MASCULINE, GENDER_FEMININE, @@ -28,6 +33,14 @@ typedef enum { GENDER_NONE } gender_t; +#define CATEGORY_PLURAL_PREFIX "p" +#define CATEGORY_DEFAULT_PREFIX "s" + +typedef enum { + CATEGORY_PLURAL, + CATEGORY_DEFAULT +} grammatical_category_t; + typedef enum { NUMEX_LEFT_CONTEXT_NONE, NUMEX_LEFT_CONTEXT_ADD, @@ -52,24 +65,28 @@ typedef struct numex_rule { numex_right_context right_context_type; numex_rule_type rule_type; gender_t gender; + grammatical_category_t category; uint32_t radix; int64_t value; } numex_rule_t; #define NUMEX_STOPWORD_INDEX 0 -#define NUMEX_STOPWORD_RULE (numex_rule_t) {NUMEX_LEFT_CONTEXT_NONE, NUMEX_RIGHT_CONTEXT_NONE, NUMEX_STOPWORD, GENDER_NONE, 0, 0} +#define NUMEX_STOPWORD_RULE (numex_rule_t) {NUMEX_LEFT_CONTEXT_NONE, NUMEX_RIGHT_CONTEXT_NONE, NUMEX_STOPWORD, GENDER_NONE, CATEGORY_DEFAULT, 0, 0} VECTOR_INIT(numex_rule_array, numex_rule_t) +#define ORDINAL_NAMESPACE_CHAR "o" + typedef struct ordinal_indicator { - uint8_t number; + char *key; gender_t gender; + grammatical_category_t category; char *suffix; } ordinal_indicator_t; -ordinal_indicator_t *ordinal_indicator_new(uint8_t number, gender_t gender, char *suffix); +ordinal_indicator_t *ordinal_indicator_new(char *key, gender_t gender, grammatical_category_t category, char *suffix); void ordinal_indicator_destroy(ordinal_indicator_t *self); VECTOR_INIT_FREE_DATA(ordinal_indicator_array, ordinal_indicator_t *, ordinal_indicator_destroy)