From bc13155ad791367a9bdfb9d1432a8c89a1875a30 Mon Sep 17 00:00:00 2001 From: deadwood Date: Wed, 1 Oct 2014 18:36:48 +0000 Subject: [PATCH] locale.library: preparation for implementing native language support No functional change at this point. git-svn-id: https://svn.aros.org/svn/aros/trunk/AROS@49668 fb15a70f-31f2-0310-bbcc-cdcc74a49acc --- workbench/libs/locale/initlocale.c | 163 +++++++++++++++++++++------------- workbench/libs/locale/languages.c | 39 -------- workbench/libs/locale/locale_init.c | 1 - workbench/libs/locale/locale_intern.h | 1 + workbench/libs/locale/mmakefile.src | 2 +- 5 files changed, 101 insertions(+), 105 deletions(-) delete mode 100644 workbench/libs/locale/languages.c diff --git a/workbench/libs/locale/initlocale.c b/workbench/libs/locale/initlocale.c index 17490ffb09..b0f21c0fb2 100644 --- a/workbench/libs/locale/initlocale.c +++ b/workbench/libs/locale/initlocale.c @@ -43,6 +43,97 @@ extern void *__eng_functable[]; | (((x) & 0x000000FF) << 24);\ } +/* fileBuf is OUT variable of size PATH_MAX */ + +static struct Library * OpenOnDiskLanguage(STRPTR lName, STRPTR fileBuf) +{ + struct Library * lang = NULL; + + snprintf(fileBuf, PATH_MAX, "%s.language", lName); + fileBuf[PATH_MAX - 1] = 0; + + /* Try and open the specified language */ + lang = OpenLibrary(fileBuf, 0); + +#ifdef __MORPHOS + if (lang == NULL) + { + /* + Ok, so the language didn't open, lets try for + MOSSYS:LOCALE/Languages/xxx.language + */ + + snprintf(fileBuf, PATH_MAX, + "MOSSYS:LOCALE/Languages/%s.language", lName); + fileBuf[PATH_MAX - 1] = 0; + + { + APTR oldwinptr; + struct Process *me = + (struct Process *)FindTask(NULL); + oldwinptr = me->pr_WindowPtr; + me->pr_WindowPtr = (APTR) - 1; + lang = OpenLibrary(fileBuf, 0); + me->pr_WindowPtr = oldwinptr; + } + } +#endif + + if (lang == NULL) + { + /* + Ok, so the language didn't open, lets try for + LOCALE:Languages/xxx.language + */ + + snprintf(fileBuf, PATH_MAX, + "LOCALE:Languages/%s.language", lName); + fileBuf[PATH_MAX - 1] = 0; + + lang = OpenLibrary(fileBuf, 0); + } + + if ((lang == NULL) + && ((((struct Process *)FindTask(NULL))->pr_HomeDir) != + BNULL)) + { + /* + Ok, so we are still NULL, lets then try for + PROGDIR:Languages/xxx.language + */ + snprintf(fileBuf, PATH_MAX, + "PROGDIR:Languages/%s.language", lName); + fileBuf[PATH_MAX - 1] = 0; + + lang = OpenLibrary(fileBuf, 0); + } + + return lang; +} + +static void BuildPreferredLanguages(struct IntLocale * locale) +{ + LONG i = 0; + TEXT fileBuf[PATH_MAX]; + struct Library * lang = NULL; + + while(i < 10) + { + STRPTR lName = locale->LanguagesOnDiskNames[i]; + + if (lName) + { + lang = OpenOnDiskLanguage(lName, fileBuf); + + if (lang) + { + strcpy(locale->PreferredLanguages[i], locale->LanguagesOnDiskNames[i]); + CloseLibrary(lang); + } + } + i++; + } +} /* void SetLocaleLanguage(struct IntLocale *, struct LocaleBase *) @@ -54,7 +145,8 @@ void SetLocaleLanguage(struct IntLocale *il, struct LocaleBase *LocaleBase) struct Library *lang = NULL; ULONG mask = 0; STRPTR fileBuf; - int i = 0; + LONG i = 0; + DEBUG_INITLOCALE(dprintf("SetLocaleLanguage: Locale 0x%lx\n", il)); @@ -82,64 +174,7 @@ void SetLocaleLanguage(struct IntLocale *il, struct LocaleBase *LocaleBase) if (ret != 0) { - snprintf(fileBuf, PATH_MAX, "%s.language", lName); - fileBuf[PATH_MAX - 1] = 0; - - /* Try and open the specified language */ - lang = OpenLibrary(fileBuf, 0); - -#ifdef __MORPHOS - if (lang == NULL) - { - /* - Ok, so the language didn't open, lets try for - MOSSYS:LOCALE/Languages/xxx.language - */ - - snprintf(fileBuf, PATH_MAX, - "MOSSYS:LOCALE/Languages/%s.language", lName); - fileBuf[PATH_MAX - 1] = 0; - - { - APTR oldwinptr; - struct Process *me = - (struct Process *)FindTask(NULL); - oldwinptr = me->pr_WindowPtr; - me->pr_WindowPtr = (APTR) - 1; - lang = OpenLibrary(fileBuf, 0); - me->pr_WindowPtr = oldwinptr; - } - } -#endif - - if (lang == NULL) - { - /* - Ok, so the language didn't open, lets try for - LOCALE:Languages/xxx.language - */ - - snprintf(fileBuf, PATH_MAX, - "LOCALE:Languages/%s.language", lName); - fileBuf[PATH_MAX - 1] = 0; - - lang = OpenLibrary(fileBuf, 0); - } - - if ((lang == NULL) - && ((((struct Process *)FindTask(NULL))->pr_HomeDir) != - BNULL)) - { - /* - Ok, so we are still NULL, lets then try for - PROGDIR:Languages/xxx.language - */ - snprintf(fileBuf, PATH_MAX, - "PROGDIR:Languages/%s.language", lName); - fileBuf[PATH_MAX - 1] = 0; - - lang = OpenLibrary(fileBuf, 0); - } + lang = OpenOnDiskLanguage(lName, fileBuf); if (lang) { @@ -244,12 +279,12 @@ void InitLocale(STRPTR filename, struct IntLocale *locale, strncpy(locale->LocaleName, FilePart(filename), 30); locale->il_Locale.loc_LocaleName = &locale->LocaleName[0]; - /* - We can copy 300 bytes straight away since - the prefered languages are all in a row. - */ + /* Configuration contains on-disk language names */ CopyMem(lp->lp_PreferredLanguages[0], - locale->PreferredLanguages[0], 300); + locale->LanguagesOnDiskNames[0], 300); + + /* Build PreferredLanguages array containing native names */ + BuildPreferredLanguages(locale); for (i = 0, i2 = 0; i < 10; i++) { diff --git a/workbench/libs/locale/languages.c b/workbench/libs/locale/languages.c deleted file mode 100644 index fbc1bf7aa0..0000000000 --- a/workbench/libs/locale/languages.c +++ /dev/null @@ -1,39 +0,0 @@ -/* - Copyright © 2013, The AROS Development Team. All rights reserved. - $Id$ - - Desc: internal language list support functions. -*/ - -#define AROS_ALMOST_COMPATIBLE -#include -#include -#include -#include -#include -#include - -#include -#include - -#include "locale_intern.h" -#include LC_LIBDEFS_FILE - - -struct LanguageMapping -{ - char *BaseName; - char *NativeName; -} -languagesSupported[] = -{ - {"", ""}, - {NULL, NULL} -}; - -char *GetNativeName(char *baseName) -{ - char *nativeName = baseName; - - return nativeName; -} diff --git a/workbench/libs/locale/locale_init.c b/workbench/libs/locale/locale_init.c index ef6bd02f60..eb71cc708a 100644 --- a/workbench/libs/locale/locale_init.c +++ b/workbench/libs/locale/locale_init.c @@ -6,7 +6,6 @@ Lang: english */ -#define DEBUG 1 #include #define AROS_ALMOST_COMPATIBLE diff --git a/workbench/libs/locale/locale_intern.h b/workbench/libs/locale/locale_intern.h index a889354d3e..902fd0ee31 100644 --- a/workbench/libs/locale/locale_intern.h +++ b/workbench/libs/locale/locale_intern.h @@ -75,6 +75,7 @@ struct IntLocale UBYTE LanguageName[30]; UBYTE PreferredLanguages[10][30]; + UBYTE LanguagesOnDiskNames[10][30]; /* ** Don't change the order of the following field, diff --git a/workbench/libs/locale/mmakefile.src b/workbench/libs/locale/mmakefile.src index 9beb9f60c3..b5c4c99bb1 100644 --- a/workbench/libs/locale/mmakefile.src +++ b/workbench/libs/locale/mmakefile.src @@ -1,7 +1,7 @@ # $Id$ include $(TOP)/config/make.cfg -FILES := defaultlocale english initlocale languages catalog_funcs patches +FILES := defaultlocale english initlocale catalog_funcs patches FUNCS := \ closecatalog closelocale convtolower convtoupper \ formatdate formatstring getcatalogstr getlocalestr \ -- 2.11.4.GIT