SCCS-vsn: lib/libc/stdio/vfprintf.c 5.7
*/
#if defined(LIBC_SCCS) && !defined(lint)
*/
#if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)vfprintf.c 5.6 (Berkeley) %G%";
+static char sccsid[] = "@(#)vfprintf.c 5.7 (Berkeley) %G%";
#endif /* LIBC_SCCS and not lint */
#include <sys/param.h>
#endif /* LIBC_SCCS and not lint */
#include <sys/param.h>
char argsize, printsign, *_cvt(), buf[MAXBUF];
int alternate, cnt, n, ladjust, width, prec, size;
char argsize, printsign, *_cvt(), buf[MAXBUF];
int alternate, cnt, n, ladjust, width, prec, size;
+ digs = "0123456789abcdef";
for (cnt = 0; *fmt; ++fmt) {
if (*fmt != '%') {
PUTC(*fmt, fp);
for (cnt = 0; *fmt; ++fmt) {
if (*fmt != '%') {
PUTC(*fmt, fp);
case '#':
alternate = 1;
goto flags;
case '#':
alternate = 1;
goto flags;
- case '%': /* "%#%" prints as "%" */
- PUTC('%', fp);
- continue;
case '*':
/*
* ``A negative field width argument is taken as a
case '*':
/*
* ``A negative field width argument is taken as a
case 'l':
argsize |= LONGINT;
goto flags;
case 'l':
argsize |= LONGINT;
goto flags;
- }
-
- digs = "0123456789abcdef";
+ case '%': /* "%#%" prints as "%" */
+ PUTC('%', fp);
+ break;
+ case 'c': {
+ char ch;
- switch (*fmt) {
- case 'c':
- PUTC(va_arg(argp, int), fp);
+ ch = va_arg(argp, int);
+ PUTC(ch, fp);
case 'd':
case 'i':
GETARG(reg_long);
case 'd':
case 'i':
GETARG(reg_long);
case 'e':
_double = va_arg(argp, double);
bp = _cvt(_double, prec, buf, EFORMAT, *fmt,
case 'e':
_double = va_arg(argp, double);
bp = _cvt(_double, prec, buf, EFORMAT, *fmt,
goto pbuf;
case 'f':
_double = va_arg(argp, double);
bp = _cvt(_double, prec, buf, FFORMAT, 'f',
goto pbuf;
case 'f':
_double = va_arg(argp, double);
bp = _cvt(_double, prec, buf, FFORMAT, 'f',
+ printsign, alternate);
+ goto pbuf;
+ case 'G':
+ case 'g':
+ _double = va_arg(argp, double);
+ bp = _cvt(_double, prec, buf, GFORMAT, *fmt - 2,
+ printsign, alternate);
pbuf: size = bp - buf;
if (size < width && !ladjust)
do {
pbuf: size = bp - buf;
if (size < width && !ladjust)
do {
for (; width > size; --width)
PUTC(padc, fp);
break;
for (; width > size; --width)
PUTC(padc, fp);
break;
- case 'G':
- case 'g':
- _double = va_arg(argp, double);
- bp = _cvt(_double, prec, buf, GFORMAT, *fmt - 2,
- printsign);
- goto pbuf;
case 'n':
*(va_arg(argp, int *)) = cnt;
break;
case 'n':
*(va_arg(argp, int *)) = cnt;
break;
PUTC(*bp, fp);
for (; width > size; --width)
PUTC(padc, fp);
PUTC(*bp, fp);
for (; width > size; --width)
PUTC(padc, fp);
+ digs = "0123456789abcdef";
break;
case '\0': /* "%?" prints ?, unless ? is NULL */
return(ferror(fp) ? -1 : cnt);
break;
case '\0': /* "%?" prints ?, unless ? is NULL */
return(ferror(fp) ? -1 : cnt);
-_cvt(number, prec, bp, format, fmtch, printsign)
+_cvt(number, prec, bp, format, fmtch, printsign, alternate)
+ int prec, format, alternate;
register char *bp;
char fmtch, printsign;
{
register char *bp;
char fmtch, printsign;
{
while(prec--)
*bp++ = *t ? *t++ : '0';
}
while(prec--)
*bp++ = *t ? *t++ : '0';
}
+ else if (alternate)
+ *bp++ = '.';
if (*t && *t > '4')
++bp[-1];
if (*t && *t > '4')
++bp[-1];
+ if (format == GFORMAT && !alternate) {
for (; bp[-1] == '0'; --bp);
for (; bp[-1] == '0'; --bp);
else while (decpt++ < 0)
*bp++ = '0';
}
else while (decpt++ < 0)
*bp++ = '0';
}
+ else if (alternate)
+ *bp++ = '.';
}
else {
for (n = 1; n <= decpt; n++)
*bp++ = *t++;
}
else {
for (n = 1; n <= decpt; n++)
*bp++ = *t++;
*bp++ = '.';
}
for (n = 1; n <= prec; n++)
*bp++ = *t ? *t++ : '0';
*bp++ = '.';
}
for (n = 1; n <= prec; n++)
*bp++ = *t ? *t++ : '0';
- if (format == GFORMAT) {
+ if (format == GFORMAT && !alternate) {
for (; bp[-1] == '0'; --bp);
if (bp[-1] == '.')
--bp;
for (; bp[-1] == '0'; --bp);
if (bp[-1] == '.')
--bp;