1 /** @file 2 Extended multibyte and wide character utilities. 3 4 Within this implementation, multibyte characters are represented using the 5 Unicode UTF-8 encoding and wide characters are represented using the 6 16-bit UCS-2 encoding. 7 8 Unless explicitly stated otherwise, if the execution of a function declared 9 in this file causes copying to take place between objects that overlap, the 10 behavior is undefined. 11 12 The following macros are defined in this file:<BR> 13 @verbatim 14 NULL Actually defined in <sys/EfiCdefs.h> 15 WCHAR_MIN Minimum value of a wide char. 16 WCHAR_MAX Maximum value of a wide char. 17 WEOF Wide char version of end-of-file. 18 @endverbatim 19 20 The following types are defined in this file:<BR> 21 @verbatim 22 size_t Unsigned integer type of the result of the sizeof operator. 23 wchar_t Type of wide characters. 24 wint_t Type capable of holding all wchar_t values and WEOF. 25 mbstate_t Type of object holding multibyte conversion state. 26 struct tm Incomplete declaration of the broken-down time structure. 27 @endverbatim 28 29 The following functions are declared in this file:<BR> 30 @verbatim 31 ############### Formatted Input/Output Functions 32 int fwprintf (FILE * __restrict stream, 33 const wchar_t * __restrict format, ...); 34 int fwscanf (FILE * __restrict stream, 35 const wchar_t * __restrict format, ...); 36 int swprintf (wchar_t * __restrict s, size_t n, 37 const wchar_t * __restrict format, ...); 38 int swscanf (const wchar_t * __restrict s, 39 const wchar_t * __restrict format, ...); 40 int vfwprintf (FILE * __restrict stream, 41 const wchar_t * __restrict format, va_list arg); 42 int vfwscanf (FILE * __restrict stream, 43 const wchar_t * __restrict format, va_list arg); 44 int vswprintf (wchar_t * __restrict s, size_t n, 45 const wchar_t * __restrict format, va_list arg); 46 int vswscanf (const wchar_t * __restrict s, 47 const wchar_t * __restrict format, va_list arg); 48 int vwprintf (const wchar_t * __restrict format, va_list arg); 49 int vwscanf (const wchar_t * __restrict format, va_list arg); 50 int wprintf (const wchar_t * __restrict format, ...); 51 int wscanf (const wchar_t * __restrict format, ...); 52 53 ################### Input/Output Functions 54 wint_t fgetwc (FILE *stream); 55 wchar_t *fgetws (wchar_t * __restrict S, int n, 56 FILE * __restrict stream); 57 wint_t fputwc (wchar_t c, FILE *stream); 58 int fputws (const wchar_t * __restrict S, 59 FILE * __restrict stream); 60 int fwide (FILE *stream, int mode); 61 wint_t getwc (FILE *stream); 62 wint_t getwchar (void); 63 wint_t putwc (wchar_t c, FILE *stream); 64 wint_t putwchar (wchar_t c); 65 wint_t ungetwc (wint_t c, FILE *stream); 66 67 ################### Numeric Conversions 68 double wcstod (const wchar_t * __restrict nptr, 69 wchar_t ** __restrict endptr); 70 float wcstof (const wchar_t * __restrict nptr, 71 wchar_t ** __restrict endptr); 72 long double wcstold (const wchar_t * __restrict nptr, 73 wchar_t ** __restrict endptr); 74 long int wcstol (const wchar_t * __restrict nptr, 75 wchar_t ** __restrict endptr, int base); 76 long long int wcstoll (const wchar_t * __restrict nptr, 77 wchar_t ** __restrict endptr, int base); 78 unsigned long int wcstoul (const wchar_t * __restrict nptr, 79 wchar_t ** __restrict endptr, int base); 80 unsigned long long int wcstoull (const wchar_t * __restrict nptr, 81 wchar_t ** __restrict endptr, int base); 82 83 ####################### String Copying 84 wchar_t *wcscpy (wchar_t * __restrict s1, 85 const wchar_t * __restrict s2); 86 wchar_t *wcsncpy (wchar_t * __restrict s1, 87 const wchar_t * __restrict s2, size_t n); 88 wchar_t *wmemcpy (wchar_t * __restrict s1, 89 const wchar_t * __restrict s2, size_t n); 90 wchar_t *wmemmove (wchar_t *s1, const wchar_t *s2, size_t n); 91 92 ################### String Concatenation 93 wchar_t *wcscat (wchar_t * __restrict s1, 94 const wchar_t * __restrict s2); 95 wchar_t *wcsncat (wchar_t * __restrict s1, 96 const wchar_t * __restrict s2, size_t n); 97 98 ##################### String Comparison 99 int wcscmp (const wchar_t *s1, const wchar_t *s2); 100 int wcscoll (const wchar_t *s1, const wchar_t *s2); 101 int wcsncmp (const wchar_t *s1, const wchar_t *s2, size_t n); 102 size_t wcsxfrm (wchar_t * __restrict s1, 103 const wchar_t * __restrict s2, size_t n); 104 int wmemcmp (const wchar_t *s1, const wchar_t *s2, size_t n); 105 106 ##################### String Searching 107 wchar_t *wcschr (const wchar_t *S, wchar_t c); 108 size_t wcscspn (const wchar_t *s1, const wchar_t *s2); 109 wchar_t *wcspbrk (const wchar_t *s1, const wchar_t *s2); 110 wchar_t *wcsrchr (const wchar_t *S, wchar_t c); 111 size_t wcsspn (const wchar_t *s1, const wchar_t *s2); 112 wchar_t *wcsstr (const wchar_t *s1, const wchar_t *s2); 113 wchar_t *wcstok (wchar_t * __restrict s1, 114 const wchar_t * __restrict s2, 115 wchar_t ** __restrict ptr); 116 wchar_t *wmemchr (const wchar_t *S, wchar_t c, size_t n); 117 118 ################### String Manipulation 119 size_t wcslen (const wchar_t *S); 120 wchar_t *wmemset (wchar_t *S, wchar_t c, size_t n); 121 122 ################# Date and Time Conversion 123 size_t wcsftime (wchar_t * __restrict S, size_t maxsize, 124 const wchar_t * __restrict format, 125 const struct tm * __restrict timeptr); 126 127 ############# Multibyte <--> Wide Character Conversion 128 wint_t btowc (int c); 129 int wctob (wint_t c); 130 int mbsinit (const mbstate_t *ps); 131 132 ####### Restartable Multibyte <--> Wide Character Conversion 133 size_t mbrlen (const char * __restrict S, size_t n, 134 mbstate_t * __restrict ps); 135 size_t mbrtowc (wchar_t * __restrict pwc, const char * __restrict S, 136 size_t n, mbstate_t * __restrict ps); 137 size_t wcrtomb (char * __restrict S, wchar_t wc, 138 mbstate_t * __restrict ps); 139 size_t mbsrtowcs (wchar_t * __restrict dst, 140 const char ** __restrict src, size_t len, 141 mbstate_t * __restrict ps); 142 size_t wcsrtombs (char * __restrict dst, 143 const wchar_t ** __restrict src, 144 size_t len, mbstate_t * __restrict ps); 145 @endverbatim 146 147 @note Properly constructed programs will take the following into consideration: 148 - wchar_t and wint_t may be the same integer type. 149 - WEOF might be a different value than that of EOF. 150 - WEOF might not be negative. 151 - mbstate_t objects are not intended to be inspected by programs. 152 153 Copyright (c) 2010 - 2014, Intel Corporation. All rights reserved.<BR> 154 This program and the accompanying materials are licensed and made available under 155 the terms and conditions of the BSD License that accompanies this distribution. 156 The full text of the license may be found at 157 http://opensource.org/licenses/bsd-license. 158 159 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 160 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 161 **/ 162 #ifndef _WCHAR_H 163 #define _WCHAR_H 164 #include <sys/EfiCdefs.h> 165 #include <machine/ansi.h> 166 #include <machine/limits.h> 167 #include <stdarg.h> 168 #include <stdio.h> 169 170 #if defined(_MSC_VER) 171 #pragma warning ( disable : 4142 ) 172 #endif 173 174 #ifdef _EFI_SIZE_T_ 175 typedef _EFI_SIZE_T_ size_t; /**< Unsigned integer type of the result of the sizeof operator. */ 176 #undef _BSD_SIZE_T_ 177 #undef _EFI_SIZE_T_ 178 #endif 179 180 #ifndef __cplusplus 181 #ifdef _EFI_WCHAR_T 182 /** An integer type capable of representing all distinct codes in the 183 UCS-2 encoding supported by UEFI. 184 **/ 185 typedef _EFI_WCHAR_T wchar_t; 186 #undef _BSD_WCHAR_T_ 187 #undef _EFI_WCHAR_T 188 #endif 189 #endif 190 191 #ifdef _BSD_MBSTATE_T_ 192 /** mbstate_t is an opaque object, that is not an array type, used to keep 193 conversion state during multibyte stream conversions. 194 */ 195 typedef _BSD_MBSTATE_T_ mbstate_t; 196 #undef _BSD_MBSTATE_T_ 197 #endif 198 199 #ifdef _EFI_WINT_T 200 /** wint_t is an integer type unchanged by default argument promotions that can 201 hold any value corresponding to members of the extended character set, as 202 well as at least one value that does not correspond to any member of the 203 extended character set: WEOF. 204 */ 205 typedef _EFI_WINT_T wint_t; 206 #undef _BSD_WINT_T_ 207 #undef _EFI_WINT_T 208 #endif 209 210 #ifndef WCHAR_MIN 211 /** @{ 212 Since wchar_t is an unsigned 16-bit value, it has a minimum value of 0, and 213 a maximum value defined by __USHRT_MAX (65535 on IA processors). 214 */ 215 #define WCHAR_MIN 0 216 #define WCHAR_MAX __USHRT_MAX 217 /*@}*/ 218 #endif 219 220 #ifndef WEOF 221 /** WEOF expands to a constant expression of type wint_t whose value does not 222 correspond to any member of the extended character set. It is accepted 223 (and returned) by several functions, declared in this file, to indicate 224 end-of-file, that is, no more input from a stream. It is also used as a 225 wide character value that does not correspond to any member of the 226 extended character set. 227 */ 228 #define WEOF ((wint_t)-1) 229 #endif 230 231 /* limits of wint_t -- These are NOT specified by ISO/IEC 9899 */ 232 #ifndef WINT_MIN 233 #define WINT_MIN _EFI_WINT_MIN /* wint_t */ 234 #define WINT_MAX _EFI_WINT_MAX /* wint_t */ 235 #endif 236 237 /** Type struct tm is declared here as an incomplete structure type for use as an argument 238 type by the wcsftime function. The full structure declaration is in <time.h>. 239 */ 240 struct tm; 241 242 /* ############### Formatted Input/Output Functions ##################### */ 243 244 /** The fwprintf function writes output to the stream pointed to by stream, 245 under control of the wide string pointed to by format that specifies how 246 subsequent arguments are converted for output. If there are insufficient 247 arguments for the format, the behavior is undefined. If the format is 248 exhausted while arguments remain, the excess arguments are evaluated 249 (as always) but are otherwise ignored. The fwprintf function returns 250 when the end of the format string is encountered. 251 252 The format is composed of zero or more directives: ordinary wide characters 253 (not %), which are copied unchanged to the output stream; and conversion 254 specifications, each of which results in fetching zero or more subsequent 255 arguments, converting them, if applicable, according to the corresponding 256 conversion specifier, and then writing the result to the output stream. 257 258 Each conversion specification is introduced by the wide character %. After 259 the %, the following appear in sequence: 260 * Zero or more flags (in any order) that modify the meaning of the 261 conversion specification. 262 * An optional minimum field width. If the converted value has fewer wide 263 characters than the field width, it is padded with spaces (by default) 264 on the left (or right, if the left adjustment flag, described later, 265 has been given) to the field width. The field width takes the form of 266 an asterisk * (described later) or a nonnegative decimal integer. 267 * An optional precision that gives the minimum number of digits to appear 268 for the d, i, o, u, x, and X conversions, the number of digits to 269 appear after the decimal-point wide character for e, E, f, and F 270 conversions, the maximum number of significant digits for the g and G 271 conversions, or the maximum number of wide characters to be written 272 for s conversions. The precision takes the form of a period (.) 273 followed either by an asterisk * (described later) or by an optional 274 decimal integer; if only the period is specified, the precision is 275 taken as zero. If a precision appears with any other conversion 276 specifier, the behavior is undefined. 277 * An optional length modifier that specifies the size of the argument. 278 * A conversion specifier wide character that specifies the type of 279 conversion to be applied. 280 281 As noted above, a field width, or precision, or both, may be indicated by 282 an asterisk. In this case, an int argument supplies the field width or 283 precision. The arguments specifying field width, or precision, or both, 284 must appear (in that order) before the argument (if any) to be converted. 285 A negative field width argument is taken as a - flag followed by a positive 286 field width. A negative precision argument is taken as if the precision 287 were omitted. 288 289 The flag wide characters and their meanings are:<BR> 290 - The result of the conversion is left-justified within the field. 291 (It is right-justified if this flag is not specified.) 292 + The result of a signed conversion always begins with a plus or minus 293 sign. (It begins with a sign only when a negative value is converted 294 if this flag is not specified.) 295 space If the first wide character of a signed conversion is not a sign, or 296 if a signed conversion results in no wide characters, a space is 297 prefixed to the result. If the space and + flags both appear, the 298 space flag is ignored. 299 # The result is converted to an "alternative form". For o conversion, 300 it increases the precision, if and only if necessary, to force the 301 first digit of the result to be a zero (if the value and precision 302 are both 0, a single 0 is printed). For x (or X) conversion, a 303 nonzero result has 0x (or 0X) prefixed to it. For e, E, f, F, g, 304 and G conversions, the result of converting a floating-point number 305 always contains a decimal-point wide character, even if no digits 306 follow it. (Normally, a decimal-point wide character appears in the 307 result of these conversions only if a digit follows it.) For g and G 308 conversions, trailing zeros are not removed from the result. For 309 other conversions, the behavior is undefined. 310 0 For d, i, o, u, x, X, e, E, f, F, g, and G conversions, leading zeros 311 (following any indication of sign or base) are used to pad to the 312 field width rather than performing space padding, except when 313 converting an infinity or NaN. If the 0 and - flags both appear, 314 the 0 flag is ignored. For d, i, o, u, x, and X conversions, if a 315 precision is specified, the 0 flag is ignored. For other conversions, 316 the behavior is undefined. 317 318 The length modifiers and their meanings are:<BR> 319 hh Specifies that a following d, i, o, u, x, or X conversion specifier 320 applies to a signed char or unsigned char argument (the argument 321 will have been promoted according to the integer promotions, but its 322 value shall be converted to signed char or unsigned char before 323 printing); or that a following n conversion specifier applies to a 324 pointer to a signed char argument. 325 h Specifies that a following d, i, o, u, x, or X conversion specifier 326 applies to a short int or unsigned short int argument (the argument 327 will have been promoted according to the integer promotions, but its 328 value shall be converted to short int or unsigned short int before 329 printing); or that a following n conversion specifier applies to a 330 pointer to a short int argument. 331 l (ell) Specifies that a following d, i, o, u, x, or X conversion 332 specifier applies to a long int or unsigned long int argument; 333 that a following n conversion specifier applies to a pointer to a 334 long int argument; that a following c conversion specifier 335 applies to a wint_t argument; that a following s conversion 336 specifier applies to a pointer to a wchar_t argument; or has no 337 effect on a following e, E, f, F, g, or G conversion specifier. 338 ll (ell-ell) Specifies that a following d, i, o, u, x, or X conversion 339 specifier applies to a long long int or unsigned long long int 340 argument; or that a following n conversion specifier applies 341 to a pointer to a long long int argument. 342 j Specifies that a following d, i, o, u, x, or X conversion specifier 343 applies to an intmax_t or uintmax_t argument; or that a following 344 n conversion specifier applies to a pointer to an intmax_t argument. 345 z Specifies that a following d, i, o, u, x, or X conversion specifier 346 applies to a size_t or the corresponding signed integer type 347 argument; or that a following n conversion specifier applies to a 348 pointer to a signed integer type corresponding to size_t argument. 349 t Specifies that a following d, i, o, u, x, or X conversion specifier 350 applies to a ptrdiff_t or the corresponding unsigned integer type 351 argument; or that a following n conversion specifier applies to a 352 pointer to a ptrdiff_t argument. 353 L Specifies that a following a, A, e, E, f, F, g, or G conversion 354 specifier applies to a long double argument. 355 356 If a length modifier appears with any conversion specifier other than as 357 specified above, the behavior is undefined. 358 359 The conversion specifiers and their meanings are:<BR> 360 d,i The int argument is converted to signed decimal in the 361 style [-]dddd. The precision specifies the minimum number of digits 362 to appear; if the value being converted can be represented in fewer 363 digits, it is expanded with leading zeros. The default precision 364 is 1. The result of converting a zero value with a precision of 365 zero is no wide characters. 366 o,u,x,X The unsigned int argument is converted to unsigned octal (o), 367 unsigned decimal (u), or unsigned hexadecimal notation (x or X) in 368 the style dddd; the letters abcdef are used for x conversion and 369 the letters ABCDEF for X conversion. The precision specifies the 370 minimum number of digits to appear; if the value being converted 371 can be represented in fewer digits, it is expanded with leading 372 zeros. The default precision is 1. The result of converting a zero 373 value with a precision of zero is no wide characters. 374 f,F A double argument representing a floating-point number is converted 375 to decimal notation in the style [-]ddd.ddd, where the number of 376 digits after the decimal-point wide character is equal to the 377 precision specification. If the precision is missing, it is taken 378 as 6; if the precision is zero and the # flag is not specified, no 379 decimal-point wide character appears. If a decimal-point wide 380 character appears, at least one digit appears before it. The value 381 is rounded to the appropriate number of digits.<BR> 382 A double argument representing an infinity is converted to [-]inf. 383 A double argument representing a NaN is converted to [-]nan. 384 The F conversion specifier produces INF or NAN instead 385 of inf or nan, respectively. 386 e,E A double argument representing a floating-point number is converted 387 in the style [-]d.ddd e +/- dd, where there is one digit (which is 388 nonzero if the argument is nonzero) before the decimal-point wide 389 character and the number of digits after it is equal to the 390 precision; if the precision is missing, it is taken as 6; if the 391 precision is zero and the # flag is not specified, no decimal-point 392 wide character appears. The value is rounded to the appropriate 393 number of digits. The E conversion specifier produces a number with 394 E instead of e introducing the exponent. The exponent always 395 contains at least two digits, and only as many more digits as 396 necessary to represent the exponent. If the value is zero, the 397 exponent is zero. A double argument representing an infinity or NaN 398 is converted in the style of an f or F conversion specifier. 399 g,G A double argument representing a floating-point number is converted 400 in style f or e (or in style F or E in the case of a G conversion 401 specifier), depending on the value converted and the precision. 402 Let P equal the precision if nonzero, 6 if the precision is 403 omitted, or 1 if the precision is zero. Then, if a conversion with 404 style E would have an exponent of X: 405 - if P > X = -4, the conversion is with style f (or F) and 406 precision P - (X + 1). 407 - otherwise, the conversion is with style e (or E) and 408 precision P - 1. 409 Finally, unless the # flag is used, any trailing zeros are removed 410 from the fractional portion of the result and the decimal-point 411 wide character is removed if there is no fractional portion 412 remaining. A double argument representing an infinity or NaN is 413 converted in the style of an f or F conversion specifier. 414 c If no l length modifier is present, the int argument is converted 415 to a wide character as if by calling btowc and the resulting wide 416 character is written. If an l length modifier is present, the 417 wint_t argument is converted to wchar_t and written. 418 s If no l length modifier is present, the argument shall be a pointer 419 to the initial element of a character array containing a multibyte 420 character sequence beginning in the initial shift state. Characters 421 from the array are converted as if by repeated calls to the mbrtowc 422 function, with the conversion state described by an mbstate_t 423 object initialized to zero before the first multibyte character is 424 converted, and written up to (but not including) the terminating 425 null wide character. If the precision is specified, no more than 426 that many wide characters are written. If the precision is not 427 specified or is greater than the size of the converted array, the 428 converted array shall contain a null wide character.<BR> 429 If an l length modifier is present, the argument shall be a pointer 430 to the initial element of an array of wchar_t type. Wide characters 431 from the array are written up to (but not including) a terminating 432 null wide character. If the precision is specified, no more than 433 that many wide characters are written. If the precision is not 434 specified or is greater than the size of the array, the array 435 shall contain a null wide character. 436 p The argument shall be a pointer to void. The value of the pointer 437 is converted to a sequence of printing wide characters, in an 438 implementation-defined manner. 439 n The argument shall be a pointer to signed integer into which is 440 written the number of wide characters written to the output stream 441 so far by this call to fwprintf. No argument is converted, but one 442 is consumed. If the conversion specification includes any flags, a 443 field width, or a precision, the behavior is undefined. 444 % A % wide character is written. No argument is converted. The 445 complete conversion specification is %%. 446 447 448 @param[in] stream An open File specifier to which the output is sent. 449 @param[in] format A wide character sequence containing characters 450 to be copied unchanged, and conversion specifiers 451 which convert their associated arguments. 452 @param ... Variable number of parameters as required by format. 453 454 @return The fwprintf function returns the number of wide characters 455 transmitted, or a negative value if an output or encoding error 456 occurred. 457 **/ 458 int fwprintf(FILE * __restrict stream, const wchar_t * __restrict format, ...); 459 460 /** The fwscanf function reads input from the stream pointed to by stream, 461 under control of the wide string pointed to by format that specifies 462 the admissible input sequences and how they are to be converted for 463 assignment, using subsequent arguments as pointers to the objects to 464 receive the converted input. If there are insufficient arguments for 465 the format, the behavior is undefined. If the format is exhausted while 466 arguments remain, the excess arguments are evaluated (as always) but are 467 otherwise ignored. 468 469 The format is composed of zero or more directives: one or more white-space 470 wide characters, an ordinary wide character (neither % nor a white-space 471 wide character), or a conversion specification. Each conversion 472 specification is introduced by the wide character %. After the %, the 473 following appear in sequence: 474 - An optional assignment-suppressing wide character *. 475 - An optional decimal integer greater than zero that specifies the 476 maximum field width (in wide characters). 477 - An optional length modifier that specifies the size of the receiving object. 478 - A conversion specifier wide character that specifies the type of 479 conversion to be applied. 480 481 The fwscanf function executes each directive of the format in turn. If a 482 directive fails, as detailed below, the function returns. Failures are 483 described as input failures (due to the occurrence of an encoding error 484 or the unavailability of input characters), or matching failures 485 (due to inappropriate input). 486 487 A directive composed of white-space wide character(s) is executed by 488 reading input up to the first non-white-space wide character (which remains 489 unread), or until no more wide characters can be read. 490 491 A directive that is an ordinary wide character is executed by reading the 492 next wide character of the stream. If that wide character differs from the 493 directive, the directive fails and the differing and subsequent wide 494 characters remain unread. Similarly, if end-of-file, an encoding error, or 495 a read error prevents a wide character from being read, the directive fails. 496 497 A directive that is a conversion specification defines a set of matching 498 input sequences, as described below for each specifier. A conversion 499 specification is executed in the following steps: 500 - Input white-space wide characters (as specified by the iswspace 501 function) are skipped, unless the specification includes 502 a [, c, or n specifier. 503 - An input item is read from the stream, unless the specification 504 includes an n specifier. An input item is defined as the longest 505 sequence of input wide characters which does not exceed any specified 506 field width and which is, or is a prefix of, a matching input sequence. 507 The first wide character, if any, after the input item remains unread. 508 If the length of the input item is zero, the execution of the directive 509 fails; this condition is a matching failure unless end-of-file, an 510 encoding error, or a read error prevented input from the stream, in 511 which case it is an input failure. 512 - Except in the case of a % specifier, the input item (or, in the case of 513 a %n directive, the count of input wide characters) is converted to a 514 type appropriate to the conversion specifier. If the input item is not 515 a matching sequence, the execution of the directive fails: this 516 condition is a matching failure. Unless assignment suppression was 517 indicated by a *, the result of the conversion is placed in the object 518 pointed to by the first argument following the format argument that has 519 not already received a conversion result. If this object does not have 520 an appropriate type, or if the result of the conversion cannot be 521 represented in the object, the behavior is undefined. 522 523 The length modifiers and their meanings are:<BR> 524 hh Specifies that a following d, i, o, u, x, X, or n conversion 525 specifier applies to an argument with type pointer to signed char 526 or unsigned char. 527 h Specifies that a following d, i, o, u, x, X, or n conversion 528 specifier applies to an argument with type pointer to short int 529 or unsigned short int. 530 l (ell) Specifies that a following d, i, o, u, x, X, or n conversion 531 specifier applies to an argument with type pointer to long int or 532 unsigned long int; that a following e, E, f, F, g, or G conversion 533 specifier applies to an argument with type pointer to double; or 534 that a following c, s, or [ conversion specifier applies to an 535 argument with type pointer to wchar_t. 536 ll (ell-ell) Specifies that a following d, i, o, u, x, X, or n conversion 537 specifier applies to an argument with type 538 pointer to long long int or unsigned long long int. 539 j Specifies that a following d, i, o, u, x, X, or n conversion 540 specifier applies to an argument with type pointer to intmax_t 541 or uintmax_t. 542 z Specifies that a following d, i, o, u, x, X, or n conversion 543 specifier applies to an argument with type pointer to size_t or the 544 corresponding signed integer type. 545 t Specifies that a following d, i, o, u, x, X, or n conversion 546 specifier applies to an argument with type pointer to ptrdiff_t or 547 the corresponding unsigned integer type. 548 L Specifies that a following e, E, f, F, g, or G conversion specifier 549 applies to an argument with type pointer to long double. 550 551 If a length modifier appears with any conversion specifier other than as 552 specified above, the behavior is undefined. 553 554 The conversion specifiers and their meanings are:<BR> 555 d Matches an optionally signed decimal integer, whose format is the 556 same as expected for the subject sequence of the wcstol function 557 with the value 10 for the base argument. The corresponding argument 558 shall be a pointer to signed integer. 559 i Matches an optionally signed integer, whose format is the same as 560 expected for the subject sequence of the wcstol function with the 561 value 0 for the base argument. The corresponding argument shall be 562 a pointer to signed integer. 563 o Matches an optionally signed octal integer, whose format is the 564 same as expected for the subject sequence of the wcstoul function 565 with the value 8 for the base argument. The corresponding argument 566 shall be a pointer to unsigned integer. 567 u Matches an optionally signed decimal integer, whose format is the 568 same as expected for the subject sequence of the wcstoul function 569 with the value 10 for the base argument. The corresponding argument 570 shall be a pointer to unsigned integer. 571 x Matches an optionally signed hexadecimal integer, whose format is 572 the same as expected for the subject sequence of the wcstoul 573 function with the value 16 for the base argument. The corresponding 574 argument shall be a pointer to unsigned integer. 575 e,f,g Matches an optionally signed floating-point number, infinity, or 576 NaN, whose format is the same as expected for the subject sequence 577 of the wcstod function. The corresponding argument shall be a 578 pointer to float. 579 c Matches a sequence of wide characters of exactly the number 580 specified by the field width (1 if no field width is present in the 581 directive).<BR> 582 If no l length modifier is present, characters from the input field 583 are converted as if by repeated calls to the wcrtomb function, with 584 the conversion state described by an mbstate_t object initialized 585 to zero before the first wide character is converted. The 586 corresponding argument shall be a pointer to the initial element of 587 a character array large enough to accept the sequence. No null 588 character is added.<BR> 589 If an l length modifier is present, the corresponding argument 590 shall be a pointer to the initial element of an array of 591 wchar_t large enough to accept the sequence. 592 No null wide character is added. 593 s Matches a sequence of non-white-space wide characters. 594 If no l length modifier is present, characters from the input field 595 are converted as if by repeated calls to the wcrtomb function, with 596 the conversion state described by an mbstate_t object initialized 597 to zero before the first wide character is converted. The 598 corresponding argument shall be a pointer to the initial element of 599 a character array large enough to accept the sequence and a 600 terminating null character, which will be added automatically.<BR> 601 If an l length modifier is present, the corresponding argument 602 shall be a pointer to the initial element of an array of wchar_t 603 large enough to accept the sequence and the terminating null wide 604 character, which will be added automatically. 605 [ Matches a nonempty sequence of wide characters from a set of 606 expected characters (the scanset).<BR> 607 If no l length modifier is present, characters from the input field 608 are converted as if by repeated calls to the wcrtomb function, with 609 the conversion state described by an mbstate_t object initialized 610 to zero before the first wide character is converted. The 611 corresponding argument shall be a pointer to the initial element of 612 a character array large enough to accept the sequence and a 613 terminating null character, which will be added automatically.<BR> 614 If an l length modifier is present, the corresponding argument 615 shall be a pointer to the initial element of an array of wchar_t 616 large enough to accept the sequence and the terminating null wide 617 character, which will be added automatically.<BR> 618 The conversion specifier includes all subsequent wide characters 619 in the format string, up to and including the matching right 620 bracket (]). The wide characters between the brackets 621 (the scanlist) compose the scanset, unless the wide character after 622 the left bracket is a circumflex (^), in which case the scanset 623 contains all wide characters that do not appear in the scanlist 624 between the circumflex and the right bracket. If the conversion 625 specifier begins with [] or [^], the right bracket wide character 626 is in the scanlist and the next following right bracket wide 627 character is the matching right bracket that ends the specification; 628 otherwise the first following right bracket wide character is the 629 one that ends the specification. If a - wide character is in the 630 scanlist and is not the first, nor the second where the first wide 631 character is a ^, nor the last character, 632 the - is added to the scanset. 633 p Matches the set of sequences produced by the %p conversion of the 634 fwprintf function. The corresponding argument is a pointer to a 635 pointer to void. The input item is converted to a pointer value. If 636 the input item is a value converted earlier during the same program 637 execution, the pointer that results will compare equal to that 638 value. 639 n No input is consumed. The corresponding argument is a pointer to 640 signed integer into which is to be written the number of wide 641 characters read from the input stream so far by this call to the 642 fwscanf function. Execution of a %n directive does not increment 643 the assignment count returned at the completion of execution of the 644 fwscanf function. No argument is converted, but one is consumed. 645 % Matches a single % wide character; no conversion or assignment 646 occurs. The complete conversion specification shall be %%. 647 648 The conversion specifiers E, F, G, and X are also valid and behave the same 649 as, respectively, e, f, g, and x. 650 651 Trailing white space (including new-line wide characters) is left unread 652 unless matched by a directive. The success of literal matches and 653 suppressed assignments is not directly determinable other than via 654 the %n directive. 655 656 @param[in] stream An open File specifier from which the input is read. 657 @param[in] format A wide character sequence containing characters 658 to be matched against, and conversion specifiers 659 which convert their associated arguments. Converted 660 items are stored according to their associated arguments. 661 @param ... Variable number of parameters, as required by format, 662 specifying the objects to receive the converted input. 663 664 @return The fwscanf function returns the value of the macro EOF if an 665 input failure occurs before any conversion. Otherwise, the 666 function returns the number of input items assigned, which can be 667 fewer than provided for, or even zero, in the event of an early 668 matching failure. 669 **/ 670 int fwscanf(FILE * __restrict stream, const wchar_t * __restrict format, ...); 671 672 /** Formatted wide-character output to a buffer. 673 674 The swprintf function is equivalent to fwprintf, except that the argument s 675 specifies an array of wide characters into which the generated output is to 676 be written, rather than written to a stream. No more than n wide characters 677 are written, including a terminating null wide character, which is always 678 added (unless n is zero). 679 680 @param[out] s A pointer to the array to receive the formatted output. 681 @param[in] n Maximum number of characters to write into buffer s. 682 @param[in] format A wide character sequence containing characters 683 to be copied unchanged, and conversion specifiers 684 which convert their associated arguments. Copied and 685 converted characters are written to the array pointed 686 to by s. 687 @param ... Variable number of parameters as required by format. 688 689 @return The swprintf function returns the number of wide characters 690 written in the array, not counting the terminating null wide 691 character, or a negative value if an encoding error occurred or 692 if n or more wide characters were requested to be written. 693 **/ 694 int swprintf(wchar_t * __restrict s, size_t n, const wchar_t * __restrict format, ...); 695 696 /** Formatted wide input from a string. 697 698 The swscanf function is equivalent to fwscanf, except that the argument 699 Buff specifies a wide string from which the input is to be obtained, rather 700 than from a stream. Reaching the end of the wide string is equivalent to 701 encountering end-of-file for the fwscanf function. 702 703 @param[in] Buff Pointer to the string from which to obtain input. 704 @param[in] Format A wide character sequence containing characters 705 to be matched against, and conversion specifiers 706 which convert their associated arguments. 707 @param[out] ... Variable number of parameters, as required by format, 708 specifying the objects to receive the converted input. 709 710 @return The swscanf function returns the value of the macro EOF if an 711 input failure occurs before any conversion. Otherwise, the 712 swscanf function returns the number of input items assigned, 713 which can be fewer than provided for, or even zero, in the event 714 of an early matching failure. 715 **/ 716 int swscanf(const wchar_t * __restrict Buff, const wchar_t * __restrict Format, ...); 717 718 /** Print formatted values from an argument list. 719 720 The vfwprintf function is equivalent to fwprintf, with the variable argument list 721 replaced by Args, which shall have been initialized by the va_start macro (and 722 possibly subsequent va_arg calls). The vfwprintf function does not invoke the 723 va_end macro. 724 725 @param[in] Stream The output stream to receive the formatted output. 726 @param[in] Format A wide character sequence containing characters 727 to be matched against, and conversion specifiers 728 which convert their associated arguments. 729 @param[in] Args A list of arguments, initialized by the va_start macro 730 and accessed using the va_arg macro, used to satisfy 731 the directives in the Format string. 732 733 @return The vfwprintf function returns the number of wide characters 734 transmitted, or a negative value if an output or encoding 735 error occurred. 736 **/ 737 int vfwprintf(FILE * __restrict Stream, const wchar_t * __restrict Format, va_list Args); 738 739 /** Formatted input from a stream. 740 741 The vfwscanf function is equivalent to fwscanf, with the variable argument 742 list replaced by Args, which must have been initialized by the va_start 743 macro (and possibly subsequent va_arg calls). The vfwscanf function does 744 not invoke the va_end macro. 745 746 @param[in] Stream The input stream. 747 @param[in] Format A wide character sequence containing characters 748 to be matched against, and conversion specifiers 749 which convert their associated arguments. 750 @param[in] Args A list of arguments, initialized by the va_start macro 751 and accessed using the va_arg macro, used to satisfy 752 the directives in the Format string. 753 754 @return The vfwscanf function returns the value of the macro EOF if an 755 input failure occurs before any conversion. Otherwise, the 756 vfwscanf function returns the number of input items assigned, 757 which can be fewer than provided for, or even zero, in the event 758 of an early matching failure. 759 **/ 760 int vfwscanf(FILE * __restrict Stream, const wchar_t * __restrict Format, va_list Args); 761 762 /** Formatted print, to a buffer, from an argument list. 763 764 The vswprintf function is equivalent to swprintf, with the variable 765 argument list replaced by Args, which must have been initialized by the 766 va_start macro (and possibly subsequent va_arg calls). The vswprintf 767 function does not invoke the va_end macro. 768 769 @param[in] S A pointer to the array to receive the formatted output. 770 @param[in] N Maximum number of characters to write into array S. 771 @param[in] Format A wide character sequence containing characters 772 to be matched against, and conversion specifiers 773 which convert their associated arguments. 774 @param[in] Args A list of arguments, initialized by the va_start macro 775 and accessed using the va_arg macro, used to satisfy 776 the directives in the Format string. 777 778 @return The vswprintf function returns the number of wide characters 779 written in the array, not counting the terminating null wide 780 character, or a neg ative value if an encoding error occurred or 781 if n or more wide characters were requested to be generated. 782 **/ 783 int vswprintf(wchar_t * __restrict S, size_t N, const wchar_t * __restrict Format, va_list Args); 784 785 /** Formatted input from a string, using an argument list. 786 787 The vswscanf function is equivalent to swscanf, with the variable argument 788 list replaced by Args, which must have been initialized by the va_start 789 macro. The vswscanf function does not invoke the va_end macro. 790 791 @param[in] S Pointer to the string from which to obtain input. 792 @param[in] Format A wide character sequence containing characters 793 to be matched against, and conversion specifiers 794 which convert their associated arguments. 795 @param[out] Args A list of arguments, initialized by the va_start macro 796 and accessed using the va_arg macro, used to satisfy 797 the directives in the Format string. 798 799 @return The vswscanf function returns the value of the macro EOF if an 800 input failure occurs before any conversion. Otherwise, the 801 vswscanf function returns the number of input items assigned, 802 which can be fewer than provided for, or even zero, in the event 803 of an early matching failure. 804 **/ 805 int vswscanf(const wchar_t * __restrict S, const wchar_t * __restrict Format, va_list Args); 806 807 /** Formatted print, to stdout, from an argument list. 808 809 The vwprintf function is equivalent to wprintf, with the variable argument 810 list replaced by Args, which must have been initialized by the va_start 811 macro. The vwprintf function does not invoke the va_end macro. 812 813 @param[in] Format A wide character sequence containing characters 814 to be matched against, and conversion specifiers 815 which convert their associated arguments. 816 @param[out] Args A list of arguments, initialized by the va_start macro 817 and accessed using the va_arg macro, used to satisfy 818 the directives in the Format string. 819 820 @return The vwprintf function returns the number of wide characters 821 transmitted, or a negative value if an output or encoding error 822 occurred. 823 **/ 824 int vwprintf(const wchar_t * __restrict Format, va_list Args); 825 826 /** Formatted input, from stdin, to an argument list. 827 828 The vwscanf function is equivalent to wscanf, with the variable argument 829 list replaced by arg, which shall have been initialized by the va_start 830 macro. The vwscanf function does not invoke the va_end macro. 831 832 @param[in] Format A wide character sequence containing characters 833 to be matched against, and conversion specifiers 834 which convert their associated arguments. 835 @param[out] Args A list of arguments, initialized by the va_start macro 836 and accessed using the va_arg macro, used to satisfy 837 the directives in the Format string. 838 839 @return The vwscanf function returns the value of the macro EOF if an 840 input failure occurs before any conversion. Otherwise, the 841 vwscanf function returns the number of input items assigned, 842 which can be fewer than provided for, or even zero, in the event 843 of an early matching failure. 844 **/ 845 int vwscanf(const wchar_t * __restrict Format, va_list Args); 846 847 /** Formatted print to stdout. 848 849 The wprintf function is equivalent to fwprintf with the argument stdout 850 specifying the output stream. 851 852 @param[in] format A wide character sequence containing characters 853 to be copied unchanged, and conversion specifiers 854 which convert their associated arguments. 855 @param ... Variable number of parameters as required by format. 856 857 @return The wprintf function returns the number of wide characters 858 transmitted, or a negative value if an output or encoding error 859 occurred. 860 **/ 861 int wprintf(const wchar_t * __restrict Format, ...); 862 863 /** Formatted input from stdin. 864 865 The wscanf function is equivalent to fwscanf with the argument stdin 866 specifying the input stream. 867 868 @param[in] format A wide character sequence containing characters 869 to be matched against, and conversion specifiers 870 which convert their associated arguments. Converted 871 items are stored according to their associated arguments. 872 @param ... Variable number of parameters, as required by format, 873 specifying the objects to receive the converted input. 874 875 @return The wscanf function returns the value of the macro EOF if an 876 input failure occurs before any conversion. Otherwise, the 877 wscanf function returns the number of input items assigned, 878 which can be fewer than provided for, or even zero, in the event 879 of an early matching failure. 880 **/ 881 int wscanf(const wchar_t * __restrict format, ...); 882 883 /* ################### Input/Output Functions ########################### */ 884 885 886 /** Get a character from an input Stream. 887 888 If the end-of-file indicator for the input stream pointed to by stream is not set and a 889 next wide character is present, the fgetwc function obtains that wide character as a 890 wchar_t converted to a wint_t and advances the associated file position indicator for 891 the stream (if defined). 892 893 @param[in] Stream An input stream from which to obtain a character. 894 895 @return If the end-of-file indicator for the stream is set, or if the stream is at end-of-file, the endof- 896 file indicator for the stream is set and the fgetwc function returns WEOF. Otherwise, 897 the fgetwc function returns the next wide character from the input stream pointed to by 898 stream. If a read error occurs, the error indicator for the stream is set and the fgetwc 899 function returns WEOF. If an encoding error occurs (including too few bytes), the value of 900 the macro EILSEQ is stored in errno and the fgetwc function returns WEOF. 901 **/ 902 wint_t fgetwc(FILE *Stream); 903 904 /** Read a string from an input stream into a buffer. 905 906 The fgetws function reads at most one less than the number of 907 wide characters specified by n from the stream pointed to by 908 stream into the array pointed to by s. No additional wide 909 characters are read after a new-line wide character (which is 910 retained) or after end-of-file. A null wide character is written 911 immediately after the last wide character read into the array. 912 913 @param[out] S A pointer to the array to receive the input string. 914 @param[in] Limit The maximum number of characters to put into Buff, 915 including the terminating null character. 916 @param[in] Stream An input stream from which to obtain the string. 917 918 @return The fgetws function returns S if successful. If end-of-file is 919 encountered and no characters have been read into the array, the 920 contents of the array remain unchanged and a null pointer is 921 returned. If a read or encoding error occurs during the 922 operation, the array contents are indeterminate and a 923 null pointer is returned. 924 **/ 925 wchar_t *fgetws(wchar_t * __restrict S, int Limit, FILE * __restrict Stream); 926 927 /** Write a character to an output stream. 928 929 The fputwc function writes the wide character specified by c to the output stream 930 pointed to by stream, at the position indicated by the associated file position indicator 931 for the stream (if defined), and advances the indicator appropriately. If the file cannot 932 support positioning requests, or if the stream was opened with append mode, the 933 character is appended to the output stream. 934 935 @param[in] C The character to be written to Stream. 936 @param[in] Stream The output stream that C is to be written to. 937 938 @return The fputwc function returns the wide character written. If a write error occurs, the 939 error indicator for the stream is set and fputwc returns WEOF. If an encoding error 940 occurs, the value of the macro EILSEQ is stored in errno and fputwc returns WEOF. 941 **/ 942 wint_t fputwc(wchar_t C, FILE *Stream); 943 944 /** Write a string to an output stream. 945 946 The fputws function writes the wide string pointed to by S to the stream pointed to by 947 Stream. The terminating null wide character is not written. 948 949 @param[in] String The character string to be written to Stream. 950 @param[in] Stream The output stream that String is to be written to. 951 952 @return The fputws function returns EOF if a write or encoding error occurs; otherwise, it 953 returns a nonnegative value. 954 **/ 955 int fputws(const wchar_t * __restrict S, FILE * __restrict Stream); 956 957 /** Query or set a stream's orientation. 958 959 The fwide function determines the orientation of the stream pointed to by stream. If 960 Mode is greater than zero, the function first attempts to make the stream wide oriented. If 961 Mode is less than zero, the function first attempts to make the stream byte oriented. 962 Otherwise, Mode is zero and the function does not alter the orientation of the stream. 963 964 @param[in] Stream The stream to be queried. 965 @param[in] Mode Control value selecting between quering or setting 966 the Stream's orientation. 967 @return The fwide function returns a value greater than zero if, after the call, the stream has 968 wide orientation, a value less than zero if the stream has byte orientation, or zero if the 969 stream has no orientation. 970 **/ 971 int fwide(FILE *Stream, int Mode); 972 973 /** Get a character from an input stream. 974 975 The getwc function is equivalent to fgetwc, except that if it is implemented as a 976 macro, it may evaluate Stream more than once, so the argument should never be an 977 expression with side effects. 978 979 @param[in] Stream The stream to be read. 980 981 @return The getwc function returns the next wide character from the input stream pointed to by 982 stream, or WEOF. 983 **/ 984 wint_t getwc(FILE *Stream); 985 986 /** Get a character from stdin. 987 988 The getwchar function is equivalent to getwc with the argument stdin. 989 990 @return The getwchar function returns the next wide character from the 991 input stream pointed to by stdin, or WEOF. 992 **/ 993 wint_t getwchar(void); 994 995 /** Write a character to an output stream. 996 997 The putwc function is equivalent to fputwc, except that if it is implemented as a 998 macro, it may evaluate Stream more than once, so the Stream argument should never be an 999 expression with side effects. 1000 1001 @param[in] C The wide character to be written to Stream. 1002 @param[in] Stream The output stream that C is to be written to. 1003 1004 @return The putwc function returns the wide character written, or WEOF. 1005 **/ 1006 wint_t putwc(wchar_t C, FILE *Stream); 1007 1008 /** Write a character to stdout. 1009 1010 The putwchar function is equivalent to putwc with the second argument stdout. 1011 1012 @param[in] C The wide character to be written to stdout. 1013 1014 @return The putwchar function returns the character written, or WEOF. 1015 **/ 1016 wint_t putwchar(wchar_t C); 1017 1018 /** Return a character to the input Stream as if it had not been read. 1019 1020 The ungetwc function pushes the wide character specified by C back onto the input 1021 stream pointed to by Stream. Pushed-back wide characters will be returned by 1022 subsequent reads on that stream in the reverse order of their pushing. A successful 1023 intervening call (with the stream pointed to by Stream) to a file positioning function 1024 (fseek, fsetpos, or rewind) discards any pushed-back wide characters for the 1025 stream. The external storage corresponding to the stream is unchanged. 1026 1027 One wide character of pushback is guaranteed, even if the call to the ungetwc function 1028 follows just after a call to a formatted wide character input function fwscanf, 1029 vfwscanf, vwscanf, or wscanf. If the ungetwc function is called too many times 1030 on the same stream without an intervening read or file positioning operation on that 1031 stream, the operation may fail. 1032 1033 If the value of C equals that of the macro WEOF, the operation fails and the input stream is 1034 unchanged. 1035 1036 A successful call to the ungetwc function clears the end-of-file indicator for the stream. 1037 The value of the file position indicator for the stream after reading or discarding all 1038 pushed-back wide characters is the same as it was before the wide characters were pushed 1039 back. For a text or binary stream, the value of its file position indicator after a successful 1040 call to the ungetwc function is unspecified until all pushed-back wide characters are 1041 read or discarded. 1042 1043 @param[in] C The wide character to push back onto the Stream. 1044 @param[in] Stream The output stream that C is to be pushed back onto. 1045 1046 @return The ungetwc function returns the character pushed back, 1047 or WEOF if the operation fails. 1048 **/ 1049 wint_t ungetwc(wint_t C, FILE *Stream); 1050 1051 /* ################### Numeric Conversions ########################### */ 1052 1053 /** @{ 1054 The wcstod, wcstof, and wcstold functions convert the initial portion of the wide 1055 string pointed to by nptr to double, float, and long double representation, 1056 respectively. First, they decompose the input string into three parts: an initial, possibly 1057 empty, sequence of white-space wide characters (as specified by the iswspace 1058 function), a subject sequence resembling a floating-point constant or representing an 1059 infinity or NaN; and a final wide string of one or more unrecognized wide characters, 1060 including the terminating null wide character of the input wide string. Then, they attempt 1061 to convert the subject sequence to a floating-point number, and return the result. 1062 1063 @param[in] Nptr Pointer to the string to convert to a floating-point value. 1064 @param[in] EndPtr Optional pointer to an object in which to store a pointer 1065 to the final wide string. 1066 1067 The functions return the converted value, if any. If no conversion could be performed, 1068 zero is returned. If the correct value is outside the range of representable values, plus or 1069 minus HUGE_VAL, HUGE_VALF, or HUGE_VALL is returned (according to the return 1070 type and sign of the value), and the value of the macro ERANGE is stored in errno. If 1071 the result underflows (7.12.1), the functions return a value whose magnitude is no greater 1072 than the smallest normalized positive number in the return type. A pointer to the 1073 final wide string is stored in the object pointed to by endptr, provided that endptr is 1074 not a null pointer. 1075 **/ 1076 double wcstod (const wchar_t * __restrict Nptr, wchar_t ** __restrict EndPtr); 1077 float wcstof (const wchar_t * __restrict Nptr, wchar_t ** __restrict EndPtr); 1078 long double wcstold (const wchar_t * __restrict Nptr, wchar_t ** __restrict EndPtr); 1079 /*@}*/ 1080 1081 /** @{ 1082 The wcstol, wcstoll, wcstoul, and wcstoull functions convert the initial 1083 portion of the wide string pointed to by nptr to long int, long long int, 1084 unsigned long int, and unsigned long long int representation, 1085 respectively. First, they decompose the input string into three parts: an initial, possibly 1086 empty, sequence of white-space wide characters (as specified by the iswspace 1087 function), a subject sequence resembling an integer represented in some radix determined 1088 by the value of base, and a final wide string of one or more unrecognized wide 1089 characters, including the terminating null wide character of the input wide string. Then, 1090 they attempt to convert the subject sequence to an integer, and return the result. 1091 1092 @param[in] Nptr Pointer to the string to convert. 1093 @param[in] EndPtr Optional pointer to an object in which to store a pointer 1094 to the final wide string. 1095 @param[in] Base Base, 0 to 36, of the value represented by the string 1096 pointed to by Nptr. 1097 1098 @return The wcstol, wcstoll, wcstoul, and wcstoull functions return the converted 1099 value, if any. If no conversion could be performed, zero is returned. If the correct value 1100 is outside the range of representable values, LONG_MIN, LONG_MAX, LLONG_MIN, 1101 LLONG_MAX, ULONG_MAX, or ULLONG_MAX is returned (according to the return type 1102 sign of the value, if any), and the value of the macro ERANGE is stored in errno. 1103 **/ 1104 long int wcstol ( const wchar_t * __restrict Nptr, wchar_t ** __restrict EndPtr, int Base); 1105 long long int wcstoll ( const wchar_t * __restrict Nptr, wchar_t ** __restrict EndPtr, int Base); 1106 unsigned long int wcstoul ( const wchar_t * __restrict Nptr, wchar_t ** __restrict EndPtr, int Base); 1107 unsigned long long int wcstoull( const wchar_t * __restrict Nptr, wchar_t ** __restrict EndPtr, int Base); 1108 /*@}*/ 1109 1110 /* ####################### String Copying ############################### */ 1111 1112 /** The wcscpy function copies the wide string pointed to by Src (including the 1113 terminating null wide character) into the array pointed to by Dest. 1114 1115 @return The wcscpy function returns the value of Dest. 1116 **/ 1117 wchar_t *wcscpy(wchar_t * __restrict Dest, const wchar_t * __restrict Src); 1118 1119 /** The wcsncpy function copies not more than n wide characters (those that 1120 follow a null wide character are not copied) from the array pointed to by 1121 Src to the array pointed to by Dest. 1122 1123 If the array pointed to by Src is a wide string that is shorter than n wide 1124 characters, null wide characters are appended to the copy in the array 1125 pointed to by Dest, until n wide characters in all have been written. 1126 1127 @return The wcsncpy function returns the value of Dest. 1128 **/ 1129 wchar_t *wcsncpy(wchar_t * __restrict Dest, const wchar_t * __restrict Src, size_t n); 1130 1131 /** The wmemcpy function copies n wide characters from the object pointed to by 1132 Src to the object pointed to by Dest. 1133 1134 Use this function if you know that Dest and Src DO NOT Overlap. Otherwise, 1135 use wmemmove. 1136 1137 @return The wmemcpy function returns the value of Dest. 1138 **/ 1139 wchar_t *wmemcpy(wchar_t * __restrict Dest, const wchar_t * __restrict Src, size_t n); 1140 1141 /** The wmemmove function copies n wide characters from the object pointed to by 1142 Src to the object pointed to by Dest. The objects pointed to by Dest and Src are 1143 allowed to overlap. 1144 1145 Because the UEFI BaseMemoryLib function CopyMem explicitly handles 1146 overlapping source and destination objects, this function and wmemcpy are 1147 implemented identically. 1148 1149 For programming clarity, it is recommended that you use wmemcpy if you know 1150 that Dest and Src DO NOT Overlap. If Dest and Src might possibly overlap, then 1151 use wmemmove. 1152 1153 @return The wmemmove function returns the value of Dest. 1154 **/ 1155 wchar_t *wmemmove(wchar_t *Dest, const wchar_t *Src, size_t n); 1156 1157 /* ################### String Concatenation ########################## */ 1158 1159 /** The wcscat function appends a copy of the wide string pointed to by Src 1160 (including the terminating null wide character) to the end of the wide 1161 string pointed to by Dest. The initial wide character of Src overwrites the 1162 null wide character at the end of Dest. 1163 1164 @return The wcscat function returns the value of Dest. 1165 **/ 1166 wchar_t *wcscat(wchar_t * __restrict Dest, const wchar_t * __restrict Src); 1167 1168 /** The wcsncat function appends not more than n wide characters (a null wide 1169 character and those that follow it are not appended) from the array pointed 1170 to by Src to the end of the wide string pointed to by Dest. The initial wide 1171 character of Src overwrites the null wide character at the end of Dest. 1172 A terminating null wide character is always appended to the result. 1173 1174 @return The wcsncat function returns the value of Dest. 1175 **/ 1176 wchar_t *wcsncat(wchar_t * __restrict Dest, const wchar_t * __restrict Src, size_t n); 1177 1178 /* ##################### String Comparison ############################# */ 1179 1180 /** The wcscmp function compares the wide string pointed to by s1 to the wide 1181 string pointed to by s2. 1182 1183 @return The wcscmp function returns an integer greater than, equal to, or 1184 less than zero, accordingly as the wide string pointed to by s1 1185 is greater than, equal to, or less than the wide string 1186 pointed to by s2. 1187 **/ 1188 int wcscmp(const wchar_t *s1, const wchar_t *s2); 1189 1190 /** The wcscoll function compares the wide string pointed to by s1 to the wide 1191 string pointed to by s2, both interpreted as appropriate to the LC_COLLATE 1192 category of the current locale. 1193 1194 @return The wcscoll function returns an integer greater than, equal to, 1195 or less than zero, accordingly as the wide string pointed to by 1196 s1 is greater than, equal to, or less than the wide string 1197 pointed to by s2 when both are interpreted as appropriate to 1198 the current locale. 1199 **/ 1200 int wcscoll(const wchar_t *s1, const wchar_t *s2); 1201 1202 /** The wcsncmp function compares not more than n wide characters (those that 1203 follow a null wide character are not compared) from the array pointed to by 1204 s1 to the array pointed to by s2. 1205 1206 @return The wcsncmp function returns an integer greater than, equal to, 1207 or less than zero, accordingly as the possibly null-terminated 1208 array pointed to by s1 is greater than, equal to, or less than 1209 the possibly null-terminated array pointed to by s2. 1210 **/ 1211 int wcsncmp(const wchar_t *s1, const wchar_t *s2, size_t n); 1212 1213 /** The wcsxfrm function transforms the wide string pointed to by s2 and places 1214 the resulting wide string into the array pointed to by s1. The 1215 transformation is such that if the wcscmp function is applied to two 1216 transformed wide strings, it returns a value greater than, equal to, or 1217 less than zero, corresponding to the result of the wcscoll function applied 1218 to the same two original wide strings. No more than n wide characters are 1219 placed into the resulting array pointed to by s1, including the terminating 1220 null wide character. If n is zero, s1 is permitted to be a null pointer. 1221 1222 @return The wcsxfrm function returns the length of the transformed wide 1223 string (not including the terminating null wide character). If 1224 the value returned is n or greater, the contents of the array 1225 pointed to by s1 are indeterminate. 1226 **/ 1227 size_t wcsxfrm(wchar_t * __restrict s1, const wchar_t * __restrict s2, size_t n); 1228 1229 /** The wmemcmp function compares the first n wide characters of the object 1230 pointed to by s1 to the first n wide characters of the object pointed to 1231 by s2. 1232 1233 @return The wmemcmp function returns an integer greater than, equal to, 1234 or less than zero, accordingly as the object pointed to by s1 is 1235 greater than, equal to, or less than the object pointed to by s2. 1236 **/ 1237 int wmemcmp(const wchar_t *s1, const wchar_t *s2, size_t n); 1238 1239 /* ##################### String Searching ############################## */ 1240 1241 /** The wcschr function locates the first occurrence of C in the wide string 1242 pointed to by S. The terminating null wide character is considered to be 1243 part of the wide string. 1244 1245 @return The wcschr function returns a pointer to the located wide 1246 character, or a null pointer if the wide character does not occur 1247 in the wide string. 1248 **/ 1249 wchar_t *wcschr(const wchar_t *S, wchar_t C); 1250 1251 /** The wcscspn function computes the length of the maximum initial segment of 1252 the wide string pointed to by s1 which consists entirely of wide characters 1253 not from the wide string pointed to by s2. 1254 1255 @return The wcscspn function returns the length of the segment. 1256 **/ 1257 size_t wcscspn(const wchar_t *s1, const wchar_t *s2); 1258 1259 /** The wcspbrk function locates the first occurrence in the wide string 1260 pointed to by s1 of any wide character from the wide string 1261 pointed to by s2. 1262 1263 @return The wcspbrk function returns a pointer to the wide character 1264 in s1, or a null pointer if no wide character from s2 occurs 1265 in s1. 1266 **/ 1267 wchar_t *wcspbrk(const wchar_t *s1, const wchar_t *s2); 1268 1269 /** The wcsrchr function locates the last occurrence of C in the wide string 1270 pointed to by S. The terminating null wide character is considered to be 1271 part of the wide string. 1272 1273 @return The wcsrchr function returns a pointer to the wide character, 1274 or a null pointer if C does not occur in the wide string. 1275 **/ 1276 wchar_t *wcsrchr(const wchar_t *S, wchar_t C); 1277 1278 /** The wcsspn function computes the length of the maximum initial segment of 1279 the wide string pointed to by s1 which consists entirely of wide characters 1280 from the wide string pointed to by s2. 1281 1282 @return The wcsspn function returns the length of the segment. 1283 **/ 1284 size_t wcsspn(const wchar_t *s1, const wchar_t *s2); 1285 1286 /** The wcsstr function locates the first occurrence in the wide string pointed 1287 to by s1 of the sequence of wide characters (excluding the terminating null 1288 wide character) in the wide string pointed to by s2. 1289 1290 @return The wcsstr function returns a pointer to the located wide string, 1291 or a null pointer if the wide string is not found. If s2 points 1292 to a wide string with zero length, the function returns s1. 1293 **/ 1294 wchar_t *wcsstr(const wchar_t *s1, const wchar_t *s2); 1295 1296 /** A sequence of calls to the wcstok function breaks the wide string pointed 1297 to by s1 into a sequence of tokens, each of which is delimited by a wide 1298 character from the wide string pointed to by s2. The third argument points 1299 to a caller-provided wchar_t pointer into which the wcstok function stores 1300 information necessary for it to continue scanning the same wide string. 1301 1302 The first call in a sequence has a non-null first argument and stores an 1303 initial value in the object pointed to by ptr. Subsequent calls in the 1304 sequence have a null first argument and the object pointed to by ptr is 1305 required to have the value stored by the previous call in the sequence, 1306 which is then updated. The separator wide string pointed to by s2 may be 1307 different from call to call. 1308 1309 The first call in the sequence searches the wide string pointed to by s1 1310 for the first wide character that is not contained in the current separator 1311 wide string pointed to by s2. If no such wide character is found, then 1312 there are no tokens in the wide string pointed to by s1 and the wcstok 1313 function returns a null pointer. If such a wide character is found, it is 1314 the start of the first token. 1315 1316 The wcstok function then searches from there for a wide character that is 1317 contained in the current separator wide string. If no such wide character 1318 is found, the current token extends to the end of the wide string pointed 1319 to by s1, and subsequent searches in the same wide string for a token 1320 return a null pointer. If such a wide character is found, it is overwritten 1321 by a null wide character, which terminates the current token. 1322 1323 In all cases, the wcstok function stores sufficient information in the 1324 pointer pointed to by ptr so that subsequent calls, with a null pointer for 1325 s1 and the unmodified pointer value for ptr, shall start searching just 1326 past the element overwritten by a null wide character (if any). 1327 1328 @return The wcstok function returns a pointer to the first wide character 1329 of a token, or a null pointer if there is no token. 1330 **/ 1331 wchar_t *wcstok(wchar_t * __restrict s1, const wchar_t * __restrict s2, wchar_t ** __restrict ptr); 1332 1333 /** The wmemchr function locates the first occurrence of C in the initial n 1334 wide characters of the object pointed to by S. 1335 1336 @return The wmemchr function returns a pointer to the located wide 1337 character, or a null pointer if the wide character does not occur 1338 in the object. 1339 **/ 1340 wchar_t *wmemchr(const wchar_t *S, wchar_t C, size_t n); 1341 1342 /* ################### String Manipulation ############################# */ 1343 1344 /** The wcslen function computes the length of the wide string pointed to by S. 1345 1346 @return The wcslen function returns the number of wide characters that 1347 precede the terminating null wide character. 1348 **/ 1349 size_t wcslen(const wchar_t *S); 1350 1351 /** The wmemset function copies the value of C into each of the first n wide 1352 characters of the object pointed to by S. 1353 1354 @return The wmemset function returns the value of S. 1355 **/ 1356 wchar_t *wmemset(wchar_t *S, wchar_t C, size_t n); 1357 1358 /* ################# Date and Time Conversion ########################### */ 1359 1360 /** 1361 The wcsftime function is equivalent to the strftime function, except that: 1362 - The argument s points to the initial element of an array of wide characters into which 1363 the generated output is to be placed. 1364 - The argument maxsize indicates the limiting number of wide characters. 1365 - The argument format is a wide string and the conversion specifiers are replaced by 1366 corresponding sequences of wide characters. 1367 - The return value indicates the number of wide characters. 1368 1369 If the total number of resulting wide characters including the terminating null wide 1370 character is not more than maxsize, the wcsftime function returns the number of 1371 wide characters placed into the array pointed to by s not including the terminating null 1372 wide character. Otherwise, zero is returned and the contents of the array are 1373 indeterminate. 1374 **/ 1375 size_t wcsftime(wchar_t * __restrict S, size_t maxsize, const wchar_t * __restrict format, const struct tm * __restrict timeptr); 1376 1377 /* ############# Multibyte <--> Wide Character Conversion ############### */ 1378 1379 /** The btowc function determines whether C constitutes a valid single-byte 1380 character in the initial shift state. 1381 1382 @return The btowc function returns WEOF if c has the value EOF or if 1383 (unsigned char)C does not constitute a valid single-byte 1384 character in the initial shift state. Otherwise, it returns the 1385 wide character representation of that character. 1386 **/ 1387 wint_t btowc(int C); 1388 1389 /** The wctob function determines whether C corresponds to a member of the extended 1390 character set whose multibyte character representation is a single byte when in the initial 1391 shift state. 1392 1393 @return The wctob function returns EOF if C does not correspond to a multibyte 1394 character with length one in the initial shift state. Otherwise, it 1395 returns the single-byte representation of that character as an 1396 unsigned char converted to an int. 1397 **/ 1398 int wctob(wint_t C); 1399 1400 /** If ps is not a null pointer, the mbsinit function determines whether the 1401 pointed-to mbstate_t object describes an initial conversion state. 1402 1403 @return The mbsinit function returns nonzero if ps is a null pointer 1404 or if the pointed-to object describes an initial conversion 1405 state; otherwise, it returns zero. 1406 **/ 1407 int mbsinit(const mbstate_t *ps); 1408 1409 /* ####### Restartable Multibyte <--> Wide Character Conversion ######### */ 1410 1411 /** The mbrlen function is equivalent to the call:<BR> 1412 @verbatim 1413 mbrtowc(NULL, s, n, ps != NULL ? ps : &internal) 1414 @endverbatim 1415 where internal is the mbstate_t object for the mbrlen function, except that 1416 the expression designated by ps is evaluated only once. 1417 1418 @param[in] s Pointer to a multibyte character sequence. 1419 @param[in] n Maximum number of bytes to examine. 1420 @param[in] pS Pointer to the conversion state object. 1421 1422 @retval 0 The next n or fewer characters complete a NUL. 1423 @retval 1..n The number of bytes that complete the multibyte character. 1424 @retval -2 The next n bytes contribute to an incomplete (but potentially valid) multibyte character. 1425 @retval -1 An encoding error occurred. 1426 **/ 1427 size_t mbrlen(const char * __restrict S, size_t n, mbstate_t * __restrict pS); 1428 1429 /** Restartable Multibyte to Wide character conversion. 1430 If S is a null pointer, the mbrtowc function is equivalent to the call:<BR> 1431 @verbatim 1432 mbrtowc(NULL, "", 1, ps) 1433 @endverbatim 1434 1435 In this case, the values of the parameters pwc and n are ignored. 1436 1437 If S is not a null pointer, the mbrtowc function inspects at most n bytes beginning with 1438 the byte pointed to by S to determine the number of bytes needed to complete the next 1439 multibyte character (including any shift sequences). If the function determines that the 1440 next multibyte character is complete and valid, it determines the value of the 1441 corresponding wide character and then, if pwc is not a null pointer, stores that value in 1442 the object pointed to by pwc. If the corresponding wide character is the null wide 1443 character, the resulting state described is the initial conversion state. 1444 1445 @retval 0 if the next n or fewer bytes complete the multibyte 1446 character that corresponds to the null wide 1447 character (which is the value stored). 1448 @retval between_1_and_n_inclusive if the next n or fewer bytes complete 1449 a valid multibyte character (which is the value 1450 stored); the value returned is the number of bytes 1451 that complete the multibyte character. 1452 @retval (size_t)(-2) if the next n bytes contribute to an incomplete 1453 (but potentially valid) multibyte character, and 1454 all n bytes have been processed (no value is stored). 1455 @retval (size_t)(-1) if an encoding error occurs, in which case the next 1456 n or fewer bytes do not contribute to a complete and 1457 valid multibyte character (no value is stored); the 1458 value of the macro EILSEQ is stored in errno, and 1459 the conversion state is unspecified. 1460 **/ 1461 size_t mbrtowc(wchar_t * __restrict pwc, const char * __restrict S, size_t n, mbstate_t * __restrict ps); 1462 1463 /** 1464 If S is a null pointer, the wcrtomb function is equivalent to the call:<BR> 1465 @verbatim 1466 wcrtomb(buf, L'\0', ps) 1467 @endverbatim 1468 where buf is an internal buffer. 1469 1470 If S is not a null pointer, the wcrtomb function determines the number of bytes needed 1471 to represent the multibyte character that corresponds to the wide character given by wc 1472 (including any shift sequences), and stores the multibyte character representation in the 1473 array whose first element is pointed to by S. At most MB_CUR_MAX bytes are stored. If 1474 wc is a null wide character, a null byte is stored, preceded by any shift sequence needed 1475 to restore the initial shift state; the resulting state described is the initial conversion state. 1476 1477 @return The wcrtomb function returns the number of bytes stored in the 1478 array object (including any shift sequences). When wc is not a 1479 valid wide character, an encoding error occurs: the function 1480 stores the value of the macro EILSEQ in errno and 1481 returns (size_t)(-1); the conversion state is unspecified. 1482 **/ 1483 size_t wcrtomb(char * __restrict S, wchar_t wc, mbstate_t * __restrict ps); 1484 1485 /** Convert a sequence of multibyte characters into a sequence of wide characters. 1486 The mbsrtowcs function converts a sequence of multibyte characters that begins in the 1487 conversion state described by the object pointed to by ps, from the array indirectly 1488 pointed to by src into a sequence of corresponding wide characters. If dst is not a null 1489 pointer, the converted characters are stored into the array pointed to by dst. Conversion 1490 continues up to and including a terminating null character, which is also stored. 1491 Conversion stops earlier in two cases: when a sequence of bytes is encountered that does 1492 not form a valid multibyte character, or (if dst is not a null pointer) when len wide 1493 characters have been stored into the array pointed to by dst. Each conversion takes 1494 place as if by a call to the mbrtowc function. 1495 1496 If dst is not a null pointer, the pointer object pointed to by src is assigned either a null 1497 pointer (if conversion stopped due to reaching a terminating null character) or the address 1498 just past the last multibyte character converted (if any). If conversion stopped due to 1499 reaching a terminating null character and if dst is not a null pointer, the resulting state 1500 described is the initial conversion state. 1501 1502 @param[in] dst Destination for the Wide character sequence. 1503 @param[in] src Pointer to Pointer to MBCS char. sequence to convert. 1504 @param[in] len Length of dest, in WIDE characters. 1505 @param[in] ps Pointer to the conversion state object to be used for this conversion. 1506 1507 @return If the input conversion encounters a sequence of bytes that do 1508 not form a valid multibyte character, an encoding error occurs: 1509 the mbsrtowcs function stores the value of the macro EILSEQ in 1510 errno and returns (size_t)(-1); the conversion state is 1511 unspecified. Otherwise, it returns the number of multibyte 1512 characters successfully converted, not including the terminating 1513 null character (if any). 1514 **/ 1515 size_t mbsrtowcs(wchar_t * __restrict dst, const char ** __restrict src, size_t len, mbstate_t * __restrict ps); 1516 1517 /** The wcsrtombs function converts a sequence of wide characters from the array 1518 indirectly pointed to by src into a sequence of corresponding multibyte 1519 characters that begins in the conversion state described by the object 1520 pointed to by ps. If dst is not a null pointer, the converted characters 1521 are then stored into the array pointed to by dst. Conversion continues 1522 up to and including a terminating null wide character, which is also 1523 stored. Conversion stops earlier in two cases: when a wide character is 1524 reached that does not correspond to a valid multibyte character, or 1525 (if dst is not a null pointer) when the next multibyte character would 1526 exceed the limit of len total bytes to be stored into the array pointed 1527 to by dst. Each conversion takes place as if by a call to the wcrtomb 1528 function.) 1529 1530 If dst is not a null pointer, the pointer object pointed to by src is 1531 assigned either a null pointer (if conversion stopped due to reaching 1532 a terminating null wide character) or the address just past the last wide 1533 character converted (if any). If conversion stopped due to reaching a 1534 terminating null wide character, the resulting state described is the 1535 initial conversion state. 1536 1537 @param[in] dst Destination for the MBCS sequence. 1538 @param[in] src Pointer to Pointer to wide char. sequence to convert. 1539 @param[in] len Length of dest, in bytes. 1540 @param[in] ps Pointer to the conversion state object to be used for this conversion. 1541 1542 @return If conversion stops because a wide character is reached that 1543 does not correspond to a valid multibyte character, an 1544 encoding error occurs: the wcsrtombs function stores the 1545 value of the macro EILSEQ in errno and returns (size_t)(-1); 1546 the conversion state is unspecified. Otherwise, it returns 1547 the number of bytes in the resulting multibyte character 1548 sequence, not including the terminating null character (if any). 1549 **/ 1550 size_t wcsrtombs(char * __restrict dst, const wchar_t ** __restrict src, size_t len, mbstate_t * __restrict ps); 1551 1552 #endif /* _WCHAR_H */ 1553