libroot/locale: Minor fixes and expose internal POSIX locale.
* We can return early from duplocale() so set the "magic" flag early. * Initialize all fields up front. * Add an internal method __posix_locale_t() which returns a locale_t usable as a global C/POSIX locale type, and add the appropriate definition to the musl internal header.
This commit is contained in:
@@ -34,14 +34,15 @@ duplocale(locale_t l)
|
|||||||
errno = ENOMEM;
|
errno = ENOMEM;
|
||||||
return (locale_t)0;
|
return (locale_t)0;
|
||||||
}
|
}
|
||||||
|
newObj->magic = LOCALE_T_MAGIC;
|
||||||
|
newObj->backend = NULL;
|
||||||
|
newObj->databridge = NULL;
|
||||||
|
|
||||||
LocaleBackend* backend = (l == LC_GLOBAL_LOCALE) ?
|
LocaleBackend* backend = (l == LC_GLOBAL_LOCALE) ?
|
||||||
gGlobalLocaleBackend : (LocaleBackend*)locObj->backend;
|
gGlobalLocaleBackend : (LocaleBackend*)locObj->backend;
|
||||||
|
|
||||||
if (backend == NULL) {
|
if (backend == NULL)
|
||||||
newObj->backend = NULL;
|
|
||||||
return (locale_t)newObj;
|
return (locale_t)newObj;
|
||||||
}
|
|
||||||
|
|
||||||
// Check if everything is set to "C" or "POSIX",
|
// Check if everything is set to "C" or "POSIX",
|
||||||
// and avoid making a backend.
|
// and avoid making a backend.
|
||||||
@@ -49,7 +50,6 @@ duplocale(locale_t l)
|
|||||||
|
|
||||||
if ((strcasecmp(localeDescription, "POSIX") == 0)
|
if ((strcasecmp(localeDescription, "POSIX") == 0)
|
||||||
|| (strcasecmp(localeDescription, "C") == 0)) {
|
|| (strcasecmp(localeDescription, "C") == 0)) {
|
||||||
newObj->backend = NULL;
|
|
||||||
return (locale_t)newObj;
|
return (locale_t)newObj;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -81,8 +81,6 @@ duplocale(locale_t l)
|
|||||||
newBackend->SetLocale(lc, backend->SetLocale(lc, NULL));
|
newBackend->SetLocale(lc, backend->SetLocale(lc, NULL));
|
||||||
}
|
}
|
||||||
|
|
||||||
newObj->magic = LOCALE_T_MAGIC;
|
|
||||||
|
|
||||||
return (locale_t)newObj;
|
return (locale_t)newObj;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -275,3 +273,13 @@ __current_locale_t()
|
|||||||
|
|
||||||
return locale;
|
return locale;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
extern "C" locale_t
|
||||||
|
__posix_locale_t()
|
||||||
|
{
|
||||||
|
static LocaleBackendData posix_locale_t;
|
||||||
|
posix_locale_t.backend = NULL;
|
||||||
|
posix_locale_t.databridge = NULL;
|
||||||
|
return &posix_locale_t;
|
||||||
|
}
|
||||||
|
|||||||
@@ -10,6 +10,8 @@
|
|||||||
#define __nl_langinfo_l nl_langinfo_l
|
#define __nl_langinfo_l nl_langinfo_l
|
||||||
|
|
||||||
locale_t __current_locale_t();
|
locale_t __current_locale_t();
|
||||||
|
locale_t __posix_locale_t();
|
||||||
#define CURRENT_LOCALE (__current_locale_t())
|
#define CURRENT_LOCALE (__current_locale_t())
|
||||||
|
#define C_LOCALE (__posix_locale_t())
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user