1 // -*- C++ -*-
2 //===--------------------- support/ibm/xlocale.h -------------------===//
3 //
4 // The LLVM Compiler Infrastructure
5 //
6 // This file is dual licensed under the MIT and the University of Illinois Open
7 // Source Licenses. See LICENSE.TXT for details.
8 //
9 //===----------------------------------------------------------------------===//
10
11 #ifndef _LIBCPP_SUPPORT_IBM_XLOCALE_H
12 #define _LIBCPP_SUPPORT_IBM_XLOCALE_H
13 #include <support/ibm/locale_mgmt_aix.h>
14
15 #if defined(_AIX)
16 #include "cstdlib"
17
18 #ifdef __cplusplus
19 extern "C" {
20 #endif
21
22 #if !defined(_AIX71)
23 // AIX 7.1 and higher has these definitions. Definitions and stubs
24 // are provied here as a temporary workaround on AIX 6.1.
25 static inline
isalnum_l(int c,locale_t locale)26 int isalnum_l(int c, locale_t locale)
27 {
28 return __xisalnum(locale, c);
29 }
30 static inline
isalpha_l(int c,locale_t locale)31 int isalpha_l(int c, locale_t locale)
32 {
33 return __xisalpha(locale, c);
34 }
35 static inline
isblank_l(int c,locale_t locale)36 int isblank_l(int c, locale_t locale)
37 {
38 return __xisblank(locale, c);
39 }
40 static inline
iscntrl_l(int c,locale_t locale)41 int iscntrl_l(int c, locale_t locale)
42 {
43 return __xiscntrl(locale, c);
44 }
45 static inline
isdigit_l(int c,locale_t locale)46 int isdigit_l(int c, locale_t locale)
47 {
48 return __xisdigit(locale, c);
49 }
50 static inline
isgraph_l(int c,locale_t locale)51 int isgraph_l(int c, locale_t locale)
52 {
53 return __xisgraph(locale, c);
54 }
55 static inline
islower_l(int c,locale_t locale)56 int islower_l(int c, locale_t locale)
57 {
58 return __xislower(locale, c);
59 }
60 static inline
isprint_l(int c,locale_t locale)61 int isprint_l(int c, locale_t locale)
62 {
63 return __xisprint(locale, c);
64 }
65
66 static inline
ispunct_l(int c,locale_t locale)67 int ispunct_l(int c, locale_t locale)
68 {
69 return __xispunct(locale, c);
70 }
71 static inline
isspace_l(int c,locale_t locale)72 int isspace_l(int c, locale_t locale)
73 {
74 return __xisspace(locale, c);
75 }
76 static inline
isupper_l(int c,locale_t locale)77 int isupper_l(int c, locale_t locale)
78 {
79 return __xisupper(locale, c);
80 }
81
82 static inline
isxdigit_l(int c,locale_t locale)83 int isxdigit_l(int c, locale_t locale)
84 {
85 return __xisxdigit(locale, c);
86 }
87
88 static inline
iswalnum_l(wchar_t wc,locale_t locale)89 int iswalnum_l(wchar_t wc, locale_t locale)
90 {
91 return __xiswalnum(locale, wc);
92 }
93
94 static inline
iswalpha_l(wchar_t wc,locale_t locale)95 int iswalpha_l(wchar_t wc, locale_t locale)
96 {
97 return __xiswalpha(locale, wc);
98 }
99
100 static inline
iswblank_l(wchar_t wc,locale_t locale)101 int iswblank_l(wchar_t wc, locale_t locale)
102 {
103 return __xiswblank(locale, wc);
104 }
105
106 static inline
iswcntrl_l(wchar_t wc,locale_t locale)107 int iswcntrl_l(wchar_t wc, locale_t locale)
108 {
109 return __xiswcntrl(locale, wc);
110 }
111
112 static inline
iswdigit_l(wchar_t wc,locale_t locale)113 int iswdigit_l(wchar_t wc, locale_t locale)
114 {
115 return __xiswdigit(locale, wc);
116 }
117
118 static inline
iswgraph_l(wchar_t wc,locale_t locale)119 int iswgraph_l(wchar_t wc, locale_t locale)
120 {
121 return __xiswgraph(locale, wc);
122 }
123
124 static inline
iswlower_l(wchar_t wc,locale_t locale)125 int iswlower_l(wchar_t wc, locale_t locale)
126 {
127 return __xiswlower(locale, wc);
128 }
129
130 static inline
iswprint_l(wchar_t wc,locale_t locale)131 int iswprint_l(wchar_t wc, locale_t locale)
132 {
133 return __xiswprint(locale, wc);
134 }
135
136 static inline
iswpunct_l(wchar_t wc,locale_t locale)137 int iswpunct_l(wchar_t wc, locale_t locale)
138 {
139 return __xiswpunct(locale, wc);
140 }
141
142 static inline
iswspace_l(wchar_t wc,locale_t locale)143 int iswspace_l(wchar_t wc, locale_t locale)
144 {
145 return __xiswspace(locale, wc);
146 }
147
148 static inline
iswupper_l(wchar_t wc,locale_t locale)149 int iswupper_l(wchar_t wc, locale_t locale)
150 {
151 return __xiswupper(locale, wc);
152 }
153
154 static inline
iswxdigit_l(wchar_t wc,locale_t locale)155 int iswxdigit_l(wchar_t wc, locale_t locale)
156 {
157 return __xiswxdigit(locale, wc);
158 }
159
160 static inline
iswctype_l(wint_t wc,wctype_t desc,locale_t locale)161 int iswctype_l(wint_t wc, wctype_t desc, locale_t locale)
162 {
163 return __xiswctype(locale, wc, desc);
164 }
165
166 static inline
toupper_l(int c,locale_t locale)167 int toupper_l(int c, locale_t locale)
168 {
169 return __xtoupper(locale, c);
170 }
171 static inline
tolower_l(int c,locale_t locale)172 int tolower_l(int c, locale_t locale)
173 {
174 return __xtolower(locale, c);
175 }
176 static inline
towupper_l(wint_t wc,locale_t locale)177 wint_t towupper_l(wint_t wc, locale_t locale)
178 {
179 return __xtowupper(locale, wc);
180 }
181 static inline
towlower_l(wint_t wc,locale_t locale)182 wint_t towlower_l(wint_t wc, locale_t locale)
183 {
184 return __xtowlower(locale, wc);
185 }
186
187 static inline
strcoll_l(const char * __s1,const char * __s2,locale_t locale)188 int strcoll_l(const char *__s1, const char *__s2, locale_t locale)
189 {
190 return __xstrcoll(locale, __s1, __s2);
191 }
192 static inline
wcscoll_l(const wchar_t * __s1,const wchar_t * __s2,locale_t locale)193 int wcscoll_l(const wchar_t *__s1, const wchar_t *__s2, locale_t locale)
194 {
195 return __xwcscoll(locale, __s1, __s2);
196 }
197 static inline
strxfrm_l(char * __s1,const char * __s2,size_t __n,locale_t locale)198 size_t strxfrm_l(char *__s1, const char *__s2, size_t __n, locale_t locale)
199 {
200 return __xstrxfrm(locale, __s1, __s2, __n);
201 }
202
203 static inline
wcsxfrm_l(wchar_t * __ws1,const wchar_t * __ws2,size_t __n,locale_t locale)204 size_t wcsxfrm_l(wchar_t *__ws1, const wchar_t *__ws2, size_t __n,
205 locale_t locale)
206 {
207 return __xwcsxfrm(locale, __ws1, __ws2, __n);
208 }
209 #endif // !defined(_AIX71)
210
211 // strftime_l() is defined by POSIX. However, AIX 7.1 does not have it
212 // implemented yet.
213 static inline
strftime_l(char * __s,size_t __size,const char * __fmt,const struct tm * __tm,locale_t locale)214 size_t strftime_l(char *__s, size_t __size, const char *__fmt,
215 const struct tm *__tm, locale_t locale) {
216 return __xstrftime(locale, __s, __size, __fmt, __tm);
217 }
218
219 // The following are not POSIX routines. These are quick-and-dirty hacks
220 // to make things pretend to work
221 static inline
strtoll_l(const char * __nptr,char ** __endptr,int __base,locale_t locale)222 long long strtoll_l(const char *__nptr, char **__endptr,
223 int __base, locale_t locale) {
224 return strtoll(__nptr, __endptr, __base);
225 }
226 static inline
strtol_l(const char * __nptr,char ** __endptr,int __base,locale_t locale)227 long strtol_l(const char *__nptr, char **__endptr,
228 int __base, locale_t locale) {
229 return strtol(__nptr, __endptr, __base);
230 }
231 static inline
strtold_l(const char * __nptr,char ** __endptr,locale_t locale)232 long double strtold_l(const char *__nptr, char **__endptr,
233 locale_t locale) {
234 return strtold(__nptr, __endptr);
235 }
236 static inline
strtoull_l(const char * __nptr,char ** __endptr,int __base,locale_t locale)237 unsigned long long strtoull_l(const char *__nptr, char **__endptr,
238 int __base, locale_t locale) {
239 return strtoull(__nptr, __endptr, __base);
240 }
241 static inline
strtoul_l(const char * __nptr,char ** __endptr,int __base,locale_t locale)242 unsigned long strtoul_l(const char *__nptr, char **__endptr,
243 int __base, locale_t locale) {
244 return strtoul(__nptr, __endptr, __base);
245 }
246
247 static inline
vasprintf(char ** strp,const char * fmt,va_list ap)248 int vasprintf(char **strp, const char *fmt, va_list ap)
249 {
250 const size_t buff_size = 256;
251 int str_size;
252 if ((*strp = (char *)malloc(buff_size)) == NULL)
253 {
254 return -1;
255 }
256 if ((str_size = vsnprintf(*strp, buff_size, fmt, ap)) >= buff_size)
257 {
258 if ((*strp = (char *)realloc(*strp, str_size + 1)) == NULL)
259 {
260 return -1;
261 }
262 str_size = vsnprintf(*strp, str_size + 1, fmt, ap);
263 }
264 return str_size;
265 }
266
267 #ifdef __cplusplus
268 }
269 #endif
270 #endif // defined(_AIX)
271 #endif // _LIBCPP_SUPPORT_IBM_XLOCALE_H
272