commit 0fadf0cd7e23607dcada424bc3b5f8b3b1b1b5b1 Author: Gearnode Date: Sat Apr 11 18:04:27 2020 +0200 add %q sprintf option format diff --git a/sprintf.c b/sprintf.c index f726b7ebe6..2ac2c1ae4f 100644 --- a/sprintf.c +++ b/sprintf.c @@ -473,9 +473,9 @@ rb_str_format(int argc, const VALUE *argv, VALUE fmt) } } break; - - case 's': - case 'p': + case 'q': + case 's': + case 'p': format_s: { VALUE arg = GETARG(); @@ -484,9 +484,14 @@ rb_str_format(int argc, const VALUE *argv, VALUE fmt) if (*p == 'p') { str = rb_inspect(arg); } + else if (*p == 'q') { + str = rb_obj_as_string(arg); + str = rb_str_dump(str); + } else { str = rb_obj_as_string(arg); } + len = RSTRING_LEN(str); rb_str_set_len(result, blen); if (coderange != ENC_CODERANGE_BROKEN && scanned < blen) { diff --git a/test/ruby/test_sprintf.rb b/test/ruby/test_sprintf.rb index 7986e9d141..4d968748e4 100644 --- a/test/ruby/test_sprintf.rb +++ b/test/ruby/test_sprintf.rb @@ -378,6 +378,12 @@ def test_string assert_equal("foo" + " " * BSIZ, sprintf("%-#{ BSIZ + 3 }s", "foo")) end + def test_quoted_string + assert_equal(%q{"foo"}, sprintf("%q", "foo")) + assert_equal(%q{"foo\n bar"}, sprintf("%q", "foo\n bar")) + assert_equal(%q{"foo\r bar"}, sprintf("%q", "foo\r bar")) + end + def test_integer assert_equal("01", sprintf("%#o", 1)) assert_equal("0x1", sprintf("%#x", 1))