From d72c79d0e25956fde9da4f4600fce36e6849f9f1 Mon Sep 17 00:00:00 2001 From: Vlasta Vesely Date: Mon, 30 Apr 2018 18:14:39 +0200 Subject: [PATCH] introduce output filters --- iast-czech.c | 11 +++++++++++ iast.c | 5 +++++ transliteration.c | 13 +++++++++++++ transliteration.h | 3 +++ 4 files changed, 32 insertions(+) diff --git a/iast-czech.c b/iast-czech.c index 0ce8568..fb73d9c 100644 --- a/iast-czech.c +++ b/iast-czech.c @@ -101,12 +101,23 @@ static const struct transliteration_letter table[] = { {0, 0, NULL} }; +static void dummy_filter(struct syllable *chain) +{ + printf("%s%s\n", chain->next->data, chain->next->next->data); +} + +static const transliteration_filter_t filters[] = { + dummy_filter, + NULL +}; + struct transliteration_context *transliteration_context_iast_czech_alloc() { struct transliteration_context *context; context = malloc(sizeof(*context)); context->table = table; + context->filters = filters; return context; } diff --git a/iast.c b/iast.c index 0cea1b5..f66ac59 100644 --- a/iast.c +++ b/iast.c @@ -99,12 +99,17 @@ static const struct transliteration_letter table[] = { {0, 0, NULL} }; +static const transliteration_filter_t filters[] = { + NULL +}; + struct transliteration_context *transliteration_context_iast_alloc() { struct transliteration_context *context; context = malloc(sizeof(*context)); context->table = table; + context->filters = filters; return context; } diff --git a/transliteration.c b/transliteration.c index 711f84c..92c6952 100644 --- a/transliteration.c +++ b/transliteration.c @@ -36,6 +36,17 @@ static void syllable_modify(struct syllable *syllable, const char *data) syllable->data = strdup(buffer); } +static void apply_transliteration_filters(struct syllable *head, + const transliteration_filter_t *filters) +{ + const transliteration_filter_t *filter = filters; + + while (*filter) { + (*filter)(head); + filter++; + } +} + char *transliterate_devanagari_to_latin(const char *text, struct transliteration_context *context) { @@ -72,6 +83,8 @@ char *transliterate_devanagari_to_latin(const char *text, free(tmp); } + apply_transliteration_filters(head, context->filters); + return syllable_chain_to_string(head); } diff --git a/transliteration.h b/transliteration.h index 22ca2f0..ed742d0 100644 --- a/transliteration.h +++ b/transliteration.h @@ -9,6 +9,8 @@ #define FLAG_REGULAR 1 << 0 #define FLAG_MODIFIER 1 << 1 +typedef void (*transliteration_filter_t)(struct syllable *syllable_chain); + struct transliteration_letter { unsigned int code; unsigned int flags; @@ -17,6 +19,7 @@ struct transliteration_letter { struct transliteration_context { const struct transliteration_letter *table; + const transliteration_filter_t *filters; }; char *transliterate_devanagari_to_latin(const char *text,