diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2014-11-06 14:58:43 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2014-11-06 14:58:43 +0000 |
commit | 1f53145dd467ebdb5d25a234f69d774ba0086afe (patch) | |
tree | 11fd401966c6af2024d4231a766a0f566ea5f973 | |
parent | fa892d27af38ef0685e944bf3a26390ef336b2ba (diff) | |
download | ruby-1f53145dd467ebdb5d25a234f69d774ba0086afe.tar.gz |
pack.c: escape and encoding
* pack.c (pack_pack): escape unprintable characters and preserve
the encoding of warning message.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@48307 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-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 |