1 /** 2 * D header file for C99. 3 * 4 * $(C_HEADER_DESCRIPTION pubs.opengroup.org/onlinepubs/009695399/basedefs/_wchar.h.html, _wchar.h) 5 * 6 * Copyright: Copyright Sean Kelly 2005 - 2009. 7 * License: Distributed under the 8 * $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0). 9 * (See accompanying file LICENSE) 10 * Authors: Sean Kelly 11 * Source: $(DRUNTIMESRC core/stdc/_wchar_.d) 12 * Standards: ISO/IEC 9899:1999 (E) 13 */ 14 15 module core.stdc.wchar_; 16 17 import core.stdc.config; 18 import core.stdc.stdarg; // for va_list 19 import core.stdc.stdio; // for FILE, not exposed per spec 20 import core.atomic : atomicLoad; 21 public import core.stdc.stddef; // for wchar_t 22 public import core.stdc.time; // for tm 23 public import core.stdc.stdint; // for WCHAR_MIN, WCHAR_MAX 24 25 extern (C): 26 nothrow: 27 @nogc: 28 29 version (CRuntime_Glibc) 30 { 31 /// 32 struct mbstate_t 33 { 34 int __count; 35 union ___value 36 { 37 wint_t __wch = 0; 38 char[4] __wchb; 39 } 40 ___value __value; 41 } 42 } 43 else version (FreeBSD) 44 { 45 /// 46 union __mbstate_t // <sys/_types.h> 47 { 48 char[128] _mbstate8 = 0; 49 long _mbstateL; 50 } 51 52 /// 53 alias mbstate_t = __mbstate_t; 54 } 55 else version (NetBSD) 56 { 57 /// 58 union __mbstate_t 59 { 60 int64_t __mbstateL; 61 char[128] __mbstate8; 62 } 63 64 /// 65 alias mbstate_t = __mbstate_t; 66 } 67 else version (OpenBSD) 68 { 69 /// 70 union __mbstate_t 71 { 72 char[128] __mbstate8 = 0; 73 int64_t __mbstateL; 74 } 75 76 /// 77 alias mbstate_t = __mbstate_t; 78 } 79 else version (DragonFlyBSD) 80 { 81 /// 82 union __mbstate_t // <sys/stdint.h> 83 { 84 char[128] _mbstate8 = 0; 85 long _mbstateL; 86 } 87 88 /// 89 alias mbstate_t = __mbstate_t; 90 } 91 else version (Solaris) 92 { 93 /// 94 struct __mbstate_t 95 { 96 version (D_LP64) 97 { 98 long[4] __filler; 99 } 100 else 101 { 102 int[6] __filler; 103 } 104 } 105 106 /// 107 alias mbstate_t = __mbstate_t; 108 } 109 else version (CRuntime_UClibc) 110 { 111 /// 112 struct mbstate_t 113 { 114 wchar_t __mask = 0; 115 wchar_t __wc = 0; 116 } 117 } 118 else 119 { 120 /// 121 alias int mbstate_t; 122 } 123 124 /// 125 alias wchar_t wint_t; 126 127 /// 128 enum wchar_t WEOF = 0xFFFF; 129 130 version (CRuntime_Glibc) 131 { 132 /// 133 int fwprintf(FILE* stream, const scope wchar_t* format, scope const ...); 134 /// 135 int __isoc99_fwscanf(FILE* stream, const scope wchar_t* format, scope ...); 136 /// 137 alias fwscanf = __isoc99_fwscanf; 138 /// 139 int swprintf(wchar_t* s, size_t n, const scope wchar_t* format, scope const ...); 140 /// 141 int __isoc99_swscanf(const scope wchar_t* s, const scope wchar_t* format, scope ...); 142 /// 143 alias swscanf = __isoc99_swscanf; 144 /// 145 int vfwprintf(FILE* stream, const scope wchar_t* format, va_list arg); 146 /// 147 int __isoc99_vfwscanf(FILE* stream, const scope wchar_t* format, va_list arg); 148 /// 149 alias vfwscanf = __isoc99_vfwscanf; 150 /// 151 int vswprintf(wchar_t* s, size_t n, const scope wchar_t* format, va_list arg); 152 /// 153 int __isoc99_vswscanf(const scope wchar_t* s, const scope wchar_t* format, va_list arg); 154 /// 155 alias vswscanf = __isoc99_vswscanf; 156 /// 157 int vwprintf(const scope wchar_t* format, va_list arg); 158 /// 159 int __isoc99_vwscanf(const scope wchar_t* format, va_list arg); 160 /// 161 alias vwscanf = __isoc99_vwscanf; 162 /// 163 int wprintf(const scope wchar_t* format, scope const ...); 164 /// 165 int __isoc99_wscanf(const scope wchar_t* format, scope ...); 166 /// 167 alias wscanf = __isoc99_wscanf; 168 } 169 else 170 { 171 /// 172 int fwprintf(FILE* stream, const scope wchar_t* format, scope const ...); 173 /// 174 int fwscanf(FILE* stream, const scope wchar_t* format, scope ...); 175 /// 176 int swprintf(wchar_t* s, size_t n, const scope wchar_t* format, scope const ...); 177 /// 178 int swscanf(const scope wchar_t* s, const scope wchar_t* format, scope ...); 179 /// 180 int vfwprintf(FILE* stream, const scope wchar_t* format, va_list arg); 181 /// 182 int vfwscanf(FILE* stream, const scope wchar_t* format, va_list arg); 183 /// 184 int vswprintf(wchar_t* s, size_t n, const scope wchar_t* format, va_list arg); 185 /// 186 int vswscanf(const scope wchar_t* s, const scope wchar_t* format, va_list arg); 187 /// 188 int vwprintf(const scope wchar_t* format, va_list arg); 189 /// 190 int vwscanf(const scope wchar_t* format, va_list arg); 191 /// 192 int wprintf(const scope wchar_t* format, scope const ...); 193 /// 194 int wscanf(const scope wchar_t* format, scope ...); 195 } 196 197 // No unsafe pointer manipulation. 198 @trusted 199 { 200 /// 201 wint_t fgetwc(FILE* stream); 202 /// 203 wint_t fputwc(wchar_t c, FILE* stream); 204 } 205 206 /// 207 wchar_t* fgetws(wchar_t* s, int n, FILE* stream); 208 /// 209 int fputws(const scope wchar_t* s, FILE* stream); 210 211 // No unsafe pointer manipulation. 212 extern (D) @trusted 213 { 214 /// 215 wint_t getwchar() { return fgetwc(atomicLoad(stdin)); } 216 /// 217 wint_t putwchar(wchar_t c) { return fputwc(c,atomicLoad(stdout)); } 218 } 219 220 /// 221 alias getwc = fgetwc; 222 /// 223 alias putwc = fputwc; 224 225 // No unsafe pointer manipulation. 226 @trusted 227 { 228 /// 229 wint_t ungetwc(wint_t c, FILE* stream); 230 /// 231 version (CRuntime_Microsoft) 232 { 233 // MSVC defines this as an inline function. 234 int fwide(FILE* stream, int mode) { return mode; } 235 } 236 else 237 { 238 int fwide(FILE* stream, int mode); 239 } 240 } 241 242 /// 243 double wcstod(const scope wchar_t* nptr, wchar_t** endptr); 244 /// 245 float wcstof(const scope wchar_t* nptr, wchar_t** endptr); 246 /// 247 real wcstold(const scope wchar_t* nptr, wchar_t** endptr); 248 /// 249 c_long wcstol(const scope wchar_t* nptr, wchar_t** endptr, int base); 250 /// 251 long wcstoll(const scope wchar_t* nptr, wchar_t** endptr, int base); 252 /// 253 c_ulong wcstoul(const scope wchar_t* nptr, wchar_t** endptr, int base); 254 /// 255 ulong wcstoull(const scope wchar_t* nptr, wchar_t** endptr, int base); 256 257 /// 258 pure wchar_t* wcscpy(return scope wchar_t* s1, scope const wchar_t* s2); 259 /// 260 pure wchar_t* wcsncpy(return scope wchar_t* s1, scope const wchar_t* s2, size_t n); 261 /// 262 pure wchar_t* wcscat(return scope wchar_t* s1, scope const wchar_t* s2); 263 /// 264 pure wchar_t* wcsncat(return scope wchar_t* s1, scope const wchar_t* s2, size_t n); 265 /// 266 pure int wcscmp(scope const wchar_t* s1, scope const wchar_t* s2); 267 /// 268 int wcscoll(scope const wchar_t* s1, scope const wchar_t* s2); 269 /// 270 pure int wcsncmp(scope const wchar_t* s1, scope const wchar_t* s2, size_t n); 271 /// 272 size_t wcsxfrm(scope wchar_t* s1, scope const wchar_t* s2, size_t n); 273 /// 274 pure inout(wchar_t)* wcschr(return scope inout(wchar_t)* s, wchar_t c); 275 /// 276 pure size_t wcscspn(scope const wchar_t* s1, scope const wchar_t* s2); 277 /// 278 pure inout(wchar_t)* wcspbrk(return scope inout(wchar_t)* s1, scope const wchar_t* s2); 279 /// 280 pure inout(wchar_t)* wcsrchr(return scope inout(wchar_t)* s, wchar_t c); 281 /// 282 pure size_t wcsspn(scope const wchar_t* s1, scope const wchar_t* s2); 283 /// 284 pure inout(wchar_t)* wcsstr(return scope inout(wchar_t)* s1, scope const wchar_t* s2); 285 /// 286 wchar_t* wcstok(return scope wchar_t* s1, scope const wchar_t* s2, wchar_t** ptr); 287 /// 288 pure size_t wcslen(scope const wchar_t* s); 289 290 /// 291 pure inout(wchar_t)* wmemchr(return scope inout wchar_t* s, wchar_t c, size_t n); 292 /// 293 pure int wmemcmp(scope const wchar_t* s1, scope const wchar_t* s2, size_t n); 294 /// 295 pure wchar_t* wmemcpy(return scope wchar_t* s1, scope const wchar_t* s2, size_t n); 296 /// 297 pure wchar_t* wmemmove(return scope wchar_t* s1, scope const wchar_t* s2, size_t n); 298 /// 299 pure wchar_t* wmemset(return scope wchar_t* s, wchar_t c, size_t n); 300 301 /// 302 size_t wcsftime(wchar_t* s, size_t maxsize, const scope wchar_t* format, const scope tm* timeptr); 303 304 version (Windows) 305 { 306 /// 307 wchar_t* _wasctime(tm*); // non-standard 308 /// 309 wchar_t* _wctime(time_t*); // non-standard 310 /// 311 wchar_t* _wstrdate(wchar_t*); // non-standard 312 /// 313 wchar_t* _wstrtime(wchar_t*); // non-standard 314 } 315 316 // No unsafe pointer manipulation. 317 @trusted 318 { 319 /// 320 wint_t btowc(int c); 321 /// 322 int wctob(wint_t c); 323 } 324 325 /// 326 int mbsinit(const scope mbstate_t* ps); 327 /// 328 size_t mbrlen(const scope char* s, size_t n, mbstate_t* ps); 329 /// 330 size_t mbrtowc(wchar_t* pwc, const scope char* s, size_t n, mbstate_t* ps); 331 /// 332 size_t wcrtomb(char* s, wchar_t wc, mbstate_t* ps); 333 /// 334 size_t mbsrtowcs(wchar_t* dst, const scope char** src, size_t len, mbstate_t* ps); 335 /// 336 size_t wcsrtombs(char* dst, const scope wchar_t** src, size_t len, mbstate_t* ps);