blob: 3acc2a4b8d99e9b268d4697edfc85e89bfa7f555 [file] [log] [blame]
Vishal Bhoj82c80712015-12-15 21:13:33 +05301/** @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*/
240struct 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**/
458int 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**/
670int 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**/
694int 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**/
716int swscanf(const wchar_t * __restrict Buff, const wchar_t * __restrict Format, ...);
717
718/** Print formatted values from an argument list.
719
720The vfwprintf function is equivalent to fwprintf, with the variable argument list
721replaced by Args, which shall have been initialized by the va_start macro (and
722possibly subsequent va_arg calls). The vfwprintf function does not invoke the
723va_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**/
737int 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**/
760int 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**/
783int 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**/
805int 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**/
824int 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**/
845int 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**/
861int 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**/
881int wscanf(const wchar_t * __restrict format, ...);
882
883/* ################### Input/Output Functions ########################### */
884
885
886/** Get a character from an input Stream.
887
888If the end-of-file indicator for the input stream pointed to by stream is not set and a
889next wide character is present, the fgetwc function obtains that wide character as a
890wchar_t converted to a wint_t and advances the associated file position indicator for
891the 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-
896file indicator for the stream is set and the fgetwc function returns WEOF. Otherwise,
897the fgetwc function returns the next wide character from the input stream pointed to by
898stream. If a read error occurs, the error indicator for the stream is set and the fgetwc
899function returns WEOF. If an encoding error occurs (including too few bytes), the value of
900the macro EILSEQ is stored in errno and the fgetwc function returns WEOF.
901**/
902wint_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**/
925wchar_t *fgetws(wchar_t * __restrict S, int Limit, FILE * __restrict Stream);
926
927/** Write a character to an output stream.
928
929The fputwc function writes the wide character specified by c to the output stream
930pointed to by stream, at the position indicated by the associated file position indicator
931for the stream (if defined), and advances the indicator appropriately. If the file cannot
932support positioning requests, or if the stream was opened with append mode, the
933character 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
939error indicator for the stream is set and fputwc returns WEOF. If an encoding error
940occurs, the value of the macro EILSEQ is stored in errno and fputwc returns WEOF.
941**/
942wint_t fputwc(wchar_t C, FILE *Stream);
943
944/** Write a string to an output stream.
945
946The fputws function writes the wide string pointed to by S to the stream pointed to by
947Stream. 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
953returns a nonnegative value.
954**/
955int fputws(const wchar_t * __restrict S, FILE * __restrict Stream);
956
957/** Query or set a stream's orientation.
958
959The fwide function determines the orientation of the stream pointed to by stream. If
960Mode is greater than zero, the function first attempts to make the stream wide oriented. If
961Mode is less than zero, the function first attempts to make the stream byte oriented.
962Otherwise, 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
968wide orientation, a value less than zero if the stream has byte orientation, or zero if the
969stream has no orientation.
970**/
971int fwide(FILE *Stream, int Mode);
972
973/** Get a character from an input stream.
974
975The getwc function is equivalent to fgetwc, except that if it is implemented as a
976macro, it may evaluate Stream more than once, so the argument should never be an
977expression 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
982stream, or WEOF.
983**/
984wint_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**/
993wint_t getwchar(void);
994
995/** Write a character to an output stream.
996
997The putwc function is equivalent to fputwc, except that if it is implemented as a
998macro, it may evaluate Stream more than once, so the Stream argument should never be an
999expression 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**/
1006wint_t putwc(wchar_t C, FILE *Stream);
1007
1008/** Write a character to stdout.
1009
1010The 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**/
1016wint_t putwchar(wchar_t C);
1017
1018/** Return a character to the input Stream as if it had not been read.
1019
1020The ungetwc function pushes the wide character specified by C back onto the input
1021stream pointed to by Stream. Pushed-back wide characters will be returned by
1022subsequent reads on that stream in the reverse order of their pushing. A successful
1023intervening 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
1025stream. The external storage corresponding to the stream is unchanged.
1026
1027One wide character of pushback is guaranteed, even if the call to the ungetwc function
1028follows just after a call to a formatted wide character input function fwscanf,
1029vfwscanf, vwscanf, or wscanf. If the ungetwc function is called too many times
1030on the same stream without an intervening read or file positioning operation on that
1031stream, the operation may fail.
1032
1033If the value of C equals that of the macro WEOF, the operation fails and the input stream is
1034unchanged.
1035
1036A successful call to the ungetwc function clears the end-of-file indicator for the stream.
1037The value of the file position indicator for the stream after reading or discarding all
1038pushed-back wide characters is the same as it was before the wide characters were pushed
1039back. For a text or binary stream, the value of its file position indicator after a successful
1040call to the ungetwc function is unspecified until all pushed-back wide characters are
1041read 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**/
1049wint_t ungetwc(wint_t C, FILE *Stream);
1050
1051/* ################### Numeric Conversions ########################### */
1052
1053/** @{
1054The wcstod, wcstof, and wcstold functions convert the initial portion of the wide
1055string pointed to by nptr to double, float, and long double representation,
1056respectively. First, they decompose the input string into three parts: an initial, possibly
1057empty, sequence of white-space wide characters (as specified by the iswspace
1058function), a subject sequence resembling a floating-point constant or representing an
1059infinity or NaN; and a final wide string of one or more unrecognized wide characters,
1060including the terminating null wide character of the input wide string. Then, they attempt
1061to 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
1067The functions return the converted value, if any. If no conversion could be performed,
1068zero is returned. If the correct value is outside the range of representable values, plus or
1069minus HUGE_VAL, HUGE_VALF, or HUGE_VALL is returned (according to the return
1070type and sign of the value), and the value of the macro ERANGE is stored in errno. If
1071the result underflows (7.12.1), the functions return a value whose magnitude is no greater
1072than the smallest normalized positive number in the return type. A pointer to the
1073final wide string is stored in the object pointed to by endptr, provided that endptr is
1074not a null pointer.
1075**/
1076double wcstod (const wchar_t * __restrict Nptr, wchar_t ** __restrict EndPtr);
1077float wcstof (const wchar_t * __restrict Nptr, wchar_t ** __restrict EndPtr);
1078long double wcstold (const wchar_t * __restrict Nptr, wchar_t ** __restrict EndPtr);
1079/*@}*/
1080
1081/** @{
1082The wcstol, wcstoll, wcstoul, and wcstoull functions convert the initial
1083portion of the wide string pointed to by nptr to long int, long long int,
1084unsigned long int, and unsigned long long int representation,
1085respectively. First, they decompose the input string into three parts: an initial, possibly
1086empty, sequence of white-space wide characters (as specified by the iswspace
1087function), a subject sequence resembling an integer represented in some radix determined
1088by the value of base, and a final wide string of one or more unrecognized wide
1089characters, including the terminating null wide character of the input wide string. Then,
1090they 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
1099value, if any. If no conversion could be performed, zero is returned. If the correct value
1100is outside the range of representable values, LONG_MIN, LONG_MAX, LLONG_MIN,
1101LLONG_MAX, ULONG_MAX, or ULLONG_MAX is returned (according to the return type
1102sign of the value, if any), and the value of the macro ERANGE is stored in errno.
1103**/
1104long int wcstol ( const wchar_t * __restrict Nptr, wchar_t ** __restrict EndPtr, int Base);
1105long long int wcstoll ( const wchar_t * __restrict Nptr, wchar_t ** __restrict EndPtr, int Base);
1106unsigned long int wcstoul ( const wchar_t * __restrict Nptr, wchar_t ** __restrict EndPtr, int Base);
1107unsigned 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**/
1117wchar_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**/
1129wchar_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**/
1139wchar_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**/
1155wchar_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**/
1166wchar_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**/
1176wchar_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**/
1188int 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**/
1200int 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**/
1211int 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**/
1227size_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**/
1237int 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**/
1249wchar_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**/
1257size_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**/
1267wchar_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**/
1276wchar_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**/
1284size_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**/
1294wchar_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**/
1331wchar_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**/
1340wchar_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**/
1349size_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**/
1356wchar_t *wmemset(wchar_t *S, wchar_t C, size_t n);
1357
1358/* ################# Date and Time Conversion ########################### */
1359
1360/**
1361The 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
1363the 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
1366corresponding sequences of wide characters.
1367 - The return value indicates the number of wide characters.
1368
1369If the total number of resulting wide characters including the terminating null wide
1370character is not more than maxsize, the wcsftime function returns the number of
1371wide characters placed into the array pointed to by s not including the terminating null
1372wide character. Otherwise, zero is returned and the contents of the array are
1373indeterminate.
1374**/
1375size_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**/
1387wint_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**/
1398int 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**/
1407int 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**/
1427size_t mbrlen(const char * __restrict S, size_t n, mbstate_t * __restrict pS);
1428
1429/** Restartable Multibyte to Wide character conversion.
1430If S is a null pointer, the mbrtowc function is equivalent to the call:<BR>
1431@verbatim
1432 mbrtowc(NULL, "", 1, ps)
1433@endverbatim
1434
1435In this case, the values of the parameters pwc and n are ignored.
1436
1437If S is not a null pointer, the mbrtowc function inspects at most n bytes beginning with
1438the byte pointed to by S to determine the number of bytes needed to complete the next
1439multibyte character (including any shift sequences). If the function determines that the
1440next multibyte character is complete and valid, it determines the value of the
1441corresponding wide character and then, if pwc is not a null pointer, stores that value in
1442the object pointed to by pwc. If the corresponding wide character is the null wide
1443character, 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**/
1461size_t mbrtowc(wchar_t * __restrict pwc, const char * __restrict S, size_t n, mbstate_t * __restrict ps);
1462
1463/**
1464If S is a null pointer, the wcrtomb function is equivalent to the call:<BR>
1465@verbatim
1466 wcrtomb(buf, L'\0', ps)
1467@endverbatim
1468where buf is an internal buffer.
1469
1470If S is not a null pointer, the wcrtomb function determines the number of bytes needed
1471to 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
1473array whose first element is pointed to by S. At most MB_CUR_MAX bytes are stored. If
1474wc is a null wide character, a null byte is stored, preceded by any shift sequence needed
1475to 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**/
1483size_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**/
1515size_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**/
1550size_t wcsrtombs(char * __restrict dst, const wchar_t ** __restrict src, size_t len, mbstate_t * __restrict ps);
1551
1552#endif /* _WCHAR_H */