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 26 int isalnum_l(int c, locale_t locale) 27 { 28 return __xisalnum(locale, c); 29 } 30 static inline 31 int isalpha_l(int c, locale_t locale) 32 { 33 return __xisalpha(locale, c); 34 } 35 static inline 36 int isblank_l(int c, locale_t locale) 37 { 38 return __xisblank(locale, c); 39 } 40 static inline 41 int iscntrl_l(int c, locale_t locale) 42 { 43 return __xiscntrl(locale, c); 44 } 45 static inline 46 int isdigit_l(int c, locale_t locale) 47 { 48 return __xisdigit(locale, c); 49 } 50 static inline 51 int isgraph_l(int c, locale_t locale) 52 { 53 return __xisgraph(locale, c); 54 } 55 static inline 56 int islower_l(int c, locale_t locale) 57 { 58 return __xislower(locale, c); 59 } 60 static inline 61 int isprint_l(int c, locale_t locale) 62 { 63 return __xisprint(locale, c); 64 } 65 66 static inline 67 int ispunct_l(int c, locale_t locale) 68 { 69 return __xispunct(locale, c); 70 } 71 static inline 72 int isspace_l(int c, locale_t locale) 73 { 74 return __xisspace(locale, c); 75 } 76 static inline 77 int isupper_l(int c, locale_t locale) 78 { 79 return __xisupper(locale, c); 80 } 81 82 static inline 83 int isxdigit_l(int c, locale_t locale) 84 { 85 return __xisxdigit(locale, c); 86 } 87 88 static inline 89 int iswalnum_l(wchar_t wc, locale_t locale) 90 { 91 return __xiswalnum(locale, wc); 92 } 93 94 static inline 95 int iswalpha_l(wchar_t wc, locale_t locale) 96 { 97 return __xiswalpha(locale, wc); 98 } 99 100 static inline 101 int iswblank_l(wchar_t wc, locale_t locale) 102 { 103 return __xiswblank(locale, wc); 104 } 105 106 static inline 107 int iswcntrl_l(wchar_t wc, locale_t locale) 108 { 109 return __xiswcntrl(locale, wc); 110 } 111 112 static inline 113 int iswdigit_l(wchar_t wc, locale_t locale) 114 { 115 return __xiswdigit(locale, wc); 116 } 117 118 static inline 119 int iswgraph_l(wchar_t wc, locale_t locale) 120 { 121 return __xiswgraph(locale, wc); 122 } 123 124 static inline 125 int iswlower_l(wchar_t wc, locale_t locale) 126 { 127 return __xiswlower(locale, wc); 128 } 129 130 static inline 131 int iswprint_l(wchar_t wc, locale_t locale) 132 { 133 return __xiswprint(locale, wc); 134 } 135 136 static inline 137 int iswpunct_l(wchar_t wc, locale_t locale) 138 { 139 return __xiswpunct(locale, wc); 140 } 141 142 static inline 143 int iswspace_l(wchar_t wc, locale_t locale) 144 { 145 return __xiswspace(locale, wc); 146 } 147 148 static inline 149 int iswupper_l(wchar_t wc, locale_t locale) 150 { 151 return __xiswupper(locale, wc); 152 } 153 154 static inline 155 int iswxdigit_l(wchar_t wc, locale_t locale) 156 { 157 return __xiswxdigit(locale, wc); 158 } 159 160 static inline 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 167 int toupper_l(int c, locale_t locale) 168 { 169 return __xtoupper(locale, c); 170 } 171 static inline 172 int tolower_l(int c, locale_t locale) 173 { 174 return __xtolower(locale, c); 175 } 176 static inline 177 wint_t towupper_l(wint_t wc, locale_t locale) 178 { 179 return __xtowupper(locale, wc); 180 } 181 static inline 182 wint_t towlower_l(wint_t wc, locale_t locale) 183 { 184 return __xtowlower(locale, wc); 185 } 186 187 static inline 188 int strcoll_l(const char *__s1, const char *__s2, locale_t locale) 189 { 190 return __xstrcoll(locale, __s1, __s2); 191 } 192 static inline 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 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 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 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 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 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 232 long double strtold_l(const char *__nptr, char **__endptr, 233 locale_t locale) { 234 return strtold(__nptr, __endptr); 235 } 236 static inline 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 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 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