From e05c30738ead860f7d59fe1de7cd14cad2b36cc0 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Sat, 29 Apr 2017 10:07:04 +0900 Subject: Use `FILL` and `PUSH` Instead of loop or `memcpy` after `CHECK`, use dedicated macros, `FILL` and `PUSH`, respectively. --- mrbgems/mruby-sprintf/src/sprintf.c | 45 +++++++++---------------------------- 1 file changed, 10 insertions(+), 35 deletions(-) (limited to 'mrbgems/mruby-sprintf/src') diff --git a/mrbgems/mruby-sprintf/src/sprintf.c b/mrbgems/mruby-sprintf/src/sprintf.c index 7dab63a17..d99d74efc 100644 --- a/mrbgems/mruby-sprintf/src/sprintf.c +++ b/mrbgems/mruby-sprintf/src/sprintf.c @@ -716,21 +716,15 @@ retry: c = RSTRING_PTR(tmp); n = RSTRING_LEN(tmp); if (!(flags & FWIDTH)) { - CHECK(n); - memcpy(buf+blen, c, n); - blen += n; + PUSH(c, n); } else if ((flags & FMINUS)) { - CHECK(n); - memcpy(buf+blen, c, n); - blen += n; + PUSH(c, n); if (width>0) FILL(' ', width-1); } else { if (width>0) FILL(' ', width-1); - CHECK(n); - memcpy(buf+blen, c, n); - blen += n; + PUSH(c, n); } } break; @@ -768,19 +762,11 @@ retry: if ((flags&FWIDTH) && (width > slen)) { width -= (int)slen; if (!(flags&FMINUS)) { - CHECK(width); - while (width-- > 0) { - buf[blen++] = ' '; - } + FILL(' ', width); } - CHECK(len); - memcpy(&buf[blen], RSTRING_PTR(str), len); - blen += len; + PUSH(RSTRING_PTR(str), len); if (flags&FMINUS) { - CHECK(width); - while (width-- > 0) { - buf[blen++] = ' '; - } + FILL(' ', width); } break; } @@ -986,10 +972,7 @@ retry: } if (!(flags&FMINUS) && width > 0) { - CHECK(width); - while (width-- > 0) { - buf[blen++] = ' '; - } + FILL(' ', width); } if (sc) PUSH(&sc, 1); @@ -998,28 +981,20 @@ retry: int plen = (int)strlen(prefix); PUSH(prefix, plen); } - CHECK(prec - len); if (dots) PUSH("..", 2); if (v < 0) { char c = sign_bits(base, p); - while (len < prec--) { - buf[blen++] = c; - } + FILL(c, prec - len); } else if ((flags & (FMINUS|FPREC)) != FMINUS) { char c = '0'; - while (len < prec--) { - buf[blen++] = c; - } + FILL(c, prec - len); } PUSH(s, len); if (width > 0) { - CHECK(width); - while (width-- > 0) { - buf[blen++] = ' '; - } + FILL(' ', width); } } break; -- cgit v1.2.3 From ef6e14ee2b1037ed3e8c08bc215d82cd22816ba3 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Sat, 29 Apr 2017 10:17:24 +0900 Subject: Better error message Raise argument error with the better message, at the only place where the size to fill can be negative. --- mrbgems/mruby-sprintf/src/sprintf.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'mrbgems/mruby-sprintf/src') diff --git a/mrbgems/mruby-sprintf/src/sprintf.c b/mrbgems/mruby-sprintf/src/sprintf.c index d99d74efc..080e2549d 100644 --- a/mrbgems/mruby-sprintf/src/sprintf.c +++ b/mrbgems/mruby-sprintf/src/sprintf.c @@ -116,7 +116,6 @@ mrb_fix2binstr(mrb_state *mrb, mrb_value x, int base) #define CHECK(l) do {\ /* int cr = ENC_CODERANGE(result);*/\ - if ((l) < 0) mrb_raise(mrb, E_ARGUMENT_ERROR, "illegal specifier"); \ while ((l) >= bsiz - blen) {\ bsiz*=2;\ if (bsiz < 0) mrb_raise(mrb, E_ARGUMENT_ERROR, "too big specifier"); \ @@ -1059,6 +1058,10 @@ retry: if ((flags&FWIDTH) && need < width) need = width; need += 20; + if (need <= 0) { + mrb_raise(mrb, E_ARGUMENT_ERROR, + (width > prec ? "width too big" : "prec too big")); + } CHECK(need); n = snprintf(&buf[blen], need, fbuf, fval); -- cgit v1.2.3