[#37248] [Feature:1.9] Enumerator#inspect — "Yusuke ENDOH" <mame@...>

遠藤です。

12 messages 2008/12/02

[#37337] [Feature #841] Object#self — "rubikitch ." <redmine@...>

Feature #841: Object#self

13 messages 2008/12/09

[#37513] Current status of 1.9.1 RC1's issues — "Yugui (Yuki Sonoda)" <yugui@...>

Hi, folks

14 messages 2008/12/20
[#37516] Re: Current status of 1.9.1 RC1's issues — Masatoshi SEKI <m_seki@...> 2008/12/20

咳といいます。

[#37576] [BUG:trunk] encoding for stdio's — "Yugui (Yuki Sonoda)" <yugui@...>

Yuguiです。

11 messages 2008/12/24

[ruby-dev:37289] '*' parameter in pack format 'M', 'm', or 'P' acts oddly

From: "Yugui (Yuki Sonoda)" <yugui@...>
Date: 2008-12-06 12:29:36 UTC
List: ruby-dev #37289
Yuguiです。

Array#packにおいて、"M<number>"や"m<number>"は出力の1行の長さを、
"P<number>"は対応する文字列(バイト列)の長さを表します。

にもかかわらず、"M*"や"m*", "P*"を指定するとアスタリスクが他のフォーマッ
トにおける場合同じく余っている配列要素の個数に展開されます。

結果として、何だか妙な挙動になります。
["abc"*5, "d", "e", "f"].pack('m*')
  #=> "YWJj\nYWJj\nYWJj\nYWJj\nYWJj\n"
["abc"*5, "d", "e", "f", "g", "h"].pack('m*')
  #=> "YWJjYWJj\nYWJjYWJj\nYWJj\n"

["a"].pack("P*")      #=> "\220\a9\001"
["a", "b"].pack("P*") #=> ArgumentError: too short buffer for P(1 for 2)


この3つのフォーマットではアスタリスクは単に無視するのが良いのではないか
と思いまして、添付のような修正を書いてみました。いかがでしょう?

-- 
Yugui <yugui@yugui.jp>
http://yugui.jp
私は私をDumpする

Attachments (1)

pack.diff (383 Bytes, text/x-diff)
diff --git a/pack.c b/pack.c
index 718f977..b02449a 100644
--- a/pack.c
+++ b/pack.c
@@ -491,7 +491,9 @@ pack_pack(VALUE ary, VALUE fmt)
 	    }
 	}
 	if (*p == '*') {	/* set data length */
-	    len = strchr("@Xxu", type) ? 0 : items;
+	    len = strchr("@Xxu", type) ? 0
+                : strchr("PMm", type) ? 1
+                : items;
 	    p++;
 	}
 	else if (ISDIGIT(*p)) {

In This Thread

Prev Next