* sprintf.c (rb_str_format): use FILL and FILL_ macros instead of
  while loop.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@58021 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2017-03-19 12:46:31 +00:00
Родитель d8bf178531
Коммит f30ed02b8a
1 изменённых файлов: 13 добавлений и 24 удалений

Просмотреть файл

@ -74,6 +74,7 @@ sign_bits(int base, const char *p)
} while (0) } while (0)
#define FILL(c, l) do { \ #define FILL(c, l) do { \
if ((l) <= 0) break;\
CHECK(l);\ CHECK(l);\
FILL_(c, l);\ FILL_(c, l);\
} while (0) } while (0)
@ -758,20 +759,15 @@ rb_str_format(int argc, const VALUE *argv, VALUE fmt)
if ((flags&FWIDTH) && (width > slen)) { if ((flags&FWIDTH) && (width > slen)) {
width -= (int)slen; width -= (int)slen;
if (!(flags&FMINUS)) { if (!(flags&FMINUS)) {
CHECK(width); FILL(' ', width);
while (width--) { width = 0;
buf[blen++] = ' ';
}
} }
CHECK(len); CHECK(len);
memcpy(&buf[blen], RSTRING_PTR(str), len); memcpy(&buf[blen], RSTRING_PTR(str), len);
RB_GC_GUARD(str); RB_GC_GUARD(str);
blen += len; blen += len;
if (flags&FMINUS) { if (flags&FMINUS) {
CHECK(width); FILL(' ', width);
while (width--) {
buf[blen++] = ' ';
}
} }
rb_enc_associate(result, enc); rb_enc_associate(result, enc);
break; break;
@ -1009,10 +1005,8 @@ rb_str_format(int argc, const VALUE *argv, VALUE fmt)
width -= prec; width -= prec;
} }
if (!(flags&FMINUS)) { if (!(flags&FMINUS)) {
CHECK(width); FILL(' ', width);
while (width-- > 0) { width = 0;
buf[blen++] = ' ';
}
} }
if (sc) PUSH(&sc, 1); if (sc) PUSH(&sc, 1);
if (prefix) { if (prefix) {
@ -1021,23 +1015,18 @@ rb_str_format(int argc, const VALUE *argv, VALUE fmt)
} }
CHECK(prec - len); CHECK(prec - len);
if (dots) PUSH("..", 2); if (dots) PUSH("..", 2);
if (!sign && valsign < 0) { if (prec > len) {
char c = sign_bits(base, p); if (!sign && valsign < 0) {
while (len < prec--) { char c = sign_bits(base, p);
buf[blen++] = c; FILL_(c, prec - len);
} }
} else if ((flags & (FMINUS|FPREC)) != FMINUS) {
else if ((flags & (FMINUS|FPREC)) != FMINUS) { FILL_('0', prec - len);
while (len < prec--) {
buf[blen++] = '0';
} }
} }
PUSH(s, len); PUSH(s, len);
RB_GC_GUARD(tmp); RB_GC_GUARD(tmp);
CHECK(width); FILL(' ', width);
while (width-- > 0) {
buf[blen++] = ' ';
}
} }
break; break;