From f052b4d55d1082ec9186f9911c7b02192f8af353 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sun, 2 Jun 2024 03:23:01 -0500 Subject: [PATCH] Momo: optimize initial search --- src/main.cpp | 2 +- src/momo/momo.c | 18 ++++++++++++++++-- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 17b5fb0f7..74d631878 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -522,7 +522,7 @@ int main(int argc, char** argv) { } else { logV("locale: %s",localeRet); } - if ((localeRet=TA_BINDTEXTDOMAIN("furnace","locale"))==NULL) { + if ((localeRet=TA_BINDTEXTDOMAIN("furnace","../po/locale"))==NULL) { logE("could not bind text domain!"); } else { logV("text domain 1: %s",localeRet); diff --git a/src/momo/momo.c b/src/momo/momo.c index d244d1c69..bac917ac9 100644 --- a/src/momo/momo.c +++ b/src/momo/momo.c @@ -44,6 +44,7 @@ struct LocaleDomain { const char** stringPtr; const char** transPtr; size_t stringCount; + size_t firstString[256]; }; struct MOHeader { @@ -321,9 +322,19 @@ const char* momo_bindtextdomain(const char* domainName, const char* dirName) { unsigned int* strTable=(unsigned int*)(&newDomain->mo[header->stringPtr]); unsigned int* transTable=(unsigned int*)(&newDomain->mo[header->transPtr]); + unsigned short curChar=0; for (size_t i=0; istringCount; i++) { newDomain->stringPtr[i]=(const char*)(&newDomain->mo[strTable[1+(i<<1)]]); newDomain->transPtr[i]=(const char*)(&newDomain->mo[transTable[1+(i<<1)]]); + + while (curChar<=(unsigned char)newDomain->stringPtr[i][0]) { + newDomain->firstString[curChar]=i; + curChar++; + } + } + while (curChar<256) { + newDomain->firstString[curChar]=newDomain->stringCount; + curChar++; } } @@ -364,9 +375,12 @@ const char* momo_gettext(const char* str) { if (curDomain==NULL) { return str; } + if (str==NULL) return NULL; // TODO: optimize - for (size_t i=0; istringCount; i++) { - if (strcmp(curDomain->stringPtr[i],str)==0) return curDomain->transPtr[i]; + for (size_t i=curDomain->firstString[(unsigned char)(str[0])]; istringCount; i++) { + if (strcmp(curDomain->stringPtr[i],str)==0) { + return curDomain->transPtr[i]; + } } return str; }