25 #define BIT_DIGITS(N) (((N)*146)/485 + 1) 29 static void fmt_setup(
char*,
size_t,
int,
int,
int,
int);
38 if (*p ==
'X') c =
'F';
59 #define CHECK(l) do {\ 60 int cr = ENC_CODERANGE(result);\ 61 while (blen + (l) >= bsiz) {\ 64 rb_str_resize(result, bsiz);\ 65 ENC_CODERANGE_SET(result, cr);\ 66 buf = RSTRING_PTR(result);\ 69 #define PUSH(s, l) do { \ 71 memcpy(&buf[blen], (s), (l));\ 75 #define FILL(c, l) do { \ 77 memset(&buf[blen], (c), (l));\ 81 #define GETARG() (nextvalue != Qundef ? nextvalue : \ 84 #define GETNEXTARG() ( \ 86 (rb_raise(rb_eArgError, "unnumbered(%d) mixed with numbered", nextarg), 0) : \ 88 (rb_raise(rb_eArgError, "unnumbered(%d) mixed with named", nextarg), 0) : \ 89 (posarg = nextarg++, GETNTHARG(posarg))) 91 #define GETPOSARG(n) (posarg > 0 ? \ 92 (rb_raise(rb_eArgError, "numbered(%d) after unnumbered(%d)", (n), posarg), 0) : \ 94 (rb_raise(rb_eArgError, "numbered(%d) after named", (n)), 0) : \ 95 (((n) < 1) ? (rb_raise(rb_eArgError, "invalid index - %d$", (n)), 0) : \ 96 (posarg = -1, GETNTHARG(n)))) 98 #define GETNTHARG(nth) \ 99 (((nth) >= argc) ? (rb_raise(rb_eArgError, "too few arguments"), 0) : argv[(nth)]) 101 #define GETNAMEARG(id, name, len, enc) ( \ 103 (rb_enc_raise((enc), rb_eArgError, "named%.*s after unnumbered(%d)", (len), (name), posarg), 0) : \ 105 (rb_enc_raise((enc), rb_eArgError, "named%.*s after numbered", (len), (name)), 0) : \ 106 (posarg = -2, rb_hash_lookup2(get_hash(&hash, argc, argv), (id), Qundef))) 108 #define GETNUM(n, val) \ 109 for (; p < end && rb_enc_isdigit(*p, enc); p++) { \ 111 if (MUL_OVERFLOW_INT_P(10, next_n)) \ 112 rb_raise(rb_eArgError, #val " too big"); \ 114 if (INT_MAX - (*p - '0') < next_n) \ 115 rb_raise(rb_eArgError, #val " too big"); \ 116 next_n += *p - '0'; \ 120 rb_raise(rb_eArgError, "malformed format string - %%*[0-9]"); \ 123 #define GETASTER(val) do { \ 128 tmp = GETPOSARG(n); \ 131 tmp = GETNEXTARG(); \ 134 (val) = NUM2INT(tmp); \ 150 return (*
hash = tmp);
431 int width, prec, flags =
FNONE;
440 #define CHECK_FOR_WIDTH(f) \ 441 if ((f) & FWIDTH) { \ 442 rb_raise(rb_eArgError, "width given twice"); \ 444 if ((f) & FPREC0) { \ 445 rb_raise(rb_eArgError, "width after precision"); \ 447 #define CHECK_FOR_FLAGS(f) \ 448 if ((f) & FWIDTH) { \ 449 rb_raise(rb_eArgError, "flag after width"); \ 451 if ((f) & FPREC0) { \ 452 rb_raise(rb_eArgError, "flag after precision"); \ 468 memset(
buf, 0, bsiz);
471 for (; p < end; p++) {
476 for (
t = p;
t < end && *
t !=
'%';
t++) ;
529 case '1':
case '2':
case '3':
case '4':
530 case '5':
case '6':
case '7':
case '8':
case '9':
534 if (nextvalue !=
Qundef) {
549 const char *start = p;
550 char term = (*p ==
'<') ?
'>' :
'}';
553 for (; p < end && *p != term; ) {
559 #if SIZEOF_INT < SIZEOF_SIZE_T 560 if ((
size_t)(p - start) >= INT_MAX) {
561 const int message_limit = 20;
564 "too long name (%"PRIdSIZE" bytes) - %.*s...%c",
565 (
size_t)(p - start - 2), len, start, term);
568 len = (int)(p - start + 1);
578 if (nextvalue ==
Qundef) {
581 if (term ==
'}')
goto format_s;
621 if (flags !=
FNONE) {
654 else if ((flags &
FMINUS)) {
694 if ((flags&
FPREC) && (prec < slen)) {
701 if ((flags&
FWIDTH) && (width > slen)) {
741 const char *prefix = 0;
742 int sign = 0, dots = 0;
745 int base, bignum = 0;
766 prefix =
"0x";
break;
768 prefix =
"0X";
break;
770 prefix =
"0b";
break;
772 prefix =
"0B";
break;
818 int numbits =
ffs(base)-1;
822 if (INT_MAX-1 < numdigits)
837 else if (flags &
FPLUS) {
841 else if (flags &
FSPACE) {
856 if (numdigits == 0 ||
857 ((abs_nlz_bits != (
size_t)(numbits-1) ||
879 else if (flags &
FPLUS) {
883 else if (flags &
FSPACE) {
887 snprintf(nbuf,
sizeof(nbuf),
"%ld", v);
901 else if (flags &
FPLUS) {
905 else if (flags &
FSPACE) {
920 while ((c = (
int)(
unsigned char)*pp) != 0) {
925 if (prefix && !prefix[1]) {
929 else if (len == 1 && *s ==
'0') {
931 if (flags &
FPREC) prec--;
933 else if ((flags &
FPREC) && (prec > len)) {
937 else if (len == 1 && *s ==
'0') {
941 width -= (int)
strlen(prefix);
949 if (!prefix && prec == 0 && len == 1 && *s ==
'0') len = 0;
956 while (width-- > 0) {
960 if (sc)
PUSH(&sc, 1);
962 int plen = (int)
strlen(prefix);
966 if (dots)
PUSH(
"..", 2);
967 if (!sign && valsign < 0) {
969 while (len < prec--) {
974 while (len < prec--) {
981 while (width-- > 0) {
1010 need = (int)
strlen(expr);
1011 if ((!
isnan(fval) && fval < 0.0) || (flags &
FPLUS))
1013 if ((flags &
FWIDTH) && need < width)
1019 if (!
isnan(fval) && fval < 0.0)
1021 else if (flags &
FPLUS)
1028 if (!
isnan(fval) && fval < 0.0)
1029 buf[blen + need -
strlen(expr) - 1] =
'-';
1030 else if (flags &
FPLUS)
1031 buf[blen + need -
strlen(expr) - 1] =
'+';
1032 else if ((flags &
FSPACE) && need > width)
1034 memcpy(&
buf[blen + need -
strlen(expr)], expr,
1041 fmt_setup(fbuf,
sizeof(fbuf), *p, flags, width, prec);
1043 if (*p !=
'e' && *p !=
'E') {
1049 need += (flags&
FPREC) ? prec : 6;
1050 if ((flags&
FWIDTH) && need < width)
1067 if (posarg >= 0 && nextarg <
argc) {
1068 const char *mesg =
"too many arguments for format string";
1094 if (flags &
FPREC) {
1104 #define FILE rb_printf_buffer 1105 #define __sbuf rb_printf_sbuf 1106 #define __sFILE rb_printf_sfile 1111 #if SIZEOF_LONG < SIZEOF_VOIDP 1112 # if SIZEOF_LONG_LONG == SIZEOF_VOIDP 1113 # define _HAVE_SANE_QUAD_ 1114 # define _HAVE_LLP64_ 1115 # define quad_t LONG_LONG 1116 # define u_quad_t unsigned LONG_LONG 1118 #elif SIZEOF_LONG != SIZEOF_LONG_LONG && SIZEOF_LONG_LONG == 8 1119 # define _HAVE_SANE_QUAD_ 1120 # define quad_t LONG_LONG 1121 # define u_quad_t unsigned LONG_LONG 1123 #define FLOATING_POINT 1 1124 #define BSD__dtoa ruby_dtoa 1125 #define BSD__hdtoa ruby_hdtoa 1138 char *
buf = (
char*)fp->_p;
1150 for (iov = uio->
uio_iov; len > 0; ++iov) {
1155 fp->_p = (
unsigned char *)
buf;
1167 if (valsize !=
sizeof(
VALUE))
return 0;
1168 value = *(
VALUE *)valp;
1177 if (sign ==
' ') value =
QUOTE(value);
1188 *(
volatile VALUE *)valp = value;
1201 #define f buffer.base 1216 f._bf._base = (
unsigned char *)
result;
1236 va_start(ap, format);
1255 va_start(ap, format);
1266 #define f buffer.base 1274 f._bf._base = (
unsigned char *)str;
1276 klass =
RBASIC(str)->klass;
1294 va_start(ap, format);
RUBY_EXTERN VALUE rb_cString
#define RBASIC_CLEAR_CLASS(obj)
int rb_enc_codelen(int c, rb_encoding *enc)
int rb_integer_pack(VALUE val, void *words, size_t numwords, size_t wordsize, size_t nails, int flags)
static VALUE get_hash(volatile VALUE *hash, int argc, const VALUE *argv)
rb_encoding * rb_enc_check(VALUE str1, VALUE str2)
void rb_enc_copy(VALUE obj1, VALUE obj2)
long rb_str_coderange_scan_restartable(const char *, const char *, rb_encoding *, int *)
size_t strlen(const char *)
static int ruby__sfvwrite(register rb_printf_buffer *fp, register struct __suio *uio)
#define ENC_CODERANGE_SET(obj, cr)
rb_encoding * rb_enc_compatible(VALUE str1, VALUE str2)
void rb_str_set_len(VALUE, long)
if((ID)(DISPID) nameid !=nameid)
unsigned int rb_enc_codepoint_len(const char *p, const char *e, int *len_p, rb_encoding *enc)
void rb_raise(VALUE exc, const char *fmt,...)
#define RSTRING_GETMEM(str, ptrvar, lenvar)
VALUE rb_enc_associate(VALUE obj, rb_encoding *enc)
int rb_enc_mbclen(const char *p, const char *e, rb_encoding *enc)
VALUE rb_enc_vsprintf(rb_encoding *enc, const char *fmt, va_list ap)
ID rb_check_id_cstr(const char *ptr, long len, rb_encoding *enc)
VALUE rb_str_conv_enc_opts(VALUE str, rb_encoding *from, rb_encoding *to, int ecflags, VALUE ecopts)
#define INTEGER_PACK_2COMP
#define ENC_CODERANGE_7BIT
VALUE rb_enc_sprintf(rb_encoding *enc, const char *format,...)
VALUE rb_str_format(int argc, const VALUE *argv, VALUE fmt)
char * rb_enc_nth(const char *, const char *, long, rb_encoding *)
int rb_enc_toupper(int c, rb_encoding *enc)
static char sign_bits(int base, const char *p)
int rb_absint_singlebit_p(VALUE val)
#define RBASIC_SET_CLASS_RAW(obj, cls)
VALUE rb_dbl2big(double d)
VALUE rb_str_to_inum(VALUE str, int base, int badcheck)
#define ECONV_INVALID_REPLACE
VALUE rb_obj_as_string(VALUE)
VALUE rb_vsprintf(const char *fmt, va_list ap)
#define ENC_CODERANGE_UNKNOWN
#define rb_enc_isprint(c, enc)
#define MEMCPY(p1, p2, type, n)
RUBY_EXTERN int isinf(double)
#define ENC_CODERANGE_BROKEN
void rb_enc_raise(rb_encoding *enc, VALUE exc, const char *fmt,...)
#define rb_enc_mbminlen(enc)
#define CHECK_FOR_WIDTH(f)
VALUE rb_big2str(VALUE x, int base)
VALUE rb_str_resize(VALUE, long)
size_t rb_str_capacity(VALUE)
VALUE rb_sprintf(const char *format,...)
VALUE rb_f_sprintf(int argc, const VALUE *argv)
static char * ruby__sfvextra(rb_printf_buffer *fp, size_t valsize, void *valp, long *sz, int sign)
VALUE rb_check_hash_type(VALUE hash)
unsigned char buf[MIME_BUF_SIZE]
static void fmt_setup(char *, size_t, int, int, int, int)
#define INTEGER_PACK_BIG_ENDIAN
#define StringValueCStr(v)
#define rb_enc_right_char_head(s, p, e, enc)
#define ECONV_UNDEF_REPLACE
void rb_str_modify(VALUE)
rb_encoding * rb_enc_get(VALUE obj)
long rb_enc_strlen(const char *, const char *, rb_encoding *)
static ssize_t BSD_vfprintf(FILE *fp, const char *fmt0, va_list ap)
VALUE rb_str_vcatf(VALUE str, const char *fmt, va_list ap)
VALUE rb_str_catf(VALUE str, const char *format,...)
VALUE rb_check_string_type(VALUE)
const char ruby_digitmap[]
size_t rb_absint_numwords(VALUE val, size_t word_numbits, size_t *nlz_bits_ret)
static unsigned int hash(const char *str, unsigned int len)
#define CHECK_FOR_FLAGS(f)
const char * rb_id2name(ID id)
#define RBIGNUM_NEGATIVE_P(b)
#define rb_enc_mbcput(c, buf, enc)
VALUE rb_str_buf_new(long)
#define GETNAMEARG(id, name, len, enc)
void rb_warn(const char *fmt,...)
VALUE rb_str_new(const char *, long)