1//===----------------------------------------------------------------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is dual licensed under the MIT and the University of Illinois Open
6// Source Licenses. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10////////////////////////////////////////////////////////////////////////////////
11// Minimal xlocale implementation for Solaris.  This implements the subset of
12// the xlocale APIs that libc++ depends on.
13////////////////////////////////////////////////////////////////////////////////
14#ifndef __XLOCALE_H_INCLUDED
15#define __XLOCALE_H_INCLUDED
16
17#ifdef __cplusplus
18extern "C" {
19#endif
20
21
22typedef struct _LC_locale_t* locale_t;
23
24#define LC_COLLATE_MASK  (1<<0)
25#define LC_CTYPE_MASK    (1<<1)
26#define LC_MESSAGES_MASK (1<<2)
27#define LC_MONETARY_MASK (1<<3)
28#define LC_NUMERIC_MASK  (1<<4)
29#define LC_TIME_MASK     (1<<5)
30#define LC_ALL_MASK      (LC_COLLATE_MASK | LC_CTYPE_MASK | LC_MESSAGES_MASK | \
31                LC_MONETARY_MASK | LC_NUMERIC_MASK | LC_TIME_MASK)
32
33#define LC_GLOBAL_LOCALE ((locale_t)-1)
34
35size_t __mb_cur_max(locale_t l);
36#define MB_CUR_MAX_L(l) __mb_cur_max(l)
37
38locale_t newlocale(int mask, const char * locale, locale_t base);
39void freelocale(locale_t loc);
40
41wint_t btowc_l(int __c, locale_t __l);
42
43int wctob_l(wint_t __c, locale_t __l);
44
45size_t wcrtomb_l(char *__s, wchar_t __wc, mbstate_t *__ps, locale_t __l);
46
47size_t mbrtowc_l(wchar_t *__pwc, const char *__s, size_t __n,
48                 mbstate_t *__ps, locale_t __l);
49
50int mbtowc_l(wchar_t *__pwc, const char *__pmb, size_t __max, locale_t __l);
51
52size_t mbrlen_l(const char *__s, size_t __n, mbstate_t *__ps, locale_t __l);
53
54struct lconv *localeconv_l(locale_t __l);
55
56size_t mbsrtowcs_l(wchar_t *__dest, const char **__src, size_t __len,
57                   mbstate_t *__ps, locale_t __l);
58
59int sprintf_l(char *__s, locale_t __l, const char *__format, ...);
60
61int snprintf_l(char *__s, size_t __n, locale_t __l, const char *__format, ...);
62
63int asprintf_l(char **__s, locale_t __l, const char *__format, ...);
64
65int sscanf_l(const char *__s, locale_t __l, const char *__format, ...);
66
67int isalnum_l(int,locale_t);
68int isalpha_l(int,locale_t);
69int isblank_l(int,locale_t);
70int iscntrl_l(int,locale_t);
71int isdigit_l(int,locale_t);
72int isgraph_l(int,locale_t);
73int islower_l(int,locale_t);
74int isprint_l(int,locale_t);
75int ispunct_l(int,locale_t);
76int isspace_l(int,locale_t);
77int isupper_l(int,locale_t);
78int isxdigit_l(int,locale_t);
79
80int iswalnum_l(wchar_t,locale_t);
81int iswalpha_l(wchar_t,locale_t);
82int iswblank_l(wchar_t,locale_t);
83int iswcntrl_l(wchar_t,locale_t);
84int iswdigit_l(wchar_t,locale_t);
85int iswgraph_l(wchar_t,locale_t);
86int iswlower_l(wchar_t,locale_t);
87int iswprint_l(wchar_t,locale_t);
88int iswpunct_l(wchar_t,locale_t);
89int iswspace_l(wchar_t,locale_t);
90int iswupper_l(wchar_t,locale_t);
91int iswxdigit_l(wchar_t,locale_t);
92
93int iswctype_l(wint_t, wctype_t, locale_t);
94
95int toupper_l(int __c, locale_t __l);
96int tolower_l(int __c, locale_t __l);
97wint_t towupper_l(wint_t __c, locale_t __l);
98wint_t towlower_l(wint_t __c, locale_t __l);
99
100
101int strcoll_l(const char *__s1, const char *__s2, locale_t __l);
102int wcscoll_l(const wchar_t *__s1, const wchar_t *__s2, locale_t __l);
103size_t strftime_l(char *__s, size_t __size, const char *__fmt, const struct tm
104    *__tm, locale_t __l);
105
106size_t strxfrm_l(char *__s1, const char *__s2, size_t __n, locale_t __l);
107
108size_t wcsxfrm_l(wchar_t *__ws1, const wchar_t *__ws2, size_t __n,
109    locale_t __l);
110
111
112
113size_t
114mbsnrtowcs_l(wchar_t * __restrict dst, const char ** __restrict src,
115    size_t nms, size_t len, mbstate_t * __restrict ps, locale_t loc);
116
117
118size_t
119wcsnrtombs_l(char * __restrict dst, const wchar_t ** __restrict src,
120    size_t nwc, size_t len, mbstate_t * __restrict ps, locale_t loc);
121
122locale_t __cloc(void);
123
124// FIXME: These are quick-and-dirty hacks to make things pretend to work
125static inline
126long long strtoll_l(const char *__nptr, char **__endptr,
127    int __base, locale_t __loc) {
128  return strtoll(__nptr, __endptr, __base);
129}
130static inline
131long strtol_l(const char *__nptr, char **__endptr,
132    int __base, locale_t __loc) {
133  return strtol(__nptr, __endptr, __base);
134}
135static inline
136long double strtold_l(const char *__nptr, char **__endptr,
137    locale_t __loc) {
138  return strtold(__nptr, __endptr);
139}
140static inline
141unsigned long long strtoull_l(const char *__nptr, char **__endptr,
142    int __base, locale_t __loc) {
143  return strtoull(__nptr, __endptr, __base);
144}
145static inline
146unsigned long strtoul_l(const char *__nptr, char **__endptr,
147    int __base, locale_t __loc) {
148  return strtoul(__nptr, __endptr, __base);
149}
150
151#ifdef __cplusplus
152}
153#endif
154
155#endif
156