diff options
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | pack.c | 15 | ||||
-rw-r--r-- | test/ruby/test_pack.rb | 8 |
3 files changed, 25 insertions, 3 deletions
@@ -1,3 +1,8 @@ +Thu Nov 6 23:58:40 2014 Nobuyoshi Nakada <nobu@ruby-lang.org> + + * pack.c (pack_pack): escape unprintable characters and preserve + the encoding of warning message. + Thu Nov 6 23:55:18 2014 Nobuyoshi Nakada <nobu@ruby-lang.org> * string.c (sym_printable): QUOTE() should not raise an exception @@ -912,10 +912,19 @@ pack_pack(VALUE ary, VALUE fmt) } break; - default: - rb_warning("unknown pack directive '%c' in '%s'", - type, RSTRING_PTR(fmt)); + default: { + char unknown[5]; + if (ISPRINT(type)) { + unknown[0] = type; + unknown[1] = '\0'; + } + else { + snprintf(unknown, sizeof(unknown), "\\x%.2x", type & 0xff); + } + rb_warning("unknown pack directive '%s' in '% "PRIsVALUE"'", + unknown, fmt); break; + } } } diff --git a/test/ruby/test_pack.rb b/test/ruby/test_pack.rb index 59edc3eb4b..5d2b656058 100644 --- a/test/ruby/test_pack.rb +++ b/test/ruby/test_pack.rb @@ -718,5 +718,13 @@ EXPECTED assert_warning(/unknown pack directive ',' in ','/) { [].pack(",") } + assert_warning(/\A[ -~]+\Z/) { + [].pack("\x7f") + } + assert_warning(/\A(.* in '\u{3042}'\n)+\z/) { + EnvUtil.with_default_external(Encoding::UTF_8) { + [].pack("\u{3042}") + } + } end end |