Momo: optimize initial search

This commit is contained in:
tildearrow 2024-06-02 03:23:01 -05:00
parent bebb1726a9
commit f052b4d55d
2 changed files with 17 additions and 3 deletions

View file

@ -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);

View file

@ -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; i<newDomain->stringCount; 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; i<curDomain->stringCount; i++) {
if (strcmp(curDomain->stringPtr[i],str)==0) return curDomain->transPtr[i];
for (size_t i=curDomain->firstString[(unsigned char)(str[0])]; i<curDomain->stringCount; i++) {
if (strcmp(curDomain->stringPtr[i],str)==0) {
return curDomain->transPtr[i];
}
}
return str;
}