From bd502f6d7b2e5e0c059ff01570f5ad9f9fccb745 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Thu, 4 Jul 2024 22:51:14 +0900 Subject: [PATCH] mruby-sprintf: support Big integers for %d etc. --- mrbgems/mruby-sprintf/src/sprintf.c | 48 ++++++++++++++++++----------- 1 file changed, 30 insertions(+), 18 deletions(-) diff --git a/mrbgems/mruby-sprintf/src/sprintf.c b/mrbgems/mruby-sprintf/src/sprintf.c index eec001264..1cfe0a921 100644 --- a/mrbgems/mruby-sprintf/src/sprintf.c +++ b/mrbgems/mruby-sprintf/src/sprintf.c @@ -9,6 +9,7 @@ #include #include #include +#include #include #include @@ -864,24 +865,6 @@ retry: } } - bin_retry: - switch (mrb_type(val)) { -#ifndef MRB_NO_FLOAT - case MRB_TT_FLOAT: - val = mrb_float_to_integer(mrb, val); - goto bin_retry; -#endif - case MRB_TT_STRING: - val = mrb_str_to_integer(mrb, val, 0, TRUE); - goto bin_retry; - case MRB_TT_INTEGER: - v = mrb_integer(val); - break; - default: - v = mrb_as_int(mrb, val); - break; - } - switch (*p) { case 'o': base = 8; break; @@ -900,6 +883,33 @@ retry: base = 10; break; } + bin_retry: + switch (mrb_type(val)) { +#ifndef MRB_NO_FLOAT + case MRB_TT_FLOAT: + val = mrb_float_to_integer(mrb, val); + goto bin_retry; +#endif +#ifdef MRB_USE_BIGINT + case MRB_TT_BIGINT: + { + mrb_value str = mrb_bint_to_s(mrb, val, base); + s = RSTRING_PTR(str); + len = RSTRING_LEN(str); + } + goto str_skip; +#endif + case MRB_TT_STRING: + val = mrb_str_to_integer(mrb, val, 0, TRUE); + goto bin_retry; + case MRB_TT_INTEGER: + v = mrb_integer(val); + break; + default: + v = mrb_as_int(mrb, val); + break; + } + if (sign) { if (v >= 0) { if (flags & FPLUS) { @@ -925,6 +935,7 @@ retry: dots = 1; } } + { size_t size; size = strlen(s); @@ -932,6 +943,7 @@ retry: len = (int)size; } + str_skip: if (*p == 'X') { char *pp = s; int c;