[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]