summaryrefslogtreecommitdiff
path: root/sprintf.c
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2022-08-30 18:12:08 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2022-08-31 17:27:59 +0900
commit576bdec03f0d58847690a0607c788ada433ce60f (patch)
treeda8277b325bfa1c033c2572662a6e781b589ae0f /sprintf.c
parent9dc60653db186b1ae9400ed75b413a07728ce6ff (diff)
downloadruby-576bdec03f0d58847690a0607c788ada433ce60f.tar.gz
[Bug #18973] Promote US-ASCII to ASCII-8BIT when adding 8-bit char
Diffstat (limited to 'sprintf.c')
-rw-r--r--sprintf.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/sprintf.c b/sprintf.c
index b2bdd4a072..bfe25e1d3c 100644
--- a/sprintf.c
+++ b/sprintf.c
@@ -454,13 +454,18 @@ rb_str_format(int argc, const VALUE *argv, VALUE fmt)
str = tmp;
goto format_s1;
}
- else {
- n = NUM2INT(val);
- if (n >= 0) n = rb_enc_codelen((c = n), enc);
- }
+ n = NUM2INT(val);
+ if (n >= 0) n = rb_enc_codelen((c = n), enc);
if (n <= 0) {
rb_raise(rb_eArgError, "invalid character");
}
+ int encidx = rb_ascii8bit_appendable_encoding_index(enc, c);
+ if (encidx >= 0 && encidx != rb_enc_to_index(enc)) {
+ /* special case */
+ rb_enc_associate_index(result, encidx);
+ enc = rb_enc_from_index(encidx);
+ coderange = ENC_CODERANGE_VALID;
+ }
if (!(flags & FWIDTH)) {
CHECK(n);
rb_enc_mbcput(c, &buf[blen], enc);