summaryrefslogtreecommitdiff
path: root/sprintf.c
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2022-08-21 20:06:39 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2022-08-21 20:06:39 +0900
commitb043dd9c5dd7b5c46580e49ad38b49d5cb5beaf1 (patch)
treee0cd905f1ba976610815435e4d54021967b17199 /sprintf.c
parent0cc989696e9a7d0386773d23aa64de8fc04ea9fe (diff)
downloadruby-b043dd9c5dd7b5c46580e49ad38b49d5cb5beaf1.tar.gz
Check the room including the space to fill
Diffstat (limited to 'sprintf.c')
-rw-r--r--sprintf.c16
1 files changed, 9 insertions, 7 deletions
diff --git a/sprintf.c b/sprintf.c
index 22323265b3..32a72439af 100644
--- a/sprintf.c
+++ b/sprintf.c
@@ -460,14 +460,16 @@ rb_str_format(int argc, const VALUE *argv, VALUE fmt)
blen += n;
}
else if ((flags & FMINUS)) {
- CHECK(n);
+ --width;
+ CHECK(n + (width > 0 ? width : 0));
rb_enc_mbcput(c, &buf[blen], enc);
blen += n;
- if (width > 1) FILL(' ', width-1);
+ if (width > 0) FILL_(' ', width);
}
else {
- if (width > 1) FILL(' ', width-1);
- CHECK(n);
+ --width;
+ CHECK(n + (width > 0 ? width : 0));
+ if (width > 0) FILL_(' ', width);
rb_enc_mbcput(c, &buf[blen], enc);
blen += n;
}
@@ -512,16 +514,16 @@ rb_str_format(int argc, const VALUE *argv, VALUE fmt)
/* need to adjust multi-byte string pos */
if ((flags&FWIDTH) && (width > slen)) {
width -= (int)slen;
+ CHECK(len + width);
if (!(flags&FMINUS)) {
- FILL(' ', width);
+ FILL_(' ', width);
width = 0;
}
- CHECK(len);
memcpy(&buf[blen], RSTRING_PTR(str), len);
RB_GC_GUARD(str);
blen += len;
if (flags&FMINUS) {
- FILL(' ', width);
+ FILL_(' ', width);
}
rb_enc_associate(result, enc);
break;