summaryrefslogtreecommitdiffstats
path: root/man3p/printf.3p
diff options
context:
space:
mode:
Diffstat (limited to 'man3p/printf.3p')
-rw-r--r--man3p/printf.3p975
1 files changed, 975 insertions, 0 deletions
diff --git a/man3p/printf.3p b/man3p/printf.3p
new file mode 100644
index 000000000..c608d8747
--- /dev/null
+++ b/man3p/printf.3p
@@ -0,0 +1,975 @@
+.\" Copyright (c) 2001-2003 The Open Group, All Rights Reserved
+.TH "FPRINTF" P 2003 "IEEE/The Open Group" "POSIX Programmer's Manual"
+.\" fprintf
+.SH NAME
+fprintf, printf, snprintf, sprintf \- print formatted output
+.SH SYNOPSIS
+.LP
+\fB#include <stdio.h>
+.br
+.sp
+int fprintf(FILE *restrict\fP \fIstream\fP\fB, const char *restrict\fP
+\fIformat\fP\fB, ...);
+.br
+int printf(const char *restrict\fP \fIformat\fP\fB, ...);
+.br
+int snprintf(char *restrict\fP \fIs\fP\fB, size_t\fP \fIn\fP\fB,
+.br
+\ \ \ \ \ \ const char *restrict\fP \fIformat\fP\fB, ...);
+.br
+int sprintf(char *restrict\fP \fIs\fP\fB, const char *restrict\fP
+\fIformat\fP\fB, ...);
+.br
+\fP
+.SH DESCRIPTION
+.LP
+The \fIfprintf\fP() function shall place output on the named output
+\fIstream\fP. The \fIprintf\fP() function shall place
+output on the standard output stream \fIstdout\fP. The \fIsprintf\fP()
+function shall place output followed by the null byte,
+\fB'\\0'\fP , in consecutive bytes starting at *\fIs\fP; it is the
+user's responsibility to ensure that enough space is
+available.
+.LP
+The \fIsnprintf\fP() function shall be equivalent to \fIsprintf\fP(),
+with the addition of the \fIn\fP argument which states
+the size of the buffer referred to by \fIs\fP. If \fIn\fP is zero,
+nothing shall be written and \fIs\fP may be a null pointer.
+Otherwise, output bytes beyond the \fIn\fP-1st shall be discarded
+instead of being written to the array, and a null byte is
+written at the end of the bytes actually written into the array.
+.LP
+If copying takes place between objects that overlap as a result of
+a call to \fIsprintf\fP() or \fIsnprintf\fP(), the results
+are undefined.
+.LP
+Each of these functions converts, formats, and prints its arguments
+under control of the \fIformat\fP. The \fIformat\fP is a
+character string, beginning and ending in its initial shift state,
+if any. The \fIformat\fP is composed of zero or more
+directives: \fIordinary characters\fP, which are simply copied to
+the output stream, and \fIconversion specifications\fP, each of
+which shall result in the fetching of zero or more arguments. The
+results are undefined if there are insufficient arguments for the
+\fIformat\fP. If the \fIformat\fP is exhausted while arguments remain,
+the excess arguments shall be evaluated but are otherwise
+ignored.
+.LP
+Conversions can be applied to the \fIn\fPth argument after the \fIformat\fP
+in the argument list, rather than to the next unused
+argument. In this case, the conversion specifier character \fB%\fP
+(see below) is replaced by the sequence
+\fB"%\fP\fIn\fP\fB$"\fP, where \fIn\fP is a decimal integer in the
+range [1,{NL_ARGMAX}], giving the position of the
+argument in the argument list. This feature provides for the definition
+of format strings that select arguments in an order
+appropriate to specific languages (see the EXAMPLES section).
+.LP
+The \fIformat\fP can contain either numbered argument conversion specifications
+(that is, \fB"%\fP\fIn\fP\fB$"\fP and
+\fB"*\fP\fIm\fP\fB$"\fP), or unnumbered argument conversion specifications
+(that is, \fB%\fP and \fB*\fP ), but not
+both. The only exception to this is that \fB%%\fP can be mixed with
+the \fB"%\fP\fIn\fP\fB$"\fP form. The results of
+mixing numbered and unnumbered argument specifications in a \fIformat\fP
+string are undefined. When numbered argument
+specifications are used, specifying the \fIN\fPth argument requires
+that all the leading arguments, from the first to the
+(\fIN-1\fP)th, are specified in the format string.
+.LP
+In format strings containing the \fB"%\fP\fIn\fP\fB$"\fP form of conversion
+specification, numbered arguments in the
+argument list can be referenced from the format string as many times
+as required.
+.LP
+In format strings containing the \fB%\fP form of conversion specification,
+each conversion specification uses the first
+unused argument in the argument list.
+.LP
+All
+forms of the \fIfprintf\fP() functions allow for the insertion of
+a language-dependent radix character in the output string. The
+radix character is defined in the program's locale (category \fILC_NUMERIC
+).\fP In the POSIX locale, or in a locale where the
+radix character is not defined, the radix character shall default
+to a period ( \fB'.'\fP ).
+.LP
+Each conversion specification is introduced by the \fB'%'\fP character
+\ or by the
+character sequence \fB"%\fP\fIn\fP\fB$"\fP, after which the
+following appear in sequence:
+.IP " *" 3
+Zero or more \fIflags\fP (in any order), which modify the meaning
+of the conversion specification.
+.LP
+.IP " *" 3
+An optional minimum \fIfield width\fP. If the converted value has
+fewer bytes than the field width, it shall be padded with
+spaces by default on the left; it shall be padded on the right if
+the left-adjustment flag ( \fB'-'\fP ), described below, is
+given to the field width. The field width takes the form of an asterisk
+( \fB'*'\fP ), described below, or a decimal
+integer.
+.LP
+.IP " *" 3
+An optional \fIprecision\fP that gives the minimum number of digits
+to appear for the \fBd\fP , \fBi\fP , \fBo\fP ,
+\fBu\fP , \fBx\fP , and \fBX\fP conversion specifiers; the number
+of digits to appear after the radix character for the
+\fBa\fP , \fBA\fP , \fBe\fP , \fBE\fP , \fBf\fP , and \fBF\fP conversion
+specifiers; the maximum number of
+significant digits for the \fBg\fP and \fBG\fP conversion specifiers;
+or the maximum number of bytes to be printed from a
+string in the \fBs\fP \ and \fBS\fP \ conversion
+specifiers. The precision takes the form of a period ( \fB'.'\fP )
+followed either by an asterisk ( \fB'*'\fP ), described
+below, or an optional decimal digit string, where a null digit string
+is treated as zero. If a precision appears with any other
+conversion specifier, the behavior is undefined.
+.LP
+.IP " *" 3
+An optional length modifier that specifies the size of the argument.
+.LP
+.IP " *" 3
+A \fIconversion specifier\fP character that indicates the type of
+conversion to be applied.
+.LP
+.LP
+A field width, or precision, or both, may be indicated by an asterisk
+( \fB'*'\fP ). In this case an argument of type
+\fBint\fP supplies the field width or precision. Applications shall
+ensure that arguments specifying field width, or precision, or
+both appear in that order before the argument, if any, to be converted.
+A negative field width is taken as a \fB'-'\fP flag
+followed by a positive field width. A negative precision is taken
+as if the precision were omitted. \ In format
+strings containing the \fB"%\fP\fIn\fP\fB$"\fP form of a conversion
+specification, a field width or precision may be
+indicated by the sequence \fB"*\fP\fIm\fP\fB$"\fP, where \fIm\fP is
+a decimal integer in the range [1,{NL_ARGMAX}] giving
+the position in the argument list (after the \fIformat\fP argument)
+of an integer argument containing the field width or
+precision, for example:
+.sp
+.RS
+.nf
+
+\fBprintf("%1$d:%2$.*3$d:%4$.*3$d\\n", hour, min, precision, sec);
+\fP
+.fi
+.RE
+.LP
+The flag characters and their meanings are:
+.TP 7
+\fB'\fP
+The integer portion of the result of a decimal conversion ( \fB%i\fP
+, \fB%d\fP , \fB%u\fP , \fB%f\fP , \fB%F\fP ,
+\fB%g\fP , or \fB%G\fP ) shall be formatted with thousands' grouping
+characters. For other conversions the behavior is
+undefined. The non-monetary grouping character is used.
+.TP 7
+\fB-\fP
+The result of the conversion shall be left-justified within the field.
+The conversion is right-justified if this flag is not
+specified.
+.TP 7
+\fB+\fP
+The result of a signed conversion shall always begin with a sign (
+\fB'+'\fP or \fB'-'\fP ). The conversion shall begin
+with a sign only when a negative value is converted if this flag is
+not specified.
+.TP 7
+<space>
+If the first character of a signed conversion is not a sign or if
+a signed conversion results in no characters, a <space>
+shall be prefixed to the result. This means that if the <space> and
+\fB'+'\fP flags both appear, the <space> flag
+shall be ignored.
+.TP 7
+\fB#\fP
+Specifies that the value is to be converted to an alternative form.
+For \fBo\fP conversion, it increases the precision (if
+necessary) to force the first digit of the result to be zero. For
+\fBx\fP or \fBX\fP conversion specifiers, a non-zero result
+shall have 0x (or 0X) prefixed to it. For \fBa\fP , \fBA\fP , \fBe\fP
+, \fBE\fP , \fBf\fP , \fBF\fP , \fBg\fP
+, and \fBG\fP conversion specifiers, the result shall always contain
+a radix character, even if no digits follow the radix
+character. Without this flag, a radix character appears in the result
+of these conversions only if a digit follows it. For
+\fBg\fP and \fBG\fP conversion specifiers, trailing zeros shall \fInot\fP
+be removed from the result as they normally are.
+For other conversion specifiers, the behavior is undefined.
+.TP 7
+\fB0\fP
+For \fBd\fP , \fBi\fP , \fBo\fP , \fBu\fP , \fBx\fP , \fBX\fP , \fBa\fP
+, \fBA\fP , \fBe\fP ,
+\fBE\fP , \fBf\fP , \fBF\fP , \fBg\fP , and \fBG\fP conversion specifiers,
+leading zeros (following any indication
+of sign or base) are used to pad to the field width; no space padding
+is performed. If the \fB'0'\fP and \fB'-'\fP flags both
+appear, the \fB'0'\fP flag is ignored. For \fBd\fP , \fBi\fP , \fBo\fP
+, \fBu\fP , \fBx\fP , and \fBX\fP
+conversion specifiers, if a precision is specified, the \fB'0'\fP
+flag is ignored. \ If the
+\fB'0'\fP and \fB'"\fP flags both appear, the grouping characters
+are inserted before zero padding. For other conversions,
+the behavior is undefined.
+.sp
+.LP
+The length modifiers and their meanings are:
+.TP 7
+\fBhh\fP
+Specifies that a following \fBd\fP , \fBi\fP , \fBo\fP , \fBu\fP ,
+\fBx\fP , or \fBX\fP conversion specifier
+applies to a \fBsigned char\fP or \fBunsigned char\fP argument (the
+argument will have been promoted according to the integer
+promotions, but its value shall be converted to \fBsigned char\fP
+or \fBunsigned char\fP before printing); or that a following
+\fBn\fP conversion specifier applies to a pointer to a \fBsigned char\fP
+argument.
+.TP 7
+\fBh\fP
+Specifies that a following \fBd\fP , \fBi\fP , \fBo\fP , \fBu\fP ,
+\fBx\fP , or \fBX\fP conversion specifier
+applies to a \fBshort\fP or \fBunsigned short\fP argument (the argument
+will have been promoted according to the integer
+promotions, but its value shall be converted to \fBshort\fP or \fBunsigned
+short\fP before printing); or that a following
+\fBn\fP conversion specifier applies to a pointer to a \fBshort\fP
+argument.
+.TP 7
+\fBl\fP\ (ell)
+Specifies that a following \fBd\fP , \fBi\fP , \fBo\fP , \fBu\fP ,
+\fBx\fP , or \fBX\fP conversion specifier
+applies to a \fBlong\fP or \fBunsigned long\fP argument; that a following
+\fBn\fP conversion specifier applies to a pointer to
+a \fBlong\fP argument; that a following \fBc\fP conversion specifier
+applies to a \fBwint_t\fP argument; that a following
+\fBs\fP conversion specifier applies to a pointer to a \fBwchar_t\fP
+argument; or has no effect on a following \fBa\fP ,
+\fBA\fP , \fBe\fP , \fBE\fP , \fBf\fP , \fBF\fP , \fBg\fP , or \fBG\fP
+conversion specifier.
+.TP 7
+\fBll\fP\ (ell-ell)
+.sp
+Specifies that a following \fBd\fP , \fBi\fP , \fBo\fP , \fBu\fP ,
+\fBx\fP , or \fBX\fP conversion specifier
+applies to a \fBlong long\fP or \fBunsigned long long\fP argument;
+or that a following \fBn\fP conversion specifier applies to
+a pointer to a \fBlong long\fP argument.
+.TP 7
+\fBj\fP
+Specifies that a following \fBd\fP , \fBi\fP , \fBo\fP , \fBu\fP ,
+\fBx\fP , or \fBX\fP conversion specifier
+applies to an \fBintmax_t\fP or \fBuintmax_t\fP argument; or that
+a following \fBn\fP conversion specifier applies to a
+pointer to an \fBintmax_t\fP argument.
+.TP 7
+\fBz\fP
+Specifies that a following \fBd\fP , \fBi\fP , \fBo\fP , \fBu\fP ,
+\fBx\fP , or \fBX\fP conversion specifier
+applies to a \fBsize_t\fP or the corresponding signed integer type
+argument; or that a following \fBn\fP conversion specifier
+applies to a pointer to a signed integer type corresponding to a \fBsize_t\fP
+argument.
+.TP 7
+\fBt\fP
+Specifies that a following \fBd\fP , \fBi\fP , \fBo\fP , \fBu\fP ,
+\fBx\fP , or \fBX\fP conversion specifier
+applies to a \fBptrdiff_t\fP or the corresponding \fBunsigned\fP type
+argument; or that a following \fBn\fP conversion
+specifier applies to a pointer to a \fBptrdiff_t\fP argument.
+.TP 7
+\fBL\fP
+Specifies that a following \fBa\fP , \fBA\fP , \fBe\fP , \fBE\fP ,
+\fBf\fP , \fBF\fP , \fBg\fP , or
+\fBG\fP conversion specifier applies to a \fBlong double\fP argument.
+.sp
+.LP
+If a length modifier appears with any conversion specifier other than
+as specified above, the behavior is undefined.
+.LP
+The conversion specifiers and their meanings are:
+.TP 7
+\fBd\fP,\ \fBi\fP
+The \fBint\fP argument shall be converted to a signed decimal in the
+style \fB"[-]\fP\fIdddd\fP\fB"\fP. The precision
+specifies the minimum number of digits to appear; if the value being
+converted can be represented in fewer digits, it shall be
+expanded with leading zeros. The default precision is 1. The result
+of converting zero with an explicit precision of zero shall be
+no characters.
+.TP 7
+\fBo\fP
+The \fBunsigned\fP argument shall be converted to unsigned octal format
+in the style \fB"\fP\fIdddd\fP\fB"\fP. The
+precision specifies the minimum number of digits to appear; if the
+value being converted can be represented in fewer digits, it
+shall be expanded with leading zeros. The default precision is 1.
+The result of converting zero with an explicit precision of zero
+shall be no characters.
+.TP 7
+\fBu\fP
+The \fBunsigned\fP argument shall be converted to unsigned decimal
+format in the style \fB"\fP\fIdddd\fP\fB"\fP. The
+precision specifies the minimum number of digits to appear; if the
+value being converted can be represented in fewer digits, it
+shall be expanded with leading zeros. The default precision is 1.
+The result of converting zero with an explicit precision of zero
+shall be no characters.
+.TP 7
+\fBx\fP
+The \fBunsigned\fP argument shall be converted to unsigned hexadecimal
+format in the style \fB"\fP\fIdddd\fP\fB"\fP;
+the letters \fB"abcdef"\fP are used. The precision specifies the minimum
+number of digits to appear; if the value being
+converted can be represented in fewer digits, it shall be expanded
+with leading zeros. The default precision is 1. The result of
+converting zero with an explicit precision of zero shall be no characters.
+.TP 7
+\fBX\fP
+Equivalent to the \fBx\fP conversion specifier, except that letters
+\fB"ABCDEF"\fP are used instead of \fB"abcdef"\fP
+\&.
+.TP 7
+\fBf\fP,\ \fBF\fP
+The \fBdouble\fP argument shall be converted to decimal notation in
+the style
+\fB"[-]\fP\fIddd\fP\fB.\fP\fIddd\fP\fB"\fP, where the number of digits
+after the radix character is equal to the
+precision specification. If the precision is missing, it shall be
+taken as 6; if the precision is explicitly zero and no
+\fB'#'\fP flag is present, no radix character shall appear. If a radix
+character appears, at least one digit appears before it.
+The low-order digit shall be rounded in an implementation-defined
+manner.
+.LP
+A \fBdouble\fP argument representing an infinity shall be converted
+in one of the styles \fB"[-]inf"\fP or
+\fB"[-]infinity"\fP ; which style is implementation-defined. A \fBdouble\fP
+argument representing a NaN shall be converted in
+one of the styles \fB"[-]nan(\fP\fIn-char-sequence\fP\fB)"\fP or \fB"[-]nan"\fP
+; which style, and the meaning of any
+\fIn-char-sequence\fP, is implementation-defined. The \fBF\fP conversion
+specifier produces \fB"INF"\fP ,
+\fB"INFINITY"\fP , or \fB"NAN"\fP instead of \fB"inf"\fP , \fB"infinity"\fP
+, or \fB"nan"\fP , respectively.
+.TP 7
+\fBe\fP,\ \fBE\fP
+The \fBdouble\fP argument shall be converted in the style
+\fB"[-]\fP\fId\fP\fB.\fP\fIddd\fP\fBe\(+-\fP\fIdd\fP\fB"\fP, where
+there is one digit before the radix character
+(which is non-zero if the argument is non-zero) and the number of
+digits after it is equal to the precision; if the precision is
+missing, it shall be taken as 6; if the precision is zero and no \fB'#'\fP
+flag is present, no radix character shall appear. The
+low-order digit shall be rounded in an implementation-defined manner.
+The \fBE\fP conversion specifier shall produce a number
+with \fB'E'\fP instead of \fB'e'\fP introducing the exponent. The
+exponent shall always contain at least two digits. If the
+value is zero, the exponent shall be zero.
+.LP
+A \fBdouble\fP argument representing an infinity or NaN shall be converted
+in the style of an \fBf\fP or \fBF\fP
+conversion specifier.
+.TP 7
+\fBg\fP,\ \fBG\fP
+The \fBdouble\fP argument shall be converted in the style \fBf\fP
+or \fBe\fP (or in the style \fBF\fP or \fBE\fP
+in the case of a \fBG\fP conversion specifier), with the precision
+specifying the number of significant digits. If an explicit
+precision is zero, it shall be taken as 1. The style used depends
+on the value converted; style \fBe\fP (or \fBE\fP ) shall
+be used only if the exponent resulting from such a conversion is less
+than -4 or greater than or equal to the precision. Trailing
+zeros shall be removed from the fractional portion of the result;
+a radix character shall appear only if it is followed by a digit
+or a \fB'#'\fP flag is present.
+.LP
+A \fBdouble\fP argument representing an infinity or NaN shall be converted
+in the style of an \fBf\fP or \fBF\fP
+conversion specifier.
+.TP 7
+\fBa\fP,\ \fBA\fP
+A \fBdouble\fP argument representing a floating-point number shall
+be converted in the style
+\fB"[-]0x\fP\fIh\fP\fB.\fP\fIhhhh\fP\fBp\(+-\fP\fId\fP\fB"\fP, where
+there is one hexadecimal digit (which shall
+be non-zero if the argument is a normalized floating-point number
+and is otherwise unspecified) before the decimal-point character
+and the number of hexadecimal digits after it is equal to the precision;
+if the precision is missing and FLT_RADIX is a power of 2,
+then the precision shall be sufficient for an exact representation
+of the value; if the precision is missing and FLT_RADIX is not a
+power of 2, then the precision shall be sufficient to distinguish
+values of type \fBdouble\fP, except that trailing zeros may be
+omitted; if the precision is zero and the \fB'#'\fP flag is not specified,
+no decimal-point character shall appear. The letters
+\fB"abcdef"\fP shall be used for \fBa\fP conversion and the letters
+\fB"ABCDEF"\fP for \fBA\fP conversion. The
+\fBA\fP conversion specifier produces a number with \fB'X'\fP and
+\fB'P'\fP instead of \fB'x'\fP and \fB'p'\fP . The
+exponent shall always contain at least one digit, and only as many
+more digits as necessary to represent the decimal exponent of 2.
+If the value is zero, the exponent shall be zero.
+.LP
+A \fBdouble\fP argument representing an infinity or NaN shall be converted
+in the style of an \fBf\fP or \fBF\fP
+conversion specifier.
+.TP 7
+\fBc\fP
+The \fBint\fP argument shall be converted to an \fBunsigned char\fP,
+and the resulting byte shall be written.
+.LP
+If an \fBl\fP (ell) qualifier is present, the \fBwint_t\fP argument
+shall be converted as if by an \fBls\fP conversion
+specification with no precision and an argument that points to a two-element
+array of type \fBwchar_t\fP, the first element of
+which contains the \fBwint_t\fP argument to the \fBls\fP conversion
+specification and the second element contains a null wide
+character.
+.TP 7
+\fBs\fP
+The argument shall be a pointer to an array of \fBchar\fP. Bytes from
+the array shall be written up to (but not including) any
+terminating null byte. If the precision is specified, no more than
+that many bytes shall be written. If the precision is not
+specified or is greater than the size of the array, the application
+shall ensure that the array contains a null byte.
+.LP
+If an \fBl\fP (ell) qualifier is present, the argument shall be a
+pointer to an array of type \fBwchar_t\fP. Wide characters
+from the array shall be converted to characters (each as if by a call
+to the \fIwcrtomb\fP() function, with the conversion state described
+by an \fBmbstate_t\fP object
+initialized to zero before the first wide character is converted)
+up to and including a terminating null wide character. The
+resulting characters shall be written up to (but not including) the
+terminating null character (byte). If no precision is
+specified, the application shall ensure that the array contains a
+null wide character. If a precision is specified, no more than
+that many characters (bytes) shall be written (including shift sequences,
+if any), and the array shall contain a null wide
+character if, to equal the character sequence length given by the
+precision, the function would need to access a wide character one
+past the end of the array. In no case shall a partial character be
+written.
+.TP 7
+\fBp\fP
+The argument shall be a pointer to \fBvoid\fP. The value of the pointer
+is converted to a sequence of printable characters, in
+an implementation-defined manner.
+.TP 7
+\fBn\fP
+The argument shall be a pointer to an integer into which is written
+the number of bytes written to the output so far by this
+call to one of the \fIfprintf\fP() functions. No argument is converted.
+.TP 7
+\fBC\fP
+Equivalent to \fBlc\fP .
+.TP 7
+\fBS\fP
+Equivalent to \fBls\fP .
+.TP 7
+\fB%\fP
+Print a \fB'%'\fP character; no argument is converted. The complete
+conversion specification shall be \fB%%\fP .
+.sp
+.LP
+If a conversion specification does not match one of the above forms,
+the behavior is undefined. If any argument is not the
+correct type for the corresponding conversion specification, the behavior
+is undefined.
+.LP
+In no case shall a nonexistent or small field width cause truncation
+of a field; if the result of a conversion is wider than the
+field width, the field shall be expanded to contain the conversion
+result. Characters generated by \fIfprintf\fP() and
+\fIprintf\fP() are printed as if \fIfputc\fP() had been called.
+.LP
+For the \fBa\fP and \fBA\fP conversion specifiers, if FLT_RADIX is
+a power of 2, the value shall be correctly rounded to a
+hexadecimal floating number with the given precision.
+.LP
+For \fBa\fP and \fBA\fP conversions, if FLT_RADIX is not a power of
+2 and the result is not exactly representable in the
+given precision, the result should be one of the two adjacent numbers
+in hexadecimal floating style with the given precision, with
+the extra stipulation that the error should have a correct sign for
+the current rounding direction.
+.LP
+For the \fBe\fP , \fBE\fP , \fBf\fP , \fBF\fP , \fBg\fP , and \fBG\fP
+conversion specifiers, if the number of
+significant decimal digits is at most DECIMAL_DIG, then the result
+should be correctly rounded. If the number of significant
+decimal digits is more than DECIMAL_DIG but the source value is exactly
+representable with DECIMAL_DIG digits, then the result
+should be an exact representation with trailing zeros. Otherwise,
+the source value is bounded by two adjacent decimal strings
+\fIL\fP < \fIU\fP, both having DECIMAL_DIG significant digits; the
+value of the resultant decimal string \fID\fP should
+satisfy \fIL\fP <= \fID\fP <= \fIU\fP, with the extra stipulation
+that the error should have a correct sign for the
+current rounding direction.
+.LP
+The
+\fIst_ctime\fP and \fIst_mtime\fP fields of the file shall be marked
+for update between the call to a successful execution of
+\fIfprintf\fP() or \fIprintf\fP() and the next successful completion
+of a call to \fIfflush\fP() or \fIfclose\fP() on the same stream or
+a
+call to \fIexit\fP() or \fIabort\fP().
+.SH RETURN VALUE
+.LP
+Upon successful completion, the \fIfprintf\fP() and \fIprintf\fP()
+functions shall return the number of bytes transmitted.
+.LP
+Upon successful completion, the \fIsprintf\fP() function shall return
+the number of bytes written to \fIs\fP, excluding the
+terminating null byte.
+.LP
+Upon successful completion, the \fIsnprintf\fP() function shall return
+the number of bytes that would be written to \fIs\fP
+had \fIn\fP been sufficiently large excluding the terminating null
+byte.
+.LP
+If an output error was encountered, these functions shall return a
+negative value.
+.LP
+If the value of \fIn\fP is zero on a call to \fIsnprintf\fP(), nothing
+shall be written, the number of bytes that would have
+been written had \fIn\fP been sufficiently large excluding the terminating
+null shall be returned, and \fIs\fP may be a null
+pointer.
+.SH ERRORS
+.LP
+For the conditions under which \fIfprintf\fP() and \fIprintf\fP()
+fail and may fail, refer to \fIfputc\fP() or \fIfputwc\fP() .
+.LP
+In addition, all forms of \fIfprintf\fP() may fail if:
+.TP 7
+.B EILSEQ
+A wide-character code that does not correspond to a valid character
+has been detected.
+.TP 7
+.B EINVAL
+There are insufficient arguments.
+.sp
+.LP
+The \fIprintf\fP() and \fIfprintf\fP() functions may fail if:
+.TP 7
+.B ENOMEM
+Insufficient storage space is available.
+.sp
+.LP
+The \fIsnprintf\fP() function shall fail if:
+.TP 7
+.B EOVERFLOW
+The value of \fIn\fP is greater than {INT_MAX} or the number of bytes
+needed to hold the output excluding the terminating null is
+greater than {INT_MAX}.
+.sp
+.LP
+\fIThe following sections are informative.\fP
+.SH EXAMPLES
+.SS Printing Language-Independent Date and Time
+.LP
+The following statement can be used to print date and time using a
+language-independent format:
+.sp
+.RS
+.nf
+
+\fBprintf(format, weekday, month, day, hour, min);
+\fP
+.fi
+.RE
+.LP
+For American usage, \fIformat\fP could be a pointer to the following
+string:
+.sp
+.RS
+.nf
+
+\fB"%s, %s %d, %d:%.2d\\n"
+\fP
+.fi
+.RE
+.LP
+This example would produce the following message:
+.sp
+.RS
+.nf
+
+\fBSunday, July 3, 10:02
+\fP
+.fi
+.RE
+.LP
+For German usage, \fIformat\fP could be a pointer to the following
+string:
+.sp
+.RS
+.nf
+
+\fB"%1$s, %3$d. %2$s, %4$d:%5$.2d\\n"
+\fP
+.fi
+.RE
+.LP
+This definition of \fIformat\fP would produce the following message:
+.sp
+.RS
+.nf
+
+\fBSonntag, 3. Juli, 10:02
+\fP
+.fi
+.RE
+.SS Printing File Information
+.LP
+The following example prints information about the type, permissions,
+and number of links of a specific file in a directory.
+.LP
+The first two calls to \fIprintf\fP() use data decoded from a previous
+\fIstat\fP() call.
+The user-defined \fIstrperm\fP() function shall return a string similar
+to the one at the beginning of the output for the
+following command:
+.sp
+.RS
+.nf
+
+\fBls -l
+\fP
+.fi
+.RE
+.LP
+The next call to \fIprintf\fP() outputs the owner's name if it is
+found using \fIgetpwuid\fP(); the \fIgetpwuid\fP() function shall
+return a \fBpasswd\fP structure from which the name of the user is
+extracted. If the user name is not found, the program instead
+prints out the numeric value of the user ID.
+.LP
+The next call prints out the group name if it is found using \fIgetgrgid\fP();
+\fIgetgrgid\fP() is very similar to \fIgetpwuid\fP() except that it
+shall return group information based on the group number. Once
+again, if the group is not found, the program prints the numeric value
+of the group for the entry.
+.LP
+The final call to \fIprintf\fP() prints the size of the file.
+.sp
+.RS
+.nf
+
+\fB#include <stdio.h>
+#include <sys/types.h>
+#include <pwd.h>
+#include <grp.h>
+.sp
+
+char *strperm (mode_t);
+\&...
+struct stat statbuf;
+struct passwd *pwd;
+struct group *grp;
+\&...
+printf("%10.10s", strperm (statbuf.st_mode));
+printf("%4d", statbuf.st_nlink);
+.sp
+
+if ((pwd = getpwuid(statbuf.st_uid)) != NULL)
+ printf(" %-8.8s", pwd->pw_name);
+else
+ printf(" %-8ld", (long) statbuf.st_uid);
+.sp
+
+if ((grp = getgrgid(statbuf.st_gid)) != NULL)
+ printf(" %-8.8s", grp->gr_name);
+else
+ printf(" %-8ld", (long) statbuf.st_gid);
+.sp
+
+printf("%9jd", (intmax_t) statbuf.st_size);
+\&...
+\fP
+.fi
+.RE
+.SS Printing a Localized Date String
+.LP
+The following example gets a localized date string. The \fInl_langinfo\fP()
+function shall return the localized date string, which specifies the
+order and layout of the date. The \fIstrftime\fP() function takes
+this information and, using the \fBtm\fP structure for values,
+places the date and time information into \fIdatestring\fP. The \fIprintf\fP()
+function then outputs \fIdatestring\fP and the
+name of the entry.
+.sp
+.RS
+.nf
+
+\fB#include <stdio.h>
+#include <time.h>
+#include <langinfo.h>
+\&...
+struct dirent *dp;
+struct tm *tm;
+char datestring[256];
+\&...
+strftime(datestring, sizeof(datestring), nl_langinfo (D_T_FMT), tm);
+.sp
+
+printf(" %s %s\\n", datestring, dp->d_name);
+\&...
+\fP
+.fi
+.RE
+.SS Printing Error Information
+.LP
+The following example uses \fIfprintf\fP() to write error information
+to standard error.
+.LP
+In the first group of calls, the program tries to open the password
+lock file named \fBLOCKFILE\fP. If the file already exists,
+this is an error, as indicated by the O_EXCL flag on the \fIopen\fP()
+function. If the call
+fails, the program assumes that someone else is updating the password
+file, and the program exits.
+.LP
+The next group of calls saves a new password file as the current password
+file by creating a link between \fBLOCKFILE\fP and
+the new password file \fBPASSWDFILE\fP.
+.sp
+.RS
+.nf
+
+\fB#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+.sp
+
+#define LOCKFILE "/etc/ptmp"
+#define PASSWDFILE "/etc/passwd"
+\&...
+int pfd;
+\&...
+if ((pfd = open(LOCKFILE, O_WRONLY | O_CREAT | O_EXCL,
+ S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)) == -1)
+{
+ fprintf(stderr, "Cannot open /etc/ptmp. Try again later.\\n");
+ exit(1);
+}
+\&...
+if (link(LOCKFILE,PASSWDFILE) == -1) {
+ fprintf(stderr, "Link error: %s\\n", strerror(errno));
+ exit(1);
+}
+\&...
+\fP
+.fi
+.RE
+.SS Printing Usage Information
+.LP
+The following example checks to make sure the program has the necessary
+arguments, and uses \fIfprintf\fP() to print usage
+information if the expected number of arguments is not present.
+.sp
+.RS
+.nf
+
+\fB#include <stdio.h>
+#include <stdlib.h>
+\&...
+char *Options = "hdbtl";
+\&...
+if (argc < 2) {
+ fprintf(stderr, "Usage: %s -%s <file\\n", argv[0], Options); exit(1);
+}
+\&...
+\fP
+.fi
+.RE
+.SS Formatting a Decimal String
+.LP
+The following example prints a key and data pair on \fIstdout\fP.
+Note use of the \fB'*'\fP (asterisk) in the format string;
+this ensures the correct number of decimal places for the element
+based on the number of elements requested.
+.sp
+.RS
+.nf
+
+\fB#include <stdio.h>
+\&...
+long i;
+char *keystr;
+int elementlen, len;
+\&...
+while (len < elementlen) {
+\&...
+ printf("%s Element%0*ld\\n", keystr, elementlen, i);
+\&...
+}
+\fP
+.fi
+.RE
+.SS Creating a Filename
+.LP
+The following example creates a filename using information from a
+previous \fIgetpwnam\fP() function that returned the HOME directory
+of the user.
+.sp
+.RS
+.nf
+
+\fB#include <stdio.h>
+#include <sys/types.h>
+#include <unistd.h>
+\&...
+char filename[PATH_MAX+1];
+struct passwd *pw;
+\&...
+sprintf(filename, "%s/%d.out", pw->pw_dir, getpid());
+\&...
+\fP
+.fi
+.RE
+.SS Reporting an Event
+.LP
+The following example loops until an event has timed out. The \fIpause\fP()
+function
+waits forever unless it receives a signal. The \fIfprintf\fP() statement
+should never occur due to the possible return values of
+\fIpause\fP().
+.sp
+.RS
+.nf
+
+\fB#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+\&...
+while (!event_complete) {
+\&...
+ if (pause() != -1 || errno != EINTR)
+ fprintf(stderr, "pause: unknown error: %s\\n", strerror(errno));
+}
+\&...
+\fP
+.fi
+.RE
+.SS Printing Monetary Information
+.LP
+The following example uses \fIstrfmon\fP() to convert a number and
+store it as a
+formatted monetary string named \fIconvbuf\fP. If the first number
+is printed, the program prints the format and the description;
+otherwise, it just prints the number.
+.sp
+.RS
+.nf
+
+\fB#include <monetary.h>
+#include <stdio.h>
+\&...
+struct tblfmt {
+ char *format;
+ char *description;
+};
+.sp
+
+struct tblfmt table[] = {
+ { "%n", "default formatting" },
+ { "%11n", "right align within an 11 character field" },
+ { "%#5n", "aligned columns for values up to 99999" },
+ { "%=*#5n", "specify a fill character" },
+ { "%=0#5n", "fill characters do not use grouping" },
+ { "%^#5n", "disable the grouping separator" },
+ { "%^#5.0n", "round off to whole units" },
+ { "%^#5.4n", "increase the precision" },
+ { "%(#5n", "use an alternative pos/neg style" },
+ { "%!(#5n", "disable the currency symbol" },
+};
+\&...
+float input[3];
+int i, j;
+char convbuf[100];
+\&...
+strfmon(convbuf, sizeof(convbuf), table[i].format, input[j]);
+.sp
+
+if (j == 0) {
+ printf("%s %s %s\\n", table[i].format,
+ convbuf, table[i].description);
+}
+else {
+ printf(" %s\\n", convbuf);
+}
+\&...
+\fP
+.fi
+.RE
+.SS Printing Wide Characters
+.LP
+The following example prints a series of wide characters. Suppose
+that \fB"L`@`"\fP expands to three bytes:
+.sp
+.RS
+.nf
+
+\fBwchar_t wz [3] = L"@@"; // Zero-terminated
+wchar_t wn [3] = L"@@@"; // Unterminated
+.sp
+
+fprintf (stdout,"%ls", wz); // Outputs 6 bytes
+fprintf (stdout,"%ls", wn); // Undefined because wn has no terminator
+fprintf (stdout,"%4ls", wz); // Outputs 3 bytes
+fprintf (stdout,"%4ls", wn); // Outputs 3 bytes; no terminator needed
+fprintf (stdout,"%9ls", wz); // Outputs 6 bytes
+fprintf (stdout,"%9ls", wn); // Outputs 9 bytes; no terminator needed
+fprintf (stdout,"%10ls", wz); // Outputs 6 bytes
+fprintf (stdout,"%10ls", wn); // Undefined because wn has no terminator
+\fP
+.fi
+.RE
+.LP
+In the last line of the example, after processing three characters,
+nine bytes have been output. The fourth character must then
+be examined to determine whether it converts to one byte or more.
+If it converts to more than one byte, the output is only nine
+bytes. Since there is no fourth character in the array, the behavior
+is undefined.
+.SH APPLICATION USAGE
+.LP
+If the application calling \fIfprintf\fP() has any objects of type
+\fBwint_t\fP or \fBwchar_t\fP, it must also include the \fI<wchar.h>\fP
+header to have these objects defined.
+.SH RATIONALE
+.LP
+None.
+.SH FUTURE DIRECTIONS
+.LP
+None.
+.SH SEE ALSO
+.LP
+\fIfputc\fP() , \fIfscanf\fP() , \fIsetlocale\fP() , \fIstrfmon\fP()
+, \fIwcrtomb\fP()
+, the Base Definitions volume of IEEE\ Std\ 1003.1-2001, Chapter 7,
+Locale, \fI<stdio.h>\fP, \fI<wchar.h>\fP
+.SH COPYRIGHT
+Portions of this text are reprinted and reproduced in electronic form
+from IEEE Std 1003.1, 2003 Edition, Standard for Information Technology
+-- Portable Operating System Interface (POSIX), The Open Group Base
+Specifications Issue 6, Copyright (C) 2001-2003 by the Institute of
+Electrical and Electronics Engineers, Inc and The Open Group. In the
+event of any discrepancy between this version and the original IEEE and
+The Open Group Standard, the original IEEE and The Open Group Standard
+is the referee document. The original Standard can be obtained online at
+http://www.opengroup.org/unix/online.html .