Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions clang/lib/Headers/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -381,6 +381,7 @@ set(llvm_libc_wrapper_files

set(zos_wrapper_files
zos_wrappers/builtins.h
zos_wrappers/locale.h
)

include(GetClangResourceDir)
Expand Down
20 changes: 20 additions & 0 deletions clang/lib/Headers/zos_wrappers/locale.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
/*===----------------------------- locale.h
*----------------------------------===
*
* Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
* See https://llvm.org/LICENSE.txt for license information.
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
*
*===-------------------------------------------------------------------------===
*/

#ifndef __ZOS_WRAPPERS_LOCALE_H
#define __ZOS_WRAPPERS_LOCALE_H
#if defined(__MVS__)
#include_next <locale.h>
#ifdef __locale
#undef __locale
#define __locale __locale
#endif
#endif /* defined(__MVS__) */
#endif /* __ZOS_WRAPPERS_LOCALE_H */
121 changes: 63 additions & 58 deletions libcxx/include/__locale_dir/locale_base_api.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,41 +39,41 @@
// Strtonum functions
// ------------------
// namespace __locale {
// float __strtof(const char*, char**, __locale_t);
// double __strtod(const char*, char**, __locale_t);
// long double __strtold(const char*, char**, __locale_t);
// long long __strtoll(const char*, char**, __locale_t);
// unsigned long long __strtoull(const char*, char**, __locale_t);
// float __libcpp_strtof(const char*, char**, __locale_t);
// double __libcpp_strtod(const char*, char**, __locale_t);
// long double __libcpp_strtold(const char*, char**, __locale_t);
// long long __libcpp_strtoll(const char*, char**, __locale_t);
// unsigned long long __libcpp_strtoull(const char*, char**, __locale_t);
// }
//
// Character manipulation functions
// --------------------------------
// namespace __locale {
// int __islower(int, __locale_t);
// int __isupper(int, __locale_t);
// int __isdigit(int, __locale_t);
// int __isxdigit(int, __locale_t);
// int __toupper(int, __locale_t);
// int __tolower(int, __locale_t);
// int __strcoll(const char*, const char*, __locale_t);
// size_t __strxfrm(char*, const char*, size_t, __locale_t);
// int __libcpp_islower(int, __locale_t);
// int __libcpp_isupper(int, __locale_t);
// int __libcpp_isdigit(int, __locale_t);
// int __libcpp_isxdigit(int, __locale_t);
// int __libcpp_toupper(int, __locale_t);
// int __libcpp_tolower(int, __locale_t);
// int __libcpp_strcoll(const char*, const char*, __locale_t);
// size_t __libcpp_strxfrm(char*, const char*, size_t, __locale_t);
//
// int __iswspace(wint_t, __locale_t);
// int __iswprint(wint_t, __locale_t);
// int __iswcntrl(wint_t, __locale_t);
// int __iswupper(wint_t, __locale_t);
// int __iswlower(wint_t, __locale_t);
// int __iswalpha(wint_t, __locale_t);
// int __iswblank(wint_t, __locale_t);
// int __iswdigit(wint_t, __locale_t);
// int __iswpunct(wint_t, __locale_t);
// int __iswxdigit(wint_t, __locale_t);
// wint_t __towupper(wint_t, __locale_t);
// wint_t __towlower(wint_t, __locale_t);
// int __wcscoll(const wchar_t*, const wchar_t*, __locale_t);
// size_t __wcsxfrm(wchar_t*, const wchar_t*, size_t, __locale_t);
// int __libcpp_iswspace(wint_t, __locale_t);
// int __libcpp_iswprint(wint_t, __locale_t);
// int __libcpp_iswcntrl(wint_t, __locale_t);
// int __libcpp_iswupper(wint_t, __locale_t);
// int __libcpp_iswlower(wint_t, __locale_t);
// int __libcpp_iswalpha(wint_t, __locale_t);
// int __libcpp_iswblank(wint_t, __locale_t);
// int __libcpp_iswdigit(wint_t, __locale_t);
// int __libcpp_iswpunct(wint_t, __locale_t);
// int __libcpp_iswxdigit(wint_t, __locale_t);
// wint_t __libcpp_towupper(wint_t, __locale_t);
// wint_t __libcpp_towlower(wint_t, __locale_t);
// int __libcpp_wcscoll(const wchar_t*, const wchar_t*, __locale_t);
// size_t __libcpp_wcsxfrm(wchar_t*, const wchar_t*, size_t, __locale_t);
//
// size_t __strftime(char*, size_t, const char*, const tm*, __locale_t);
// size_t __libcpp_strftime(char*, size_t, const char*, const tm*, __locale_t);
// }
//
// Other functions
Expand Down Expand Up @@ -154,68 +154,73 @@ inline _LIBCPP_HIDE_FROM_ABI lconv* __localeconv(__locale_t& __loc) { return __l
//
// Strtonum functions
//
inline _LIBCPP_HIDE_FROM_ABI float __strtof(const char* __nptr, char** __endptr, __locale_t __loc) {
inline _LIBCPP_HIDE_FROM_ABI float __libcpp_strtof(const char* __nptr, char** __endptr, __locale_t __loc) {
return strtof_l(__nptr, __endptr, __loc);
}

inline _LIBCPP_HIDE_FROM_ABI double __strtod(const char* __nptr, char** __endptr, __locale_t __loc) {
inline _LIBCPP_HIDE_FROM_ABI double __libcpp_strtod(const char* __nptr, char** __endptr, __locale_t __loc) {
return strtod_l(__nptr, __endptr, __loc);
}

inline _LIBCPP_HIDE_FROM_ABI long double __strtold(const char* __nptr, char** __endptr, __locale_t __loc) {
inline _LIBCPP_HIDE_FROM_ABI long double __libcpp_strtold(const char* __nptr, char** __endptr, __locale_t __loc) {
return strtold_l(__nptr, __endptr, __loc);
}

inline _LIBCPP_HIDE_FROM_ABI long long __strtoll(const char* __nptr, char** __endptr, int __base, __locale_t __loc) {
inline _LIBCPP_HIDE_FROM_ABI long long
__libcpp_strtoll(const char* __nptr, char** __endptr, int __base, __locale_t __loc) {
return strtoll_l(__nptr, __endptr, __base, __loc);
}

inline _LIBCPP_HIDE_FROM_ABI unsigned long long
__strtoull(const char* __nptr, char** __endptr, int __base, __locale_t __loc) {
__libcpp_strtoull(const char* __nptr, char** __endptr, int __base, __locale_t __loc) {
return strtoull_l(__nptr, __endptr, __base, __loc);
}

# if defined(__MVS__)
using namespace __ibm;
# endif

//
// Character manipulation functions
//
inline _LIBCPP_HIDE_FROM_ABI int __islower(int __ch, __locale_t __loc) { return islower_l(__ch, __loc); }
inline _LIBCPP_HIDE_FROM_ABI int __isupper(int __ch, __locale_t __loc) { return isupper_l(__ch, __loc); }
inline _LIBCPP_HIDE_FROM_ABI int __isdigit(int __ch, __locale_t __loc) { return isdigit_l(__ch, __loc); }
inline _LIBCPP_HIDE_FROM_ABI int __isxdigit(int __ch, __locale_t __loc) { return isxdigit_l(__ch, __loc); }
inline _LIBCPP_HIDE_FROM_ABI int __strcoll(const char* __s1, const char* __s2, __locale_t __loc) {
inline _LIBCPP_HIDE_FROM_ABI int __libcpp_islower(int __ch, __locale_t __loc) { return islower_l(__ch, __loc); }
inline _LIBCPP_HIDE_FROM_ABI int __libcpp_isupper(int __ch, __locale_t __loc) { return isupper_l(__ch, __loc); }
inline _LIBCPP_HIDE_FROM_ABI int __libcpp_isdigit(int __ch, __locale_t __loc) { return isdigit_l(__ch, __loc); }
inline _LIBCPP_HIDE_FROM_ABI int __libcpp_isxdigit(int __ch, __locale_t __loc) { return isxdigit_l(__ch, __loc); }
inline _LIBCPP_HIDE_FROM_ABI int __libcpp_strcoll(const char* __s1, const char* __s2, __locale_t __loc) {
return strcoll_l(__s1, __s2, __loc);
}
inline _LIBCPP_HIDE_FROM_ABI size_t __strxfrm(char* __dest, const char* __src, size_t __n, __locale_t __loc) {
inline _LIBCPP_HIDE_FROM_ABI size_t __libcpp_strxfrm(char* __dest, const char* __src, size_t __n, __locale_t __loc) {
return strxfrm_l(__dest, __src, __n, __loc);
}
inline _LIBCPP_HIDE_FROM_ABI int __toupper(int __ch, __locale_t __loc) { return toupper_l(__ch, __loc); }
inline _LIBCPP_HIDE_FROM_ABI int __tolower(int __ch, __locale_t __loc) { return tolower_l(__ch, __loc); }
inline _LIBCPP_HIDE_FROM_ABI int __libcpp_toupper(int __ch, __locale_t __loc) { return toupper_l(__ch, __loc); }
inline _LIBCPP_HIDE_FROM_ABI int __libcpp_tolower(int __ch, __locale_t __loc) { return tolower_l(__ch, __loc); }

# if _LIBCPP_HAS_WIDE_CHARACTERS
inline _LIBCPP_HIDE_FROM_ABI int __wcscoll(const wchar_t* __s1, const wchar_t* __s2, __locale_t __loc) {
inline _LIBCPP_HIDE_FROM_ABI int __libcpp_wcscoll(const wchar_t* __s1, const wchar_t* __s2, __locale_t __loc) {
return wcscoll_l(__s1, __s2, __loc);
}
inline _LIBCPP_HIDE_FROM_ABI size_t __wcsxfrm(wchar_t* __dest, const wchar_t* __src, size_t __n, __locale_t __loc) {
inline _LIBCPP_HIDE_FROM_ABI size_t
__libcpp_wcsxfrm(wchar_t* __dest, const wchar_t* __src, size_t __n, __locale_t __loc) {
return wcsxfrm_l(__dest, __src, __n, __loc);
}
inline _LIBCPP_HIDE_FROM_ABI int __iswspace(wint_t __ch, __locale_t __loc) { return iswspace_l(__ch, __loc); }
inline _LIBCPP_HIDE_FROM_ABI int __iswprint(wint_t __ch, __locale_t __loc) { return iswprint_l(__ch, __loc); }
inline _LIBCPP_HIDE_FROM_ABI int __iswcntrl(wint_t __ch, __locale_t __loc) { return iswcntrl_l(__ch, __loc); }
inline _LIBCPP_HIDE_FROM_ABI int __iswupper(wint_t __ch, __locale_t __loc) { return iswupper_l(__ch, __loc); }
inline _LIBCPP_HIDE_FROM_ABI int __iswlower(wint_t __ch, __locale_t __loc) { return iswlower_l(__ch, __loc); }
inline _LIBCPP_HIDE_FROM_ABI int __iswalpha(wint_t __ch, __locale_t __loc) { return iswalpha_l(__ch, __loc); }
inline _LIBCPP_HIDE_FROM_ABI int __iswblank(wint_t __ch, __locale_t __loc) { return iswblank_l(__ch, __loc); }
inline _LIBCPP_HIDE_FROM_ABI int __iswdigit(wint_t __ch, __locale_t __loc) { return iswdigit_l(__ch, __loc); }
inline _LIBCPP_HIDE_FROM_ABI int __iswpunct(wint_t __ch, __locale_t __loc) { return iswpunct_l(__ch, __loc); }
inline _LIBCPP_HIDE_FROM_ABI int __iswxdigit(wint_t __ch, __locale_t __loc) { return iswxdigit_l(__ch, __loc); }
inline _LIBCPP_HIDE_FROM_ABI wint_t __towupper(wint_t __ch, __locale_t __loc) { return towupper_l(__ch, __loc); }
inline _LIBCPP_HIDE_FROM_ABI wint_t __towlower(wint_t __ch, __locale_t __loc) { return towlower_l(__ch, __loc); }
# endif

inline _LIBCPP_HIDE_FROM_ABI int __libcpp_iswspace(wint_t __ch, __locale_t __loc) { return iswspace_l(__ch, __loc); }
inline _LIBCPP_HIDE_FROM_ABI int __libcpp_iswprint(wint_t __ch, __locale_t __loc) { return iswprint_l(__ch, __loc); }
inline _LIBCPP_HIDE_FROM_ABI int __libcpp_iswcntrl(wint_t __ch, __locale_t __loc) { return iswcntrl_l(__ch, __loc); }
inline _LIBCPP_HIDE_FROM_ABI int __libcpp_iswupper(wint_t __ch, __locale_t __loc) { return iswupper_l(__ch, __loc); }
inline _LIBCPP_HIDE_FROM_ABI int __libcpp_iswlower(wint_t __ch, __locale_t __loc) { return iswlower_l(__ch, __loc); }
inline _LIBCPP_HIDE_FROM_ABI int __libcpp_iswalpha(wint_t __ch, __locale_t __loc) { return iswalpha_l(__ch, __loc); }
inline _LIBCPP_HIDE_FROM_ABI int __libcpp_iswblank(wint_t __ch, __locale_t __loc) { return iswblank_l(__ch, __loc); }
inline _LIBCPP_HIDE_FROM_ABI int __libcpp_iswdigit(wint_t __ch, __locale_t __loc) { return iswdigit_l(__ch, __loc); }
inline _LIBCPP_HIDE_FROM_ABI int __libcpp_iswpunct(wint_t __ch, __locale_t __loc) { return iswpunct_l(__ch, __loc); }
inline _LIBCPP_HIDE_FROM_ABI int __libcpp_iswxdigit(wint_t __ch, __locale_t __loc) { return iswxdigit_l(__ch, __loc); }
inline _LIBCPP_HIDE_FROM_ABI wint_t __libcpp_towupper(wint_t __ch, __locale_t __loc) { return towupper_l(__ch, __loc); }
inline _LIBCPP_HIDE_FROM_ABI wint_t __libcpp_towlower(wint_t __ch, __locale_t __loc) { return towlower_l(__ch, __loc); }
inline _LIBCPP_HIDE_FROM_ABI size_t
__strftime(char* __s, size_t __max, const char* __format, const tm* __tm, __locale_t __loc) {
__libcpp_strftime(char* __s, size_t __max, const char* __format, const tm* __tm, __locale_t __loc) {
return strftime_l(__s, __max, __format, __tm, __loc);
}
# endif

//
// Other functions
Expand Down
33 changes: 33 additions & 0 deletions libcxx/include/__locale_dir/locale_base_api/ibm.h
Original file line number Diff line number Diff line change
Expand Up @@ -105,4 +105,37 @@ _LIBCPP_ATTRIBUTE_FORMAT(__printf__, 2, 0) int vasprintf(char** strp, const char
return str_size;
}

namespace __ibm {
_LIBCPP_EXPORTED_FROM_ABI int isalnum_l(int, locale_t);
_LIBCPP_EXPORTED_FROM_ABI int isalpha_l(int, locale_t);
_LIBCPP_EXPORTED_FROM_ABI int isblank_l(int, locale_t);
_LIBCPP_EXPORTED_FROM_ABI int iscntrl_l(int, locale_t);
_LIBCPP_EXPORTED_FROM_ABI int isgraph_l(int, locale_t);
_LIBCPP_EXPORTED_FROM_ABI int islower_l(int, locale_t);
_LIBCPP_EXPORTED_FROM_ABI int isprint_l(int, locale_t);
_LIBCPP_EXPORTED_FROM_ABI int ispunct_l(int, locale_t);
_LIBCPP_EXPORTED_FROM_ABI int isspace_l(int, locale_t);
_LIBCPP_EXPORTED_FROM_ABI int isupper_l(int, locale_t);
_LIBCPP_EXPORTED_FROM_ABI int iswalnum_l(wint_t, locale_t);
_LIBCPP_EXPORTED_FROM_ABI int iswalpha_l(wint_t, locale_t);
_LIBCPP_EXPORTED_FROM_ABI int iswblank_l(wint_t, locale_t);
_LIBCPP_EXPORTED_FROM_ABI int iswcntrl_l(wint_t, locale_t);
_LIBCPP_EXPORTED_FROM_ABI int iswdigit_l(wint_t, locale_t);
_LIBCPP_EXPORTED_FROM_ABI int iswgraph_l(wint_t, locale_t);
_LIBCPP_EXPORTED_FROM_ABI int iswlower_l(wint_t, locale_t);
_LIBCPP_EXPORTED_FROM_ABI int iswprint_l(wint_t, locale_t);
_LIBCPP_EXPORTED_FROM_ABI int iswpunct_l(wint_t, locale_t);
_LIBCPP_EXPORTED_FROM_ABI int iswspace_l(wint_t, locale_t);
_LIBCPP_EXPORTED_FROM_ABI int iswupper_l(wint_t, locale_t);
_LIBCPP_EXPORTED_FROM_ABI int iswxdigit_l(wint_t, locale_t);
_LIBCPP_EXPORTED_FROM_ABI int toupper_l(int, locale_t);
_LIBCPP_EXPORTED_FROM_ABI int tolower_l(int, locale_t);
_LIBCPP_EXPORTED_FROM_ABI wint_t towupper_l(wint_t, locale_t);
_LIBCPP_EXPORTED_FROM_ABI wint_t towlower_l(wint_t, locale_t);
_LIBCPP_EXPORTED_FROM_ABI int strcoll_l(const char*, const char*, locale_t);
_LIBCPP_EXPORTED_FROM_ABI size_t strxfrm_l(char*, const char*, size_t, locale_t);
_LIBCPP_EXPORTED_FROM_ABI size_t strftime_l(char*, size_t, const char*, const struct tm*, locale_t);
_LIBCPP_EXPORTED_FROM_ABI int wcscoll_l(const wchar_t*, const wchar_t*, locale_t);
_LIBCPP_EXPORTED_FROM_ABI size_t wcsxfrm_l(wchar_t*, const wchar_t*, size_t, locale_t);
} // namespace __ibm
#endif // _LIBCPP___LOCALE_DIR_LOCALE_BASE_API_IBM_H
14 changes: 7 additions & 7 deletions libcxx/include/locale
Original file line number Diff line number Diff line change
Expand Up @@ -722,7 +722,7 @@ __num_get_signed_integral(const char* __a, const char* __a_end, ios_base::iostat
__libcpp_remove_reference_t<decltype(errno)> __save_errno = errno;
errno = 0;
char* __p2;
long long __ll = __locale::__strtoll(__a, &__p2, __base, _LIBCPP_GET_C_LOCALE);
long long __ll = __locale::__libcpp_strtoll(__a, &__p2, __base, _LIBCPP_GET_C_LOCALE);
__libcpp_remove_reference_t<decltype(errno)> __current_errno = errno;
if (__current_errno == 0)
errno = __save_errno;
Expand Down Expand Up @@ -754,7 +754,7 @@ __num_get_unsigned_integral(const char* __a, const char* __a_end, ios_base::iost
__libcpp_remove_reference_t<decltype(errno)> __save_errno = errno;
errno = 0;
char* __p2;
unsigned long long __ll = __locale::__strtoull(__a, &__p2, __base, _LIBCPP_GET_C_LOCALE);
unsigned long long __ll = __locale::__libcpp_strtoull(__a, &__p2, __base, _LIBCPP_GET_C_LOCALE);
__libcpp_remove_reference_t<decltype(errno)> __current_errno = errno;
if (__current_errno == 0)
errno = __save_errno;
Expand All @@ -779,17 +779,17 @@ _LIBCPP_HIDE_FROM_ABI _Tp __do_strtod(const char* __a, char** __p2);

template <>
inline _LIBCPP_HIDE_FROM_ABI float __do_strtod<float>(const char* __a, char** __p2) {
return __locale::__strtof(__a, __p2, _LIBCPP_GET_C_LOCALE);
return __locale::__libcpp_strtof(__a, __p2, _LIBCPP_GET_C_LOCALE);
}

template <>
inline _LIBCPP_HIDE_FROM_ABI double __do_strtod<double>(const char* __a, char** __p2) {
return __locale::__strtod(__a, __p2, _LIBCPP_GET_C_LOCALE);
return __locale::__libcpp_strtod(__a, __p2, _LIBCPP_GET_C_LOCALE);
}

template <>
inline _LIBCPP_HIDE_FROM_ABI long double __do_strtod<long double>(const char* __a, char** __p2) {
return __locale::__strtold(__a, __p2, _LIBCPP_GET_C_LOCALE);
return __locale::__libcpp_strtold(__a, __p2, _LIBCPP_GET_C_LOCALE);
}

template <class _Tp>
Expand Down Expand Up @@ -1126,11 +1126,11 @@ void __num_put<_CharT>::__widen_and_group_float(
*__oe++ = __ct.widen(*__nf++);
*__oe++ = __ct.widen(*__nf++);
for (__ns = __nf; __ns < __ne; ++__ns)
if (!__locale::__isxdigit(*__ns, _LIBCPP_GET_C_LOCALE))
if (!__locale::__libcpp_isxdigit(*__ns, _LIBCPP_GET_C_LOCALE))
break;
} else {
for (__ns = __nf; __ns < __ne; ++__ns)
if (!__locale::__isdigit(*__ns, _LIBCPP_GET_C_LOCALE))
if (!__locale::__libcpp_isdigit(*__ns, _LIBCPP_GET_C_LOCALE))
break;
}
if (__grouping.empty()) {
Expand Down
Loading
Loading