diff options
author | Camm Maguire <camm@debian.org> | 2014-04-02 21:17:27 +0000 |
---|---|---|
committer | Camm Maguire <camm@debian.org> | 2014-04-02 21:17:27 +0000 |
commit | ee726de0321126d6a6dd2769216054f2d45d67b9 (patch) | |
tree | a24179b5d492f66b03249b18e4ac6bd2d559b205 | |
parent | 9dc327540d0576616ea09ab6be34336547c76d9e (diff) | |
download | gcl-ee726de0321126d6a6dd2769216054f2d45d67b9.tar.gz |
parse float fix
-rwxr-xr-x | gcl/o/read.d | 18 |
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': |