OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [tags/] [gnu-src/] [newlib-1.18.0/] [newlib-1.18.0-or32-1.0rc1/] [newlib/] [libc/] [stdio/] [swprintf.c] - Diff between revs 207 and 345

Only display areas with differences | Details | Blame | View Log

Rev 207 Rev 345
/*
/*
 * Copyright (c) 1990, 2007 The Regents of the University of California.
 * Copyright (c) 1990, 2007 The Regents of the University of California.
 * All rights reserved.
 * All rights reserved.
 *
 *
 * Redistribution and use in source and binary forms are permitted
 * Redistribution and use in source and binary forms are permitted
 * provided that the above copyright notice and this paragraph are
 * provided that the above copyright notice and this paragraph are
 * duplicated in all such forms and that any documentation,
 * duplicated in all such forms and that any documentation,
 * advertising materials, and other materials related to such
 * advertising materials, and other materials related to such
 * distribution and use acknowledge that the software was developed
 * distribution and use acknowledge that the software was developed
 * by the University of California, Berkeley.  The name of the
 * by the University of California, Berkeley.  The name of the
 * University may not be used to endorse or promote products derived
 * University may not be used to endorse or promote products derived
 * from this software without specific prior written permission.
 * from this software without specific prior written permission.
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 */
 */
 
 
/*
/*
FUNCTION
FUNCTION
<<swprintf>>, <<fwprintf>>, <<wprintf>>---wide character format output
<<swprintf>>, <<fwprintf>>, <<wprintf>>---wide character format output
 
 
INDEX
INDEX
        fwprintf
        fwprintf
INDEX
INDEX
        _fwprintf_r
        _fwprintf_r
INDEX
INDEX
        wprintf
        wprintf
INDEX
INDEX
        _wprintf_r
        _wprintf_r
INDEX
INDEX
        swprintf
        swprintf
INDEX
INDEX
        _swprintf_r
        _swprintf_r
 
 
ANSI_SYNOPSIS
ANSI_SYNOPSIS
        #include <wchar.h>
        #include <wchar.h>
 
 
        int wprintf(const wchar_t *<[format]>, ...);
        int wprintf(const wchar_t *<[format]>, ...);
        int fwprintf(FILE *<[fd]>, const wchar_t *<[format]>, ...);
        int fwprintf(FILE *<[fd]>, const wchar_t *<[format]>, ...);
        int swprintf(wchar_t *<[str]>, size_t <[size]>,
        int swprintf(wchar_t *<[str]>, size_t <[size]>,
                        const wchar_t *<[format]>, ...);
                        const wchar_t *<[format]>, ...);
 
 
        int _wprintf_r(struct _reent *<[ptr]>, const wchar_t *<[format]>, ...);
        int _wprintf_r(struct _reent *<[ptr]>, const wchar_t *<[format]>, ...);
        int _fwprintf_r(struct _reent *<[ptr]>, FILE *<[fd]>,
        int _fwprintf_r(struct _reent *<[ptr]>, FILE *<[fd]>,
                        const wchar_t *<[format]>, ...);
                        const wchar_t *<[format]>, ...);
        int _swprintf_r(struct _reent *<[ptr]>, wchar_t *<[str]>,
        int _swprintf_r(struct _reent *<[ptr]>, wchar_t *<[str]>,
                        size_t <[size]>, const wchar_t *<[format]>, ...);
                        size_t <[size]>, const wchar_t *<[format]>, ...);
 
 
DESCRIPTION
DESCRIPTION
        <<wprintf>> accepts a series of arguments, applies to each a
        <<wprintf>> accepts a series of arguments, applies to each a
        format specifier from <<*<[format]>>>, and writes the
        format specifier from <<*<[format]>>>, and writes the
        formatted data to <<stdout>>, without a terminating NUL
        formatted data to <<stdout>>, without a terminating NUL
        wide character.  The behavior of <<wprintf>> is undefined if there
        wide character.  The behavior of <<wprintf>> is undefined if there
        are not enough arguments for the format or if any argument is not the
        are not enough arguments for the format or if any argument is not the
        right type for the corresponding conversion specifier.  <<wprintf>>
        right type for the corresponding conversion specifier.  <<wprintf>>
        returns when it reaches the end of the format string.  If there are
        returns when it reaches the end of the format string.  If there are
        more arguments than the format requires, excess arguments are
        more arguments than the format requires, excess arguments are
        ignored.
        ignored.
 
 
        <<fwprintf>> is like <<wprintf>>, except that output is directed
        <<fwprintf>> is like <<wprintf>>, except that output is directed
        to the stream <[fd]> rather than <<stdout>>.
        to the stream <[fd]> rather than <<stdout>>.
 
 
        <<swprintf>> is like <<wprintf>>, except that output is directed
        <<swprintf>> is like <<wprintf>>, except that output is directed
        to the buffer <[str]> with a terminating wide <<NUL>>, and the
        to the buffer <[str]> with a terminating wide <<NUL>>, and the
        resulting string length is limited to at most <[size]> wide characters,
        resulting string length is limited to at most <[size]> wide characters,
        including the terminating <<NUL>>.  It is considered an error if the
        including the terminating <<NUL>>.  It is considered an error if the
        output (including the terminating wide-<<NULL>>) does not fit into
        output (including the terminating wide-<<NULL>>) does not fit into
        <[size]> wide characters.  (This error behavior is not the same as for
        <[size]> wide characters.  (This error behavior is not the same as for
        <<snprintf>>, which <<swprintf>> is otherwise completely analogous to.
        <<snprintf>>, which <<swprintf>> is otherwise completely analogous to.
        While <<snprintf>> allows the needed size to be known simply by giving
        While <<snprintf>> allows the needed size to be known simply by giving
        <[size]>=0, <<swprintf>> does not, giving an error instead.)
        <[size]>=0, <<swprintf>> does not, giving an error instead.)
 
 
        For <<swprintf>> the behavior is undefined if the output
        For <<swprintf>> the behavior is undefined if the output
        <<*<[str]>>> overlaps with one of the arguments.  Behavior is also
        <<*<[str]>>> overlaps with one of the arguments.  Behavior is also
        undefined if the argument for <<%n>> within <<*<[format]>>>
        undefined if the argument for <<%n>> within <<*<[format]>>>
        overlaps another argument.
        overlaps another argument.
 
 
        <[format]> is a pointer to a wide character string containing two
        <[format]> is a pointer to a wide character string containing two
        types of objects: ordinary characters (other than <<%>>),
        types of objects: ordinary characters (other than <<%>>),
        which are copied unchanged to the output, and conversion
        which are copied unchanged to the output, and conversion
        specifications, each of which is introduced by <<%>>. (To
        specifications, each of which is introduced by <<%>>. (To
        include <<%>> in the output, use <<%%>> in the format string.)
        include <<%>> in the output, use <<%%>> in the format string.)
        A conversion specification has the following form:
        A conversion specification has the following form:
 
 
.       %[<[pos]>][<[flags]>][<[width]>][.<[prec]>][<[size]>]<[type]>
.       %[<[pos]>][<[flags]>][<[width]>][.<[prec]>][<[size]>]<[type]>
 
 
        The fields of the conversion specification have the following
        The fields of the conversion specification have the following
        meanings:
        meanings:
 
 
        O+
        O+
        o <[pos]>
        o <[pos]>
 
 
        Conversions normally consume arguments in the order that they
        Conversions normally consume arguments in the order that they
        are presented.  However, it is possible to consume arguments
        are presented.  However, it is possible to consume arguments
        out of order, and reuse an argument for more than one
        out of order, and reuse an argument for more than one
        conversion specification (although the behavior is undefined
        conversion specification (although the behavior is undefined
        if the same argument is requested with different types), by
        if the same argument is requested with different types), by
        specifying <[pos]>, which is a decimal integer followed by
        specifying <[pos]>, which is a decimal integer followed by
        '$'.  The integer must be between 1 and <NL_ARGMAX> from
        '$'.  The integer must be between 1 and <NL_ARGMAX> from
        limits.h, and if argument <<%n$>> is requested, all earlier
        limits.h, and if argument <<%n$>> is requested, all earlier
        arguments must be requested somewhere within <[format]>.  If
        arguments must be requested somewhere within <[format]>.  If
        positional parameters are used, then all conversion
        positional parameters are used, then all conversion
        specifications except for <<%%>> must specify a position.
        specifications except for <<%%>> must specify a position.
        This positional parameters method is a POSIX extension to the C
        This positional parameters method is a POSIX extension to the C
        standard definition for the functions.
        standard definition for the functions.
 
 
        o <[flags]>
        o <[flags]>
 
 
        <[flags]> is an optional sequence of characters which control
        <[flags]> is an optional sequence of characters which control
        output justification, numeric signs, decimal points, trailing
        output justification, numeric signs, decimal points, trailing
        zeros, and octal and hex prefixes.  The flag characters are
        zeros, and octal and hex prefixes.  The flag characters are
        minus (<<->>), plus (<<+>>), space ( ), zero (<<0>>), sharp
        minus (<<->>), plus (<<+>>), space ( ), zero (<<0>>), sharp
        (<<#>>), and quote (<<'>>).  They can appear in any
        (<<#>>), and quote (<<'>>).  They can appear in any
        combination, although not all flags can be used for all
        combination, although not all flags can be used for all
        conversion specification types.
        conversion specification types.
 
 
                o+
                o+
                o '
                o '
                        A POSIX extension to the C standard.  However, this
                        A POSIX extension to the C standard.  However, this
                        implementation presently treats it as a no-op, which
                        implementation presently treats it as a no-op, which
                        is the default behavior for the C locale, anyway.  (If
                        is the default behavior for the C locale, anyway.  (If
                        it did what it is supposed to, when <[type]> were <<i>>,
                        it did what it is supposed to, when <[type]> were <<i>>,
                        <<d>>, <<u>>, <<f>>, <<F>>, <<g>>, or <<G>>, the
                        <<d>>, <<u>>, <<f>>, <<F>>, <<g>>, or <<G>>, the
                        integer portion of the conversion would be formatted
                        integer portion of the conversion would be formatted
                        with thousands' grouping wide characters.)
                        with thousands' grouping wide characters.)
 
 
                o -
                o -
                        The result of the conversion is left
                        The result of the conversion is left
                        justified, and the right is padded with
                        justified, and the right is padded with
                        blanks.  If you do not use this flag, the
                        blanks.  If you do not use this flag, the
                        result is right justified, and padded on the
                        result is right justified, and padded on the
                        left.
                        left.
 
 
                o +
                o +
                        The result of a signed conversion (as
                        The result of a signed conversion (as
                        determined by <[type]> of <<d>>, <<i>>, <<a>>,
                        determined by <[type]> of <<d>>, <<i>>, <<a>>,
                        <<A>>, <<e>>, <<E>>, <<f>>, <<F>>, <<g>>, or
                        <<A>>, <<e>>, <<E>>, <<f>>, <<F>>, <<g>>, or
                        <<G>>) will always begin with a plus or minus
                        <<G>>) will always begin with a plus or minus
                        sign.  (If you do not use this flag, positive
                        sign.  (If you do not use this flag, positive
                        values do not begin with a plus sign.)
                        values do not begin with a plus sign.)
 
 
                o " " (space)
                o " " (space)
                        If the first character of a signed conversion
                        If the first character of a signed conversion
                        specification is not a sign, or if a signed
                        specification is not a sign, or if a signed
                        conversion results in no characters, the
                        conversion results in no characters, the
                        result will begin with a space.  If the space
                        result will begin with a space.  If the space
                        ( ) flag and the plus (<<+>>) flag both
                        ( ) flag and the plus (<<+>>) flag both
                        appear, the space flag is ignored.
                        appear, the space flag is ignored.
 
 
                o 0
                o 0
                        If the <[type]> character is <<d>>, <<i>>,
                        If the <[type]> character is <<d>>, <<i>>,
                        <<o>>, <<u>>, <<x>>, <<X>>, <<a>>, <<A>>,
                        <<o>>, <<u>>, <<x>>, <<X>>, <<a>>, <<A>>,
                        <<e>>, <<E>>, <<f>>, <<F>>, <<g>>, or <<G>>:  leading
                        <<e>>, <<E>>, <<f>>, <<F>>, <<g>>, or <<G>>:  leading
                        zeros are used to pad the field width
                        zeros are used to pad the field width
                        (following any indication of sign or base); no
                        (following any indication of sign or base); no
                        spaces are used for padding.  If the zero
                        spaces are used for padding.  If the zero
                        (<<0>>) and minus (<<->>) flags both appear,
                        (<<0>>) and minus (<<->>) flags both appear,
                        the zero (<<0>>) flag will be ignored.  For
                        the zero (<<0>>) flag will be ignored.  For
                        <<d>>, <<i>>, <<o>>, <<u>>, <<x>>, and <<X>>
                        <<d>>, <<i>>, <<o>>, <<u>>, <<x>>, and <<X>>
                        conversions, if a precision <[prec]> is
                        conversions, if a precision <[prec]> is
                        specified, the zero (<<0>>) flag is ignored.
                        specified, the zero (<<0>>) flag is ignored.
 
 
                        Note that <<0>> is interpreted as a flag, not
                        Note that <<0>> is interpreted as a flag, not
                        as the beginning of a field width.
                        as the beginning of a field width.
 
 
                o #
                o #
                        The result is to be converted to an
                        The result is to be converted to an
                        alternative form, according to the <[type]>
                        alternative form, according to the <[type]>
                        character:
                        character:
 
 
                        o+
                        o+
                        o o
                        o o
                                Increases precision to force the first
                                Increases precision to force the first
                                digit of the result to be a zero.
                                digit of the result to be a zero.
 
 
                        o x
                        o x
                                A non-zero result will have a <<0x>>
                                A non-zero result will have a <<0x>>
                                prefix.
                                prefix.
 
 
                        o X
                        o X
                                A non-zero result will have a <<0X>>
                                A non-zero result will have a <<0X>>
                                prefix.
                                prefix.
 
 
                        o a, A, e, E, f, or F
                        o a, A, e, E, f, or F
                                The result will always contain a
                                The result will always contain a
                                decimal point even if no digits follow
                                decimal point even if no digits follow
                                the point.  (Normally, a decimal point
                                the point.  (Normally, a decimal point
                                appears only if a digit follows it.)
                                appears only if a digit follows it.)
                                Trailing zeros are removed.
                                Trailing zeros are removed.
 
 
                        o g or G
                        o g or G
                                The result will always contain a
                                The result will always contain a
                                decimal point even if no digits follow
                                decimal point even if no digits follow
                                the point.  Trailing zeros are not
                                the point.  Trailing zeros are not
                                removed.
                                removed.
 
 
                        o all others
                        o all others
                                Undefined.
                                Undefined.
 
 
                        o-
                        o-
                o-
                o-
 
 
        o <[width]>
        o <[width]>
 
 
                <[width]> is an optional minimum field width.  You can
                <[width]> is an optional minimum field width.  You can
                either specify it directly as a decimal integer, or
                either specify it directly as a decimal integer, or
                indirectly by using instead an asterisk (<<*>>), in
                indirectly by using instead an asterisk (<<*>>), in
                which case an <<int>> argument is used as the field
                which case an <<int>> argument is used as the field
                width.  If positional arguments are used, then the
                width.  If positional arguments are used, then the
                width must also be specified positionally as <<*m$>>,
                width must also be specified positionally as <<*m$>>,
                with m as a decimal integer.  Negative field widths
                with m as a decimal integer.  Negative field widths
                are treated as specifying the minus (<<->>) flag for
                are treated as specifying the minus (<<->>) flag for
                left justfication, along with a positive field width.
                left justfication, along with a positive field width.
                The resulting format may be wider than the specified
                The resulting format may be wider than the specified
                width.
                width.
 
 
        o <[prec]>
        o <[prec]>
 
 
                <[prec]> is an optional field; if present, it is
                <[prec]> is an optional field; if present, it is
                introduced with `<<.>>' (a period). You can specify
                introduced with `<<.>>' (a period). You can specify
                the precision either directly as a decimal integer or
                the precision either directly as a decimal integer or
                indirectly by using an asterisk (<<*>>), in which case
                indirectly by using an asterisk (<<*>>), in which case
                an <<int>> argument is used as the precision.  If
                an <<int>> argument is used as the precision.  If
                positional arguments are used, then the precision must
                positional arguments are used, then the precision must
                also be specified positionally as <<*m$>>, with m as a
                also be specified positionally as <<*m$>>, with m as a
                decimal integer.  Supplying a negative precision is
                decimal integer.  Supplying a negative precision is
                equivalent to omitting the precision.  If only a
                equivalent to omitting the precision.  If only a
                period is specified the precision is zero. The effect
                period is specified the precision is zero. The effect
                depends on the conversion <[type]>.
                depends on the conversion <[type]>.
 
 
                o+
                o+
                o d, i, o, u, x, or X
                o d, i, o, u, x, or X
                        Minimum number of digits to appear.  If no
                        Minimum number of digits to appear.  If no
                        precision is given, defaults to 1.
                        precision is given, defaults to 1.
 
 
                o a or A
                o a or A
                        Number of digits to appear after the decimal
                        Number of digits to appear after the decimal
                        point.  If no precision is given, the
                        point.  If no precision is given, the
                        precision defaults to the minimum needed for
                        precision defaults to the minimum needed for
                        an exact representation.
                        an exact representation.
 
 
                o e, E, f or F
                o e, E, f or F
                        Number of digits to appear after the decimal
                        Number of digits to appear after the decimal
                        point.  If no precision is given, the
                        point.  If no precision is given, the
                        precision defaults to 6.
                        precision defaults to 6.
 
 
                o g or G
                o g or G
                        Maximum number of significant digits.  A
                        Maximum number of significant digits.  A
                        precision of 0 is treated the same as a
                        precision of 0 is treated the same as a
                        precision of 1.  If no precision is given, the
                        precision of 1.  If no precision is given, the
                        precision defaults to 6.
                        precision defaults to 6.
 
 
                o s or S
                o s or S
                        Maximum number of characters to print from the
                        Maximum number of characters to print from the
                        string.  If no precision is given, the entire
                        string.  If no precision is given, the entire
                        string is printed.
                        string is printed.
 
 
                o all others
                o all others
                        undefined.
                        undefined.
 
 
                o-
                o-
 
 
        o <[size]>
        o <[size]>
 
 
                <[size]> is an optional modifier that changes the data
                <[size]> is an optional modifier that changes the data
                type that the corresponding argument has.  Behavior is
                type that the corresponding argument has.  Behavior is
                unspecified if a size is given that does not match the
                unspecified if a size is given that does not match the
                <[type]>.
                <[type]>.
 
 
                o+
                o+
                o hh
                o hh
                        With <<d>>, <<i>>, <<o>>, <<u>>, <<x>>, or
                        With <<d>>, <<i>>, <<o>>, <<u>>, <<x>>, or
                        <<X>>, specifies that the argument should be
                        <<X>>, specifies that the argument should be
                        converted to a <<signed char>> or <<unsigned
                        converted to a <<signed char>> or <<unsigned
                        char>> before printing.
                        char>> before printing.
 
 
                        With <<n>>, specifies that the argument is a
                        With <<n>>, specifies that the argument is a
                        pointer to a <<signed char>>.
                        pointer to a <<signed char>>.
 
 
                o h
                o h
                        With <<d>>, <<i>>, <<o>>, <<u>>, <<x>>, or
                        With <<d>>, <<i>>, <<o>>, <<u>>, <<x>>, or
                        <<X>>, specifies that the argument should be
                        <<X>>, specifies that the argument should be
                        converted to a <<short>> or <<unsigned short>>
                        converted to a <<short>> or <<unsigned short>>
                        before printing.
                        before printing.
 
 
                        With <<n>>, specifies that the argument is a
                        With <<n>>, specifies that the argument is a
                        pointer to a <<short>>.
                        pointer to a <<short>>.
 
 
                o l
                o l
                        With <<d>>, <<i>>, <<o>>, <<u>>, <<x>>, or
                        With <<d>>, <<i>>, <<o>>, <<u>>, <<x>>, or
                        <<X>>, specifies that the argument is a
                        <<X>>, specifies that the argument is a
                        <<long>> or <<unsigned long>>.
                        <<long>> or <<unsigned long>>.
 
 
                        With <<c>>, specifies that the argument has
                        With <<c>>, specifies that the argument has
                        type <<wint_t>>.
                        type <<wint_t>>.
 
 
                        With <<s>>, specifies that the argument is a
                        With <<s>>, specifies that the argument is a
                        pointer to <<wchar_t>>.
                        pointer to <<wchar_t>>.
 
 
                        With <<n>>, specifies that the argument is a
                        With <<n>>, specifies that the argument is a
                        pointer to a <<long>>.
                        pointer to a <<long>>.
 
 
                        With <<a>>, <<A>>, <<e>>, <<E>>, <<f>>, <<F>>,
                        With <<a>>, <<A>>, <<e>>, <<E>>, <<f>>, <<F>>,
                        <<g>>, or <<G>>, has no effect (because of
                        <<g>>, or <<G>>, has no effect (because of
                        vararg promotion rules, there is no need to
                        vararg promotion rules, there is no need to
                        distinguish between <<float>> and <<double>>).
                        distinguish between <<float>> and <<double>>).
 
 
                o ll
                o ll
                        With <<d>>, <<i>>, <<o>>, <<u>>, <<x>>, or
                        With <<d>>, <<i>>, <<o>>, <<u>>, <<x>>, or
                        <<X>>, specifies that the argument is a
                        <<X>>, specifies that the argument is a
                        <<long long>> or <<unsigned long long>>.
                        <<long long>> or <<unsigned long long>>.
 
 
                        With <<n>>, specifies that the argument is a
                        With <<n>>, specifies that the argument is a
                        pointer to a <<long long>>.
                        pointer to a <<long long>>.
 
 
                o j
                o j
                        With <<d>>, <<i>>, <<o>>, <<u>>, <<x>>, or
                        With <<d>>, <<i>>, <<o>>, <<u>>, <<x>>, or
                        <<X>>, specifies that the argument is an
                        <<X>>, specifies that the argument is an
                        <<intmax_t>> or <<uintmax_t>>.
                        <<intmax_t>> or <<uintmax_t>>.
 
 
                        With <<n>>, specifies that the argument is a
                        With <<n>>, specifies that the argument is a
                        pointer to an <<intmax_t>>.
                        pointer to an <<intmax_t>>.
 
 
                o z
                o z
                        With <<d>>, <<i>>, <<o>>, <<u>>, <<x>>, or
                        With <<d>>, <<i>>, <<o>>, <<u>>, <<x>>, or
                        <<X>>, specifies that the argument is a <<size_t>>.
                        <<X>>, specifies that the argument is a <<size_t>>.
 
 
                        With <<n>>, specifies that the argument is a
                        With <<n>>, specifies that the argument is a
                        pointer to a <<size_t>>.
                        pointer to a <<size_t>>.
 
 
                o t
                o t
                        With <<d>>, <<i>>, <<o>>, <<u>>, <<x>>, or
                        With <<d>>, <<i>>, <<o>>, <<u>>, <<x>>, or
                        <<X>>, specifies that the argument is a
                        <<X>>, specifies that the argument is a
                        <<ptrdiff_t>>.
                        <<ptrdiff_t>>.
 
 
                        With <<n>>, specifies that the argument is a
                        With <<n>>, specifies that the argument is a
                        pointer to a <<ptrdiff_t>>.
                        pointer to a <<ptrdiff_t>>.
 
 
                o L
                o L
                        With <<a>>, <<A>>, <<e>>, <<E>>, <<f>>, <<F>>,
                        With <<a>>, <<A>>, <<e>>, <<E>>, <<f>>, <<F>>,
                        <<g>>, or <<G>>, specifies that the argument
                        <<g>>, or <<G>>, specifies that the argument
                        is a <<long double>>.
                        is a <<long double>>.
 
 
                o-
                o-
 
 
        o   <[type]>
        o   <[type]>
 
 
                <[type]> specifies what kind of conversion <<wprintf>>
                <[type]> specifies what kind of conversion <<wprintf>>
                performs.  Here is a table of these:
                performs.  Here is a table of these:
 
 
                o+
                o+
                o %
                o %
                        Prints the percent character (<<%>>).
                        Prints the percent character (<<%>>).
 
 
                o c
                o c
                        If no <<l>> qualifier is present, the int argument shall
                        If no <<l>> qualifier is present, the int argument shall
                        be converted to a wide character as if by calling
                        be converted to a wide character as if by calling
                        the btowc() function and the resulting wide character
                        the btowc() function and the resulting wide character
                        shall be written.  Otherwise, the wint_t argument
                        shall be written.  Otherwise, the wint_t argument
                        shall be converted to wchar_t, and written.
                        shall be converted to wchar_t, and written.
 
 
                o C
                o C
                        Short for <<%lc>>.  A POSIX extension to the C standard.
                        Short for <<%lc>>.  A POSIX extension to the C standard.
 
 
                o s
                o s
                        If no <<l>> qualifier is present, the application
                        If no <<l>> qualifier is present, the application
                        shall ensure that the argument is a pointer to a
                        shall ensure that the argument is a pointer to a
                        character array containing a character sequence
                        character array containing a character sequence
                        beginning in the initial shift state.  Characters
                        beginning in the initial shift state.  Characters
                        from the array shall be converted as if by repeated
                        from the array shall be converted as if by repeated
                        calls to the mbrtowc() function, with the conversion
                        calls to the mbrtowc() function, with the conversion
                        state described by an mbstate_t object initialized to
                        state described by an mbstate_t object initialized to
                        zero before the first character is converted, and
                        zero before the first character is converted, and
                        written up to (but not including) the terminating
                        written up to (but not including) the terminating
                        null wide character. If the precision is specified,
                        null wide character. If the precision is specified,
                        no more than that many wide characters shall be
                        no more than that many wide characters shall be
                        written.  If the precision is not specified, or is
                        written.  If the precision is not specified, or is
                        greater than the size of the array, the application
                        greater than the size of the array, the application
                        shall ensure that the array contains a null wide
                        shall ensure that the array contains a null wide
                        character.
                        character.
 
 
                        If an <<l>> qualifier is present, the application
                        If an <<l>> qualifier is present, the application
                        shall ensure that the argument is a pointer to an
                        shall ensure that the argument is a pointer to an
                        array of type wchar_t. Wide characters from the array
                        array of type wchar_t. Wide characters from the array
                        shall be written up to (but not including) a
                        shall be written up to (but not including) a
                        terminating null wide character. If no precision is
                        terminating null wide character. If no precision is
                        specified, or is greater than the size of the array,
                        specified, or is greater than the size of the array,
                        the application shall ensure that the array contains
                        the application shall ensure that the array contains
                        a null wide character. If a precision is specified,
                        a null wide character. If a precision is specified,
                        no more than that many wide characters shall be
                        no more than that many wide characters shall be
                        written.
                        written.
 
 
                o S
                o S
                        Short for <<%ls>>.  A POSIX extension to the C standard.
                        Short for <<%ls>>.  A POSIX extension to the C standard.
 
 
                o d or i
                o d or i
                        Prints a signed decimal integer; takes an
                        Prints a signed decimal integer; takes an
                        <<int>>.  Leading zeros are inserted as
                        <<int>>.  Leading zeros are inserted as
                        necessary to reach the precision.  A value of 0 with
                        necessary to reach the precision.  A value of 0 with
                        a precision of 0 produces an empty string.
                        a precision of 0 produces an empty string.
 
 
                o o
                o o
                        Prints an unsigned octal integer; takes an
                        Prints an unsigned octal integer; takes an
                        <<unsigned>>.  Leading zeros are inserted as
                        <<unsigned>>.  Leading zeros are inserted as
                        necessary to reach the precision.  A value of 0 with
                        necessary to reach the precision.  A value of 0 with
                        a precision of 0 produces an empty string.
                        a precision of 0 produces an empty string.
 
 
                o u
                o u
                        Prints an unsigned decimal integer; takes an
                        Prints an unsigned decimal integer; takes an
                        <<unsigned>>.  Leading zeros are inserted as
                        <<unsigned>>.  Leading zeros are inserted as
                        necessary to reach the precision.  A value of 0 with
                        necessary to reach the precision.  A value of 0 with
                        a precision of 0 produces an empty string.
                        a precision of 0 produces an empty string.
 
 
                o x
                o x
                        Prints an unsigned hexadecimal integer (using
                        Prints an unsigned hexadecimal integer (using
                        <<abcdef>> as digits beyond <<9>>); takes an
                        <<abcdef>> as digits beyond <<9>>); takes an
                        <<unsigned>>.  Leading zeros are inserted as
                        <<unsigned>>.  Leading zeros are inserted as
                        necessary to reach the precision.  A value of 0 with
                        necessary to reach the precision.  A value of 0 with
                        a precision of 0 produces an empty string.
                        a precision of 0 produces an empty string.
 
 
                o X
                o X
                        Like <<x>>, but uses <<ABCDEF>> as digits
                        Like <<x>>, but uses <<ABCDEF>> as digits
                        beyond <<9>>.
                        beyond <<9>>.
 
 
                o f
                o f
                        Prints a signed value of the form
                        Prints a signed value of the form
                        <<[-]9999.9999>>, with the precision
                        <<[-]9999.9999>>, with the precision
                        determining how many digits follow the decimal
                        determining how many digits follow the decimal
                        point; takes a <<double>> (remember that
                        point; takes a <<double>> (remember that
                        <<float>> promotes to <<double>> as a vararg).
                        <<float>> promotes to <<double>> as a vararg).
                        The low order digit is rounded to even.  If
                        The low order digit is rounded to even.  If
                        the precision results in at most DECIMAL_DIG
                        the precision results in at most DECIMAL_DIG
                        digits, the result is rounded correctly; if
                        digits, the result is rounded correctly; if
                        more than DECIMAL_DIG digits are printed, the
                        more than DECIMAL_DIG digits are printed, the
                        result is only guaranteed to round back to the
                        result is only guaranteed to round back to the
                        original value.
                        original value.
 
 
                        If the value is infinite, the result is
                        If the value is infinite, the result is
                        <<inf>>, and no zero padding is performed.  If
                        <<inf>>, and no zero padding is performed.  If
                        the value is not a number, the result is
                        the value is not a number, the result is
                        <<nan>>, and no zero padding is performed.
                        <<nan>>, and no zero padding is performed.
 
 
                o F
                o F
                        Like <<f>>, but uses <<INF>> and <<NAN>> for
                        Like <<f>>, but uses <<INF>> and <<NAN>> for
                        non-finite numbers.
                        non-finite numbers.
 
 
                o e
                o e
                        Prints a signed value of the form
                        Prints a signed value of the form
                        <<[-]9.9999e[+|-]999>>; takes a <<double>>.
                        <<[-]9.9999e[+|-]999>>; takes a <<double>>.
                        The digit before the decimal point is non-zero
                        The digit before the decimal point is non-zero
                        if the value is non-zero.  The precision
                        if the value is non-zero.  The precision
                        determines how many digits appear between
                        determines how many digits appear between
                        <<.>> and <<e>>, and the exponent always
                        <<.>> and <<e>>, and the exponent always
                        contains at least two digits.  The value zero
                        contains at least two digits.  The value zero
                        has an exponent of zero.  If the value is not
                        has an exponent of zero.  If the value is not
                        finite, it is printed like <<f>>.
                        finite, it is printed like <<f>>.
 
 
                o E
                o E
                        Like <<e>>, but using <<E>> to introduce the
                        Like <<e>>, but using <<E>> to introduce the
                        exponent, and like <<F>> for non-finite
                        exponent, and like <<F>> for non-finite
                        values.
                        values.
 
 
                o g
                o g
                        Prints a signed value in either <<f>> or <<e>>
                        Prints a signed value in either <<f>> or <<e>>
                        form, based on the given value and
                        form, based on the given value and
                        precision---an exponent less than -4 or
                        precision---an exponent less than -4 or
                        greater than the precision selects the <<e>>
                        greater than the precision selects the <<e>>
                        form.  Trailing zeros and the decimal point
                        form.  Trailing zeros and the decimal point
                        are printed only if necessary; takes a
                        are printed only if necessary; takes a
                        <<double>>.
                        <<double>>.
 
 
                o G
                o G
                        Like <<g>>, except use <<F>> or <<E>> form.
                        Like <<g>>, except use <<F>> or <<E>> form.
 
 
                o a
                o a
                        Prints a signed value of the form
                        Prints a signed value of the form
                        <<[-]0x1.ffffp[+|-]9>>; takes a <<double>>.
                        <<[-]0x1.ffffp[+|-]9>>; takes a <<double>>.
                        The letters <<abcdef>> are used for digits
                        The letters <<abcdef>> are used for digits
                        beyond <<9>>.  The precision determines how
                        beyond <<9>>.  The precision determines how
                        many digits appear after the decimal point.
                        many digits appear after the decimal point.
                        The exponent contains at least one digit, and
                        The exponent contains at least one digit, and
                        is a decimal value representing the power of
                        is a decimal value representing the power of
                        2; a value of 0 has an exponent of 0.
                        2; a value of 0 has an exponent of 0.
                        Non-finite values are printed like <<f>>.
                        Non-finite values are printed like <<f>>.
 
 
                o A
                o A
                        Like <<a>>, except uses <<X>>, <<P>>, and
                        Like <<a>>, except uses <<X>>, <<P>>, and
                        <<ABCDEF>> instead of lower case.
                        <<ABCDEF>> instead of lower case.
 
 
                o n
                o n
                        Takes a pointer to <<int>>, and stores a count
                        Takes a pointer to <<int>>, and stores a count
                        of the number of bytes written so far.  No
                        of the number of bytes written so far.  No
                        output is created.
                        output is created.
 
 
                o p
                o p
                        Takes a pointer to <<void>>, and prints it in
                        Takes a pointer to <<void>>, and prints it in
                        an implementation-defined format.  This
                        an implementation-defined format.  This
                        implementation is similar to <<%#tx>>), except
                        implementation is similar to <<%#tx>>), except
                        that <<0x>> appears even for the NULL pointer.
                        that <<0x>> appears even for the NULL pointer.
 
 
                o-
                o-
        O-
        O-
 
 
        <<_wprintf_r>>, <<_fwprintf_r>>, <<_swprintf_r>>, are simply
        <<_wprintf_r>>, <<_fwprintf_r>>, <<_swprintf_r>>, are simply
        reentrant versions of the functions above.
        reentrant versions of the functions above.
 
 
RETURNS
RETURNS
On success, <<swprintf>> return the number of wide characters in
On success, <<swprintf>> return the number of wide characters in
the output string, except the concluding <<NUL>> is not counted.
the output string, except the concluding <<NUL>> is not counted.
<<wprintf>> and <<fwprintf>> return the number of characters transmitted.
<<wprintf>> and <<fwprintf>> return the number of characters transmitted.
 
 
If an error occurs, the result of <<wprintf>>, <<fwprintf>>, and
If an error occurs, the result of <<wprintf>>, <<fwprintf>>, and
<<swprintf>> is a negative value.  For <<wprintf>> and <<fwprintf>>,
<<swprintf>> is a negative value.  For <<wprintf>> and <<fwprintf>>,
<<errno>> may be set according to <<fputwc>>.  For <<swprintf>>, <<errno>>
<<errno>> may be set according to <<fputwc>>.  For <<swprintf>>, <<errno>>
may be set to EOVERFLOW if <[size]> is greater than INT_MAX / sizeof (wchar_t),
may be set to EOVERFLOW if <[size]> is greater than INT_MAX / sizeof (wchar_t),
or when the output does not fit into <[size]> wide characters (including the
or when the output does not fit into <[size]> wide characters (including the
terminating wide <<NULL>>).
terminating wide <<NULL>>).
 
 
BUGS
BUGS
The ``''' (quote) flag does not work when locale's thousands_sep is not empty.
The ``''' (quote) flag does not work when locale's thousands_sep is not empty.
 
 
PORTABILITY
PORTABILITY
POSIX-1.2008 with extensions; C99 (compliant except for POSIX extensions).
POSIX-1.2008 with extensions; C99 (compliant except for POSIX extensions).
 
 
Depending on how newlib was configured, not all format specifiers are
Depending on how newlib was configured, not all format specifiers are
supported.
supported.
 
 
Supporting OS subroutines required: <<close>>, <<fstat>>, <<isatty>>,
Supporting OS subroutines required: <<close>>, <<fstat>>, <<isatty>>,
<<lseek>>, <<read>>, <<sbrk>>, <<write>>.
<<lseek>>, <<read>>, <<sbrk>>, <<write>>.
*/
*/
 
 
 
 
#include <_ansi.h>
#include <_ansi.h>
#include <reent.h>
#include <reent.h>
#include <stdio.h>
#include <stdio.h>
#include <wchar.h>
#include <wchar.h>
#include <stdarg.h>
#include <stdarg.h>
#include <limits.h>
#include <limits.h>
#include <errno.h>
#include <errno.h>
#include "local.h"
#include "local.h"
 
 
/* NOTE:  _swprintf_r() should be identical to swprintf() except for the
/* NOTE:  _swprintf_r() should be identical to swprintf() except for the
 * former having ptr as a parameter and the latter needing to declare it as
 * former having ptr as a parameter and the latter needing to declare it as
 * a variable set to _REENT.  */
 * a variable set to _REENT.  */
 
 
int
int
_DEFUN(_swprintf_r, (ptr, str, size, fmt),
_DEFUN(_swprintf_r, (ptr, str, size, fmt),
       struct _reent *ptr _AND
       struct _reent *ptr _AND
       wchar_t *str          _AND
       wchar_t *str          _AND
       size_t size        _AND
       size_t size        _AND
       _CONST wchar_t *fmt _DOTS)
       _CONST wchar_t *fmt _DOTS)
{
{
  int ret;
  int ret;
  va_list ap;
  va_list ap;
  FILE f;
  FILE f;
 
 
  if (size > INT_MAX / sizeof (wchar_t))
  if (size > INT_MAX / sizeof (wchar_t))
    {
    {
      ptr->_errno = EOVERFLOW;  /* POSIX extension */
      ptr->_errno = EOVERFLOW;  /* POSIX extension */
      return EOF;
      return EOF;
    }
    }
  f._flags = __SWR | __SSTR;
  f._flags = __SWR | __SSTR;
  f._bf._base = f._p = (unsigned char *) str;
  f._bf._base = f._p = (unsigned char *) str;
  f._bf._size = f._w = (size > 0 ? (size - 1) * sizeof (wchar_t) : 0);
  f._bf._size = f._w = (size > 0 ? (size - 1) * sizeof (wchar_t) : 0);
  f._file = -1;  /* No file. */
  f._file = -1;  /* No file. */
  va_start (ap, fmt);
  va_start (ap, fmt);
  ret = _svfwprintf_r (ptr, &f, fmt, ap);
  ret = _svfwprintf_r (ptr, &f, fmt, ap);
  va_end (ap);
  va_end (ap);
  /* _svfwprintf_r() does not put in a terminating NUL, so add one if
  /* _svfwprintf_r() does not put in a terminating NUL, so add one if
   * appropriate, which is whenever size is > 0.  _svfwprintf_r() stops
   * appropriate, which is whenever size is > 0.  _svfwprintf_r() stops
   * after n-1, so always just put at the end.  */
   * after n-1, so always just put at the end.  */
  if (size > 0)  {
  if (size > 0)  {
    *(wchar_t *)f._p = L'\0';   /* terminate the string */
    *(wchar_t *)f._p = L'\0';   /* terminate the string */
  }
  }
  if(ret >= size)  {
  if(ret >= size)  {
    /* _svfwprintf_r() returns how many wide characters it would have printed
    /* _svfwprintf_r() returns how many wide characters it would have printed
     * if there were enough space.  Return an error if too big to fit in str,
     * if there were enough space.  Return an error if too big to fit in str,
     * unlike snprintf, which returns the size needed.  */
     * unlike snprintf, which returns the size needed.  */
    ptr->_errno = EOVERFLOW;    /* POSIX extension */
    ptr->_errno = EOVERFLOW;    /* POSIX extension */
    ret = -1;
    ret = -1;
  }
  }
  return (ret);
  return (ret);
}
}
 
 
#ifndef _REENT_ONLY
#ifndef _REENT_ONLY
 
 
int
int
_DEFUN(swprintf, (str, size, fmt),
_DEFUN(swprintf, (str, size, fmt),
       wchar_t *str   _AND
       wchar_t *str   _AND
       size_t size _AND
       size_t size _AND
       _CONST wchar_t *fmt _DOTS)
       _CONST wchar_t *fmt _DOTS)
{
{
  int ret;
  int ret;
  va_list ap;
  va_list ap;
  FILE f;
  FILE f;
  struct _reent *ptr = _REENT;
  struct _reent *ptr = _REENT;
 
 
  if (size > INT_MAX / sizeof (wchar_t))
  if (size > INT_MAX / sizeof (wchar_t))
    {
    {
      ptr->_errno = EOVERFLOW;  /* POSIX extension */
      ptr->_errno = EOVERFLOW;  /* POSIX extension */
      return EOF;
      return EOF;
    }
    }
  f._flags = __SWR | __SSTR;
  f._flags = __SWR | __SSTR;
  f._bf._base = f._p = (unsigned char *) str;
  f._bf._base = f._p = (unsigned char *) str;
  f._bf._size = f._w = (size > 0 ? (size - 1) * sizeof (wchar_t) : 0);
  f._bf._size = f._w = (size > 0 ? (size - 1) * sizeof (wchar_t) : 0);
  f._file = -1;  /* No file. */
  f._file = -1;  /* No file. */
  va_start (ap, fmt);
  va_start (ap, fmt);
  ret = _svfwprintf_r (ptr, &f, fmt, ap);
  ret = _svfwprintf_r (ptr, &f, fmt, ap);
  va_end (ap);
  va_end (ap);
  /* _svfwprintf_r() does not put in a terminating NUL, so add one if
  /* _svfwprintf_r() does not put in a terminating NUL, so add one if
   * appropriate, which is whenever size is > 0.  _svfwprintf_r() stops
   * appropriate, which is whenever size is > 0.  _svfwprintf_r() stops
   * after n-1, so always just put at the end.  */
   * after n-1, so always just put at the end.  */
  if (size > 0)  {
  if (size > 0)  {
    *(wchar_t *)f._p = L'\0';   /* terminate the string */
    *(wchar_t *)f._p = L'\0';   /* terminate the string */
  }
  }
  if(ret >= size)  {
  if(ret >= size)  {
    /* _svfwprintf_r() returns how many wide characters it would have printed
    /* _svfwprintf_r() returns how many wide characters it would have printed
     * if there were enough space.  Return an error if too big to fit in str,
     * if there were enough space.  Return an error if too big to fit in str,
     * unlike snprintf, which returns the size needed.  */
     * unlike snprintf, which returns the size needed.  */
    ptr->_errno = EOVERFLOW;    /* POSIX extension */
    ptr->_errno = EOVERFLOW;    /* POSIX extension */
    ret = -1;
    ret = -1;
  }
  }
  return (ret);
  return (ret);
}
}
 
 
#endif
#endif
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.