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
182 const char *(*vextra)();
186 #define __SLBF 0x0001
187 #define __SNBF 0x0002
192 #define __SEOF 0x0020
193 #define __SERR 0x0040
194 #define __SMBF 0x0080
195 #define __SAPP 0x0100
196 #define __SSTR 0x0200
197 #define __SOPT 0x0400
198 #define __SNPT 0x0800
199 #define __SOFF 0x1000
200 #define __SMOD 0x2000
206 #define BSD__sfeof(p) (((p)->_flags & __SEOF) != 0)
207 #define BSD__sferror(p) (((p)->_flags & __SERR) != 0)
208 #define BSD__sclearerr(p) ((void)((p)->_flags &= ~(__SERR|__SEOF)))
209 #define BSD__sfileno(p) ((p)->_file)
214 #define feof(p) BSD__sfeof(p)
215 #define ferror(p) BSD__sferror(p)
216 #define clearerr(p) BSD__sclearerr(p)
219 #define fileno(p) BSD__sfileno(p)
243 BSD__sfvwrite(
register FILE *fp,
register struct __suio *uio)
246 register const char *p;
247 register struct __siov *iov;
253 #define MIN(a, b) ((a) < (b) ? (a) : (b))
255 #define COPY(n) (void)memcpy((void *)fp->_p, (void *)p, (size_t)(n))
261 #define GETIOV(extra_work) \
265 len = iov->iov_len; \
321 BSD__sprint(
FILE *fp,
register struct __suio *uio)
352 #define to_digit(c) ((c) - '0')
353 #define is_digit(c) ((unsigned)to_digit(c) <= 9)
354 #define to_char(n) (char)((n) + '0')
356 #ifdef _HAVE_SANE_QUAD_
364 BSD__uqtoa(
register u_quad_t val,
char *endp,
int base,
int octzero,
const char *xdigs)
366 register char *cp = endp;
367 register quad_t sval;
401 if (octzero && *cp !=
'0')
407 *--cp = xdigs[val & 15];
429 BSD__ultoa(
register u_long val,
char *endp,
int base,
int octzero,
const char *xdigs)
431 register char *cp = endp;
466 if (octzero && *cp !=
'0')
472 *--cp = xdigs[val & 15];
486 #ifdef FLOATING_POINT
492 # if DBL_MAX_10_EXP > -DBL_MIN_10_EXP
493 # define MAXEXP (DBL_MAX_10_EXP)
495 # define MAXEXP (-DBL_MIN_10_EXP)
500 # define MAXFRACT (MAXEXP*10/3)
503 #define BUF (MAXEXP+MAXFRACT+1)
506 static char *cvt(
double,
int,
int,
char *,
int *,
int,
int *,
char *);
507 static int exponent(
char *,
int,
int);
515 #ifndef lower_hexdigits
516 # define lower_hexdigits "0123456789abcdef"
518 #ifndef upper_hexdigits
519 # define upper_hexdigits "0123456789ABCDEF"
526 #define HEXPREFIX 0x002
527 #define LADJUST 0x004
528 #define LONGDBL 0x008
529 #define LONGINT 0x010
531 #ifdef _HAVE_SANE_QUAD_
532 #define QUADINT 0x020
535 #define SHORTINT 0x040
536 #define ZEROPAD 0x080
540 BSD_vfprintf(
FILE *fp,
const char *fmt0,
va_list ap)
542 #ifdef PRI_EXTRA_MARK
545 register const char *
fmt;
548 register const char *cp;
549 register struct __siov *iovp;
555 #ifdef FLOATING_POINT
565 #ifdef _HAVE_SANE_QUAD_
573 const char *xdigs = 0;
579 char *
const ebuf =
buf +
sizeof(
buf);
580 #if SIZEOF_LONG > SIZEOF_INT
590 static const char blanks[
PADSIZE] =
591 {
' ',
' ',
' ',
' ',
' ',
' ',
' ',
' ',
' ',
' ',
' ',
' ',
' ',
' ',
' ',
' '};
592 static const char zeroes[
PADSIZE] =
593 {
'0',
'0',
'0',
'0',
'0',
'0',
'0',
'0',
'0',
'0',
'0',
'0',
'0',
'0',
'0',
'0'};
598 #define PRINT(ptr, len) { \
599 iovp->iov_base = (ptr); \
600 iovp->iov_len = (len); \
601 uio.uio_resid += (len); \
603 if (++uio.uio_iovcnt >= NIOV) { \
604 if (BSD__sprint(fp, &uio)) \
609 #define PAD(howmany, with) { \
610 if ((n = (howmany)) > 0) { \
611 while (n > PADSIZE) { \
612 PRINT((with), PADSIZE); \
618 #if SIZEOF_LONG > SIZEOF_INT
620 #define PAD_L(howmany, with) { \
622 if ((long)((int)ln) != ln) { \
626 if (ln > 0) PAD((int)ln, (with)); \
629 #define PAD_L(howmany, with) PAD((howmany), (with))
632 if (uio.uio_resid && BSD__sprint(fp, &uio)) \
634 uio.uio_iovcnt = 0; \
643 (flags&LONGINT ? va_arg(ap, long) : \
644 flags&SHORTINT ? (long)(short)va_arg(ap, int) : \
645 (long)va_arg(ap, int))
647 (flags&LONGINT ? va_arg(ap, u_long) : \
648 flags&SHORTINT ? (u_long)(u_short)va_arg(ap, int) : \
649 (u_long)va_arg(ap, u_int))
654 return (BSD__sbprintf(fp, fmt0, ap));
668 for (cp =
fmt; (ch = *
fmt) !=
'\0' && ch !=
'%';
fmt++)
670 if ((nc =
fmt - cp) != 0) {
685 reswitch:
switch (ch) {
705 if ((width =
va_arg(ap,
int)) >= 0)
716 if ((ch = *
fmt++) ==
'*') {
718 prec =
n < 0 ? -1 :
n;
726 prec =
n < 0 ? -1 :
n;
736 case '1':
case '2':
case '3':
case '4':
737 case '5':
case '6':
case '7':
case '8':
case '9':
745 #ifdef FLOATING_POINT
753 #if SIZEOF_PTRDIFF_T == SIZEOF_LONG
756 #if SIZEOF_SIZE_T == SIZEOF_LONG
760 #ifdef _HAVE_SANE_QUAD_
771 #ifdef _HAVE_SANE_QUAD_
772 #if SIZEOF_PTRDIFF_T == SIZEOF_LONG_LONG
775 #if SIZEOF_SIZE_T == SIZEOF_LONG_LONG
784 if (*
fmt ==
'3' && *(
fmt + 1) ==
'2') {
788 #ifdef _HAVE_SANE_QUAD_
789 else if (*
fmt ==
'6' && *(
fmt + 1) ==
'4') {
795 #if defined(_HAVE_SANE_QUAD_) && SIZEOF_SIZE_T == SIZEOF_LONG_LONG
809 #ifdef _HAVE_SANE_QUAD_
810 # define INTPTR_MASK (QUADINT|LONGINT|SHORTINT)
812 # define INTPTR_MASK (LONGINT|SHORTINT)
814 #if defined _HAVE_SANE_QUAD_ && SIZEOF_VOIDP == SIZEOF_LONG_LONG
815 # define INTPTR_FLAG QUADINT
816 #elif SIZEOF_VOIDP == SIZEOF_LONG
817 # define INTPTR_FLAG LONGINT
819 # define INTPTR_FLAG 0
821 #ifdef PRI_EXTRA_MARK
822 # define IS_PRI_EXTRA_MARK(s) \
823 (PRI_EXTRA_MARK_LEN < 1 || \
824 (*(s) == PRI_EXTRA_MARK[0] && \
825 (PRI_EXTRA_MARK_LEN == 1 || \
826 strncmp((s)+1, &PRI_EXTRA_MARK[1], \
827 PRI_EXTRA_MARK_LEN-1) == 0)))
829 # define PRI_EXTRA_MARK_LEN 0
830 # define IS_PRI_EXTRA_MARK(s) 1
836 #if defined _HAVE_SANE_QUAD_ && SIZEOF_VOIDP == SIZEOF_LONG_LONG
837 uqval =
va_arg(ap, u_quad_t);
838 cp = (*fp->
vextra)(fp,
sizeof(uqval), &uqval, &fieldsz, sign);
841 cp = (*fp->
vextra)(fp,
sizeof(ulval), &ulval, &fieldsz, sign);
845 if (prec < 0)
goto long_len;
846 size = fieldsz < prec ? (
int)fieldsz : prec;
855 #ifdef _HAVE_SANE_QUAD_
856 if (flags & QUADINT) {
857 uqval =
va_arg(ap, quad_t);
858 if ((quad_t)uqval < 0) {
859 uqval = -(quad_t)uqval;
866 if ((
long)ulval < 0) {
867 ulval = (
u_long)(-(
long)ulval);
873 #ifdef FLOATING_POINT
886 prec = (prec == -1) ?
887 DEFPREC + 1 : (fprec = prec + 1);
899 fp_begin: _double =
va_arg(ap,
double);
901 if (
isinf(_double)) {
908 if (
isnan(_double)) {
914 cp = cvt(_double, (prec < MAXFRACT ? prec : MAXFRACT), flags, &softsign,
915 &expt, ch, &ndig,
buf);
916 if (ch ==
'g' || ch ==
'G') {
917 if (expt <= -4 || (expt > prec && expt > 1))
918 ch = (ch ==
'g') ?
'e' :
'E';
922 if (ch ==
'a' || ch ==
'A') {
925 expsize = exponent(expstr, expt, ch +
'p' -
'a');
927 size = expsize + ndig;
928 if (ndig > 1 || flags &
ALT)
931 else if (ch <=
'e') {
933 expsize = exponent(expstr, expt, ch);
934 size = expsize + ndig;
935 if (ndig > 1 || flags &
ALT)
937 }
else if (ch ==
'f') {
940 if (prec || flags &
ALT)
948 }
else if (expt >= ndig) {
953 size = ndig + (expt > 0 ?
961 #ifdef _HAVE_SANE_QUAD_
963 *
va_arg(ap, quad_t *) = ret;
968 *
va_arg(ap,
long *) = ret;
978 #ifdef _HAVE_SANE_QUAD_
980 uqval =
va_arg(ap, u_quad_t);
996 uqval = (u_quad_t)
va_arg(ap,
void *);
1000 #ifdef _HAVE_SANE_QUAD_
1019 const char *p = (
char *)
memchr(cp, 0, prec);
1021 if (p !=
NULL && (p - cp) < prec)
1022 size = (
int)(p - cp);
1036 #ifdef _HAVE_SANE_QUAD_
1037 if (flags & QUADINT)
1038 uqval =
va_arg(ap, u_quad_t);
1050 #ifdef _HAVE_SANE_QUAD_
1051 if (flags & QUADINT)
1052 uqval =
va_arg(ap, u_quad_t);
1059 #ifdef _HAVE_SANE_QUAD_
1060 (flags & QUADINT ? uqval != 0 : ulval != 0)
1068 nosign: sign =
'\0';
1074 number:
if ((dprec = prec) >= 0)
1083 #ifdef _HAVE_SANE_QUAD_
1084 if (flags & QUADINT) {
1085 if (uqval != 0 || prec != 0)
1086 cp = BSD__uqtoa(uqval, ebuf, base,
1087 flags &
ALT, xdigs);
1092 if (ulval != 0 || prec != 0)
1093 cp = BSD__ultoa(ulval, ebuf, base,
1094 flags &
ALT, xdigs);
1125 realsz = dprec > fieldsz ? dprec : fieldsz;
1133 PAD_L(width - realsz, blanks);
1147 PAD_L(width - realsz, zeroes);
1150 PAD_L(dprec - fieldsz, zeroes);
1153 #ifdef FLOATING_POINT
1154 if ((flags &
FPT) == 0) {
1158 if (ndig > 1 || flags &
ALT) {
1162 if (ndig > 0)
PRINT(cp, ndig-1);
1165 PAD(fprec-ndig, zeroes);
1166 PRINT(expstr, expsize);
1168 else if (ch >=
'f') {
1172 (flags &
ALT) == 0) {
1176 PAD((ndig >= fprec ? ndig - 1 : fprec - (ch !=
'f')),
1179 }
else if (expt == 0 && ndig == 0 && (flags &
ALT) == 0) {
1181 }
else if (expt <= 0) {
1186 PAD(fprec - ndig + (ch ==
'f' ? expt : 0), zeroes);
1187 }
else if (expt >= ndig) {
1189 PAD(expt - ndig, zeroes);
1196 PRINT(cp, ndig-expt);
1198 PAD(fprec - ndig + (ch ==
'f' ? expt : 0), zeroes);
1201 if (ndig > 1 || flags &
ALT) {
1209 PAD(ndig - 1, zeroes);
1210 if (flags &
ALT)
PAD(fprec - ndig - 1, zeroes);
1213 PRINT(expstr, expsize);
1221 PAD_L(width - realsz, blanks);
1224 ret += width > realsz ? width : realsz;
1235 #ifdef FLOATING_POINT
1237 extern char *
BSD__dtoa(
double,
int,
int,
int *,
int *,
char **);
1238 extern char *
BSD__hdtoa(
double,
const char *,
int,
int *,
int *,
char **);
1241 cvt(
double value,
int ndigits,
int flags,
char *sign,
int *decpt,
int ch,
int *length,
char *
buf)
1244 char *digits, *
bp, *rve;
1254 }
else if (value == 0.0 &&
signbit(value)) {
1259 if (ch ==
'a' || ch ==
'A') {
1262 ndigits, decpt, &dsgn, &rve);
1265 digits =
BSD__dtoa(value, mode, ndigits, decpt, &dsgn, &rve);
1270 rve =
buf + (rve - digits);
1273 bp = digits + ndigits;
1275 if (*digits ==
'0' && value)
1276 *decpt = -ndigits + 1;
1282 *length = (
int)(rve - digits);
1287 exponent(
char *p0,
int exp,
int fmtch)
1289 register char *p, *t;
1290 char expbuf[2 + (MAXEXP < 1000 ? 3 : MAXEXP < 10000 ? 4 : 5)];
1300 t = expbuf +
sizeof(expbuf);
1304 }
while ((
exp /= 10) > 9);
1306 for (; t < expbuf +
sizeof(expbuf); *p++ = *t++);
1309 if (fmtch & 15) *p++ =
'0';
1312 return (
int)(p - p0);