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
138 unsigned char *_base;
184 const char *(*vextra)(
struct __sFILE*, size_t,
void*,
long*, int);
208#define BSD__sfeof(p) (((p)->_flags & __SEOF) != 0)
209#define BSD__sferror(p) (((p)->_flags & __SERR) != 0)
210#define BSD__sclearerr(p) ((void)((p)->_flags &= ~(__SERR|__SEOF)))
211#define BSD__sfileno(p) ((p)->_file)
216#define feof(p) BSD__sfeof(p)
217#define ferror(p) BSD__sferror(p)
218#define clearerr(p) BSD__sclearerr(p)
221#define fileno(p) BSD__sfileno(p)
229 const void *iov_base;
245BSD__sfvwrite(
register FILE *fp,
register struct __suio *uio)
248 register const char *p;
249 register struct __siov *iov;
252 if ((len = uio->uio_resid) == 0)
255#define MIN(a, b) ((a) < (b) ? (a) : (b))
257#define COPY(n) (void)memcpy((void *)fp->_p, (void *)p, (size_t)(n))
263#define GETIOV(extra_work) \
267 len = iov->iov_len; \
270 if (fp->_flags & __SNBF) {
274 }
else if ((fp->_flags & __SLBF) == 0) {
289 if (fp->_flags & __SSTR) {
303 }
while ((uio->uio_resid -= w) != 0);
323BSD__sprint(
FILE *fp,
register struct __suio *uio)
327 if (uio->uio_resid == 0) {
331 err = (*fp->vwrite)(fp, uio);
344BSD__sbprintf(
register FILE *fp,
const char *fmt, va_list ap)
354#define to_digit(c) ((c) - '0')
355#define is_digit(c) ((unsigned)to_digit(c) <= 9)
356#define to_char(n) (char)((n) + '0')
358#ifdef _HAVE_SANE_QUAD_
366BSD__uqtoa(
register u_quad_t val,
char *endp,
int base,
int octzero,
const char *xdigs)
368 register char *cp = endp;
369 register quad_t sval;
378 *--cp = to_char(val);
387 if (val > LLONG_MAX) {
388 *--cp = to_char(val % 10);
393 *--cp = to_char(sval % 10);
400 *--cp = to_char(val & 7);
403 if (octzero && *cp !=
'0')
409 *--cp = xdigs[val & 15];
431BSD__ultoa(
register u_long val,
char *endp,
int base,
int octzero,
const char *xdigs)
433 register char *cp = endp;
443 *--cp = to_char(val);
452 if (val > LONG_MAX) {
453 *--cp = to_char(val % 10);
458 *--cp = to_char(sval % 10);
465 *--cp = to_char(val & 7);
468 if (octzero && *cp !=
'0')
474 *--cp = xdigs[val & 15];
494# if DBL_MAX_10_EXP > -DBL_MIN_10_EXP
495# define MAXEXP (DBL_MAX_10_EXP)
497# define MAXEXP (-DBL_MIN_10_EXP)
502# define MAXFRACT (MAXEXP*10/3)
505#define BUF (MAXEXP+MAXFRACT+1)
508static char *cvt(
double,
int,
int,
char *,
int *,
int,
int *,
char *);
509static int exponent(
char *,
int,
int);
517#ifndef lower_hexdigits
518# define lower_hexdigits "0123456789abcdef"
520#ifndef upper_hexdigits
521# define upper_hexdigits "0123456789ABCDEF"
528#define HEXPREFIX 0x002
533#ifdef _HAVE_SANE_QUAD_
537#define SHORTINT 0x040
540ATTRIBUTE_NO_ADDRESS_SAFETY_ANALYSIS(
static ssize_t BSD_vfprintf(
FILE *fp,
const char *fmt0, va_list ap));
542BSD_vfprintf(
FILE *fp,
const char *fmt0, va_list ap)
545 const int PRI_EXTRA_MARK_LEN =
rb_strlen_lit(PRI_EXTRA_MARK);
547 register const char *fmt;
550 register const char *cp;
551 register struct __siov *iovp;
566 u_long MAYBE_UNUSED(ulval) = 0;
567#ifdef _HAVE_SANE_QUAD_
568 u_quad_t MAYBE_UNUSED(uqval);
575 const char *xdigs = 0;
581 char *
const ebuf = buf +
sizeof(buf);
582#if SIZEOF_LONG > SIZEOF_INT
592 static const char blanks[PADSIZE] =
593 {
' ',
' ',
' ',
' ',
' ',
' ',
' ',
' ',
' ',
' ',
' ',
' ',
' ',
' ',
' ',
' '};
594 static const char zeroes[PADSIZE] =
595 {
'0',
'0',
'0',
'0',
'0',
'0',
'0',
'0',
'0',
'0',
'0',
'0',
'0',
'0',
'0',
'0'};
600#define PRINT(ptr, len) { \
601 iovp->iov_base = (ptr); \
602 iovp->iov_len = (len); \
603 uio.uio_resid += (len); \
605 if (++uio.uio_iovcnt >= NIOV) { \
606 if (BSD__sprint(fp, &uio)) \
611#define PAD(howmany, with) { \
612 if ((n = (howmany)) > 0) { \
613 while (n > PADSIZE) { \
614 PRINT((with), PADSIZE); \
620#if SIZEOF_LONG > SIZEOF_INT
622#define PAD_L(howmany, with) { \
624 if ((long)((int)ln) != ln) { \
628 if (ln > 0) PAD((int)ln, (with)); \
631#define PAD_L(howmany, with) PAD((howmany), (with))
634 if (uio.uio_resid && BSD__sprint(fp, &uio)) \
636 uio.uio_iovcnt = 0; \
645 (flags&LONGINT ? va_arg(ap, long) : \
646 flags&SHORTINT ? (long)(short)va_arg(ap, int) : \
647 (long)va_arg(ap, int))
649 (flags&LONGINT ? va_arg(ap, u_long) : \
650 flags&SHORTINT ? (u_long)(u_short)va_arg(ap, int) : \
651 (u_long)va_arg(ap, u_int))
654 if ((fp->_flags & (__SNBF|__SWR|__SRW)) == (__SNBF|__SWR) &&
656 return (BSD__sbprintf(fp, fmt0, ap));
659 uio.uio_iov = iovp = iov;
670 for (cp = fmt; (ch = *fmt) !=
'\0' && ch !=
'%'; fmt++)
672 if ((nc = fmt - cp) != 0) {
687reswitch:
switch (ch) {
707 if ((width = va_arg(ap,
int)) >= 0)
718 if ((ch = *fmt++) ==
'*') {
720 prec = n < 0 ? -1 : n;
724 while (is_digit(ch)) {
725 n = 10 * n + to_digit(ch);
728 prec = n < 0 ? -1 : n;
738 case '1':
case '2':
case '3':
case '4':
739 case '5':
case '6':
case '7':
case '8':
case '9':
742 n = 10 * n + to_digit(ch);
744 }
while (is_digit(ch));
755#if SIZEOF_PTRDIFF_T == SIZEOF_LONG
758#if SIZEOF_SIZE_T == SIZEOF_LONG
762#ifdef _HAVE_SANE_QUAD_
773#ifdef _HAVE_SANE_QUAD_
774#if SIZEOF_PTRDIFF_T == SIZEOF_LONG_LONG
777#if SIZEOF_SIZE_T == SIZEOF_LONG_LONG
786 if (*fmt ==
'3' && *(fmt + 1) ==
'2') {
790#ifdef _HAVE_SANE_QUAD_
791 else if (*fmt ==
'6' && *(fmt + 1) ==
'4') {
797#if defined(_HAVE_SANE_QUAD_) && SIZEOF_SIZE_T == SIZEOF_LONG_LONG
806 *buf = (char)va_arg(ap,
int);
811#ifdef _HAVE_SANE_QUAD_
812# define INTPTR_MASK (QUADINT|LONGINT|SHORTINT)
814# define INTPTR_MASK (LONGINT|SHORTINT)
816#if defined _HAVE_SANE_QUAD_ && SIZEOF_VOIDP == SIZEOF_LONG_LONG
817# define INTPTR_FLAG QUADINT
818#elif SIZEOF_VOIDP == SIZEOF_LONG
819# define INTPTR_FLAG LONGINT
821# define INTPTR_FLAG 0
824# define IS_PRI_EXTRA_MARK(s) \
825 (PRI_EXTRA_MARK_LEN < 1 || \
826 (*(s) == PRI_EXTRA_MARK[0] && \
827 (PRI_EXTRA_MARK_LEN == 1 || \
828 strncmp((s)+1, &PRI_EXTRA_MARK[1], \
829 PRI_EXTRA_MARK_LEN-1) == 0)))
831# define PRI_EXTRA_MARK_LEN 0
832# define IS_PRI_EXTRA_MARK(s) 1
834 if (fp->vextra && (flags & INTPTR_MASK) == INTPTR_FLAG &&
835 IS_PRI_EXTRA_MARK(fmt)) {
836 fmt += PRI_EXTRA_MARK_LEN;
838#if defined _HAVE_SANE_QUAD_ && SIZEOF_VOIDP == SIZEOF_LONG_LONG
839 uqval = va_arg(ap, u_quad_t);
840 cp = (*fp->vextra)(fp,
sizeof(uqval), &uqval, &fieldsz, sign);
842 ulval = va_arg(ap, u_long);
843 cp = (*fp->vextra)(fp,
sizeof(ulval), &ulval, &fieldsz, sign);
847 if (prec < 0)
goto long_len;
848 size = fieldsz < prec ? (int)fieldsz : prec;
857#ifdef _HAVE_SANE_QUAD_
858 if (flags & QUADINT) {
859 uqval = va_arg(ap, quad_t);
860 if ((quad_t)uqval < 0) {
861 uqval = -(quad_t)uqval;
868 if ((
long)ulval < 0) {
869 ulval = (u_long)(-(
long)ulval);
888 prec = (prec == -1) ?
889 DEFPREC + 1 : (fprec = prec + 1);
901fp_begin: _double = va_arg(ap,
double);
903 if (isinf(_double)) {
910 if (isnan(_double)) {
916 cp = cvt(_double, (prec < MAXFRACT ? prec : MAXFRACT), flags, &softsign,
917 &expt, ch, &ndig, buf);
918 if (ch ==
'g' || ch ==
'G') {
919 if (expt <= -4 || (expt > prec && expt > 1))
920 ch = (ch ==
'g') ?
'e' :
'E';
924 if (ch ==
'a' || ch ==
'A') {
927 expsize = exponent(expstr, expt, ch +
'p' -
'a');
929 size = expsize + ndig;
930 if (ndig > 1 || flags & ALT)
933 else if (ch <=
'e') {
935 expsize = exponent(expstr, expt, ch);
936 size = expsize + ndig;
937 if (ndig > 1 || flags & ALT)
939 }
else if (ch ==
'f') {
942 if (prec || flags & ALT)
950 }
else if (expt >= ndig) {
955 size = ndig + (expt > 0 ?
963#ifdef _HAVE_SANE_QUAD_
965 *va_arg(ap, quad_t *) = ret;
966 else if (flags & LONGINT)
970 *va_arg(ap,
long *) = ret;
971 else if (flags & SHORTINT)
972 *va_arg(ap,
short *) = (short)ret;
974 *va_arg(ap,
int *) = (int)ret;
980#ifdef _HAVE_SANE_QUAD_
982 uqval = va_arg(ap, u_quad_t);
996 prec = (int)(
sizeof(
void*)*CHAR_BIT/4);
998 uqval = (u_quad_t)va_arg(ap,
void *);
999 flags = (flags) | QUADINT | HEXPREFIX;
1001 ulval = (u_long)va_arg(ap,
void *);
1002#ifdef _HAVE_SANE_QUAD_
1003 flags = (flags & ~QUADINT) | HEXPREFIX;
1005 flags = (flags) | HEXPREFIX;
1009 xdigs = lower_hexdigits;
1013 if ((cp = va_arg(ap,
char *)) == NULL)
1021 const char *p = (
char *)memchr(cp, 0, prec);
1023 if (p != NULL && (p - cp) < prec)
1024 size = (
int)(p - cp);
1029 fieldsz = strlen(cp);
1038#ifdef _HAVE_SANE_QUAD_
1039 if (flags & QUADINT)
1040 uqval = va_arg(ap, u_quad_t);
1047 xdigs = upper_hexdigits;
1050 xdigs = lower_hexdigits;
1052#ifdef _HAVE_SANE_QUAD_
1053 if (flags & QUADINT)
1054 uqval = va_arg(ap, u_quad_t);
1061#ifdef _HAVE_SANE_QUAD_
1062 (flags & QUADINT ? uqval != 0 : ulval != 0)
1076number:
if ((dprec = prec) >= 0)
1085#ifdef _HAVE_SANE_QUAD_
1086 if (flags & QUADINT) {
1087 if (uqval != 0 || prec != 0)
1088 cp = BSD__uqtoa(uqval, ebuf, base,
1089 flags & ALT, xdigs);
1094 if (ulval != 0 || prec != 0)
1095 cp = BSD__ultoa(ulval, ebuf, base,
1096 flags & ALT, xdigs);
1098 size = (int)(ebuf - cp);
1127 realsz = dprec > fieldsz ? dprec : fieldsz;
1130 if (flags & HEXPREFIX)
1134 if ((flags & (LADJUST|ZEROPAD)) == 0)
1135 PAD_L(width - realsz, blanks);
1141 if (flags & HEXPREFIX) {
1148 if ((flags & (LADJUST|ZEROPAD)) == ZEROPAD)
1149 PAD_L(width - realsz, zeroes);
1152 PAD_L(dprec - fieldsz, zeroes);
1155#ifdef FLOATING_POINT
1156 if ((flags & FPT) == 0) {
1159 if (flags & HEXPREFIX) {
1160 if (ndig > 1 || flags & ALT) {
1164 if (ndig > 0) PRINT(cp, ndig-1);
1167 PAD(fprec-ndig, zeroes);
1168 PRINT(expstr, expsize);
1170 else if (ch >=
'f') {
1174 (flags & ALT) == 0) {
1178 PAD((ndig >= fprec ? ndig - 1 : fprec - (ch !=
'f')),
1181 }
else if (expt == 0 && ndig == 0 && (flags & ALT) == 0) {
1183 }
else if (expt <= 0) {
1188 PAD(fprec - ndig + (ch ==
'f' ? expt : 0), zeroes);
1189 }
else if (expt >= ndig) {
1191 PAD(expt - ndig, zeroes);
1198 PRINT(cp, ndig-expt);
1200 PAD(fprec - ndig + (ch ==
'f' ? expt : 0), zeroes);
1203 if (ndig > 1 || flags & ALT) {
1211 PAD(ndig - 1, zeroes);
1212 if (flags & ALT) PAD(fprec - ndig - 1, zeroes);
1215 PRINT(expstr, expsize);
1222 if (flags & LADJUST)
1223 PAD_L(width - realsz, blanks);
1226 ret += width > realsz ? width : realsz;
1233 return (BSD__sferror(fp) ? EOF : ret);
1237#ifdef FLOATING_POINT
1239extern char *BSD__dtoa(
double,
int,
int,
int *,
int *,
char **);
1240extern char *BSD__hdtoa(
double,
const char *,
int,
int *,
int *,
char **);
1243cvt(
double value,
int ndigits,
int flags,
char *sign,
int *decpt,
int ch,
int *length,
char *buf)
1246 char *digits, *bp, *rve;
1256 }
else if (value == 0.0 && signbit(value)) {
1261 if (ch ==
'a' || ch ==
'A') {
1262 digits = BSD__hdtoa(value,
1263 ch ==
'a' ? lower_hexdigits : upper_hexdigits,
1264 ndigits, decpt, &dsgn, &rve);
1267 digits = BSD__dtoa(value, mode, ndigits, decpt, &dsgn, &rve);
1270 memcpy(buf, digits, rve - digits);
1272 rve = buf + (rve - digits);
1275 bp = digits + ndigits;
1277 if (*digits ==
'0' && value)
1278 *decpt = -ndigits + 1;
1284 *length = (int)(rve - digits);
1289exponent(
char *p0,
int exp,
int fmtch)
1291 register char *p, *t;
1292 char expbuf[2 + (MAXEXP < 1000 ? 3 : MAXEXP < 10000 ? 4 : 5)];
1302 t = expbuf +
sizeof(expbuf);
1305 *--t = to_char(exp % 10);
1306 }
while ((exp /= 10) > 9);
1307 *--t = to_char(exp);
1308 for (; t < expbuf +
sizeof(expbuf); *p++ = *t++);
1311 if (fmtch & 15) *p++ =
'0';
1312 *p++ = to_char(exp);
1314 return (
int)(p - p0);
#define xfree
Old name of ruby_xfree.
#define rb_strlen_lit(str)
Length of a string literal.