Bug #3248 » 0005-printf-1-sync-with-FreeBSD.patch
usr.bin/printf/printf.1 | ||
---|---|---|
.\" @(#)printf.1 8.1 (Berkeley) 6/6/93
|
||
.\" $FreeBSD: head/usr.bin/printf/printf.1 264743 2014-04-21 22:47:18Z pfg $
|
||
.\"
|
||
.Dd January 11, 2016
|
||
.Dd July 1, 2020
|
||
.Dt PRINTF 1
|
||
.Os
|
||
.Sh NAME
|
||
... | ... | |
Write a <bell> character.
|
||
.It Cm \eb
|
||
Write a <backspace> character.
|
||
.It Cm \ec
|
||
Ignore remaining characters in this string.
|
||
.It Cm \ef
|
||
Write a <form-feed> character.
|
||
.It Cm \en
|
||
... | ... | |
octal escapes are
|
||
.Cm \e0 Ns Ar num
|
||
instead of
|
||
.Cm \e Ns Ar num .
|
||
.Cm \e Ns Ar num
|
||
and that an additional escape sequence
|
||
.Cm \ec
|
||
stops further output from this
|
||
.Nm
|
||
invocation.
|
||
.It Cm n$
|
||
Allows reordering of the output according to
|
||
.Ar argument .
|
||
... | ... | |
manual page.
|
||
.Sh EXIT STATUS
|
||
.Ex -std
|
||
.Sh EXAMPLES
|
||
Print the string
|
||
.Qq hello :
|
||
.Bd -literal -offset indent
|
||
$ printf "%s\en" hello
|
||
hello
|
||
.Ed
|
||
.Pp
|
||
Same as above, but notice that the format string is not quoted and hence we
|
||
do not get the expected behavior:
|
||
.Bd -literal -offset indent
|
||
$ printf %s\en hello
|
||
hellon$
|
||
.Ed
|
||
.Pp
|
||
Print arguments forcing sign only for the first argument:
|
||
.Bd -literal -offset indent
|
||
$ printf "%+d\en%d\en%d\en" 1 -2 13
|
||
+1
|
||
-2
|
||
13
|
||
.Ed
|
||
.Pp
|
||
Same as above, but the single format string will be applied to the three
|
||
arguments:
|
||
.Bd -literal -offset indent
|
||
$ printf "%+d\en" 1 -2 13
|
||
+1
|
||
-2
|
||
+13
|
||
.Ed
|
||
.Pp
|
||
Print number using only two digits after the decimal point:
|
||
.Bd -literal -offset indent
|
||
$ printf "%.2f\en" 31.7456
|
||
31.75
|
||
.Ed
|
||
.Sh COMPATIBILITY
|
||
The traditional
|
||
.Bx
|
||
behavior of converting arguments of numeric formats not beginning
|
||
with a digit to the
|
||
.Tn ASCII
|
||
with a digit to the ASCII
|
||
code of the first character is not supported.
|
||
.Sh SEE ALSO
|
||
.Xr builtin 1 ,
|
||
... | ... | |
after the standard library function,
|
||
.Xr printf 3 .
|
||
.Sh CAVEATS
|
||
.Tn ANSI
|
||
hexadecimal character constants were deliberately not provided.
|
||
ANSI hexadecimal character constants were deliberately not provided.
|
||
.Pp
|
||
If the locale contains multibyte characters
|
||
(such as UTF-8),
|
||
... | ... | |
formats with a precision
|
||
may not operate as expected.
|
||
.Sh BUGS
|
||
Since the floating point numbers are translated from
|
||
.Tn ASCII
|
||
to floating-point and
|
||
then back again, floating-point precision may be lost.
|
||
Since the floating point numbers are translated from ASCII
|
||
to floating-point and then back again, floating-point precision may be lost.
|
||
(By default, the number is translated to an IEEE-754 double-precision
|
||
value before being printed.
|
||
The
|
usr.bin/printf/printf.c | ||
---|---|---|
/*-
|
||
* Copyright 2018 Staysail Systems, Inc. <info@staysail.tech>
|
||
* Copyright 2014 Garrett D'Amore <garrett@damore.org>
|
||
* Copyright 2010 Nexenta Systems, Inc. All rights reserved.
|
||
* Copyright (c) 1989, 1993
|
||
... | ... | |
#ifdef SHELL
|
||
#define main printfcmd
|
||
#include "bltin/bltin.h"
|
||
#include "error.h"
|
||
#include "options.h"
|
||
#endif
|
||
#define PF(f, func) do { \
|
||
char *b = NULL; \
|
||
if (havewidth) \
|
||
if (haveprec) \
|
||
asprintf(&b, f, fieldwidth, precision, func); \
|
||
printf(f, fieldwidth, precision, func); \
|
||
else \
|
||
asprintf(&b, f, fieldwidth, func); \
|
||
printf(f, fieldwidth, func); \
|
||
else if (haveprec) \
|
||
asprintf(&b, f, precision, func); \
|
||
printf(f, precision, func); \
|
||
else \
|
||
asprintf(&b, f, func); \
|
||
if (b) { \
|
||
fputs(b, stdout); \
|
||
free(b); \
|
||
} \
|
||
printf(f, func); \
|
||
} while (0)
|
||
static int asciicode(void);
|
||
... | ... | |
char *p;
|
||
int getout;
|
||
p = strdup(getstr());
|
||
if (p == NULL) {
|
||
/* Convert "b" to "s" for output. */
|
||
start[strlen(start) - 1] = 's';
|
||
if ((p = strdup(getstr())) == NULL) {
|
||
warnx("%s", strerror(ENOMEM));
|
||
return (NULL);
|
||
}
|
||
getout = escape(p, 0, &len);
|
||
fputs(p, stdout);
|
||
PF(start, p);
|
||
/* Restore format for next loop. */
|
||
free(p);
|
||
if (getout)
|
||
return (end_fmt);
|
||
... | ... | |
char p;
|
||
p = getchr();
|
||
PF(start, p);
|
||
if (p != '\0')
|
||
PF(start, p);
|
||
break;
|
||
}
|
||
case 's': {
|