63 #include <sys/types.h>
64 #define u_long unsigned long
65 #define u_short unsigned short
66 #define u_int unsigned int
68 #if !defined(HAVE_STDARG_PROTOTYPES)
70 #define HAVE_STDARG_PROTOTYPES 1
75 #if defined(HAVE_STDARG_PROTOTYPES)
88 #define _BSD_VA_LIST_ va_list
99 # define LONG_MAX 2147483647
104 #if defined(__hpux) && !defined(__GNUC__) && !defined(__STDC__)
114 #if defined(__hpux) && !defined(__GNUC__) || defined(__DECC)
118 #if !defined(__CYGWIN32__) && defined(__hpux) && !defined(__GNUC__)
126 #if SIZEOF_LONG > SIZEOF_INT
131 #define UNINITIALIZED_VAR(x) x = x
133 #define UNINITIALIZED_VAR(x) x
189 #define __SLBF 0x0001
190 #define __SNBF 0x0002
195 #define __SEOF 0x0020
196 #define __SERR 0x0040
197 #define __SMBF 0x0080
198 #define __SAPP 0x0100
199 #define __SSTR 0x0200
200 #define __SOPT 0x0400
201 #define __SNPT 0x0800
202 #define __SOFF 0x1000
203 #define __SMOD 0x2000
209 #define __sfeof(p) (((p)->_flags & __SEOF) != 0)
210 #define __sferror(p) (((p)->_flags & __SERR) != 0)
211 #define __sclearerr(p) ((void)((p)->_flags &= ~(__SERR|__SEOF)))
212 #define __sfileno(p) ((p)->_file)
217 #define feof(p) __sfeof(p)
218 #define ferror(p) __sferror(p)
219 #define clearerr(p) __sclearerr(p)
222 #define fileno(p) __sfileno(p)
247 register struct
__suio *uio;
250 register const char *
p;
251 register struct __siov *iov;
254 if ((len = uio->uio_resid) == 0)
257 #define MIN(a, b) ((a) < (b) ? (a) : (b))
259 #define COPY(n) (void)memcpy((void *)fp->_p, (void *)p, (size_t)(n))
265 #define GETIOV(extra_work) \
269 len = iov->iov_len; \
272 if (fp->_flags &
__SNBF) {
276 }
else if ((fp->_flags &
__SLBF) == 0) {
291 if (fp->_flags &
__SSTR) {
305 }
while ((uio->uio_resid -= w) != 0);
333 err = (*fp->
vwrite)(fp, uio);
356 #define to_digit(c) ((c) - '0')
357 #define is_digit(c) ((unsigned)to_digit(c) <= 9)
358 #define to_char(n) (char)((n) + '0')
360 #ifdef _HAVE_SANE_QUAD_
368 BSD__uqtoa(
register u_quad_t val,
char *endp,
int base,
int octzero,
const char *xdigs)
370 register char *cp = endp;
371 register quad_t sval;
389 if (val > LLONG_MAX) {
405 if (octzero && *cp !=
'0')
411 *--cp = xdigs[val & 15];
435 register char *cp = endp;
470 if (octzero && *cp !=
'0')
476 *--cp = xdigs[val & 15];
490 #ifdef FLOATING_POINT
502 #define BUF (MAXEXP+MAXFRACT+1)
505 static char *cvt
__P((
double,
int,
int,
char *,
int *,
int,
int *,
char *));
506 static int exponent
__P((
char *,
int,
int));
519 #define HEXPREFIX 0x002
520 #define LADJUST 0x004
521 #define LONGDBL 0x008
522 #define LONGINT 0x010
524 #ifdef _HAVE_SANE_QUAD_
525 #define QUADINT 0x020
528 #define SHORTINT 0x040
529 #define ZEROPAD 0x080
534 register const char *fmt;
537 register const char *cp;
538 register struct __siov *iovp;
544 #ifdef FLOATING_POINT
553 #ifdef _HAVE_SANE_QUAD_
561 const char *xdigs = 0;
567 char *
const ebuf = buf +
sizeof(
buf);
568 #if SIZEOF_LONG > SIZEOF_INT
578 static const char blanks[
PADSIZE] =
579 {
' ',
' ',
' ',
' ',
' ',
' ',
' ',
' ',
' ',
' ',
' ',
' ',
' ',
' ',
' ',
' '};
580 static const char zeroes[
PADSIZE] =
581 {
'0',
'0',
'0',
'0',
'0',
'0',
'0',
'0',
'0',
'0',
'0',
'0',
'0',
'0',
'0',
'0'};
586 #define PRINT(ptr, len) { \
587 iovp->iov_base = (ptr); \
588 iovp->iov_len = (len); \
589 uio.uio_resid += (len); \
591 if (++uio.uio_iovcnt >= NIOV) { \
592 if (BSD__sprint(fp, &uio)) \
597 #define PAD(howmany, with) { \
598 if ((n = (howmany)) > 0) { \
599 while (n > PADSIZE) { \
600 PRINT((with), PADSIZE); \
606 #if SIZEOF_LONG > SIZEOF_INT
608 #define PAD_L(howmany, with) { \
610 if ((long)((int)ln) != ln) { \
614 if (ln > 0) PAD((int)ln, (with)); \
617 #define PAD_L(howmany, with) PAD((howmany), (with))
620 if (uio.uio_resid && BSD__sprint(fp, &uio)) \
622 uio.uio_iovcnt = 0; \
631 (flags&LONGINT ? va_arg(ap, long) : \
632 flags&SHORTINT ? (long)(short)va_arg(ap, int) : \
633 (long)va_arg(ap, int))
635 (flags&LONGINT ? va_arg(ap, u_long) : \
636 flags&SHORTINT ? (u_long)(u_short)va_arg(ap, int) : \
637 (u_long)va_arg(ap, u_int))
656 for (cp = fmt; (ch = *fmt) !=
'\0' && ch !=
'%'; fmt++)
658 if ((nc = fmt - cp) != 0) {
673 reswitch:
switch (ch) {
693 if ((width = va_arg(ap,
int)) >= 0)
704 if ((ch = *fmt++) ==
'*') {
706 prec = n < 0 ? -1 : n;
714 prec = n < 0 ? -1 : n;
724 case '1':
case '2':
case '3':
case '4':
725 case '5':
case '6':
case '7':
case '8':
case '9':
733 #ifdef FLOATING_POINT
741 #if SIZEOF_PTRDIFF_T == SIZEOF_LONG
744 #if SIZEOF_SIZE_T == SIZEOF_LONG
750 #ifdef _HAVE_SANE_QUAD_
751 #if SIZEOF_PTRDIFF_T == SIZEOF_LONG_LONG
754 #if SIZEOF_SIZE_T == SIZEOF_LONG_LONG
763 if (*fmt ==
'3' && *(fmt + 1) ==
'2') {
767 #ifdef _HAVE_SANE_QUAD_
768 else if (*fmt ==
'6' && *(fmt + 1) ==
'4') {
774 #if defined(_HAVE_SANE_QUAD_) && SIZEOF_SIZE_T == SIZEOF_LONG_LONG
783 *buf = (char)va_arg(ap,
int);
792 #ifdef _HAVE_SANE_QUAD_
793 if (flags & QUADINT) {
794 uqval = va_arg(ap, quad_t);
795 if ((quad_t)uqval < 0) {
796 uqval = -(quad_t)uqval;
803 if ((
long)ulval < 0) {
804 ulval = (
u_long)(-(
long)ulval);
810 #ifdef FLOATING_POINT
822 prec = (prec == -1) ?
823 DEFPREC + 1 : prec + 1;
833 fp_begin: _double = va_arg(ap,
double);
835 if (
isinf(_double)) {
842 if (
isnan(_double)) {
848 cp = cvt(_double, prec, flags, &softsign,
849 &expt, ch, &ndig, buf);
850 if (ch ==
'g' || ch ==
'G') {
851 if (expt <= -4 || (expt > prec && expt > 1))
852 ch = (ch ==
'g') ?
'e' :
'E';
856 if (ch ==
'a' || ch ==
'A') {
859 expsize = exponent(expstr, expt, ch +
'p' -
'a');
861 size = expsize + ndig;
862 if (ndig > 1 || flags &
ALT)
865 else if (ch <=
'e') {
867 expsize = exponent(expstr, expt, ch);
868 size = expsize + ndig;
869 if (ndig > 1 || flags &
ALT)
871 }
else if (ch ==
'f') {
874 if (prec || flags &
ALT)
882 }
else if (expt >= ndig) {
887 size = ndig + (expt > 0 ?
895 #ifdef _HAVE_SANE_QUAD_
897 *va_arg(ap, quad_t *) = ret;
902 *va_arg(ap,
long *) = ret;
904 *va_arg(ap,
short *) = (short)ret;
906 *va_arg(ap,
int *) = (int)ret;
912 #ifdef _HAVE_SANE_QUAD_
914 uqval = va_arg(ap, u_quad_t);
928 prec = (int)(
sizeof(
void*)*
CHAR_BIT/4);
930 uqval = (u_quad_t)va_arg(ap,
void *);
933 ulval = (
u_long)va_arg(ap,
void *);
934 #ifdef _HAVE_SANE_QUAD_
941 xdigs =
"0123456789abcdef";
945 if ((cp = va_arg(ap,
char *)) ==
NULL)
953 const char *
p = (
char *)memchr(cp, 0, prec);
955 if (p !=
NULL && (p - cp) > prec)
956 size = (
int)(p - cp);
970 #ifdef _HAVE_SANE_QUAD_
972 uqval = va_arg(ap, u_quad_t);
979 xdigs =
"0123456789ABCDEF";
982 xdigs =
"0123456789abcdef";
984 #ifdef _HAVE_SANE_QUAD_
986 uqval = va_arg(ap, u_quad_t);
993 #ifdef _HAVE_SANE_QUAD_
994 (flags & QUADINT ? uqval != 0 : ulval != 0)
1002 nosign: sign =
'\0';
1008 number:
if ((dprec = prec) >= 0)
1016 #ifdef _HAVE_SANE_QUAD_
1017 if (flags & QUADINT) {
1018 if (uqval != 0 || prec != 0)
1019 cp = BSD__uqtoa(uqval, ebuf, base,
1020 flags &
ALT, xdigs);
1025 if (ulval != 0 || prec != 0)
1027 flags &
ALT, xdigs);
1029 size = (int)(ebuf - cp);
1062 realsz = dprec > fieldsz ? dprec : fieldsz;
1066 PAD_L(width - realsz, blanks);
1072 if (flags & HEXPREFIX) {
1080 PAD_L(width - realsz, zeroes);
1083 PAD_L(dprec - fieldsz, zeroes);
1086 if (flags & HEXPREFIX)
1090 #ifdef FLOATING_POINT
1091 if ((flags &
FPT) == 0) {
1094 if (flags & HEXPREFIX) {
1095 if (ndig > 1 || flags &
ALT) {
1099 if (ndig > 0)
PRINT(cp, ndig-1);
1102 PRINT(expstr, expsize);
1104 else if (ch >=
'f') {
1108 (flags &
ALT) == 0) {
1112 PAD(ndig - 1, zeroes);
1114 }
else if (expt == 0 && ndig == 0 && (flags &
ALT) == 0) {
1116 }
else if (expt <= 0) {
1120 }
else if (expt >= ndig) {
1122 PAD(expt - ndig, zeroes);
1129 PRINT(cp, ndig-expt);
1132 if (ndig > 1 || flags &
ALT) {
1140 PAD(ndig - 1, zeroes);
1143 PRINT(expstr, expsize);
1151 PAD_L(width - realsz, blanks);
1154 ret += width > realsz ? width : realsz;
1165 #ifdef FLOATING_POINT
1167 extern char *
BSD__dtoa __P((
double,
int,
int,
int *,
int *,
char **));
1168 extern char *
BSD__hdtoa(
double,
const char *,
int,
int *,
int *,
char **);
1171 cvt(value, ndigits, flags, sign, decpt, ch, length,
buf)
1173 int ndigits, flags, *decpt, ch, *length;
1177 char *digits, *
bp, *rve;
1187 }
else if (value == 0.0 && 1.0/value < 0) {
1192 if (ch ==
'a' || ch ==
'A') {
1194 ch ==
'a' ?
"0123456789abcdef" :
"0123456789ABCDEF",
1195 ndigits, decpt, &dsgn, &rve);
1198 digits =
BSD__dtoa(value, mode, ndigits, decpt, &dsgn, &rve);
1201 memcpy(buf, digits, rve - digits);
1203 rve = buf + (rve - digits);
1206 bp = digits + ndigits;
1208 if (*digits ==
'0' && value)
1209 *decpt = -ndigits + 1;
1215 *length = (int)(rve - digits);
1220 exponent(p0, exp, fmtch)
1224 register char *
p, *t;
1225 char expbuf[MAXEXP];
1235 t = expbuf + MAXEXP;
1239 }
while ((exp /= 10) > 9);
1241 for (; t < expbuf + MAXEXP; *p++ = *t++);
1244 if (fmtch & 15) *p++ =
'0';
1247 return (
int)(p - p0);