summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCamm Maguire <camm@debian.org>2014-04-02 21:17:27 +0000
committerCamm Maguire <camm@debian.org>2014-04-02 21:17:27 +0000
commitee726de0321126d6a6dd2769216054f2d45d67b9 (patch)
treea24179b5d492f66b03249b18e4ac6bd2d559b205
parent9dc327540d0576616ea09ab6be34336547c76d9e (diff)
downloadgcl-ee726de0321126d6a6dd2769216054f2d45d67b9.tar.gz
parse float fix
-rwxr-xr-xgcl/o/read.d18
1 files changed, 10 insertions, 8 deletions
diff --git a/gcl/o/read.d b/gcl/o/read.d
index bf6bb829..bc9fc106 100755
--- a/gcl/o/read.d
+++ b/gcl/o/read.d
@@ -127,7 +127,7 @@ static inline object
parse_number(char *s,int radix) {
object x,y;
- char *q,ch;
+ char *q,ch,c;
int n,m;
double f;
@@ -142,17 +142,19 @@ parse_number(char *s,int radix) {
default:
if (radix!=10)
x=parse_integer(s,&q,10);
- if (!*q) return OBJNULL;
- if (*q=='.')
- if (parse_unsigned_integer(q+1,&q,10)==OBJNULL)
- return x;
- if ((ch=*q)) *q='E';
+ if ((ch=*q)=='.') {
+ if (!*++q) return x;
+ parse_unsigned_integer(q,&q,10);
+ ch=*q ? *q : 'E';
+ }
+
+ if ((c=*q)) *q='E';
n=sscanf(s,"%lf%n",&f,&m);
- *q=ch;
+ *q=c;
if (n!=1||s[m]) return OBJNULL;
- switch (ch=='e' || ch=='E' || !ch ? READdefault_float_format : ch) {
+ switch (ch=='e' || ch=='E' ? READdefault_float_format : ch) {
case 's':case 'S':
return make_shortfloat((float)f);
case 'f':case 'F':case 'd':case 'D':case 'l':case 'L':