14#include "ruby/internal/config.h"
25#include "internal/error.h"
26#include "internal/hash.h"
27#include "internal/numeric.h"
28#include "internal/object.h"
29#include "internal/sanitizers.h"
30#include "internal/symbol.h"
35#define BIT_DIGITS(N) (((N)*146)/485 + 1)
37static char *fmt_setup(
char*,
size_t,
int,
int,
int,
int);
38static char *ruby_ultoa(
unsigned long val,
char *endp,
int base,
int octzero);
41sign_bits(
int base,
const char *p)
47 if (*p ==
'X') c =
'F';
73 while (l > bsiz - blen) {
75 if (bsiz < 0) rb_raise(rb_eArgError,
"too big specifier");
77 rb_str_resize(result, bsiz);
83 bsiz = expand_result(result, bsiz, blen, l);\
84 buf = RSTRING_PTR(result);\
87#define CHECK_WIDTH(l, w) do { \
88 if ((l) > INT_MAX - (w)) rb_raise(rb_eArgError, "width too big");\
92#define PUSH(s, l) do { \
97#define PUSH_(s, l) do { \
98 memcpy(&buf[blen], (s), (l));\
102#define FILL(c, l) do { \
103 if ((l) <= 0) break;\
108#define FILL_(c, l) do { \
109 memset(&buf[blen], (c), (l));\
114format_args_check(
VALUE ary,
int argc,
const VALUE *argv)
116 if (!
RTEST(ary))
return;
122#define GETARG() (!UNDEF_P(nextvalue) ? nextvalue : \
125#define GETNEXTARG() ( \
126 check_next_arg(posarg, nextarg), \
127 (RTEST(ary) ? (format_args_check(ary, argc0, argv0), 0) : 0), \
128 (posarg = nextarg++, GETNTHARG(posarg)))
130#define GETPOSARG(n) ( \
131 check_pos_arg(posarg, (n)), \
132 (RTEST(ary) ? (format_args_check(ary, argc0, argv0), 0) : 0), \
133 (posarg = -1, GETNTHARG(n)))
135#define GETNTHARG(nth) \
136 (((nth) >= argc) ? (rb_raise(rb_eArgError, "too few arguments"), 0) : argv[(nth)])
138#define CHECKNAMEARG(name, len, enc) ( \
139 check_name_arg(posarg, name, len, enc), \
142#define GETNUM(n, val) \
143 (!(p = get_num(p, end, enc, &(n))) ? \
144 rb_raise(rb_eArgError, #val " too big") : (void)0)
146#define GETASTER(val) do { \
151 tmp = GETPOSARG(n); \
154 tmp = GETNEXTARG(); \
157 (val) = NUM2INT(tmp); \
161get_num(
const char *p,
const char *end,
rb_encoding *enc,
int *valp)
165 if (MUL_OVERFLOW_INT_P(10, next_n))
168 if (INT_MAX - (*p -
'0') < next_n)
173 rb_raise(rb_eArgError,
"malformed format string - %%*[0-9]");
180check_next_arg(
int posarg,
int nextarg)
184 rb_raise(rb_eArgError,
"unnumbered(%d) mixed with numbered", nextarg);
186 rb_raise(rb_eArgError,
"unnumbered(%d) mixed with named", nextarg);
191check_pos_arg(
int posarg,
int n)
194 rb_raise(rb_eArgError,
"numbered(%d) after unnumbered(%d)", n, posarg);
197 rb_raise(rb_eArgError,
"numbered(%d) after named", n);
200 rb_raise(rb_eArgError,
"invalid index - %d$", n);
205check_name_arg(
int posarg,
const char *name,
int len,
rb_encoding *enc)
208 rb_enc_raise(enc, rb_eArgError,
"named%.*s after unnumbered(%d)",
len, name, posarg);
211 rb_enc_raise(enc, rb_eArgError,
"named%.*s after numbered",
len, name);
216get_hash(
volatile VALUE *hash,
int argc,
const VALUE *argv)
220 if (!UNDEF_P(*hash))
return *hash;
222 rb_raise(rb_eArgError,
"one hash required");
224 tmp = rb_check_hash_type(argv[1]);
226 rb_raise(rb_eArgError,
"one hash required");
228 return (*hash = tmp);
240 return RSTRING_PTR(rb_enc_associate(result, enc));
244reassoc_enc_index(
VALUE result,
int encidx)
246 return RSTRING_PTR(rb_enc_associate_index(result, encidx));
252 enum {default_float_precision = 6};
261 int width, prec, flags = FNONE;
270#define CHECK_FOR_WIDTH(f) \
271 if ((f) & FWIDTH) { \
272 rb_raise(rb_eArgError, "width given twice"); \
274 if ((f) & FPREC0) { \
275 rb_raise(rb_eArgError, "width after precision"); \
277#define CHECK_FOR_FLAGS(f) \
278 if ((f) & FWIDTH) { \
279 rb_raise(rb_eArgError, "flag after width"); \
281 if ((f) & FPREC0) { \
282 rb_raise(rb_eArgError, "flag after precision"); \
285#define update_coderange(partial) do { \
286 if (coderange != ENC_CODERANGE_BROKEN && scanned < blen) { \
287 int cr = coderange; \
288 scanned += rb_str_coderange_scan_restartable(buf+scanned, buf+blen, enc, &cr); \
289 ENC_CODERANGE_SET(result, \
290 (partial && cr == ENC_CODERANGE_UNKNOWN ? \
291 ENC_CODERANGE_BROKEN : (coderange = cr))); \
295 const int argc0 = argc;
296 const VALUE *argv0 = argv;
301 enc = rb_enc_get(fmt);
304 fmt = rb_str_tmp_frozen_acquire(fmt);
305 p = RSTRING_PTR(fmt);
306 end = p + RSTRING_LEN(fmt);
310 buf = reassoc_enc(result, enc);
311 memset(buf, 0, bsiz);
314 for (; p < end; p++) {
319 for (t = p; t < end && *t !=
'%'; t++) ;
321 rb_raise(rb_eArgError,
"incomplete format specifier; use %%%% (double %%) instead");
324 update_coderange(FALSE);
337 rb_raise(rb_eArgError,
"malformed format string - %%%c", *p);
339 rb_raise(rb_eArgError,
"malformed format string");
343 CHECK_FOR_FLAGS(flags);
349 CHECK_FOR_FLAGS(flags);
355 CHECK_FOR_FLAGS(flags);
361 CHECK_FOR_FLAGS(flags);
367 CHECK_FOR_FLAGS(flags);
372 case '1':
case '2':
case '3':
case '4':
373 case '5':
case '6':
case '7':
case '8':
case '9':
377 if (!UNDEF_P(nextvalue)) {
378 rb_raise(rb_eArgError,
"value given twice - %d$", n);
380 nextvalue = GETPOSARG(n);
384 CHECK_FOR_WIDTH(flags);
392 const char *start = p;
393 char term = (*p ==
'<') ?
'>' :
'}';
396 for (; p < end && *p != term; ) {
397 p += rb_enc_mbclen(p, end, enc);
400 rb_raise(rb_eArgError,
"malformed name - unmatched parenthesis");
402#if SIZEOF_INT < SIZEOF_SIZE_T
403 if ((
size_t)(p - start) >= INT_MAX) {
404 const int message_limit = 20;
407 "too long name (%"PRIuSIZE
" bytes) - %.*s...%c",
408 (
size_t)(p - start - 2),
len, start, term);
411 len = (int)(p - start + 1);
413 rb_enc_raise(enc, rb_eArgError,
"named%.*s after <%"PRIsVALUE
">",
416 CHECKNAMEARG(start,
len, enc);
417 get_hash(&hash, argc, argv);
421 if (!
NIL_P(sym)) nextvalue = rb_hash_lookup2(hash, sym,
Qundef);
422 if (UNDEF_P(nextvalue)) {
424 sym = rb_sym_intern(start + 1,
428 nextvalue = rb_hash_default_value(hash, sym);
429 if (
NIL_P(nextvalue)) {
430 rb_key_err_raise(
rb_enc_sprintf(enc,
"key%.*s not found",
len, start), hash, sym);
433 if (term ==
'}')
goto format_s;
439 CHECK_FOR_WIDTH(flags);
444 if (width == INT_MIN) rb_raise(rb_eArgError,
"width too big");
451 if (flags & FPREC0) {
452 rb_raise(rb_eArgError,
"precision given twice");
454 flags |= FPREC|FPREC0;
467 GETNUM(prec, precision);
471 if (flags != FNONE) {
472 rb_raise(rb_eArgError,
"invalid format character - %%");
479 VALUE val = GETARG();
493 n = rb_enc_codelen((c = n), enc);
494 encidx = rb_ascii8bit_appendable_encoding_index(enc, c);
497 rb_raise(rb_eArgError,
"invalid character");
499 if (encidx >= 0 && encidx != rb_enc_to_index(enc)) {
501 buf = reassoc_enc_index(result, encidx);
502 enc = rb_enc_from_index(encidx);
505 if (!(flags & FWIDTH)) {
507 rb_enc_mbcput(c, &buf[blen], enc);
512 CHECK_WIDTH(n, (width > 0 ? width : 0));
513 if (!(flags & FMINUS) && (width > 0)) FILL_(
' ', width);
514 rb_enc_mbcput(c, &buf[blen], enc);
516 if ((flags & FMINUS) && (width > 0)) FILL_(
' ', width);
525 VALUE arg = GETARG();
535 len = RSTRING_LEN(str);
537 update_coderange(TRUE);
538 enc = rb_enc_check(result, str);
539 if (flags&(FPREC|FWIDTH)) {
542 rb_raise(rb_eArgError,
"invalid mbstring sequence");
544 if ((flags&FPREC) && (prec < slen)) {
548 len = p - RSTRING_PTR(str);
551 if ((flags&FWIDTH) && (width > slen)) {
553 CHECK_WIDTH(
len, width);
554 if (!(flags&FMINUS)) {
558 memcpy(&buf[blen], RSTRING_PTR(str),
len);
564 buf = reassoc_enc(result, enc);
568 PUSH(RSTRING_PTR(str),
len);
570 buf = reassoc_enc(result, enc);
583 volatile VALUE val = GETARG();
585 char nbuf[BIT_DIGITS(SIZEOF_LONG*CHAR_BIT)+2], *s;
586 const char *prefix = 0;
587 int sign = 0, dots = 0;
590 int base, bignum = 0;
603 if (flags&(FPLUS|FSPACE)) sign = 1;
606 if (flags & FSHARP) {
611 prefix =
"0x";
break;
613 prefix =
"0X";
break;
615 prefix =
"0b";
break;
617 prefix =
"0B";
break;
633 val = rb_str_to_inum(val, 0, TRUE);
663 int numbits = ffs(base)-1;
665 size_t numdigits = rb_absint_numwords(val, numbits, &abs_nlz_bits);
667 if (INT_MAX-1 < numdigits)
668 rb_raise(rb_eArgError,
"size too big");
673 valsign = rb_integer_pack(val, RSTRING_PTR(tmp), RSTRING_LEN(tmp),
675 for (i = 0; i < RSTRING_LEN(tmp); i++)
676 RSTRING_PTR(tmp)[i] = ruby_digitmap[((
unsigned char *)RSTRING_PTR(tmp))[i]];
677 s = RSTRING_PTR(tmp);
682 else if (flags & FPLUS) {
686 else if (flags & FSPACE) {
701 if (numdigits == 0 ||
702 ((abs_nlz_bits != (
size_t)(numbits-1) ||
703 !rb_absint_singlebit_p(val)) &&
704 (!bignum ? v < 0 : BIGNUM_NEGATIVE_P(val))))
707 valsign = rb_integer_pack(val, RSTRING_PTR(tmp), RSTRING_LEN(tmp),
709 for (i = 0; i < RSTRING_LEN(tmp); i++)
710 RSTRING_PTR(tmp)[i] = ruby_digitmap[((
unsigned char *)RSTRING_PTR(tmp))[i]];
711 s = RSTRING_PTR(tmp);
724 else if (flags & FPLUS) {
728 else if (flags & FSPACE) {
732 s = ruby_ultoa((
unsigned long)v, nbuf +
sizeof(nbuf), 10, 0);
733 len = (int)(nbuf +
sizeof(nbuf) - s);
736 tmp = rb_big2str(val, 10);
737 s = RSTRING_PTR(tmp);
745 else if (flags & FPLUS) {
749 else if (flags & FSPACE) {
764 while ((c = (
int)(
unsigned char)*pp) != 0) {
765 *pp = rb_enc_toupper(c, enc);
769 if (prefix && !prefix[1]) {
773 else if (
len == 1 && *s ==
'0') {
775 if (flags & FPREC) prec--;
777 else if ((flags & FPREC) && (prec >
len)) {
781 else if (
len == 1 && *s ==
'0') {
785 width -= (int)strlen(prefix);
787 if ((flags & (FZERO|FMINUS|FPREC)) == FZERO) {
793 if (!prefix && prec == 0 &&
len == 1 && *s ==
'0')
len = 0;
798 if (!(flags&FMINUS)) {
802 if (sc) PUSH(&sc, 1);
804 int plen = (int)strlen(prefix);
807 if (dots) PUSH(
"..", 2);
810 if (!sign && valsign < 0) {
811 char c = sign_bits(base, p);
812 FILL_(c, prec -
len);
814 else if ((flags & (FMINUS|FPREC)) != FMINUS) {
815 FILL_(
'0', prec -
len);
826 VALUE val = GETARG(), num, den;
827 int sign = (flags&FPLUS) ? 1 : 0, zero = 0;
841 if (!(flags&FPREC)) prec = default_float_precision;
849 else if (BIGNUM_NEGATIVE_P(num)) {
851 num = rb_big_uminus(num);
855 num = rb_int_plus(num, rb_int_idiv(den,
INT2FIX(2)));
856 num = rb_int_idiv(num, den);
858 else if (prec >= 0) {
861 val = rb_int2str(num, 10);
862 len = RSTRING_LEN(val) + zero;
863 if (prec >=
len)
len = prec + 1;
864 if (sign || (flags&FSPACE)) ++
len;
866 fill = width >
len ? width -
len : 0;
868 if (fill && !(flags&(FMINUS|FZERO))) {
871 if (sign || (flags&FSPACE)) {
872 buf[blen++] = sign > 0 ?
'+' : sign < 0 ?
'-' :
' ';
874 if (fill && (flags&(FMINUS|FZERO)) == FZERO) {
877 len = RSTRING_LEN(val) + zero;
878 t = RSTRING_PTR(val);
880 PUSH_(t,
len - prec);
891 else if (prec >
len) {
892 FILL_(
'0', prec -
len);
896 PUSH_(t +
len - prec, prec);
898 if (fill && (flags&FMINUS)) {
913 VALUE val = GETARG();
917 if (!isfinite(fval)) {
929 need = (int)strlen(expr);
931 if (!isnan(fval) && fval < 0.0)
933 else if (flags & (FPLUS|FSPACE))
934 sign = (flags & FPLUS) ?
'+' :
' ';
937 if ((flags & FWIDTH) && need < width)
941 if (flags & FMINUS) {
943 buf[blen - need--] = sign;
944 memcpy(&buf[blen - need], expr, elen);
948 buf[blen - elen - 1] = sign;
949 memcpy(&buf[blen - elen], expr, elen);
955 char fbuf[2*BIT_DIGITS(SIZEOF_INT*CHAR_BIT)+10];
956 char *fmt = fmt_setup(fbuf,
sizeof(fbuf), *p, flags, width, prec);
958 rb_str_catf(result, fmt, fval);
969 update_coderange(FALSE);
971 rb_str_tmp_frozen_release(orig, fmt);
974 format_args_check(ary, argc0, argv0);
975 if (posarg >= 0 && nextarg < argc && !(argc == 2 &&
RB_TYPE_P(argv[1],
T_HASH))) {
976 const char *mesg =
"too many arguments for format string";
979 rb_str_resize(result, blen);
987 return rb_str_format_ary(argc, argv, fmt,
Qfalse);
991fmt_setup(
char *buf,
size_t size,
int c,
int flags,
int width,
int prec)
998 buf = ruby_ultoa(prec, buf, 10, 0);
1002 if (flags & FWIDTH) {
1003 buf = ruby_ultoa(width, buf, 10, 0);
1006 if (flags & FSPACE) *--buf =
' ';
1007 if (flags & FZERO) *--buf =
'0';
1008 if (flags & FMINUS) *--buf =
'-';
1009 if (flags & FPLUS) *--buf =
'+';
1010 if (flags & FSHARP) *--buf =
'#';
1016#define FILE rb_printf_buffer
1017#define __sbuf rb_printf_sbuf
1018#define __sFILE rb_printf_sfile
1023#if SIZEOF_LONG < SIZEOF_LONG_LONG
1024# if SIZEOF_LONG_LONG == SIZEOF_VOIDP
1027# define _HAVE_LLP64_
1029# define _HAVE_SANE_QUAD_
1030# define quad_t LONG_LONG
1031# define u_quad_t unsigned LONG_LONG
1033#define FLOATING_POINT 1
1034#define BSD__dtoa ruby_dtoa
1035#define BSD__hdtoa ruby_hdtoa
1036#ifdef RUBY_PRI_VALUE_MARK
1037# define PRI_EXTRA_MARK RUBY_PRI_VALUE_MARK
1039#define lower_hexdigits (ruby_hexdigits+0)
1040#define upper_hexdigits (ruby_hexdigits+16)
1041#include "vsnprintf.c"
1044ruby_ultoa(
unsigned long val,
char *endp,
int base,
int flags)
1046 const char *xdigs = lower_hexdigits;
1047 int octzero = flags & FSHARP;
1048 return BSD__ultoa(val, endp, base, octzero, xdigs);
1051static int ruby_do_vsnprintf(
char *str,
size_t n,
const char *fmt, va_list ap);
1056 if (str && (ssize_t)n < 1)
1058 return ruby_do_vsnprintf(str, n, fmt, ap);
1062ruby_do_vsnprintf(
char *str,
size_t n,
const char *fmt, va_list ap)
1067 f._flags = __SWR | __SSTR;
1068 f._bf._base = f._p = (
unsigned char *)str;
1069 f._bf._size = f._w = str ? (n - 1) : 0;
1070 f.vwrite = BSD__sfvwrite;
1072 ret = BSD_vfprintf(&f, fmt, ap);
1074#if SIZEOF_SIZE_T > SIZEOF_INT
1075 if (n > INT_MAX)
return INT_MAX;
1086 if (str && (ssize_t)n < 1)
1090 ret = ruby_do_vsnprintf(str, n, fmt, ap);
1096 rb_printf_buffer base;
1097 volatile VALUE value;
1101ruby__sfvwrite(
register rb_printf_buffer *fp,
register struct __suio *uio)
1105 char *buf = (
char*)fp->_p;
1107 rb_len_t blen = buf - RSTRING_PTR(result), bsiz = fp->_w;
1109 if (
RBASIC(result)->klass) {
1112 if (uio->uio_resid == 0)
1114#if SIZE_MAX > RB_LEN_MAX
1122 for (iov = uio->uio_iov;
len > 0; ++iov) {
1123 MEMCPY(buf, iov->iov_base,
char, n = iov->iov_len);
1127 fp->_p = (
unsigned char *)buf;
1133ruby__sfvextra(rb_printf_buffer *fp,
size_t valsize,
void *valp,
long *sz,
int sign)
1139 if (valsize !=
sizeof(
VALUE))
return 0;
1140 value = *(
VALUE *)valp;
1141 if (
RBASIC(result)->klass) {
1145# define LITERAL(str) (*sz = rb_strlen_lit(str), str)
1148# define LITERAL_CASE(x) case Q##x: return LITERAL(#x)
1151 LITERAL_CASE(
false);
1159 if (sign ==
' ' && !rb_str_symname_p(value)) {
1160 value = rb_str_escape(value);
1165 if (sign ==
' ') value = QUOTE(value);
1167 enc = rb_enc_compatible(result, value);
1168 if (enc && rb_enc_asciicompat(enc)) {
1169 rb_enc_associate(result, enc);
1172 enc = rb_enc_get(result);
1176 *(
volatile VALUE *)valp = value;
1179#if SIZEOF_RB_LEN_T > SIZEOF_LONG
1181 if (RSTRING_LEN(value) > LONG_MAX) {
1182 rb_raise(rb_eArgError,
"string size too big");
1185 cp = RSTRING_PTR(value);
1186 *sz = (long)RSTRING_LEN(value);
1192ruby_vsprintf0(
VALUE result,
char *p,
const char *fmt, va_list ap)
1195#define f buffer.base
1202 f._flags = __SWR | __SSTR;
1205 f._bf._base = (
unsigned char *)result;
1206 f._p = (
unsigned char *)p;
1207 RBASIC_CLEAR_CLASS(result);
1208 f.vwrite = ruby__sfvwrite;
1209 f.vextra = ruby__sfvextra;
1211 BSD_vfprintf(&f, fmt, ap);
1212 RBASIC_SET_CLASS_RAW(result, klass);
1213 p = RSTRING_PTR(result);
1221 rb_str_resize(result, blen);
1228 if (!rb_enc_asciicompat(enc)) {
1237 const int initial_len = 120;
1242 rb_enc_associate(result, enc_check(enc));
1244 ruby_vsprintf0(result, RSTRING_PTR(result), fmt, ap);
1254 va_start(ap, format);
1268rb_sprintf(
const char *format, ...)
1273 va_start(ap, format);
1281rb_str_vcatf(
VALUE str,
const char *fmt, va_list ap)
1284 enc_check(rb_enc_get(str));
1292rb_str_catf(
VALUE str,
const char *format, ...)
1296 va_start(ap, format);
1297 str = rb_str_vcatf(str, format, ap);
#define RUBY_ASSERT(...)
Asserts that the given expression is truthy if and only if RUBY_DEBUG is truthy.
ruby_coderange_type
What rb_enc_str_coderange() returns.
static bool rb_enc_isprint(OnigCodePoint c, rb_encoding *enc)
Identical to rb_isprint(), except it additionally takes an encoding.
static bool rb_enc_isdigit(OnigCodePoint c, rb_encoding *enc)
Identical to rb_isdigit(), except it additionally takes an encoding.
VALUE rb_enc_vsprintf(rb_encoding *enc, const char *fmt, va_list ap)
Identical to rb_enc_sprintf(), except it takes a va_list instead of variadic arguments.
VALUE rb_enc_sprintf(rb_encoding *enc, const char *fmt,...)
Identical to rb_sprintf(), except it additionally takes an encoding.
#define TYPE(_)
Old name of rb_type.
#define RB_INTEGER_TYPE_P
Old name of rb_integer_type_p.
#define ENC_CODERANGE_7BIT
Old name of RUBY_ENC_CODERANGE_7BIT.
#define ENC_CODERANGE_VALID
Old name of RUBY_ENC_CODERANGE_VALID.
#define RFLOAT_VALUE
Old name of rb_float_value.
#define T_STRING
Old name of RUBY_T_STRING.
#define Qundef
Old name of RUBY_Qundef.
#define INT2FIX
Old name of RB_INT2FIX.
#define T_FLOAT
Old name of RUBY_T_FLOAT.
#define T_BIGNUM
Old name of RUBY_T_BIGNUM.
#define ECONV_UNDEF_REPLACE
Old name of RUBY_ECONV_UNDEF_REPLACE.
#define T_FIXNUM
Old name of RUBY_T_FIXNUM.
#define ENC_CODERANGE(obj)
Old name of RB_ENC_CODERANGE.
#define ENC_CODERANGE_UNKNOWN
Old name of RUBY_ENC_CODERANGE_UNKNOWN.
#define FIXABLE
Old name of RB_FIXABLE.
#define LONG2FIX
Old name of RB_INT2FIX.
#define ECONV_INVALID_REPLACE
Old name of RUBY_ECONV_INVALID_REPLACE.
#define T_RATIONAL
Old name of RUBY_T_RATIONAL.
#define T_HASH
Old name of RUBY_T_HASH.
#define LONG2NUM
Old name of RB_LONG2NUM.
#define NUM2INT
Old name of RB_NUM2INT.
#define Qnil
Old name of RUBY_Qnil.
#define Qfalse
Old name of RUBY_Qfalse.
#define FIX2LONG
Old name of RB_FIX2LONG.
#define NIL_P
Old name of RB_NIL_P.
#define FIXNUM_P
Old name of RB_FIXNUM_P.
#define ENC_CODERANGE_SET(obj, cr)
Old name of RB_ENC_CODERANGE_SET.
#define SYMBOL_P
Old name of RB_SYMBOL_P.
#define ruby_verbose
This variable controls whether the interpreter is in debug mode.
VALUE rb_eEncCompatError
Encoding::CompatibilityError exception.
VALUE rb_eRuntimeError
RuntimeError exception.
void rb_warn(const char *fmt,...)
Identical to rb_warning(), except it reports unless $VERBOSE is nil.
void rb_enc_raise(rb_encoding *enc, VALUE exc, const char *fmt,...)
Identical to rb_raise(), except it additionally takes an encoding.
VALUE rb_Float(VALUE val)
This is the logic behind Kernel#Float.
VALUE rb_Integer(VALUE val)
This is the logic behind Kernel#Integer.
VALUE rb_inspect(VALUE obj)
Generates a human-readable textual representation of the given object.
static char * rb_enc_right_char_head(const char *s, const char *p, const char *e, rb_encoding *enc)
Queries the right boundary of a character.
rb_len_t rb_enc_strlen(const char *head, const char *tail, rb_encoding *enc)
Counts the number of characters of the passed string, according to the passed encoding.
rb_len_t rb_str_coderange_scan_restartable(const char *str, const char *end, rb_encoding *enc, int *cr)
Scans the passed string until it finds something odd.
VALUE rb_str_conv_enc_opts(VALUE str, rb_encoding *from, rb_encoding *to, int ecflags, VALUE ecopts)
Identical to rb_str_conv_enc(), except it additionally takes IO encoder options.
char * rb_enc_nth(const char *head, const char *tail, rb_len_t nth, rb_encoding *enc)
Queries the n-th character.
VALUE rb_check_symbol_cstr(const char *ptr, rb_len_t len, rb_encoding *enc)
Identical to rb_check_id_cstr(), except for the return type.
#define INTEGER_PACK_BIG_ENDIAN
Big endian combination.
#define INTEGER_PACK_2COMP
Uses 2's complement representation.
VALUE rb_int_positive_pow(long x, unsigned long y)
Raises the passed x to the power of y.
VALUE rb_rational_num(VALUE rat)
Queries the numerator of the passed Rational.
VALUE rb_rational_den(VALUE rat)
Queries the denominator of the passed Rational.
#define rb_str_new(str, len)
Allocates an instance of rb_cString.
size_t rb_str_capacity(VALUE str)
Queries the capacity of the given string.
void rb_str_set_len(VALUE str, rb_len_t len)
Overwrites the length of the string.
void rb_must_asciicompat(VALUE obj)
Asserts that the given string's encoding is (Ruby's definition of) ASCII compatible.
VALUE rb_str_buf_new(rb_len_t capa)
Allocates a "string buffer".
VALUE rb_check_string_type(VALUE obj)
Try converting an object to its stringised representation using its to_str method,...
VALUE rb_obj_as_string(VALUE obj)
Try converting an object to its stringised representation using its to_s method, if any.
VALUE rb_sym2str(VALUE symbol)
Obtain a frozen string representation of a symbol (not including the leading colon).
int len
Length of the buffer.
VALUE rb_str_format(int argc, const VALUE *argv, VALUE fmt)
Formats a string.
VALUE rb_f_sprintf(int argc, const VALUE *argv)
Identical to rb_str_format(), except how the arguments are arranged.
VALUE rb_vsprintf(const char *fmt, va_list ap)
Identical to rb_sprintf(), except it takes a va_list.
#define rb_len2int
Just another name of rb_len2int_inline.
#define MEMCPY(p1, p2, type, n)
Handy macro to call memcpy.
#define RB_GC_GUARD(v)
Prevents premature destruction of local objects.
#define RARRAY_LEN
Just another name of rb_array_len.
#define RARRAY_CONST_PTR
Just another name of rb_array_const_ptr.
#define RBASIC(obj)
Convenient casting macro.
#define StringValue(v)
Ensures that the parameter object is a String.
static char * RSTRING_END(VALUE str)
Queries the end of the contents pointer of the string.
#define RSTRING_GETMEM(str, ptrvar, lenvar)
Convenient macro to obtain the contents and length at once.
#define StringValueCStr(v)
Identical to StringValuePtr, except it additionally checks for the contents for viability as a C stri...
int ruby_vsnprintf(char *str, size_t n, char const *fmt, va_list ap)
Identical to ruby_snprintf(), except it takes a va_list.
int ruby_snprintf(char *str, size_t n, char const *fmt,...)
Our own locale-insensitive version of snprintf(3).
#define RTEST
This is an old name of RB_TEST.
long rb_len_t
A signed integer type for lengths and indices of objects such as String and Array.
#define RB_LEN_MAX
Maximum possible value that a rb_len_t can take.
intptr_t SIGNED_VALUE
A signed integer type that has the same width with VALUE.
uintptr_t VALUE
Type that represents a Ruby object.
static bool RB_TYPE_P(VALUE obj, enum ruby_value_type t)
Queries if the given object is of given type.