From 4bf6a04f49a23ab33f6c9209a873c08b6f28fb37 Mon Sep 17 00:00:00 2001 From: nobu Date: Sat, 21 Oct 2017 12:34:13 +0000 Subject: Fix bug about String#scanf("%a") * lib/scanf.rb (extract_float, initialize): allow to omit a sign on the binary exponent. [ruby-core:82435] [Bug #13833] [Fix GH-1689] From: tarotaro0 git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@60261 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- lib/scanf.rb | 6 +++--- test/scanf/test_scanf.rb | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/scanf.rb b/lib/scanf.rb index a98c359573..6bd7da4043 100644 --- a/lib/scanf.rb +++ b/lib/scanf.rb @@ -295,7 +295,7 @@ module Scanf def extract_float(s) return nil unless s &&! skip - if /\A(?[-+]?)0[xX](?\.\h+|\h+(?:\.\h*)?)[pP](?[-+]\d+)/ =~ s + if /\A(?[-+]?)0[xX](?\.\h+|\h+(?:\.\h*)?)[pP](?[-+]?\d+)/ =~ s f1, f2 = frac.split('.') f = f1.hex if f2 @@ -411,11 +411,11 @@ module Scanf # %f when /%\*?[aefgAEFG]/ - [ '([-+]?(?:0[xX](?:\.\h+|\h+(?:\.\h*)?)[pP][-+]\d+|\d+(?![\d.])|\d*\.\d*(?:[eE][-+]?\d+)?))', :extract_float ] + [ '([-+]?(?:0[xX](?:\.\h+|\h+(?:\.\h*)?)[pP][-+]?\d+|\d+(?![\d.])|\d*\.\d*(?:[eE][-+]?\d+)?))', :extract_float ] # %5f when /%\*?(\d+)[aefgAEFG]/ - [ '(?=[-+]?(?:0[xX](?:\.\h+|\h+(?:\.\h*)?)[pP][-+]\d+|\d+(?![\d.])|\d*\.\d*(?:[eE][-+]?\d+)?))' + + [ '(?=[-+]?(?:0[xX](?:\.\h+|\h+(?:\.\h*)?)[pP][-+]?\d+|\d+(?![\d.])|\d*\.\d*(?:[eE][-+]?\d+)?))' + "(\\S{1,#{$1}})", :extract_float ] # %5s diff --git a/test/scanf/test_scanf.rb b/test/scanf/test_scanf.rb index 827eb2fc3b..988ff99adc 100644 --- a/test/scanf/test_scanf.rb +++ b/test/scanf/test_scanf.rb @@ -258,6 +258,7 @@ module ScanfTests [ "%G", "+3.25e2", [325.0] ], [ "%f", "3.z", [3.0] ], [ "%a", "0X1P+10", [1024.0] ], + [ "%a", "0X1P10", [1024.0] ], [ "%A", "0x1.deadbeefp+99", [1.1851510441583988e+30] ], # Testing embedded matches including literal '[' behavior -- cgit v1.2.3