Skip to content

Commit

Permalink
"backport" CRuby r46756; ref #3500
Browse files Browse the repository at this point in the history
  • Loading branch information
matz committed Sep 25, 2020
1 parent 4719b12 commit 4b27549
Showing 1 changed file with 12 additions and 10 deletions.
22 changes: 12 additions & 10 deletions mrbgems/mruby-sprintf/src/sprintf.c
Expand Up @@ -192,9 +192,9 @@ check_name_arg(mrb_state *mrb, int posarg, const char *name, size_t len)
#define GETNTHARG(nth) \
((nth >= argc) ? (mrb_raise(mrb, E_ARGUMENT_ERROR, "too few arguments"), mrb_undef_value()) : argv[nth])

#define GETNAMEARG(id, name, len) (\
#define CHECKNAMEARG(name, len) (\
check_name_arg(mrb, posarg, name, len),\
(posarg = -2, mrb_hash_fetch(mrb, get_hash(mrb, &hash, argc, argv), id, mrb_undef_value())))
posarg = -2)

#define GETNUM(n, val) do { \
if (!(p = get_num(mrb, p, end, &(n)))) \
Expand Down Expand Up @@ -236,20 +236,20 @@ get_num(mrb_state *mrb, const char *p, const char *end, mrb_int *valp)
return p;
}

static mrb_value
static void
get_hash(mrb_state *mrb, mrb_value *hash, mrb_int argc, const mrb_value *argv)
{
mrb_value tmp;

if (!mrb_undef_p(*hash)) return *hash;
if (!mrb_undef_p(*hash)) return;
if (argc != 2) {
mrb_raise(mrb, E_ARGUMENT_ERROR, "one hash required");
}
tmp = mrb_check_hash_type(mrb, argv[1]);
if (mrb_nil_p(tmp)) {
mrb_raise(mrb, E_ARGUMENT_ERROR, "one hash required");
}
return (*hash = tmp);
*hash = tmp;
}

/*
Expand Down Expand Up @@ -690,18 +690,20 @@ mrb_str_format(mrb_state *mrb, mrb_int argc, const mrb_value *argv, mrb_value fm
case '{': {
const char *start = p;
char term = (*p == '<') ? '>' : '}';
mrb_value symname;

for (; p < end && *p != term; )
p++;
if (id) {
mrb_raisef(mrb, E_ARGUMENT_ERROR, "name%l after <%n>",
start, p - start + 1, id);
}
symname = mrb_str_new(mrb, start + 1, p - start - 1);
id = mrb_intern_str(mrb, symname);
nextvalue = GETNAMEARG(mrb_symbol_value(id), start, p - start + 1);
if (mrb_undef_p(nextvalue)) {
CHECKNAMEARG(start, p - start + 1);
get_hash(mrb, &hash, argc, argv);
id = mrb_check_intern(mrb, start + 1, p - start - 1);
if (id) {
nextvalue = mrb_hash_fetch(mrb, hash, mrb_symbol_value(id), mrb_undef_value());
}
if (!id || mrb_undef_p(nextvalue)) {
mrb_raisef(mrb, E_KEY_ERROR, "key%l not found", start, p - start + 1);
}
if (term == '}') goto format_s;
Expand Down

0 comments on commit 4b27549

Please sign in to comment.