mirror of
https://github.com/opnsense/src.git
synced 2026-06-04 22:32:43 -04:00
kvprintf(): Fix '+' conversion handling
For example, printf("%+i", 1) prints "+1". However, kvprintf() did
print just "1" for this example. According to PRINTF(3):
A sign must always be placed before a number produced by a signed
conversion.
For "%+r" radix conversions, keep the "+" handling as it is, since this
is a non-standard conversion. For "%+p" pointer conversions, continue
to ignore the sign modifier to be in line with libc.
This change allows to support the ' conversion modifier in the future.
Reviewed by: imp
Pull Request: https://github.com/freebsd/freebsd-src/pull/1310
This commit is contained in:
parent
f5a58c2da2
commit
07d90ee0a6
1 changed files with 13 additions and 14 deletions
|
|
@ -660,9 +660,9 @@ kvprintf(char const *fmt, void (*func)(int, void*), void *arg, int radix, va_lis
|
|||
char *d;
|
||||
const char *p, *percent, *q;
|
||||
u_char *up;
|
||||
int ch, n;
|
||||
int ch, n, sign;
|
||||
uintmax_t num;
|
||||
int base, lflag, qflag, tmp, width, ladjust, sharpflag, neg, sign, dot;
|
||||
int base, lflag, qflag, tmp, width, ladjust, sharpflag, dot;
|
||||
int cflag, hflag, jflag, tflag, zflag;
|
||||
int bconv, dwidth, upper;
|
||||
char padc;
|
||||
|
|
@ -690,7 +690,7 @@ kvprintf(char const *fmt, void (*func)(int, void*), void *arg, int radix, va_lis
|
|||
PCHAR(ch);
|
||||
}
|
||||
percent = fmt - 1;
|
||||
qflag = 0; lflag = 0; ladjust = 0; sharpflag = 0; neg = 0;
|
||||
qflag = 0; lflag = 0; ladjust = 0; sharpflag = 0;
|
||||
sign = 0; dot = 0; bconv = 0; dwidth = 0; upper = 0;
|
||||
cflag = 0; hflag = 0; jflag = 0; tflag = 0; zflag = 0;
|
||||
reswitch: switch (ch = (u_char)*fmt++) {
|
||||
|
|
@ -701,7 +701,7 @@ reswitch: switch (ch = (u_char)*fmt++) {
|
|||
sharpflag = 1;
|
||||
goto reswitch;
|
||||
case '+':
|
||||
sign = 1;
|
||||
sign = '+';
|
||||
goto reswitch;
|
||||
case '-':
|
||||
ladjust = 1;
|
||||
|
|
@ -771,7 +771,6 @@ reswitch: switch (ch = (u_char)*fmt++) {
|
|||
case 'd':
|
||||
case 'i':
|
||||
base = 10;
|
||||
sign = 1;
|
||||
goto handle_sign;
|
||||
case 'h':
|
||||
if (hflag) {
|
||||
|
|
@ -824,8 +823,10 @@ reswitch: switch (ch = (u_char)*fmt++) {
|
|||
goto reswitch;
|
||||
case 'r':
|
||||
base = radix;
|
||||
if (sign)
|
||||
if (sign) {
|
||||
sign = 0;
|
||||
goto handle_sign;
|
||||
}
|
||||
goto handle_nosign;
|
||||
case 's':
|
||||
p = va_arg(ap, char *);
|
||||
|
|
@ -862,13 +863,11 @@ reswitch: switch (ch = (u_char)*fmt++) {
|
|||
goto handle_nosign;
|
||||
case 'y':
|
||||
base = 16;
|
||||
sign = 1;
|
||||
goto handle_sign;
|
||||
case 'z':
|
||||
zflag = 1;
|
||||
goto reswitch;
|
||||
handle_nosign:
|
||||
sign = 0;
|
||||
if (jflag)
|
||||
num = va_arg(ap, uintmax_t);
|
||||
else if (qflag)
|
||||
|
|
@ -907,11 +906,11 @@ handle_sign:
|
|||
num = (signed char)va_arg(ap, int);
|
||||
else
|
||||
num = va_arg(ap, int);
|
||||
number:
|
||||
if (sign && (intmax_t)num < 0) {
|
||||
neg = 1;
|
||||
if ((intmax_t)num < 0) {
|
||||
sign = '-';
|
||||
num = -(intmax_t)num;
|
||||
}
|
||||
number:
|
||||
p = ksprintn(nbuf, num, base, &n, upper);
|
||||
tmp = 0;
|
||||
if (sharpflag && num != 0) {
|
||||
|
|
@ -920,7 +919,7 @@ number:
|
|||
else if (base == 16)
|
||||
tmp += 2;
|
||||
}
|
||||
if (neg)
|
||||
if (sign)
|
||||
tmp++;
|
||||
|
||||
if (!ladjust && padc == '0')
|
||||
|
|
@ -930,8 +929,8 @@ number:
|
|||
if (!ladjust)
|
||||
while (width-- > 0)
|
||||
PCHAR(' ');
|
||||
if (neg)
|
||||
PCHAR('-');
|
||||
if (sign)
|
||||
PCHAR(sign);
|
||||
if (sharpflag && num != 0) {
|
||||
if (base == 8) {
|
||||
PCHAR('0');
|
||||
|
|
|
|||
Loading…
Reference in a new issue