From 0f651c8506fd4315eb981ac7fda5ac210af83e8c Mon Sep 17 00:00:00 2001
From: Joe Groff <arcata@gmail.com>
Date: Sun, 7 Feb 2010 14:21:50 -0800
Subject: [PATCH] math.parser: support leading + on significand and exponent so
 string>number can be a proper superset of C strto* functions

---
 core/math/parser/parser-tests.factor | 20 +++++++++++++++++---
 core/math/parser/parser.factor       |  2 ++
 2 files changed, 19 insertions(+), 3 deletions(-)

diff --git a/core/math/parser/parser-tests.factor b/core/math/parser/parser-tests.factor
index 7be86e0a8c..dac2e34f10 100644
--- a/core/math/parser/parser-tests.factor
+++ b/core/math/parser/parser-tests.factor
@@ -25,8 +25,20 @@ unit-test
 [ "12345abcdef" string>number ]
 unit-test
 
-[ t ]
-[ "-12" string>number 0 < ]
+[ 12 ]
+[ "+12" string>number ]
+unit-test
+
+[ -12 ]
+[ "-12" string>number ]
+unit-test
+
+[ f ]
+[ "-+12" string>number ]
+unit-test
+
+[ f ]
+[ "+-12" string>number ]
 unit-test
 
 [ f ]
@@ -47,13 +59,13 @@ unit-test
 [ f ] [ "1/-2" string>number ] unit-test
 [ f ] [ "1/2/3" string>number ] unit-test
 [ 1+1/2 ] [ "1+1/2" string>number ] unit-test
+[ 1+1/2 ] [ "+1+1/2" string>number ] unit-test
 [ f ] [ "1-1/2" string>number ] unit-test
 [ -1-1/2 ] [ "-1-1/2" string>number ] unit-test
 [ f ] [ "-1+1/2" string>number ] unit-test
 [ f ] [ "1+2" string>number ] unit-test
 [ f ] [ "1+" string>number ] unit-test
 [ f ] [ "1-" string>number ] unit-test
-[ f ] [ "+1" string>number ] unit-test
 [ f ] [ "1+1/2+2" string>number ] unit-test
 
 [ 100000 ] [ "100,000" string>number ] unit-test
@@ -68,6 +80,7 @@ unit-test
 [ f ] [ "-,2" string>number ] unit-test
 
 [ 2.0 ] [ "2." string>number ] unit-test
+[ 2.0 ] [ "+2." string>number ] unit-test
 [ 0.25 ] [ ".25" string>number ] unit-test
 [ -2.0 ] [ "-2." string>number ] unit-test
 [ -0.25 ] [ "-.25" string>number ] unit-test
@@ -80,6 +93,7 @@ unit-test
 [ 100.0 ] [ "100." string>number ] unit-test
 
 [ 100.0 ] [ "1e2" string>number ] unit-test
+[ 100.0 ] [ "1e+2" string>number ] unit-test
 [ HEX: 1e2 ] [ "1e2" hex> ] unit-test
 
 [ HEX: 1.999999999999ap-3 ] [ "0.2" string>number ] unit-test
diff --git a/core/math/parser/parser.factor b/core/math/parser/parser.factor
index ee022b64a4..5bb024db9d 100644
--- a/core/math/parser/parser.factor
+++ b/core/math/parser/parser.factor
@@ -118,6 +118,7 @@ DEFER: @neg-digit
 : @exponent-first-char ( float-parse i number-parse n char -- float-parse n/f )
     {
         { CHAR: - [ [ @exponent-digit ] require-next-digit ?neg ] }
+        { CHAR: + [ [ @exponent-digit ] require-next-digit ] }
         [ @exponent-digit ]
     } case ; inline
 
@@ -231,6 +232,7 @@ DEFER: @neg-digit
 : @first-char ( i number-parse n char -- n/f ) 
     {
         { CHAR: - [ [ @neg-first-digit ] require-next-digit ?neg ] }
+        { CHAR: + [ [ @pos-first-digit ] require-next-digit ] }
         [ @pos-first-digit ]
     } case ; inline