d338200e2b
Implemented the missing POSIX functions in <locale.h>: newlocale, duplocale, uselocale, and freelocale, and also provided missing type definitions for <locale.h>. Implemented missing POSIX locale-based function variants. Modified LocaleBackend so that it could support thread-local locales. Some glibc-like locale-related variables supporting ctype and printf family of functions have also been updated to reflect the thread-local variables present in the latest glibc sources. As there have been some modifications to global symbols in libroot, libroot_stubs.c has been regenerated. Bug: #17168 Change-Id: Ibf296c58c47d42d1d1dfb2ce64042442f2679431 Reviewed-on: https://review.haiku-os.org/c/haiku/+/5351 Tested-by: Commit checker robot <no-reply+buildbot@haiku-os.org> Reviewed-by: Adrien Destugues <pulkomandy@pulkomandy.tk>
61 lines
1.2 KiB
C++
61 lines
1.2 KiB
C++
/*
|
|
* Copyright 2022, Trung Nguyen, trungnt282910@gmail.com
|
|
* All rights reserved. Distributed under the terms of the MIT License.
|
|
*/
|
|
|
|
|
|
#ifndef _THREAD_LOCALE_H
|
|
#define _THREAD_LOCALE_H
|
|
|
|
|
|
#include "LocaleBackend.h"
|
|
|
|
|
|
namespace BPrivate {
|
|
namespace Libroot {
|
|
|
|
|
|
// This struct is taken from glibc's __locale_struct
|
|
// from xlocale.h.
|
|
// It will also be used by glibc so it should have the same
|
|
// layout.
|
|
struct GlibcLocaleStruct {
|
|
void *__locales[7]; /* 7 = __LC_LAST. */
|
|
|
|
const unsigned short int *__ctype_b;
|
|
const int *__ctype_tolower;
|
|
const int *__ctype_toupper;
|
|
};
|
|
|
|
|
|
// Taken from glibc's bits/locale.h
|
|
// glibc uses different codes from our the native locale.h.
|
|
// This should be the values used for the indexes
|
|
// in GlibcLocaleStruct.
|
|
enum {
|
|
GLIBC_LC_CTYPE = 0,
|
|
GLIBC_LC_NUMERIC = 1,
|
|
GLIBC_LC_TIME = 2,
|
|
GLIBC_LC_COLLATE = 3,
|
|
GLIBC_LC_MONETARY = 4,
|
|
GLIBC_LC_MESSAGES = 5,
|
|
GLIBC_LC_ALL = 6,
|
|
};
|
|
|
|
|
|
// The pointer in the TLS will point to this struct.
|
|
struct ThreadLocale {
|
|
GlibcLocaleStruct glibcLocaleStruct;
|
|
LocaleBackendData* threadLocaleInfo;
|
|
};
|
|
|
|
|
|
ThreadLocale* GetCurrentThreadLocale();
|
|
|
|
|
|
} // namespace Libroot
|
|
} // namespace BPrivate
|
|
|
|
|
|
#endif // _THREAD_LOCALE_H
|