192a07003b2ce449b22709fbd9b4f1e49b3a2fd3eHoward Hinnant// -*- C++ -*- 214fa9f9d8ff5a4541404f3e23b91188e74c56f31Howard Hinnant//===--------------------- support/win32/locale_win32.h -------------------===// 392a07003b2ce449b22709fbd9b4f1e49b3a2fd3eHoward Hinnant// 492a07003b2ce449b22709fbd9b4f1e49b3a2fd3eHoward Hinnant// The LLVM Compiler Infrastructure 592a07003b2ce449b22709fbd9b4f1e49b3a2fd3eHoward Hinnant// 692a07003b2ce449b22709fbd9b4f1e49b3a2fd3eHoward Hinnant// This file is dual licensed under the MIT and the University of Illinois Open 792a07003b2ce449b22709fbd9b4f1e49b3a2fd3eHoward Hinnant// Source Licenses. See LICENSE.TXT for details. 892a07003b2ce449b22709fbd9b4f1e49b3a2fd3eHoward Hinnant// 992a07003b2ce449b22709fbd9b4f1e49b3a2fd3eHoward Hinnant//===----------------------------------------------------------------------===// 1092a07003b2ce449b22709fbd9b4f1e49b3a2fd3eHoward Hinnant 1114fa9f9d8ff5a4541404f3e23b91188e74c56f31Howard Hinnant#ifndef _LIBCPP_SUPPORT_WIN32_LOCALE_WIN32_H 1214fa9f9d8ff5a4541404f3e23b91188e74c56f31Howard Hinnant#define _LIBCPP_SUPPORT_WIN32_LOCALE_WIN32_H 13efbe4067f225856814465913bf51e87ec8f17bdbHoward Hinnant 143c466fc631a2a474d84ad6c29770a2cbdf40bf1bHoward Hinnant// ctype mask table defined in msvcrt.dll 153c466fc631a2a474d84ad6c29770a2cbdf40bf1bHoward Hinnantextern "C" unsigned short __declspec(dllimport) _ctype[]; 163c466fc631a2a474d84ad6c29770a2cbdf40bf1bHoward Hinnant 17efbe4067f225856814465913bf51e87ec8f17bdbHoward Hinnant#include "support/win32/support.h" 18ef5aa93b9cdc5bfea3e4c59bafd784a9ff968decHoward Hinnant#include <stdio.h> 19efbe4067f225856814465913bf51e87ec8f17bdbHoward Hinnant#include <memory> 20efbe4067f225856814465913bf51e87ec8f17bdbHoward Hinnant#include <xlocinfo.h> // _locale_t 2192a07003b2ce449b22709fbd9b4f1e49b3a2fd3eHoward Hinnant#define locale_t _locale_t 22efbe4067f225856814465913bf51e87ec8f17bdbHoward Hinnant#define LC_COLLATE_MASK _M_COLLATE 23efbe4067f225856814465913bf51e87ec8f17bdbHoward Hinnant#define LC_CTYPE_MASK _M_CTYPE 24efbe4067f225856814465913bf51e87ec8f17bdbHoward Hinnant#define LC_MONETARY_MASK _M_MONETARY 25efbe4067f225856814465913bf51e87ec8f17bdbHoward Hinnant#define LC_NUMERIC_MASK _M_NUMERIC 26efbe4067f225856814465913bf51e87ec8f17bdbHoward Hinnant#define LC_TIME_MASK _M_TIME 27efbe4067f225856814465913bf51e87ec8f17bdbHoward Hinnant#define LC_MESSAGES_MASK _M_MESSAGES 28efbe4067f225856814465913bf51e87ec8f17bdbHoward Hinnant#define LC_ALL_MASK ( LC_COLLATE_MASK \ 29efbe4067f225856814465913bf51e87ec8f17bdbHoward Hinnant | LC_CTYPE_MASK \ 30efbe4067f225856814465913bf51e87ec8f17bdbHoward Hinnant | LC_MESSAGES_MASK \ 31efbe4067f225856814465913bf51e87ec8f17bdbHoward Hinnant | LC_MONETARY_MASK \ 32efbe4067f225856814465913bf51e87ec8f17bdbHoward Hinnant | LC_NUMERIC_MASK \ 33efbe4067f225856814465913bf51e87ec8f17bdbHoward Hinnant | LC_TIME_MASK ) 34efbe4067f225856814465913bf51e87ec8f17bdbHoward Hinnant#define freelocale _free_locale 35efbe4067f225856814465913bf51e87ec8f17bdbHoward Hinnant// FIXME: base currently unused. Needs manual work to construct the new locale 36efbe4067f225856814465913bf51e87ec8f17bdbHoward Hinnantlocale_t newlocale( int mask, const char * locale, locale_t base ); 37efbe4067f225856814465913bf51e87ec8f17bdbHoward Hinnantlocale_t uselocale( locale_t newloc ); 38efbe4067f225856814465913bf51e87ec8f17bdbHoward Hinnantlconv *localeconv_l( locale_t loc ); 39ef5aa93b9cdc5bfea3e4c59bafd784a9ff968decHoward Hinnantsize_t mbrlen_l( const char *__restrict s, size_t n, 40ef5aa93b9cdc5bfea3e4c59bafd784a9ff968decHoward Hinnant mbstate_t *__restrict ps, locale_t loc); 41ef5aa93b9cdc5bfea3e4c59bafd784a9ff968decHoward Hinnantsize_t mbsrtowcs_l( wchar_t *__restrict dst, const char **__restrict src, 42ef5aa93b9cdc5bfea3e4c59bafd784a9ff968decHoward Hinnant size_t len, mbstate_t *__restrict ps, locale_t loc ); 43ef5aa93b9cdc5bfea3e4c59bafd784a9ff968decHoward Hinnantsize_t wcrtomb_l( char *__restrict s, wchar_t wc, mbstate_t *__restrict ps, 44efbe4067f225856814465913bf51e87ec8f17bdbHoward Hinnant locale_t loc); 45ef5aa93b9cdc5bfea3e4c59bafd784a9ff968decHoward Hinnantsize_t mbrtowc_l( wchar_t *__restrict pwc, const char *__restrict s, 46ef5aa93b9cdc5bfea3e4c59bafd784a9ff968decHoward Hinnant size_t n, mbstate_t *__restrict ps, locale_t loc); 47ef5aa93b9cdc5bfea3e4c59bafd784a9ff968decHoward Hinnantsize_t mbsnrtowcs_l( wchar_t *__restrict dst, const char **__restrict src, 48ef5aa93b9cdc5bfea3e4c59bafd784a9ff968decHoward Hinnant size_t nms, size_t len, mbstate_t *__restrict ps, locale_t loc); 49ef5aa93b9cdc5bfea3e4c59bafd784a9ff968decHoward Hinnantsize_t wcsnrtombs_l( char *__restrict dst, const wchar_t **__restrict src, 50ef5aa93b9cdc5bfea3e4c59bafd784a9ff968decHoward Hinnant size_t nwc, size_t len, mbstate_t *__restrict ps, locale_t loc); 51efbe4067f225856814465913bf51e87ec8f17bdbHoward Hinnantwint_t btowc_l( int c, locale_t loc ); 52efbe4067f225856814465913bf51e87ec8f17bdbHoward Hinnantint wctob_l( wint_t c, locale_t loc ); 53efbe4067f225856814465913bf51e87ec8f17bdbHoward Hinnanttypedef _VSTD::remove_pointer<locale_t>::type __locale_struct; 54efbe4067f225856814465913bf51e87ec8f17bdbHoward Hinnanttypedef _VSTD::unique_ptr<__locale_struct, decltype(&uselocale)> __locale_raii; 551e564246eced50a94eea249719498e72e236a571Howard Hinnantinline _LIBCPP_ALWAYS_INLINE 56efbe4067f225856814465913bf51e87ec8f17bdbHoward Hinnantdecltype(MB_CUR_MAX) MB_CUR_MAX_L( locale_t __l ) 57efbe4067f225856814465913bf51e87ec8f17bdbHoward Hinnant{ 58efbe4067f225856814465913bf51e87ec8f17bdbHoward Hinnant __locale_raii __current( uselocale(__l), uselocale ); 59efbe4067f225856814465913bf51e87ec8f17bdbHoward Hinnant return MB_CUR_MAX; 60efbe4067f225856814465913bf51e87ec8f17bdbHoward Hinnant} 61efbe4067f225856814465913bf51e87ec8f17bdbHoward Hinnant 62efbe4067f225856814465913bf51e87ec8f17bdbHoward Hinnant// the *_l functions are prefixed on Windows, only available for msvcr80+, VS2005+ 63efbe4067f225856814465913bf51e87ec8f17bdbHoward Hinnant#define mbtowc_l _mbtowc_l 6492a07003b2ce449b22709fbd9b4f1e49b3a2fd3eHoward Hinnant#define strtoll_l _strtoi64_l 6592a07003b2ce449b22709fbd9b4f1e49b3a2fd3eHoward Hinnant#define strtoull_l _strtoui64_l 6692a07003b2ce449b22709fbd9b4f1e49b3a2fd3eHoward Hinnant// FIXME: current msvcrt does not know about long double 6792a07003b2ce449b22709fbd9b4f1e49b3a2fd3eHoward Hinnant#define strtold_l _strtod_l 68a5733b3ad3695aed8f7676165dabe3da7f49d78cHoward Hinnant 69a5733b3ad3695aed8f7676165dabe3da7f49d78cHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 70a5733b3ad3695aed8f7676165dabe3da7f49d78cHoward Hinnantint 71a5733b3ad3695aed8f7676165dabe3da7f49d78cHoward Hinnantislower_l(int c, _locale_t loc) 72a5733b3ad3695aed8f7676165dabe3da7f49d78cHoward Hinnant{ 73a5733b3ad3695aed8f7676165dabe3da7f49d78cHoward Hinnant return _islower_l((int)c, loc); 74a5733b3ad3695aed8f7676165dabe3da7f49d78cHoward Hinnant} 75a5733b3ad3695aed8f7676165dabe3da7f49d78cHoward Hinnant 76a5733b3ad3695aed8f7676165dabe3da7f49d78cHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 77a5733b3ad3695aed8f7676165dabe3da7f49d78cHoward Hinnantint 78a5733b3ad3695aed8f7676165dabe3da7f49d78cHoward Hinnantisupper_l(int c, _locale_t loc) 79a5733b3ad3695aed8f7676165dabe3da7f49d78cHoward Hinnant{ 80a5733b3ad3695aed8f7676165dabe3da7f49d78cHoward Hinnant return _isupper_l((int)c, loc); 81a5733b3ad3695aed8f7676165dabe3da7f49d78cHoward Hinnant} 82a5733b3ad3695aed8f7676165dabe3da7f49d78cHoward Hinnant 8392a07003b2ce449b22709fbd9b4f1e49b3a2fd3eHoward Hinnant#define isdigit_l _isdigit_l 8492a07003b2ce449b22709fbd9b4f1e49b3a2fd3eHoward Hinnant#define isxdigit_l _isxdigit_l 856cd05eeb35636c33a5cd951a7b5501f51611b469Howard Hinnant#define strcoll_l _strcoll_l 866cd05eeb35636c33a5cd951a7b5501f51611b469Howard Hinnant#define strxfrm_l _strxfrm_l 876cd05eeb35636c33a5cd951a7b5501f51611b469Howard Hinnant#define wcscoll_l _wcscoll_l 886cd05eeb35636c33a5cd951a7b5501f51611b469Howard Hinnant#define wcsxfrm_l _wcsxfrm_l 896cd05eeb35636c33a5cd951a7b5501f51611b469Howard Hinnant#define toupper_l _toupper_l 906cd05eeb35636c33a5cd951a7b5501f51611b469Howard Hinnant#define tolower_l _tolower_l 916cd05eeb35636c33a5cd951a7b5501f51611b469Howard Hinnant#define iswspace_l _iswspace_l 926cd05eeb35636c33a5cd951a7b5501f51611b469Howard Hinnant#define iswprint_l _iswprint_l 936cd05eeb35636c33a5cd951a7b5501f51611b469Howard Hinnant#define iswcntrl_l _iswcntrl_l 946cd05eeb35636c33a5cd951a7b5501f51611b469Howard Hinnant#define iswupper_l _iswupper_l 956cd05eeb35636c33a5cd951a7b5501f51611b469Howard Hinnant#define iswlower_l _iswlower_l 966cd05eeb35636c33a5cd951a7b5501f51611b469Howard Hinnant#define iswalpha_l _iswalpha_l 976cd05eeb35636c33a5cd951a7b5501f51611b469Howard Hinnant#define iswdigit_l _iswdigit_l 986cd05eeb35636c33a5cd951a7b5501f51611b469Howard Hinnant#define iswpunct_l _iswpunct_l 996cd05eeb35636c33a5cd951a7b5501f51611b469Howard Hinnant#define iswxdigit_l _iswxdigit_l 1006cd05eeb35636c33a5cd951a7b5501f51611b469Howard Hinnant#define towupper_l _towupper_l 1016cd05eeb35636c33a5cd951a7b5501f51611b469Howard Hinnant#define towlower_l _towlower_l 1026cd05eeb35636c33a5cd951a7b5501f51611b469Howard Hinnant#define strftime_l _strftime_l 103efbe4067f225856814465913bf51e87ec8f17bdbHoward Hinnant#define sscanf_l( __s, __l, __f, ...) _sscanf_l( __s, __f, __l, __VA_ARGS__ ) 104efbe4067f225856814465913bf51e87ec8f17bdbHoward Hinnant#define vsscanf_l( __s, __l, __f, ...) _sscanf_l( __s, __f, __l, __VA_ARGS__ ) 105efbe4067f225856814465913bf51e87ec8f17bdbHoward Hinnant#define sprintf_l( __s, __l, __f, ... ) _sprintf_l( __s, __f, __l, __VA_ARGS__ ) 106efbe4067f225856814465913bf51e87ec8f17bdbHoward Hinnant#define vsprintf_l( __s, __l, __f, ... ) _vsprintf_l( __s, __f, __l, __VA_ARGS__ ) 107efbe4067f225856814465913bf51e87ec8f17bdbHoward Hinnant#define vsnprintf_l( __s, __n, __l, __f, ... ) _vsnprintf_l( __s, __n, __f, __l, __VA_ARGS__ ) 10815c04bedad8762d7ed031d53db26bf02b2df18bbYaron Kerenint snprintf_l(char *ret, size_t n, locale_t loc, const char *format, ...); 109efbe4067f225856814465913bf51e87ec8f17bdbHoward Hinnantint asprintf_l( char **ret, locale_t loc, const char *format, ... ); 110efbe4067f225856814465913bf51e87ec8f17bdbHoward Hinnantint vasprintf_l( char **ret, locale_t loc, const char *format, va_list ap ); 111efbe4067f225856814465913bf51e87ec8f17bdbHoward Hinnant 112efbe4067f225856814465913bf51e87ec8f17bdbHoward Hinnant 113efbe4067f225856814465913bf51e87ec8f17bdbHoward Hinnant// not-so-pressing FIXME: use locale to determine blank characters 1146cd05eeb35636c33a5cd951a7b5501f51611b469Howard Hinnantinline int isblank_l( int c, locale_t /*loc*/ ) 1156cd05eeb35636c33a5cd951a7b5501f51611b469Howard Hinnant{ 1166cd05eeb35636c33a5cd951a7b5501f51611b469Howard Hinnant return ( c == ' ' || c == '\t' ); 1176cd05eeb35636c33a5cd951a7b5501f51611b469Howard Hinnant} 1186cd05eeb35636c33a5cd951a7b5501f51611b469Howard Hinnantinline int iswblank_l( wint_t c, locale_t /*loc*/ ) 1196cd05eeb35636c33a5cd951a7b5501f51611b469Howard Hinnant{ 1206cd05eeb35636c33a5cd951a7b5501f51611b469Howard Hinnant return ( c == L' ' || c == L'\t' ); 1216cd05eeb35636c33a5cd951a7b5501f51611b469Howard Hinnant} 1226cd05eeb35636c33a5cd951a7b5501f51611b469Howard Hinnant 123ef5aa93b9cdc5bfea3e4c59bafd784a9ff968decHoward Hinnant#if defined(_LIBCPP_MSVCRT) 1249f8884e6c18994360a5e580e5de3aad7a289205dHoward Hinnantinline int isblank( int c, locale_t /*loc*/ ) 1259f8884e6c18994360a5e580e5de3aad7a289205dHoward Hinnant{ return ( c == ' ' || c == '\t' ); } 1269f8884e6c18994360a5e580e5de3aad7a289205dHoward Hinnantinline int iswblank( wint_t c, locale_t /*loc*/ ) 1279f8884e6c18994360a5e580e5de3aad7a289205dHoward Hinnant{ return ( c == L' ' || c == L'\t' ); } 128ef5aa93b9cdc5bfea3e4c59bafd784a9ff968decHoward Hinnant#endif // _LIBCPP_MSVCRT 12914fa9f9d8ff5a4541404f3e23b91188e74c56f31Howard Hinnant#endif // _LIBCPP_SUPPORT_WIN32_LOCALE_WIN32_H 130