X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/1c15e88899094343f75aeba04122cd96a96b428e..ad7871609881e73855d0b04da49b486cd93efca7:/usr/src/lib/libc/stdio/printf.3 diff --git a/usr/src/lib/libc/stdio/printf.3 b/usr/src/lib/libc/stdio/printf.3 index f75a208d5f..70f8b99d3b 100644 --- a/usr/src/lib/libc/stdio/printf.3 +++ b/usr/src/lib/libc/stdio/printf.3 @@ -1,478 +1,638 @@ -.\" @(#)printf.3 6.7 (Berkeley) 4/14/89 +.\" Copyright (c) 1990, 1991, 1993 +.\" The Regents of the University of California. All rights reserved. .\" -.TH PRINTF 3 "October 22, 1987" -.AT 3 -.SH NAME -fprintf, printf, sprintf, vprintf, vfprintf, vsprintf - formatted -output conversion -.SH SYNOPSIS -.B #include -.PP -.B printf(format -.RB [ , -arg ] ... -.B ) -.br -.B char *format; -.PP -.B fprintf(stream, format -.RB [ , -arg ] ... -.B ) -.br -.SM -.B FILE -.B *stream; -.br -.B char *format; -.PP -.B sprintf(s, format -.RB [ , -arg ] ... -.B ) -.br -.B char *s, *format; -.PP -.B #include -.br -.B vprintf(format, args) -.br -.B char *format; -.br -.B va_list args; -.PP -.B vfprintf(stream, format, args) -.br -.B FILE *stream; -.br -.B char *format; -.br -.B va_list args; -.PP -.B vsprintf(s, format, args) -.br -.B char *s, *format; -.br -.B va_list args; -.SH DESCRIPTION -.I Printf -and -.I vprintf -place output on the standard output stream -.BR stdout . -.I Fprintf +.\" This code is derived from software contributed to Berkeley by +.\" Chris Torek and the American National Standards Committee X3, +.\" on Information Processing Systems. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)printf.3 8.1 (Berkeley) 6/4/93 +.\" +.Dd June 4, 1993 +.Dt PRINTF 3 +.Os +.Sh NAME +.Nm printf , +.Nm fprintf , +.Nm sprintf , +.Nm snprintf , +.Nm vprintf , +.Nm vfprintf, +.Nm vsprintf , +.Nm vsnprintf +.Nd formatted output conversion +.Sh SYNOPSIS +.Fd #include +.Ft int +.Fn printf "const char *format" ... +.Ft int +.Fn fprintf "FILE *stream" "const char *format" ... +.Ft int +.Fn sprintf "char *str" "const char *format" ... +.Ft int +.Fn snprintf "char *str" "size_t size" "const char *format" ... +.\" .Ft int +.\" .Fn smprintf "const char *format" ... +.Fd #include +.Ft int +.Fn vprintf "const char *format" "va_list ap" +.Ft int +.Fn vfprintf "FILE *stream" "const char *format" "va_list ap" +.Ft int +.Fn vsprintf "char *str" "char *format" "va_list ap" +.Ft int +.Fn vsnprintf "char *str" "size_t size" "const char *format" "va_list ap" +.\" .Ft int +.\" .Fn vsmprintf "const char *format" "va_list ap" +.Sh DESCRIPTION +The +.Fn printf +family of functions produces output according to a +.Fa format +as described below. +.Fn Printf and -.I vfprintf -place output on the named output -.IR stream . -.I Sprintf +.Fn vprintf +write output to +.Em stdout, +the standard output stream; +.Fn fprintf and -.I vsprintf -copy into the string -.IR s , -followed by the character `\e0'. -.IR Printf , -.IR fprintf , +.Fn vfprintf +write output to the given output +.Fa stream ; +.Fn sprintf , +.Fn snprintf , +.Fn vsprintf , and -.I sprintf -take variadic argument lists directly, while -.IR vprintf , -.IR vfprintf , +.Fn vsnprintf +write to the character string +.Fa str . +.\" .IR str ; +.\" and +.\" .I smprintf +.\" and +.\" .I vsmprintf +.\" dynamically allocate a new string with +.\" .IR malloc . +These functions write the output under the control of a +.Fa format +string that specifies how subsequent arguments +(or arguments accessed via the variable-length argument facilities of +.Xr stdarg 3 ) +are converted for output. +.\" Except for +.\" .I smprintf +.\" and +.\" .IR vsmprintf , +.\" all of these functions return +These functions return +the number of characters printed +(not including the trailing +.Ql \e0 +used to end output to strings). +.\" .I Smprintf +.\" and +.\" .I vsmprintf +.\" return a pointer to a string of an appropriate length; +.\" this pointer should be passed to +.\" .I free +.\" to release the associated storage +.\" when it is no longer needed. +.\" If sufficient space is not avaliable, +.\" .I smprintf +.\" and +.\" .I vsmprintf +.\" will return +.\" .SM +.\" .BR +.Fn Snprintf and -.I vsprintf -use the variable-length argument facilities of -.IR varargs (3) -and hence may be called indirectly (see examples). -.PP -Each function converts, formats, and prints its arguments after the -.I format -under control of the -.I format -argument; each returns the the total number of characters printed (not -including the trailing `\e0' in -.I sprintf +.Fn vsnprintf +will write at most +.Fa size Ns \-1 +of the characters printed into the output string +(the +.Fa size Ns 'th +character then gets the terminating +.Ql \e0 ) ; +if the return value is greater than or equal to the +.Fa size +argument, the string was too short +and some of the printed characters were discarded. +.Fn Sprintf and -.IR vsprintf ). -.I Format -is a character string which contains two types of objects: plain characters, -which are simply copied to the output stream, and conversion specifications, -each of which causes conversion and printing of the next successive -.IR arg . -.PP -Each conversion specification is introduced by the percent character (``%''). -The remainder of the conversion specification includes, in the following -order, -.TP -.B \(bu +.Fn vsprintf +effectively assume an infinite +.Fa size . +.Pp +The format string is composed of zero or more directives: +ordinary +.\" multibyte +characters (not +.Cm % ) , +which are copied unchanged to the output stream; +and conversion specifications, each of which results +in fetching zero or more subsequent arguments. +Each conversion specification is introduced by +the character +.Cm % . +The arguments must correspond properly (after type promotion) +with the conversion specifier. +After the +.Cm % , +the following appear in sequence: +.Bl -bullet +.It Zero or more of the following flags: -.RS -.TP -.B \(bu -a `#' character +.Bl -hyphen +.It +A +.Cm # +character specifying that the value should be converted to an ``alternate form''. For -.BR c , -.BR d , -.BR i , -.BR n , -.BR p , -.BR s , +.Cm c , +.Cm d , +.Cm i , +.Cm n , +.Cm p , +.Cm s , and -.BR u , +.Cm u , conversions, this option has no effect. For -.B o +.Cm o conversions, the precision of the number is increased to force the first character of the output string to a zero (except if a zero value is printed with an explicit precision of zero). For -.B x +.Cm x and -.B X +.Cm X conversions, a non-zero result has the string -.B 0x +.Ql 0x (or -.B 0X +.Ql 0X for -.B X +.Cm X conversions) prepended to it. For -.BR e , -.BR E , -.BR f , -.BR g , +.Cm e , +.Cm E , +.Cm f , +.Cm g , and -.BR G , +.Cm G , conversions, the result will always contain a decimal point, even if no digits follow it (normally, a decimal point appears in the results of those conversions only if a digit follows). For -.B g +.Cm g and -.B G +.Cm G conversions, trailing zeros are not removed from the result as they would otherwise be. -.TP -.B \(bu -A zero ``0'' character specifying zero padding. +.It +A zero +.Sq Cm \&0 +character specifying zero padding. For all conversions except -.BR n , +.Cm n , the converted value is padded on the left with zeros rather than blanks. -If a precision is given with a numeric conversion ( -.BR d , -.BR i , -.BR o , -.BR u , -.BR i , -.BR x , +If a precision is given with a numeric conversion +.Pf ( Mc d , +.Cm i , +.Cm o , +.Cm u , +.Cm i , +.Cm x , and -.BR X ), -the ``0'' flag is ignored. -.TP -.B \(bu -A minus sign (``-'') specifying left adjustment of the converted value -in the indicated field. +.Cm X ) , +the +.Sq Cm \&0 +flag is ignored. +.It +A negative field width flag +.Sq Cm \- +indicates the converted value is to be left adjusted on the field boundary. Except for -.B n +.Cm n conversions, the converted value is padded on the right with blanks, rather than on the left with blanks or zeros. -A ``-'' overrides a ``0'' if both are given. -.TP -.B \(bu +A +.Sq Cm \- +overrides a +.Sq Cm \&0 +if both are given. +.It A space, specifying that a blank should be left before a positive number -produced by a signed conversion ( -.BR d , -.BR e , -.BR E , -.BR f , -.BR g , -.BR G , +produced by a signed conversion +.Pf ( Cm d , +.Cm e , +.Cm E , +.Cm f , +.Cm g , +.Cm G , or -.BR i ). -.TP -.B \(bu -a `+' character specifying that a sign always be placed before a +.Cm i ) . +.It +A +.Sq Cm + +character specifying that a sign always be placed before a number produced by a signed conversion. -A ``+'' overrides a space if both are used. -.RE -.TP -.B \(bu -An optional digit string specifying a field width. +A +.Sq Cm + +overrides a space if both are used. +.El +.It +An optional decimal digit string specifying a minimum field width. If the converted value has fewer characters than the field width, it will -be padded on the left (or right, if the left-adjustment flag is used) to -make up the field width. -.TP -.B \(bu -An optional precision, in the form of a period (``.'') followed by an +be padded with spaces on the left (or right, if the left-adjustment +flag has been given) to fill out +the field width. +.It +An optional precision, in the form of a period +.Sq Cm \&. +followed by an optional digit string. If the digit string is omitted, the precision is taken as zero. This gives the minimum number of digits to appear for -.BR d , -.BR i , -.BR o , -.BR u , -.BR x , +.Cm d , +.Cm i , +.Cm o , +.Cm u , +.Cm x , and -.B X -conversions, the number of digits to appear after the decimal point for -.BR e , -.BR E , +.Cm X +conversions, the number of digits to appear after the decimal-point for +.Cm e , +.Cm E , and -.B f +.Cm f conversions, the maximum number of significant digits for -.B g +.Cm g and -.B G +.Cm G conversions, or the maximum number of characters to be printed from a string for -.B s +.Cm s conversions. -.TP -.B \(bu -The character -.BR h , +.It +The optional character +.Cm h , specifying that a following -.BR d , -.BR i , -.BR o , -.BR u , -.BR x , +.Cm d , +.Cm i , +.Cm o , +.Cm u , +.Cm x , or -.B X +.Cm X conversion corresponds to a -.B "short int" +.Em short int or -.B "unsigned short int" +.Em unsigned short int argument, or that a following -.B n +.Cm n conversion corresponds to a pointer to a -.B "short int" +.Em short int argument. -.TP -.B \(bu -the character -.B l +.It +The optional character +.Cm l (ell) specifying that a following -.BR d , -.BR i , -.BR o , -.BR u , -.BR x , +.Cm d , +.Cm i , +.Cm o , +.Cm u , +.Cm x , +or +.Cm X +conversion applies to a pointer to a +.Em long int +or +.Em unsigned long int +argument, or that a following +.Cm n +conversion corresponds to a pointer to a +.Em long int +argument. +.It +The optional character +.Cm q , +specifying that a following +.Cm d , +.Cm i , +.Cm o , +.Cm u , +.Cm x , or -.B X +.Cm X conversion corresponds to a -.B "long int" +.Em quad int or -.B "unsigned long int" +.Em unsigned quad int argument, or that a following -.B n +.Cm n conversion corresponds to a pointer to a -.B "long int" +.Em quad int argument. -.TP -.B \(bu +.It The character -.B L +.Cm L specifying that a following -.BR e , -.BR E , -.BR f , -.BR g , +.Cm e , +.Cm E , +.Cm f , +.Cm g , or -.B G +.Cm G conversion corresponds to a -.B "long double" +.Em long double argument (but note that long double values are not currently supported -by the \s-2VAX\s0 and Tahoe compilers). -.TP -.B \(bu -A character which indicates the type of conversion to be applied. -.PP -A field width or precision may be an asterisk (``*'') instead of a +by the +.Tn VAX +and +.Tn Tahoe +compilers). +.It +A character that specifies the type of conversion to be applied. +.El +.Pp +A field width or precision, or both, may be indicated by +an asterisk +.Ql * +instead of a digit string. -In this case an -.B int -argument supplies the value. +In this case, an +.Em int +argument supplies the field width or precision. A negative field width is treated as a left adjustment flag followed by a positive field width; a negative precision is treated as though it were missing. -.PP -The conversion characters and their meanings are: -.TP -.B diouxX +.Pp +The conversion specifiers and their meanings are: +.Bl -tag -width "diouxX" +.It Cm diouxX The -.B int +.Em int (or appropriate variant) argument is converted to signed decimal -.RB ( d " and " i ), +.Pf ( Cm d +and +.Cm i ) , unsigned octal -.RB ( o ), +.Pq Cm o , unsigned decimal -.RB ( u ), +.Pq Cm u , or unsigned hexadecimal -.RB ( x " and " X ) -notation respectively. The letters -.B abcdef +.Pf ( Cm x +and +.Cm X ) +notation. The letters +.Cm abcdef are used for -.B x +.Cm x conversions; the letters -.B ABCDEF +.Cm ABCDEF are used for -.B X +.m X conversions. The precision, if any, gives the minimum number of digits that must appear; if the converted value requires fewer digits, it is padded on the left with zeros. -.TP -.B DOU +.It Cm DOU The -.B "long int" +.Em long int argument is converted to signed decimal, unsigned octal, or unsigned decimal, as if the format had been -.BR ld , -.BR lo , +.Cm ld , +.Cm lo , or -.B lu +.Cm lu respectively. These conversion characters are deprecated, and will eventually disappear. -.TP 8 -.B eE +.It Cm eE The -.B double +.Em double argument is rounded and converted in the style -`[\fB\-\fR]d\fB.\fRddd\fBe\fR\(+-dd' where there is one digit before the -decimal point and the number after is equal to the precision specification -for the argument. -If the precision is missing, 6 digits are given; if the precision is -explicitly zero, no decimal point appears. +.Sm off +.Pf [\-]d Cm \&. No ddd Cm e No \\*(Pmdd +.Sm on +where there is one digit before the +decimal-point character +and the number of digits after it is equal to the precision; +if the precision is missing, +it is taken as 6; if the precision is +zero, no decimal-point character appears. An -.B E +.Cm E conversion uses the letter -.B E +.Cm E (rather than -.BR e ) +.Cm e ) to introduce the exponent. The exponent always contains at least two digits; if the value is zero, the exponent is 00. -.TP 8 -.B f +.It Cm f The -.B double +.Em double argument is rounded and converted to decimal notation in the style -`[\fB\-\fR]ddd.ddd' where the number of digits after the decimal point -is equal to the precision. -If the precision is missing, 6 digits are given; if the precision is -explicitly 0, no digits and no decimal point are printed. +.Sm off +.Pf [-]ddd Cm \&. No ddd , +.Sm on +where the number of digits after the decimal-point character +is equal to the precision specification. +If the precision is missing, it is taken as 6; if the precision is +explicitly zero, no decimal-point character appears. If a decimal point appears, at least one digit appears before it. -.TP 8 -.B g +.It Cm g The -.B double -argument is printed in style -.B f +.Em double +argument is converted in style +.Cm f or -.B e +.Cm e (or -.B E +.Cm E for -.B G +.Cm G conversions). The precision specifies the number of significant digits. If the precision is missing, 6 digits are given; if the precision is zero, it is treated as 1. Style -.B e +.Cm e is used if the exponent from its conversion is less than -4 or greater than or equal to the precision. Trailing zeros are removed from the fractional part of the result; a decimal point appears only if it is followed by at least one digit. -.TP 8 -.B c +.It Cm c The -.B int +.Em int argument is converted to an -.B "unsigned char", -and the resulting character is printed. -.TP 8 -.B s +.Em unsigned char , +and the resulting character is written. +.It Cm s The -.B "char *" -argument is taken to be a string (character pointer). -Characters from the string are printed until a null character is reached, -or until the number of characters indicated by the precision have been -printed, whichever occurs first; if a precision is given, no null character -need be present. -.TP 8 -.B p +.Dq Em char * +argument is expected to be a pointer to an array of character type (pointer +to a string). +Characters from the array are written up to (but not including) +a terminating +.Dv NUL +character; +if a precision is specified, no more than the number specified are +written. +If a precision is given, no null character +need be present; if the precision is not specified, or is greater than +the size of the array, the array must contain a terminating +.Dv NUL +character. +.It Cm p The -.B "void *" -pointer argument is printed in hexadecimal (as if by ``%x'' or ``%lx''). -.TP 8 -.B n +.Dq Em void * +pointer argument is printed in hexadecimal (as if by +.Ql %#x +or +.Ql %#lx ) . +.It Cm n The number of characters written so far is stored into the integer indicated by the -.B "int *" +.Dq Em int * (or variant) pointer argument. No argument is converted. -.TP 8 -.B % -Prints a `%'; no argument is converted. -.PP +.It Cm % +A +.Ql % +is written. No argument is converted. The complete conversion specification +is +.Ql %% . +.El +.Pp In no case does a non-existent or small field width cause truncation of a field; if the result of a conversion is wider than the field width, the -field is expanded to contain it. -Similarly, padding takes place only if the specified field width exceeds -the actual width. -.PP -.SH EXAMPLES +field is expanded to contain the conversion result. +.Pp +.Sh EXAMPLES .br To print a date and time in the form `Sunday, July 3, 10:02', where -.I weekday +.Em weekday and -.I month -are pointers to null-terminated strings: -.RS -.HP -.nh -printf("%s, %s %d, %02d:%.2d", weekday, month, day, hour, min); -.RE -.hy -.PP -To print -.if n pi -.if t \(*p -to 5 decimals: -.IP -printf("pi = %.5f", 4*atan(1.0)); -.PP +.Em month +are pointers to strings: +.Bd -literal -offset indent +#include +fprintf(stdout, "%s, %s %d, %.2d:%.2d\en", + weekday, month, day, hour, min); +.Ed +.Pp +To print \*(Pi +to five decimal places: +.Bd -literal -offset indent +#include +#include +fprintf(stdout, "pi = %.5f\en", 4 * atan(1.0)); +.Ed +.Pp To allocate a 128 byte string and print into it: -.RS -.nf -.ta 1i 2i -.sp +.Bd -literal -offset indent #include -#include -char *newfmt(va_alist) - va_dcl +#include +#include +char *newfmt(const char *fmt, ...) { - char *p, *malloc(), fmt; - va_list ap; - if ((p = malloc(128)) == NULL) - return (NULL); - va_start(ap); - fmt = va_arg(ap, char *); - (void) vsprintf(p, fmt, ap); - va_end(ap); - return (p); + char *p; + va_list ap; + if ((p = malloc(128)) == NULL) + return (NULL); + va_start(ap, fmt); + (void) vsnprintf(p, 128, fmt, ap); + va_end(ap); + return (p); } -.RE -.fi -.SH "SEE ALSO" -putc(3), scanf(3) -.SH BUGS -The conversion formats ``%D'', ``%O'', and ``%U'' are not standard and +.Ed +.Sh SEE ALSO +.Xr printf 1 , +.Xr scanf 3 +.Sh STANDARDS +The +.Fn fprintf , +.Fn printf , +.Fn sprintf , +.Fn vprintf , +.Fn vfprintf , +and +.Fn vsprintf +functions +conform to +.St -ansiC . +.Sh HISTORY +The functions +.Fn snprintf +and +.Fn vsnprintf +are new to this release. +.Sh BUGS +The conversion formats +.Cm \&%D , +.Cm \&%O , +and +.Cm %U +are not standard and are provided only for backward compatibility. -The effect of padding the ``%p'' format with zeros (either by the ``0'' +The effect of padding the +.Cm %p +format with zeros (either by the +.Sq Cm 0 flag or by specifying a precision), and the benign effect (i.e., none) -of the ``#'' flag on ``%n'' and ``%p'' conversions, as well as other -nonsensical combinations such as ``%Ld'', are not standard; such combinations +of the +.Sq Cm # +flag on +.Cm %n +and +.Cm %p +conversions, as well as other +nonsensical combinations such as +.Cm %Ld , +are not standard; such combinations should be avoided. +.Pp +Because +.Fn sprintf +and +.Fn vsprintf +assume an infinitely long string, +callers must be careful not to overflow the actual space; +this is often impossible to assure. +For safety, programmers should use the +.Fn snprintf +interface instead. +Unfortunately, this interface is not portable.