Home | History | Annotate | Download | only in Include
      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