From 157f0be146bf8122a70dcf5940f1033a6462c34c Mon Sep 17 00:00:00 2001 From: Jaakko Keränen Date: Mon, 22 Mar 2021 14:57:22 +0200 Subject: Lang: Loading a set of NULL-terminated strings --- src/lang.c | 40 +++++++++++++++++++++++++++++++--------- 1 file changed, 31 insertions(+), 9 deletions(-) diff --git a/src/lang.c b/src/lang.c index b5f80fd1..3e99c09c 100644 --- a/src/lang.c +++ b/src/lang.c @@ -1,4 +1,5 @@ #include "lang.h" +#include "embedded.h" #include #include @@ -7,8 +8,8 @@ iDeclareType(Lang) iDeclareType(MsgStr) struct Impl_MsgStr { - const char *id; - iString str; + const char *id; /* these point to null-terminated strings in embedded data */ + const char *str; }; int cmp_MsgStr_(const void *e1, const void *e2) { @@ -24,6 +25,24 @@ struct Impl_Lang { static iLang lang_; +static void clear_Lang_(iLang *d) { + clear_SortedArray(d->messages); +} + +static void load_Lang_(iLang *d, const char *id) { + /* Load compiled language strings from an embedded blob. */ + const iBlock *data = NULL; // &blobLangEn_Embedded; + iMsgStr msg; + for (const char *ptr = constBegin_Block(data); ptr != constEnd_Block(data); ptr++) { + msg.id = ptr; + while (*++ptr) {} + msg.str = ++ptr; + while (*++ptr) {} + /* Allocate the string. */ + insert_SortedArray(d->messages, &msg); + } +} + void init_Lang(void) { iLang *d = &lang_; d->messages = new_SortedArray(sizeof(iMsgStr), cmp_MsgStr_); @@ -32,25 +51,28 @@ void init_Lang(void) { void deinit_Lang(void) { iLang *d = &lang_; + clear_Lang_(d); delete_SortedArray(d->messages); } void setCurrent_Lang(const char *language) { - /* TODO: Load compiled language strings from an embedded blob. */ + iLang *d = &lang_; + clear_Lang_(d); + load_Lang_(d, language); } -const iString *string_Lang(const char *msgId) { +const char *cstr_Lang(const char *msgId) { const iLang *d = &lang_; size_t pos; - const iMsgStr key = { .id = msgId }; + const iMsgStr key = { .id = iConstCast(char *, msgId) }; if (locate_SortedArray(d->messages, &key, &pos)) { - return &((const iMsgStr *) at_SortedArray(d->messages, pos))->str; + return ((const iMsgStr *) at_SortedArray(d->messages, pos))->str; } //iAssert(iFalse); fprintf(stderr, "[Lang] missing: %s\n", msgId); - return collectNewCStr_String(msgId); + return msgId; } -const char *cstr_Lang(const char *msgId) { - return cstr_String(string_Lang(msgId)); +const iString *string_Lang(const char *msgId) { + return collectNewCStr_String(cstr_Lang(msgId)); } -- cgit v1.2.3