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;
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) {
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 496 # if DBL_MAX_10_EXP > -DBL_MIN_10_EXP 497 # define MAXEXP (DBL_MAX_10_EXP) 499 # define MAXEXP (-DBL_MIN_10_EXP) 504 # define MAXFRACT (MAXEXP*10/3) 507 #define BUF (MAXEXP+MAXFRACT+1) 510 static char *cvt
__P((
double,
int,
int,
char *,
int *,
int,
int *,
char *));
511 static int exponent
__P((
char *,
int,
int));
524 #define HEXPREFIX 0x002 525 #define LADJUST 0x004 526 #define LONGDBL 0x008 527 #define LONGINT 0x010 529 #ifdef _HAVE_SANE_QUAD_ 530 #define QUADINT 0x020 533 #define SHORTINT 0x040 534 #define ZEROPAD 0x080 539 register const char *fmt;
542 register const char *cp;
543 register struct __siov *iovp;
549 #ifdef FLOATING_POINT 559 #ifdef _HAVE_SANE_QUAD_ 567 const char *xdigs = 0;
573 char *
const ebuf =
buf +
sizeof(
buf);
574 #if SIZEOF_LONG > SIZEOF_INT 584 static const char blanks[
PADSIZE] =
585 {
' ',
' ',
' ',
' ',
' ',
' ',
' ',
' ',
' ',
' ',
' ',
' ',
' ',
' ',
' ',
' '};
586 static const char zeroes[
PADSIZE] =
587 {
'0',
'0',
'0',
'0',
'0',
'0',
'0',
'0',
'0',
'0',
'0',
'0',
'0',
'0',
'0',
'0'};
592 #define PRINT(ptr, len) { \ 593 iovp->iov_base = (ptr); \ 594 iovp->iov_len = (len); \ 595 uio.uio_resid += (len); \ 597 if (++uio.uio_iovcnt >= NIOV) { \ 598 if (BSD__sprint(fp, &uio)) \ 603 #define PAD(howmany, with) { \ 604 if ((n = (howmany)) > 0) { \ 605 while (n > PADSIZE) { \ 606 PRINT((with), PADSIZE); \ 612 #if SIZEOF_LONG > SIZEOF_INT 614 #define PAD_L(howmany, with) { \ 616 if ((long)((int)ln) != ln) { \ 620 if (ln > 0) PAD((int)ln, (with)); \ 623 #define PAD_L(howmany, with) PAD((howmany), (with)) 626 if (uio.uio_resid && BSD__sprint(fp, &uio)) \ 628 uio.uio_iovcnt = 0; \ 637 (flags&LONGINT ? va_arg(ap, long) : \ 638 flags&SHORTINT ? (long)(short)va_arg(ap, int) : \ 639 (long)va_arg(ap, int)) 641 (flags&LONGINT ? va_arg(ap, u_long) : \ 642 flags&SHORTINT ? (u_long)(u_short)va_arg(ap, int) : \ 643 (u_long)va_arg(ap, u_int)) 662 for (cp = fmt; (ch = *fmt) !=
'\0' && ch !=
'%'; fmt++)
664 if ((nc = fmt - cp) != 0) {
679 reswitch:
switch (ch) {
699 if ((width = va_arg(ap,
int)) >= 0)
710 if ((ch = *fmt++) ==
'*') {
712 prec = n < 0 ? -1 : n;
720 prec = n < 0 ? -1 : n;
730 case '1':
case '2':
case '3':
case '4':
731 case '5':
case '6':
case '7':
case '8':
case '9':
739 #ifdef FLOATING_POINT 747 #if SIZEOF_PTRDIFF_T == SIZEOF_LONG 750 #if SIZEOF_SIZE_T == SIZEOF_LONG 756 #ifdef _HAVE_SANE_QUAD_ 757 #if SIZEOF_PTRDIFF_T == SIZEOF_LONG_LONG 760 #if SIZEOF_SIZE_T == SIZEOF_LONG_LONG 769 if (*fmt ==
'3' && *(fmt + 1) ==
'2') {
773 #ifdef _HAVE_SANE_QUAD_ 774 else if (*fmt ==
'6' && *(fmt + 1) ==
'4') {
780 #if defined(_HAVE_SANE_QUAD_) && SIZEOF_SIZE_T == SIZEOF_LONG_LONG 789 *
buf = (char)va_arg(ap,
int);
798 #ifdef _HAVE_SANE_QUAD_ 799 if (flags & QUADINT) {
800 uqval = va_arg(ap, quad_t);
801 if ((quad_t)uqval < 0) {
802 uqval = -(quad_t)uqval;
809 if ((
long)ulval < 0) {
810 ulval = (
u_long)(-(
long)ulval);
816 #ifdef FLOATING_POINT 829 prec = (prec == -1) ?
830 DEFPREC + 1 : (fprec = prec + 1);
842 fp_begin: _double = va_arg(ap,
double);
844 if (
isinf(_double)) {
851 if (
isnan(_double)) {
857 cp = cvt(_double, (prec < MAXFRACT ? prec : MAXFRACT), flags, &softsign,
858 &expt, ch, &ndig,
buf);
859 if (ch ==
'g' || ch ==
'G') {
860 if (expt <= -4 || (expt > prec && expt > 1))
861 ch = (ch ==
'g') ?
'e' :
'E';
865 if (ch ==
'a' || ch ==
'A') {
868 expsize = exponent(expstr, expt, ch +
'p' -
'a');
870 size = expsize + ndig;
871 if (ndig > 1 || flags &
ALT)
874 else if (ch <=
'e') {
876 expsize = exponent(expstr, expt, ch);
877 size = expsize + ndig;
878 if (ndig > 1 || flags &
ALT)
880 }
else if (ch ==
'f') {
883 if (prec || flags &
ALT)
891 }
else if (expt >= ndig) {
896 size = ndig + (expt > 0 ?
904 #ifdef _HAVE_SANE_QUAD_ 906 *va_arg(ap, quad_t *) = ret;
911 *va_arg(ap,
long *) = ret;
913 *va_arg(ap,
short *) = (short)ret;
915 *va_arg(ap,
int *) = (int)ret;
921 #ifdef _HAVE_SANE_QUAD_ 923 uqval = va_arg(ap, u_quad_t);
937 prec = (int)(
sizeof(
void*)*
CHAR_BIT/4);
939 uqval = (u_quad_t)va_arg(ap,
void *);
942 ulval = (
u_long)va_arg(ap,
void *);
943 #ifdef _HAVE_SANE_QUAD_ 950 xdigs =
"0123456789abcdef";
954 if ((cp = va_arg(ap,
char *)) ==
NULL)
962 const char *
p = (
char *)memchr(cp, 0, prec);
964 if (
p !=
NULL && (
p - cp) > prec)
965 size = (
int)(
p - cp);
979 #ifdef _HAVE_SANE_QUAD_ 981 uqval = va_arg(ap, u_quad_t);
988 xdigs =
"0123456789ABCDEF";
991 xdigs =
"0123456789abcdef";
993 #ifdef _HAVE_SANE_QUAD_ 995 uqval = va_arg(ap, u_quad_t);
1002 #ifdef _HAVE_SANE_QUAD_
1003 (flags & QUADINT ? uqval != 0 : ulval != 0)
1011 nosign: sign =
'\0';
1017 number:
if ((dprec = prec) >= 0)
1025 #ifdef _HAVE_SANE_QUAD_ 1026 if (flags & QUADINT) {
1027 if (uqval != 0 || prec != 0)
1028 cp = BSD__uqtoa(uqval, ebuf, base,
1029 flags &
ALT, xdigs);
1034 if (ulval != 0 || prec != 0)
1036 flags &
ALT, xdigs);
1038 size = (int)(ebuf - cp);
1071 realsz = dprec > fieldsz ? dprec : fieldsz;
1075 PAD_L(width - realsz, blanks);
1089 PAD_L(width - realsz, zeroes);
1092 PAD_L(dprec - fieldsz, zeroes);
1099 #ifdef FLOATING_POINT 1100 if ((flags &
FPT) == 0) {
1104 if (ndig > 1 || flags &
ALT) {
1108 if (ndig > 0)
PRINT(cp, ndig-1);
1111 PAD(fprec-ndig, zeroes);
1112 PRINT(expstr, expsize);
1114 else if (ch >=
'f') {
1118 (flags &
ALT) == 0) {
1122 PAD((ndig >= fprec ? ndig - 1 : fprec - (ch !=
'f')),
1125 }
else if (expt == 0 && ndig == 0 && (flags &
ALT) == 0) {
1127 }
else if (expt <= 0) {
1132 PAD(fprec - ndig + (ch ==
'f' ? expt : 0), zeroes);
1133 }
else if (expt >= ndig) {
1135 PAD(expt - ndig, zeroes);
1142 PRINT(cp, ndig-expt);
1144 PAD(fprec - ndig + (ch ==
'f' ? expt : 0), zeroes);
1147 if (ndig > 1 || flags &
ALT) {
1155 PAD(ndig - 1, zeroes);
1156 if (flags &
ALT)
PAD(fprec - ndig - 1, zeroes);
1159 PRINT(expstr, expsize);
1167 PAD_L(width - realsz, blanks);
1170 ret += width > realsz ? width : realsz;
1181 #ifdef FLOATING_POINT 1183 extern char *
BSD__dtoa __P((
double,
int,
int,
int *,
int *,
char **));
1184 extern char *
BSD__hdtoa(
double,
const char *,
int,
int *,
int *,
char **);
1187 cvt(value, ndigits, flags, sign, decpt, ch, length,
buf)
1189 int ndigits, flags, *decpt, ch, *length;
1193 char *digits, *
bp, *rve;
1203 }
else if (value == 0.0 && 1.0/value < 0) {
1208 if (ch ==
'a' || ch ==
'A') {
1210 ch ==
'a' ?
"0123456789abcdef" :
"0123456789ABCDEF",
1211 ndigits, decpt, &dsgn, &rve);
1214 digits =
BSD__dtoa(value, mode, ndigits, decpt, &dsgn, &rve);
1217 memcpy(
buf, digits, rve - digits);
1219 rve =
buf + (rve - digits);
1222 bp = digits + ndigits;
1224 if (*digits ==
'0' && value)
1225 *decpt = -ndigits + 1;
1231 *length = (int)(rve - digits);
1236 exponent(p0, exp, fmtch)
1240 register char *
p, *t;
1241 char expbuf[2 + (MAXEXP < 1000 ? 3 : MAXEXP < 10000 ? 4 : 5)];
1251 t = expbuf +
sizeof(expbuf);
1255 }
while ((exp /= 10) > 9);
1257 for (; t < expbuf +
sizeof(expbuf); *
p++ = *t++);
1260 if (fmtch & 15) *
p++ =
'0';
1263 return (
int)(
p - p0);
size_t strlen(const char *)
int ruby_snprintf(char *str, size_t n, char const *fmt,...)
static int BSD__sfvwrite(FILE *fp, struct __suio *uio)
#define UNINITIALIZED_VAR(x)
#define PAD(howmany, with)
int ruby_vsnprintf(char *str, size_t n, const char *fmt, va_list ap)
RUBY_EXTERN int isinf(double)
#define PAD_L(howmany, with)
unsigned char buf[MIME_BUF_SIZE]
#define GETIOV(extra_work)
register unsigned int len
static int BSD__sbprintf(register FILE *fp, const char *fmt, va_list ap)
static ssize_t BSD_vfprintf(FILE *fp, const char *fmt0, va_list ap)
static char * BSD__ultoa(register u_long val, char *endp, int base, int octzero, const char *xdigs)
static int BSD__sprint(FILE *fp, register struct __suio *uio)