ruby-changes:17522
From: naruse <ko1@a...>
Date: Mon, 18 Oct 2010 13:12:41 +0900 (JST)
Subject: [ruby-changes:17522] Ruby:r29527 (trunk): * pack.c (pack_pack): Add native size option ! to q and Q.
naruse 2010-10-18 13:12:35 +0900 (Mon, 18 Oct 2010) New Revision: 29527 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=29527 Log: * pack.c (pack_pack): Add native size option ! to q and Q. [ruby-dev:42375] * pack.c (pack_unpack): ditto. Modified files: trunk/ChangeLog trunk/pack.c trunk/test/ruby/test_pack.rb Index: ChangeLog =================================================================== --- ChangeLog (revision 29526) +++ ChangeLog (revision 29527) @@ -1,3 +1,10 @@ +Mon Oct 18 12:00:12 2010 NARUSE, Yui <naruse@r...> + + * pack.c (pack_pack): Add native size option ! to q and Q. + [ruby-dev:42375] + + * pack.c (pack_unpack): ditto. + Mon Oct 18 12:58:40 2010 Tanaka Akira <akr@f...> * pack.c (pack_pack): refine the document. [ruby-dev:42397] Index: pack.c =================================================================== --- pack.c (revision 29526) +++ pack.c (revision 29527) @@ -20,10 +20,6 @@ ((__GNUC__ > (major)) || \ (__GNUC__ == (major) && __GNUC_MINOR__ > (minor)) || \ (__GNUC__ == (major) && __GNUC_MINOR__ == (minor) && __GNUC_PATCHLEVEL__ >= (patchlevel)))) - -#define SIZE16 2 -#define SIZE32 4 - #if SIZEOF_SHORT != 2 || SIZEOF_LONG != 4 # define NATINT_PACK #endif @@ -52,8 +48,15 @@ #ifdef NATINT_PACK # define NATINT_LEN(type,len) (natint?(int)sizeof(type):(int)(len)) +# ifdef LONG_LONG_ +# define NATLL_LEN() NATINT_LEN(LONG_LONG, 8); +# else +# define NATLL_LEN() natint ? \ + rb_raise(rb_eNotImpError,"this machine doesn't have long long"),0 : 8 +# endif #else # define NATINT_LEN(type,len) ((int)sizeof(type)) +# define NATLL_LEN() 8 #endif #if SIZEOF_LONG == 8 @@ -280,7 +283,6 @@ return 0; /* not reached */ } -#define QUAD_SIZE 8 #define MAX_INTEGER_PACK_SIZE 8 /* #define FORCE_BIG_PACK */ @@ -333,10 +335,12 @@ * S_, S! | Integer | unsigned short, native endian * I, I_, I! | Integer | unsigned int, native endian * L_, L! | Integer | unsigned long, native endian + * Q_, Q! | Integer | unsigned long long, native endian * | | * s_, s! | Integer | signed short, native endian * i, i_, i! | Integer | signed int, native endian * l_, l! | Integer | signed long, native endian + * q_, q! | Integer | signed long long, native endian * | | * S> L> Q> | Integer | same as the directives without ">" except * s> l> q> | | big endian @@ -442,7 +446,7 @@ } { - static const char natstr[] = "sSiIlL"; + static const char natstr[] = "sSiIlLqQ"; static const char endstr[] = "sSiIlLqQ"; modifiers: @@ -716,13 +720,13 @@ case 'q': /* signed quad (64bit) int */ signed_p = 1; - integer_size = 8; + integer_size = NATLL_LEN(); bigendian_p = BIGENDIAN_P(); goto pack_integer; case 'Q': /* unsigned quad (64bit) int */ signed_p = 0; - integer_size = 8; + integer_size = NATLL_LEN(); bigendian_p = BIGENDIAN_P(); goto pack_integer; @@ -1397,7 +1401,7 @@ star = 0; { - static const char natstr[] = "sSiIlL"; + static const char natstr[] = "sSiIlLqQ"; static const char endstr[] = "sSiIlLqQ"; modifiers: @@ -1626,13 +1630,13 @@ case 'q': signed_p = 1; - integer_size = QUAD_SIZE; + integer_size = NATLL_LEN(); bigendian_p = BIGENDIAN_P(); goto unpack_integer; case 'Q': signed_p = 0; - integer_size = QUAD_SIZE; + integer_size = NATLL_LEN(); bigendian_p = BIGENDIAN_P(); goto unpack_integer; Index: test/ruby/test_pack.rb =================================================================== --- test/ruby/test_pack.rb (revision 29526) +++ test/ruby/test_pack.rb (revision 29527) @@ -85,7 +85,9 @@ assert_match(/\A\x00*\x01\x02\x03\x04\z/, [0x01020304].pack("I!"+mod)) assert_match(/\A\x00*\x01\x02\x03\x04\z/, [0x01020304].pack("l!"+mod)) assert_match(/\A\x00*\x01\x02\x03\x04\z/, [0x01020304].pack("L!"+mod)) - %w[s S l L q Q s! S! i I i! I! l! L!].each {|fmt| + assert_match(/\A\x00*\x01\x02\x03\x04\z/, [0x01020304].pack("q!"+mod)) + assert_match(/\A\x00*\x01\x02\x03\x04\z/, [0x01020304].pack("Q!"+mod)) + %w[s S l L q Q s! S! i I i! I! l! L! q! Q!].each {|fmt| fmt += mod nuls = [0].pack(fmt) v = 0 @@ -118,7 +120,9 @@ assert_match(/\A\x04\x03\x02\x01\x00*\z/, [0x01020304].pack("I!"+mod)) assert_match(/\A\x04\x03\x02\x01\x00*\z/, [0x01020304].pack("l!"+mod)) assert_match(/\A\x04\x03\x02\x01\x00*\z/, [0x01020304].pack("L!"+mod)) - %w[s S l L q Q s! S! i I i! I! l! L!].each {|fmt| + assert_match(/\A\x04\x03\x02\x01\x00*\z/, [0x01020304].pack("q!"+mod)) + assert_match(/\A\x04\x03\x02\x01\x00*\z/, [0x01020304].pack("Q!"+mod)) + %w[s S l L q Q s! S! i I i! I! l! L! q! Q!].each {|fmt| fmt += mod nuls = [0].pack(fmt) v = 0 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/