summaryrefslogtreecommitdiffstats
path: root/newlib/libc/stdio/sprintf.c
diff options
context:
space:
mode:
Diffstat (limited to 'newlib/libc/stdio/sprintf.c')
-rw-r--r--newlib/libc/stdio/sprintf.c661
1 files changed, 450 insertions, 211 deletions
diff --git a/newlib/libc/stdio/sprintf.c b/newlib/libc/stdio/sprintf.c
index 346749a68..d2203fb3c 100644
--- a/newlib/libc/stdio/sprintf.c
+++ b/newlib/libc/stdio/sprintf.c
@@ -17,7 +17,7 @@
/*
FUNCTION
- <<printf>>, <<fprintf>>, <<asprintf>>, <<sprintf>>, <<snprintf>>---format output
+<<printf>>, <<fprintf>>, <<sprintf>>, <<snprintf>>, <<asprintf>>, <<asnprintf>>---format output
INDEX
fprintf
@@ -29,6 +29,8 @@ INDEX
sprintf
INDEX
snprintf
+INDEX
+ asnprintf
ANSI_SYNOPSIS
#include <stdio.h>
@@ -36,271 +38,508 @@ ANSI_SYNOPSIS
int printf(const char *<[format]> [, <[arg]>, ...]);
int fprintf(FILE *<[fd]>, const char *<[format]> [, <[arg]>, ...]);
int sprintf(char *<[str]>, const char *<[format]> [, <[arg]>, ...]);
- int asprintf(char **<[strp]>, const char *<[format]> [, <[arg]>, ...]);
int snprintf(char *<[str]>, size_t <[size]>, const char *<[format]>
[, <[arg]>, ...]);
-
-TRAD_SYNOPSIS
- #include <stdio.h>
-
- int printf(<[format]> [, <[arg]>, ...])
- char *<[format]>;
-
- int fprintf(<[fd]>, <[format]> [, <[arg]>, ...]);
- FILE *<[fd]>;
- char *<[format]>;
-
- int asprintf(<[strp]>, <[format]> [, <[arg]>, ...]);
- char **<[strp]>;
- char *<[format]>;
-
- int sprintf(<[str]>, <[format]> [, <[arg]>, ...]);
- char *<[str]>;
- char *<[format]>;
-
- int snprintf(<[str]>, size_t <[size]>, <[format]> [, <[arg]>, ...]);
- char *<[str]>;
- size_t <[size]>;
- char *<[format]>;
+ int asprintf(char **<[strp]>, const char *<[format]> [, <[arg]>, ...]);
+ char *asnprintf(char *<[str]>, size_t *<[size]>, const char *<[format]>
+ [, <[arg]>, ...]);
+
+ int _printf_r(struct _reent *<[ptr]>, const char *<[format]>
+ [, <[arg]>, ...]);
+ int _fprintf_r(struct _reent *<[ptr]>, FILE *<[fd]>,
+ const char *<[format]> [, <[arg]>, ...]);
+ int _sprintf_r(struct _reent *<[ptr]>, char *<[str]>,
+ const char *<[format]> [, <[arg]>, ...]);
+ int _snprintf_r(struct _reent *<[ptr]>, char *<[str]>, size_t <[size]>,
+ const char *<[format]> [, <[arg]>, ...]);
+ int _asprintf_r(struct _reent *<[ptr]>, char **<[strp]>,
+ const char *<[format]> [, <[arg]>, ...]);
+ char *_asnprintf_r(struct _reent *<[ptr]>, char *<[str]>,
+ size_t *<[size]>, const char *<[format]>
+ [, <[arg]>, ...]);
DESCRIPTION
<<printf>> accepts a series of arguments, applies to each a
format specifier from <<*<[format]>>>, and writes the
- formatted data to <<stdout>>, terminated with a null character.
- The behavior of <<printf>> is undefined if there are not enough
- arguments for the format.
- <<printf>> returns when it reaches the end of the format string.
- If there are more arguments than the format requires, excess
- arguments are ignored.
-
- <<fprintf>>, <<asprintf>>, <<sprintf>> and <<snprintf>> are identical
- to <<printf>>, other than the destination of the formatted output:
- <<fprintf>> sends the output to a specified file <[fd]>, while
- <<asprintf>> stores the output in a dynamically allocated buffer,
- while <<sprintf>> stores the output in the specified char array
- <[str]> and <<snprintf>> limits number of characters written to
- <[str]> to at most <[size]> (including terminating <<0>>). For
- <<sprintf>> and <<snprintf>>, the behavior is undefined if the
- output <<*<[str]>>> overlaps with one of the arguments. For
- <<asprintf>>, <[strp]> points to a pointer to char which is filled
- in with the dynamically allocated buffer. <[format]> is a pointer
- to a charater string containing two types of objects: ordinary
- characters (other than <<%>>), which are copied unchanged to the
- output, and conversion specifications, each of which is introduced
- by <<%>>. (To include <<%>> in the output, use <<%%>> in the format
- string.) A conversion specification has the following form:
-
-. %[<[flags]>][<[width]>][.<[prec]>][<[size]>][<[type]>]
-
- The fields of the conversion specification have the following meanings:
+ formatted data to <<stdout>>, without a terminating NUL
+ character. The behavior of <<printf>> is undefined if there
+ are not enough arguments for the format. <<printf>> returns
+ when it reaches the end of the format string. If there are
+ more arguments than the format requires, excess arguments are
+ ignored.
+
+ <<fprintf>> is like <<printf>>, except that output is directed
+ to the stream <[fd]> rather than <<stdout>>.
+
+ <<sprintf>> is like <<printf>>, except that output is directed
+ to the buffer <[str]>, and a terminating NUL is output.
+ Behavior is undefined if more output is generated than the
+ buffer can hold.
+
+ <<snprintf>> is like <<sprintf>>, except that output is
+ limited to at most <[size]> bytes, including the terminating
+ <<NUL>>. As a special case, if <[size]> is 0, <[str]> can be
+ NULL, and <<snprintf>> merely calculates how many bytes would
+ be printed.
+
+ <<asprintf>> is like <<sprintf>>, except that the output is
+ stored in a dynamically allocated buffer, <[pstr]>, which
+ should be freed later with <<free>>.
+
+ <<asnprintf>> is like <<sprintf>>, except that the return type
+ is either the original <[str]> if it was large enough, or a
+ dynamically allocated string if the output exceeds *<[size]>;
+ the length of the result is returned in *<[size]>. When
+ dynamic allocation occurs, the contents of the original
+ <[str]> may have been modified.
+
+ For <<sprintf>>, <<snprintf>>, and <<asnprintf>>, the behavior
+ is undefined if the output <<*<[str]>>> overlaps with one of
+ the arguments. Behavior is also undefined if the argument for
+ <<%n>> within <<*<[format]>>> overlaps another argument.
+
+ <[format]> is a pointer to a character string containing two
+ types of objects: ordinary characters (other than <<%>>),
+ which are copied unchanged to the output, and conversion
+ specifications, each of which is introduced by <<%>>. (To
+ include <<%>> in the output, use <<%%>> in the format string.)
+ A conversion specification has the following form:
+
+. %[<[pos]>][<[flags]>][<[width]>][.<[prec]>][<[size]>]<[type]>
+
+ The fields of the conversion specification have the following
+ meanings:
O+
+ o <[pos]>
+
+ Conversions normally consume arguments in the order that they
+ are presented. However, it is possible to consume arguments
+ out of order, and reuse an argument for more than one
+ conversion specification (although the behavior is undefined
+ if the same argument is requested with different types), by
+ specifying <[pos]>, which is a decimal integer followed by
+ '$'. The integer must be between 1 and <NL_ARGMAX> from
+ limits.h, and if argument <<%n$>> is requested, all earlier
+ arguments must be requested somewhere within <[format]>. If
+ positional parameters are used, then all conversion
+ specifications except for <<%%>> must specify a position.
+
o <[flags]>
- an optional sequence of characters which control
- output justification, numeric signs, decimal points,
- trailing zeroes, and octal and hex prefixes.
- The flag characters are minus (<<->>), plus (<<+>>),
- space ( ), zero (<<0>>), and sharp (<<#>>). They can
- appear in any combination.
-
- o+
- o -
- The result of the conversion is left justified, and the right is
- padded with blanks. If you do not use this flag, the result is right
- justified, and padded on the left.
-
- o +
- The result of a signed conversion (as determined by <[type]>)
- will always begin with a plus or minus sign. (If you do not use
- this flag, positive values do not begin with a plus sign.)
-
- o " " (space)
- If the first character of a signed conversion specification
- is not a sign, or if a signed conversion results in no
- characters, the result will begin with a space. If the
- space ( ) flag and the plus (<<+>>) flag both appear,
- the space flag is ignored.
-
- o 0
- If the <[type]> character is <<d>>, <<i>>, <<o>>, <<u>>,
- <<x>>, <<X>>, <<e>>, <<E>>, <<f>>, <<g>>, or <<G>>: leading zeroes,
- are used to pad the field width (following any indication of sign or
- base); no spaces are used for padding. If the zero (<<0>>) and
- minus (<<->>) flags both appear, the zero (<<0>>) flag will
- be ignored. For <<d>>, <<i>>, <<o>>, <<u>>, <<x>>, and <<X>>
- conversions, if a precision <[prec]> is specified, the zero (<<0>>)
- flag is ignored.
-
- Note that <<0>> is interpreted as a flag, not as the beginning
- of a field width.
-
- o #
- The result is to be converted to an alternative form, according
- to the next character:
-
- o+
- o 0
- increases precision to force the first digit
- of the result to be a zero.
+ <[flags]> is an optional sequence of characters which control
+ output justification, numeric signs, decimal points, trailing
+ zeros, and octal and hex prefixes. The flag characters are
+ minus (<<->>), plus (<<+>>), space ( ), zero (<<0>>), sharp
+ (<<#>>), and quote (<<'>>). They can appear in any
+ combination, although not all flags can be used for all
+ conversion specification types.
+
+ o+
+ o '
+ Since newlib only supports the C locale, this
+ flag has no effect in this implementation.
+ But in other locales, when <[type]> is <<i>>,
+ <<d>>, <<u>>, <<f>>, <<F>>, <<g>>, or <<G>>,
+ the locale-dependent thousand's separator is
+ inserted prior to zero padding.
+
+ o -
+ The result of the conversion is left
+ justified, and the right is padded with
+ blanks. If you do not use this flag, the
+ result is right justified, and padded on the
+ left.
+
+ o +
+ The result of a signed conversion (as
+ determined by <[type]> of <<d>>, <<i>>, <<a>>,
+ <<A>>, <<e>>, <<E>>, <<f>>, <<F>>, <<g>>, or
+ <<G>>) will always begin with a plus or minus
+ sign. (If you do not use this flag, positive
+ values do not begin with a plus sign.)
+
+ o " " (space)
+ If the first character of a signed conversion
+ specification is not a sign, or if a signed
+ conversion results in no characters, the
+ result will begin with a space. If the space
+ ( ) flag and the plus (<<+>>) flag both
+ appear, the space flag is ignored.
+
+ o 0
+ If the <[type]> character is <<d>>, <<i>>,
+ <<o>>, <<u>>, <<x>>, <<X>>, <<a>>, <<A>>,
+ <<e>>, <<E>>, <<f>>, <<g>>, or <<G>>: leading
+ zeros are used to pad the field width
+ (following any indication of sign or base); no
+ spaces are used for padding. If the zero
+ (<<0>>) and minus (<<->>) flags both appear,
+ the zero (<<0>>) flag will be ignored. For
+ <<d>>, <<i>>, <<o>>, <<u>>, <<x>>, and <<X>>
+ conversions, if a precision <[prec]> is
+ specified, the zero (<<0>>) flag is ignored.
+
+ Note that <<0>> is interpreted as a flag, not
+ as the beginning of a field width.
+
+ o #
+ The result is to be converted to an
+ alternative form, according to the <[type]>
+ character:
+
+ o+
+ o o
+ Increases precision to force the first
+ digit of the result to be a zero.
o x
- a non-zero result will have a <<0x>> prefix.
+ A non-zero result will have a <<0x>>
+ prefix.
o X
- a non-zero result will have a <<0X>> prefix.
+ A non-zero result will have a <<0X>>
+ prefix.
- o e, E or f
- The result will always contain a decimal point
- even if no digits follow the point.
- (Normally, a decimal point appears only if a
- digit follows it.) Trailing zeroes are removed.
+ o a, A, e, E, f, or F
+ The result will always contain a
+ decimal point even if no digits follow
+ the point. (Normally, a decimal point
+ appears only if a digit follows it.)
+ Trailing zeros are removed.
o g or G
- same as <<e>> or <<E>>, but trailing zeroes
- are not removed.
+ The result will always contain a
+ decimal point even if no digits follow
+ the point. Trailing zeros are not
+ removed.
o all others
- undefined.
+ Undefined.
o-
- o-
-
- o <[width]>
-
- <[width]> is an optional minimum field width. You can either
- specify it directly as a decimal integer, or indirectly by
- using instead an asterisk (<<*>>), in which case an <<int>>
- argument is used as the field width. Negative field widths
- are not supported; if you attempt to specify a negative field
- width, it is interpreted as a minus (<<->>) flag followed by a
- positive field width.
-
- o <[prec]>
-
- an optional field; if present, it is introduced with `<<.>>'
- (a period). This field gives the maximum number of
- characters to print in a conversion; the minimum number of
- digits of an integer to print, for conversions with <[type]>
- <<d>>, <<i>>, <<o>>, <<u>>, <<x>>, and <<X>>; the maximum number of
- significant digits, for the <<g>> and <<G>> conversions;
- or the number of digits to print after the decimal
- point, for <<e>>, <<E>>, and <<f>> conversions. You can specify
- the precision either directly as a decimal integer or
- indirectly by using an asterisk (<<*>>), in which case
- an <<int>> argument is used as the precision. Supplying a negative
- precision is equivalent to omitting the precision.
- If only a period is specified the precision is zero.
- If a precision appears with any other conversion <[type]>
- than those listed here, the behavior is undefined.
-
- o <[size]>
-
- <<h>>, <<l>>, and <<L>> are optional size characters which
- override the default way that <<printf>> interprets the
- data type of the corresponding argument. <<h>> forces
- the following <<d>>, <<i>>, <<o>>, <<u>>, <<x>> or <<X>> conversion
- <[type]> to apply to a <<short>> or <<unsigned short>>. <<h>> also
- forces a following <<n>> <[type]> to apply to
- a pointer to a <<short>>. Similarily, an
- <<l>> forces the following <<d>>, <<i>>, <<o>>, <<u>>,
- <<x>> or <<X>> conversion <[type]> to apply to a <<long>> or
- <<unsigned long>>. <<l>> also forces a following <<n>> <[type]> to
- apply to a pointer to a <<long>>. <<l>> with <<c>>, <<s>> is
- equivalent to <<C>>, <<S>> respectively. If an <<h>>
- or an <<l>> appears with another conversion
- specifier, the behavior is undefined. <<L>> forces a
- following <<e>>, <<E>>, <<f>>, <<g>> or <<G>> conversion <[type]> to
- apply to a <<long double>> argument. If <<L>> appears with
- any other conversion <[type]>, the behavior is undefined.
-
- o <[type]>
-
- <[type]> specifies what kind of conversion <<printf>> performs.
- Here is a table of these:
-
- o+
+ o-
+
+ o <[width]>
+
+ <[width]> is an optional minimum field width. You can
+ either specify it directly as a decimal integer, or
+ indirectly by using instead an asterisk (<<*>>), in
+ which case an <<int>> argument is used as the field
+ width. If positional arguments are used, then the
+ width must also be specified positionally as <<*m$>>,
+ with m as a decimal integer. Negative field widths
+ are treated as specifying the minus (<<->>) flag for
+ left justfication, along with a positive field width.
+ The resulting format may be wider than the specified
+ width.
+
+ o <[prec]>
+
+ <[prec]> is an optional field; if present, it is
+ introduced with `<<.>>' (a period). You can specify
+ the precision either directly as a decimal integer or
+ indirectly by using an asterisk (<<*>>), in which case
+ an <<int>> argument is used as the precision. If
+ positional arguments are used, then the precision must
+ also be specified positionally as <<*m$>>, with m as a
+ decimal integer. Supplying a negative precision is
+ equivalent to omitting the precision. If only a
+ period is specified the precision is zero. The effect
+ depends on the conversion <[type]>.
+
+ o+
+ o d, i, o, u, x, or X
+ Minimum number of digits to appear. If no
+ precision is given, defaults to 1.
+
+ o a or A
+ Number of digits to appear after the decimal
+ point. If no precision is given, the
+ precision defaults to the minimum needed for
+ an exact representation.
+
+ o e, E, f or F
+ Number of digits to appear after the decimal
+ point. If no precision is given, the
+ precision defaults to 6.
+
+ o g or G
+ Maximum number of significant digits. A
+ precision of 0 is treated the same as a
+ precision of 1. If no precision is given, the
+ precision defaults to 6.
+
+ o s or S
+ Maximum number of characters to print from the
+ string. If no precision is given, the entire
+ string is printed.
+
+ o all others
+ undefined.
+
+ o-
+
+ o <[size]>
+
+ <[size]> is an optional modifier that changes the data
+ type that the corresponding argument has. Behavior is
+ unspecified if a size is given that does not match the
+ <[type]>.
+
+ o+
+ o hh
+ With <<d>>, <<i>>, <<o>>, <<u>>, <<x>>, or
+ <<X>>, specifies that the argument should be
+ converted to a <<signed char>> or <<unsigned
+ char>> before printing.
+
+ With <<n>>, specifies that the argument is a
+ pointer to a <<signed char>>.
+
+ o h
+ With <<d>>, <<i>>, <<o>>, <<u>>, <<x>>, or
+ <<X>>, specifies that the argument should be
+ converted to a <<short>> or <<unsigned short>>
+ before printing.
+
+ With <<n>>, specifies that the argument is a
+ pointer to a <<short>>.
+
+ o l
+ With <<d>>, <<i>>, <<o>>, <<u>>, <<x>>, or
+ <<X>>, specifies that the argument is a
+ <<long>> or <<unsigned long>>.
+
+ With <<c>>, specifies that the argument has
+ type <<wint_t>>.
+
+ With <<s>>, specifies that the argument is a
+ pointer to <<wchar_t>>.
+
+ With <<n>>, specifies that the argument is a
+ pointer to a <<long>>.
+
+ With <<a>>, <<A>>, <<e>>, <<E>>, <<f>>, <<F>>,
+ <<g>>, or <<G>>, has no effect (because of
+ vararg promotion rules, there is no need to
+ distinguish between <<float>> and <<double>>).
+
+ o ll
+ With <<d>>, <<i>>, <<o>>, <<u>>, <<x>>, or
+ <<X>>, specifies that the argument is a
+ <<long long>> or <<unsigned long long>>.
+
+ With <<n>>, specifies that the argument is a
+ pointer to a <<long long>>.
+
+ o j
+ With <<d>>, <<i>>, <<o>>, <<u>>, <<x>>, or
+ <<X>>, specifies that the argument is an
+ <<intmax_t>> or <<uintmax_t>>.
+
+ With <<n>>, specifies that the argument is a
+ pointer to an <<intmax_t>>.
+
+ o z
+ With <<d>>, <<i>>, <<o>>, <<u>>, <<x>>, or
+ <<X>>, specifies that the argument is a
+ <<ssize_t>> or <<size_t>>.
+
+ With <<n>>, specifies that the argument is a
+ pointer to a <<ssize_t>>.
+
+ o t
+ With <<d>>, <<i>>, <<o>>, <<u>>, <<x>>, or
+ <<X>>, specifies that the argument is a
+ <<ptrdiff_t>>.
+
+ With <<n>>, specifies that the argument is a
+ pointer to a <<ptrdiff_t>>.
+
+ o L
+ With <<a>>, <<A>>, <<e>>, <<E>>, <<f>>, <<F>>,
+ <<g>>, or <<G>>, specifies that the argument
+ is a <<long double>>.
+
+ o-
+
+ o <[type]>
+
+ <[type]> specifies what kind of conversion <<printf>>
+ performs. Here is a table of these:
+
+ o+
o %
- prints the percent character (<<%>>)
+ Prints the percent character (<<%>>).
o c
- prints <[arg]> as single character
-
+ Prints <[arg]> as single character. If the
+ <<l>> size specifier is in effect, a multibyte
+ character is printed.
+
o C
- prints wchar_t <[arg]> as single multibyte character
-
+ Short for <<%lc>>.
+
o s
- prints characters until precision is reached or a null terminator
- is encountered; takes a string pointer
+ Prints the elements of a pointer to <<char>>
+ until the precision or a null character is
+ reached. If the <<l>> size specifier is in
+ effect, the pointer is to an array of
+ <<wchar_t>>, and the string is converted to
+ multibyte characters before printing.
o S
- converts wchar_t characters to multibyte output characters until
- precision is reached or a null wchar_t terminator
- is encountered; takes a wchar_t pointer
+ Short for <<%ls>>.
- o d
- prints a signed decimal integer; takes an <<int>> (same as <<i>>)
+ o d or i
+ Prints a signed decimal integer; takes an
+ <<int>>. Leading zeros are inserted as
+ necessary to reach the precision. A precision
+ of 0 produces an empty string.
- o i
- prints a signed decimal integer; takes an <<int>> (same as <<d>>)
+ o D
+ Newlib extension, short for <<%ld>>.
o o
- prints a signed octal integer; takes an <<int>>
+ Prints an unsigned octal integer; takes an
+ <<unsigned>>. Leading zeros are inserted as
+ necessary to reach the precision. A precision
+ of 0 produces an empty string.
+
+ o O
+ Newlib extension, short for <<%lo>>.
o u
- prints an unsigned decimal integer; takes an <<int>>
+ Prints an unsigned decimal integer; takes an
+ <<unsigned>>. Leading zeros are inserted as
+ necessary to reach the precision. A precision
+ of 0 produces an empty string.
+
+ o U
+ Newlib extension, short for <<%lu>>.
o x
- prints an unsigned hexadecimal integer (using <<abcdef>> as
- digits beyond <<9>>); takes an <<int>>
+ Prints an unsigned hexadecimal integer (using
+ <<abcdef>> as digits beyond <<9>>); takes an
+ <<unsigned>>. Leading zeros are inserted as
+ necessary to reach the precision. A precision
+ of 0 produces an empty string.
o X
- prints an unsigned hexadecimal integer (using <<ABCDEF>> as
- digits beyond <<9>>); takes an <<int>>
+ Like <<x>>, but uses <<ABCDEF>> as digits
+ beyond <<9>>.
o f
- prints a signed value of the form <<[-]9999.9999>>; takes
- a floating-point number
-
+ Prints a signed value of the form
+ <<[-]9999.9999>>, with the precision
+ determining how many digits follow the decimal
+ point; takes a <<double>> (remember that
+ <<float>> promotes to <<double>> as a vararg).
+ The low order digit is rounded to even. If
+ the precision results in at most DECIMAL_DIG
+ digits, the result is rounded correctly; if
+ more than DECIMAL_DIG digits are printed, the
+ result is only guaranteed to round back to the
+ original value.
+
+ If the value is infinite, the result is
+ <<inf>>, and no zero padding is performed. If
+ the value is not a number, the result is
+ <<nan>>, and no zero padding is performed.
+
+ o F
+ Like <<f>>, but uses <<INF>> and <<NAN>> for
+ non-finite numbers.
+
o e
- prints a signed value of the form <<[-]9.9999e[+|-]999>>; takes a
- floating-point number
+ Prints a signed value of the form
+ <<[-]9.9999e[+|-]999>>; takes a <<double>>.
+ The digit before the decimal point is non-zero
+ if the value is non-zero. The precision
+ determines how many digits appear between
+ <<.>> and <<e>>, and the exponent always
+ contains at least two digits. The value zero
+ has an exponent of zero. If the value is not
+ finite, it is printed like <<f>>.
o E
- prints the same way as <<e>>, but using <<E>> to introduce the
- exponent; takes a floating-point number
+ Like <<e>>, but using <<E>> to introduce the
+ exponent, and like <<F>> for non-finite
+ values.
o g
- prints a signed value in either <<f>> or <<e>> form, based on given
- value and precision---trailing zeros and the decimal point are
- printed only if necessary; takes a floating-point number
-
+ Prints a signed value in either <<f>> or <<e>>
+ form, based on the given value and
+ precision---an exponent less than -4 or
+ greater than the precision selects the <<e>>
+ form. Trailing zeros and the decimal point
+ are printed only if necessary; takes a
+ <<double>>.
+
o G
- prints the same way as <<g>>, but using <<E>> for the exponent if an
- exponent is needed; takes a floating-point number
+ Like <<g>>, except use <<F>> or <<E>> form.
+
+ o a
+ Prints a signed value of the form
+ <<[-]0x1.ffffp[+|-]9>>; takes a <<double>>.
+ The letters <<abcdef>> are used for digits
+ beyond <<9>>. The precision determines how
+ many digits appear after the decimal point.
+ The exponent contains at least one digit, and
+ is a decimal value representing the power of
+ 2; a value of 0 has an exponent of 0.
+ Non-finite values are printed like <<f>>.
+
+ o A
+ Like <<a>>, except uses <<X>>, <<P>>, and
+ <<ABCDEF>> instead of lower case.
o n
- stores (in the same object) a count of the characters written;
- takes a pointer to <<int>>
+ Takes a pointer to <<int>>, and stores a count
+ of the number of bytes written so far. No
+ output is created.
o p
- prints a pointer in an implementation-defined format.
- This implementation treats the pointer as an
- <<unsigned long>> (same as <<Lu>>).
- o-
-O-
+ Takes a pointer to <<void>>, and prints it in
+ an implementation-defined format. This
+ implementation is similar to <<%#tx>>), except
+ that <<0x>> appears even for the NULL pointer.
+
+ o-
+ O-
+ <<_printf_r>>, <<_fprintf_r>>, <<_asprintf_r>>,
+ <<_sprintf_r>>, <<_snprintf_r>>, <<_asnprintf_r>> are simply
+ reentrant versions of the functions above.
RETURNS
-<<sprintf>> and <<asprintf>> return the number of bytes in the output string,
-save that the concluding <<NULL>> is not counted.
-<<printf>> and <<fprintf>> return the number of characters transmitted.
-If an error occurs, <<printf>> and <<fprintf>> return <<EOF>> and
-<<asprintf>> returns -1. No error returns occur for <<sprintf>>.
+On success, <<sprintf>> and <<asprintf>> return the number of bytes in
+the output string, except the concluding <<NUL>> is not counted.
+<<snprintf>> returns the number of bytes that would be in the output
+string, except the concluding <<NUL>> is not counted. <<printf>> and
+<<fprintf>> return the number of characters transmitted.
+<<asnprintf>> returns the original <[str]> if there was enough room,
+otherwise it returns an allocated string.
+
+If an error occurs, the result of <<printf>>, <<fprintf>>,
+<<snprintf>>, and <<asprintf>> is a negative value, and the result of
+<<asnprintf>> is NULL. No error returns occur for <<sprintf>>. For
+<<printf>> and <<fprintf>>, <<errno>> may be set according to
+<<fputc>>. For <<asprintf>> and <<asnprintf>>, <<errno>> may be set
+to ENOMEM if allocation fails, and for <<snprintf>>, <<errno>> may be
+set to EOVERFLOW if <[size]> or the output length exceeds INT_MAX.
PORTABILITY
- The ANSI C standard specifies that implementations must
- support at least formatted output of up to 509 characters.
+ANSI C requires <<printf>>, <<fprintf>>, <<sprintf>>, and
+<<snprintf>>. <<asprintf>> and <<asnprintf>> are newlib extensions.
+
+The ANSI C standard specifies that implementations must support at
+least formatted output of up to 509 characters. This implementation
+has no inherent limit.
+
+Depending on how newlib was configured, not all format specifiers are
+supported.
Supporting OS subroutines required: <<close>>, <<fstat>>, <<isatty>>,
<<lseek>>, <<read>>, <<sbrk>>, <<write>>.