Skip to content

Commit 144286f

Browse files
committed
WIP: original patch
1 parent 6563ed3 commit 144286f

File tree

5 files changed

+113
-26
lines changed

5 files changed

+113
-26
lines changed

libcxx/include/__locale_dir/locale_base_api.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
#ifndef _LIBCPP___LOCALE_DIR_LOCALE_BASE_API_H
1010
#define _LIBCPP___LOCALE_DIR_LOCALE_BASE_API_H
1111

12+
#include <__config>
13+
1214
#if defined(_LIBCPP_MSVCRT_LIKE)
1315
# include <__locale_dir/locale_base_api/win32.h>
1416
#elif defined(_AIX) || defined(__MVS__)
@@ -27,6 +29,12 @@
2729
# include <__locale_dir/locale_base_api/freebsd.h>
2830
#endif
2931

32+
#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
33+
# include <__locale_dir/locale_base_api/bsd_locale_defaults.h>
34+
#else
35+
# include <__locale_dir/locale_base_api/bsd_locale_fallbacks.h>
36+
#endif
37+
3038
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
3139
# pragma GCC system_header
3240
#endif

libcxx/include/__locale_dir/locale_base_api/bsd_locale_defaults.h

Lines changed: 93 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -14,23 +14,102 @@
1414
#ifndef _LIBCPP___LOCALE_DIR_LOCALE_BASE_API_BSD_LOCALE_DEFAULTS_H
1515
#define _LIBCPP___LOCALE_DIR_LOCALE_BASE_API_BSD_LOCALE_DEFAULTS_H
1616

17+
#include <ctype.h>
18+
#include <stdio.h>
19+
#include <stdlib.h>
20+
#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
21+
# include <wchar.h>
22+
#endif
23+
24+
// <xlocale.h> must come after the includes above since the functions it includes depend on
25+
// what headers have been included up to that point.
26+
#if defined(__APPLE__) || defined(__FreeBSD__)
27+
# include <xlocale.h>
28+
#endif
29+
30+
#include <__config>
31+
#include <__cstddef/size_t.h>
32+
#include <__std_mbstate_t.h>
33+
#include <__utility/forward.h>
34+
1735
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
1836
# pragma GCC system_header
1937
#endif
2038

21-
#define __libcpp_mb_cur_max_l(loc) MB_CUR_MAX_L(loc)
22-
#define __libcpp_btowc_l(ch, loc) btowc_l(ch, loc)
23-
#define __libcpp_wctob_l(wch, loc) wctob_l(wch, loc)
24-
#define __libcpp_wcsnrtombs_l(dst, src, nwc, len, ps, loc) wcsnrtombs_l(dst, src, nwc, len, ps, loc)
25-
#define __libcpp_wcrtomb_l(src, wc, ps, loc) wcrtomb_l(src, wc, ps, loc)
26-
#define __libcpp_mbsnrtowcs_l(dst, src, nms, len, ps, loc) mbsnrtowcs_l(dst, src, nms, len, ps, loc)
27-
#define __libcpp_mbrtowc_l(pwc, s, n, ps, l) mbrtowc_l(pwc, s, n, ps, l)
28-
#define __libcpp_mbtowc_l(pwc, pmb, max, l) mbtowc_l(pwc, pmb, max, l)
29-
#define __libcpp_mbrlen_l(s, n, ps, l) mbrlen_l(s, n, ps, l)
30-
#define __libcpp_localeconv_l(l) localeconv_l(l)
31-
#define __libcpp_mbsrtowcs_l(dest, src, len, ps, l) mbsrtowcs_l(dest, src, len, ps, l)
32-
#define __libcpp_snprintf_l(...) snprintf_l(__VA_ARGS__)
33-
#define __libcpp_asprintf_l(...) asprintf_l(__VA_ARGS__)
34-
#define __libcpp_sscanf_l(...) sscanf_l(__VA_ARGS__)
39+
_LIBCPP_BEGIN_NAMESPACE_STD
40+
41+
inline _LIBCPP_HIDE_FROM_ABI decltype(MB_CUR_MAX) __libcpp_mb_cur_max_l(locale_t __loc) { return MB_CUR_MAX_L(__loc); }
42+
43+
#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
44+
inline _LIBCPP_HIDE_FROM_ABI wint_t __libcpp_btowc_l(int __c, locale_t __loc) { return ::btowc_l(__c, __loc); }
45+
46+
inline _LIBCPP_HIDE_FROM_ABI int __libcpp_wctob_l(wint_t __c, locale_t __loc) { return ::wctob_l(__c, __loc); }
47+
48+
inline _LIBCPP_HIDE_FROM_ABI size_t __libcpp_wcsnrtombs_l(
49+
char* __dest, const wchar_t** __src, size_t __nwc, size_t __len, mbstate_t* __ps, locale_t __loc) {
50+
return ::wcsnrtombs_l(__dest, __src, __nwc, __len, __ps, __loc);
51+
}
52+
53+
inline _LIBCPP_HIDE_FROM_ABI size_t __libcpp_wcrtomb_l(char* __s, wchar_t __wc, mbstate_t* __ps, locale_t __loc) {
54+
return ::wcrtomb_l(__s, __wc, __ps, __loc);
55+
}
56+
57+
inline _LIBCPP_HIDE_FROM_ABI size_t __libcpp_mbsnrtowcs_l(
58+
wchar_t* __dest, const char** __src, size_t __nms, size_t __len, mbstate_t* __ps, locale_t __loc) {
59+
return ::mbsnrtowcs_l(__dest, __src, __nms, __len, __ps, __loc);
60+
}
61+
62+
inline _LIBCPP_HIDE_FROM_ABI size_t
63+
__libcpp_mbrtowc_l(wchar_t* __pwc, const char* __s, size_t __n, mbstate_t* __ps, locale_t __loc) {
64+
return ::mbrtowc_l(__pwc, __s, __n, __ps, __loc);
65+
}
66+
67+
inline _LIBCPP_HIDE_FROM_ABI int __libcpp_mbtowc_l(wchar_t* __pwc, const char* __pmb, size_t __max, locale_t __loc) {
68+
return ::mbtowc_l(__pwc, __pmb, __max, __loc);
69+
}
70+
71+
inline _LIBCPP_HIDE_FROM_ABI size_t __libcpp_mbrlen_l(const char* __s, size_t __n, mbstate_t* __ps, locale_t __loc) {
72+
return ::mbrlen_l(__s, __n, __ps, __loc);
73+
}
74+
#endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS
75+
76+
inline _LIBCPP_HIDE_FROM_ABI lconv* __libcpp_localeconv_l(locale_t __loc) { return ::localeconv_l(__loc); }
77+
78+
#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
79+
inline _LIBCPP_HIDE_FROM_ABI size_t
80+
__libcpp_mbsrtowcs_l(wchar_t* __dest, const char** __src, size_t __len, mbstate_t* __ps, locale_t __loc) {
81+
return ::mbsrtowcs_l(__dest, __src, __len, __ps, __loc);
82+
}
83+
#endif
84+
85+
template <class... _Args>
86+
_LIBCPP_HIDE_FROM_ABI int
87+
__libcpp_snprintf_l(char* __s, size_t __n, locale_t __loc, const char* __format, _Args&&... __args) {
88+
_LIBCPP_DIAGNOSTIC_PUSH
89+
_LIBCPP_CLANG_DIAGNOSTIC_IGNORED("-Wformat-nonliteral")
90+
_LIBCPP_GCC_DIAGNOSTIC_IGNORED("-Wformat-nonliteral")
91+
return ::snprintf_l(__s, __n, __loc, __format, std::forward<_Args>(__args)...);
92+
_LIBCPP_DIAGNOSTIC_POP
93+
}
94+
95+
template <class... _Args>
96+
_LIBCPP_HIDE_FROM_ABI int __libcpp_asprintf_l(char** __s, locale_t __loc, const char* __format, _Args&&... __args) {
97+
_LIBCPP_DIAGNOSTIC_PUSH
98+
_LIBCPP_CLANG_DIAGNOSTIC_IGNORED("-Wformat-nonliteral")
99+
_LIBCPP_GCC_DIAGNOSTIC_IGNORED("-Wformat-nonliteral")
100+
return ::asprintf_l(__s, __loc, __format, std::forward<_Args>(__args)...);
101+
_LIBCPP_DIAGNOSTIC_POP
102+
}
103+
104+
template <class... _Args>
105+
_LIBCPP_HIDE_FROM_ABI int __libcpp_sscanf_l(const char* __s, locale_t __loc, const char* __format, _Args&&... __args) {
106+
_LIBCPP_DIAGNOSTIC_PUSH
107+
_LIBCPP_CLANG_DIAGNOSTIC_IGNORED("-Wformat-nonliteral")
108+
_LIBCPP_GCC_DIAGNOSTIC_IGNORED("-Wformat-nonliteral")
109+
return ::sscanf_l(__s, __loc, __format, std::forward<_Args>(__args)...);
110+
_LIBCPP_DIAGNOSTIC_POP
111+
}
112+
113+
_LIBCPP_END_NAMESPACE_STD
35114

36115
#endif // _LIBCPP___LOCALE_DIR_LOCALE_BASE_API_BSD_LOCALE_DEFAULTS_H

libcxx/include/__locale_dir/locale_base_api/bsd_locale_fallbacks.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,11 @@
1313
#ifndef _LIBCPP___LOCALE_DIR_LOCALE_BASE_API_BSD_LOCALE_FALLBACKS_H
1414
#define _LIBCPP___LOCALE_DIR_LOCALE_BASE_API_BSD_LOCALE_FALLBACKS_H
1515

16+
#include <locale.h>
17+
1618
#include <__locale_dir/locale_guard.h>
17-
#include <cstdio>
1819
#include <stdarg.h>
20+
#include <stdio.h>
1921
#include <stdlib.h>
2022

2123
#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS

libcxx/include/locale

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ template <class charT> class messages_byname;
215215
# include <streambuf>
216216
# include <version>
217217

218-
// TODO: Fix __bsd_locale_defaults.h
218+
// TODO: Properly qualify calls now that __bsd_locale_defaults.h defines functions instead of macros
219219
// NOLINTBEGIN(libcpp-robust-against-adl)
220220

221221
# if defined(__unix__) || (defined(__APPLE__) && defined(__MACH__))
@@ -230,16 +230,6 @@ template <class charT> class messages_byname;
230230
# define _LIBCPP_HAS_CATOPEN 0
231231
# endif
232232

233-
# ifdef _LIBCPP_LOCALE__L_EXTENSIONS
234-
# include <__locale_dir/locale_base_api/bsd_locale_defaults.h>
235-
# else
236-
# include <__locale_dir/locale_base_api/bsd_locale_fallbacks.h>
237-
# endif
238-
239-
# if defined(__APPLE__) || defined(__FreeBSD__)
240-
# include <xlocale.h>
241-
# endif
242-
243233
# if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
244234
# pragma GCC system_header
245235
# endif

libcxx/test/libcxx/clang_modules_include.gen.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@
2424
//--- {header}.compile.pass.cpp
2525
// RUN: %{{cxx}} %s %{{flags}} %{{compile_flags}} -fmodules -fcxx-modules -fmodules-cache-path=%t -fsyntax-only
2626
27+
// Older macOS SDKs were not properly modularized, which causes issues with localization.
28+
// This feature should instead be based on the SDK version.
29+
// UNSUPPORTED: stdlib=system && target={{{{.+}}}}-apple-macosx13{{{{.*}}}}
30+
2731
// GCC doesn't support -fcxx-modules
2832
// UNSUPPORTED: gcc
2933
@@ -52,6 +56,10 @@
5256
5357
// REQUIRES: clang-modules-build
5458
59+
// Older macOS SDKs were not properly modularized, which causes issues with localization.
60+
// This feature should instead be based on the SDK version.
61+
// UNSUPPORTED: stdlib=system && target={{{{.+}}}}-apple-macosx13{{{{.*}}}}
62+
5563
// GCC doesn't support -fcxx-modules
5664
// UNSUPPORTED: gcc
5765

0 commit comments

Comments
 (0)