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

ruby-changes:15257

From: naruse <ko1@a...>
Date: Thu, 1 Apr 2010 13:32:45 +0900 (JST)
Subject: [ruby-changes:15257] Ruby:r27139 (trunk): * lib/scanf.rb: support %a format.

naruse	2010-04-01 13:32:22 +0900 (Thu, 01 Apr 2010)

  New Revision: 27139

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=27139

  Log:
    * lib/scanf.rb: support %a format. [ruby-dev:40650]

  Modified files:
    trunk/ChangeLog
    trunk/lib/scanf.rb
    trunk/test/scanf/test_scanf.rb

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 27138)
+++ ChangeLog	(revision 27139)
@@ -1,3 +1,7 @@
+Thu Apr  1 13:20:50 2010  NARUSE, Yui  <naruse@r...>
+
+	* lib/scanf.rb: support %a format. [ruby-dev:40650]
+
 Thu Apr  1 12:04:10 2010  NAKAMURA Usaku  <usa@r...>
 
 	* include/ruby/ruby.h (PRE_TIMET_PREFIX): define if configure doesn't
Index: lib/scanf.rb
===================================================================
--- lib/scanf.rb	(revision 27138)
+++ lib/scanf.rb	(revision 27139)
@@ -112,7 +112,7 @@
 [x,X]
   Matches an optionally signed hexadecimal integer,
 
-[f,g,e,E]
+[a,e,f,g,A,E,F,G]
   Matches an optionally signed floating-point number.
 
 [s]
@@ -309,7 +309,22 @@
 
     def skip;  /^\s*%\*/.match(@spec_string); end
 
-    def extract_float(s); s.to_f if s &&! skip; end
+    def extract_float(s)
+      return nil unless s &&! skip
+      if /\A(?<sign>[-+]?)0[xX](?<frac>\.\h+|\h+(?:\.\h*)?)[pP](?<exp>[-+]\d+)/ =~ s
+        f1, f2 = frac.split('.')
+        f = f1.hex
+        if f2
+          len = f2.length
+          if len > 0
+            f += f2.hex / (16.0 ** len)
+          end
+        end
+        (sign == ?- ? -1 : 1) * Math.ldexp(f, exp.to_i)
+      else
+        s.to_f
+      end
+    end
     def extract_decimal(s); s.to_i if s &&! skip; end
     def extract_hex(s); s.hex if s &&! skip; end
     def extract_octal(s); s.oct if s &&! skip; end
@@ -409,12 +424,12 @@
           [ "([-+][0-7]{1,#{$1.to_i-1}}|[0-7]{1,#{$1}})", :extract_octal ]
 
           # %f
-        when /%\*?[efgEFG]/
-          [ '([-+]?(?:\d+(?![\d.])|\d*\.\d*(?:[eE][-+]?\d+)?))', :extract_float ]
+        when /%\*?[aefgAEFG]/
+          [ '([-+]?(?:0[xX](?:\.\h+|\h+(?:\.\h*)?)[pP][-+]\d+|\d+(?![\d.])|\d*\.\d*(?:[eE][-+]?\d+)?))', :extract_float ]
 
           # %5f
-        when /%\*?(\d+)[efgEFG]/
-          [ '(?=[-+]?(?:\d+(?![\d.])|\d*\.\d*(?:[eE][-+]?\d+)?))' +
+        when /%\*?(\d+)[aefgAEFG]/
+          [ '(?=[-+]?(?:0[xX](?:\.\h+|\h+(?:\.\h*)?)[pP][-+]\d+|\d+(?![\d.])|\d*\.\d*(?:[eE][-+]?\d+)?))' +
             "(\\S{1,#{$1}})", :extract_float ]
 
           # %5s
@@ -491,7 +506,7 @@
     attr_reader :string_left, :last_spec_tried,
                 :last_match_tried, :matched_count, :space
 
-    SPECIFIERS = 'diuXxofFeEgGsc'
+    SPECIFIERS = 'diuXxofFeEgGscaA'
     REGEX = /
         # possible space, followed by...
           (?:\s*
Index: test/scanf/test_scanf.rb
===================================================================
--- test/scanf/test_scanf.rb	(revision 27138)
+++ test/scanf/test_scanf.rb	(revision 27139)
@@ -276,6 +276,8 @@
       [ "%g", "+3.25", [3.25] ],
       [ "%G", "+3.25e2", [325.0] ],
       [ "%f", "3.z", [3.0] ],
+      [ "%a", "0X1P+10", [1024.0] ],
+      [ "%A", "0x1.deadbeefp+99", [1.1851510441583988e+30] ],
 
 # Testing embedded matches including literal '[' behavior
       [",%d,%f", ",10,1.1", [10,1.1] ],

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

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