diff options
author | Jerry DeLisle <jvdelisle@gcc.gnu.org> | 2010-06-30 01:35:56 +0000 |
---|---|---|
committer | Jerry DeLisle <jvdelisle@gcc.gnu.org> | 2010-06-30 01:35:56 +0000 |
commit | 457bcf66d1a07ce50c8d9054a3bb2419124aaf49 (patch) | |
tree | eb20cc2ca5e1f8dfc78c9521bc48245cad3f1321 /libgfortran/io/read.c | |
parent | 0622223a32a82cdda72bd562f493219b19da5764 (diff) | |
download | gcc-457bcf66d1a07ce50c8d9054a3bb2419124aaf49.zip gcc-457bcf66d1a07ce50c8d9054a3bb2419124aaf49.tar.gz gcc-457bcf66d1a07ce50c8d9054a3bb2419124aaf49.tar.bz2 |
re PR libfortran/43298 (fortran library does not read in NaN -Inf or Inf)
2010-06-29 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR libfortran/43298
* io/read.c: Add code to parse and read Inf, Infinity, NaN, and Nan with
optional parenthesis.
From-SVN: r161585
Diffstat (limited to 'libgfortran/io/read.c')
-rw-r--r-- | libgfortran/io/read.c | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/libgfortran/io/read.c b/libgfortran/io/read.c index 6aaa506..873d26c 100644 --- a/libgfortran/io/read.c +++ b/libgfortran/io/read.c @@ -810,6 +810,66 @@ read_f (st_parameter_dt *dtp, const fnode *f, char *dest, int length) if (w == 0) goto zero; + /* Check for Infinity or NaN. */ + if (unlikely ((w >= 3 && (*p == 'i' || *p == 'I' || *p == 'n' || *p == 'N')))) + { + int seen_paren = 0; + char *save = out; + + /* Scan through the buffer keeping track of spaces and parenthesis. We + null terminate the string as soon as we see a left paren or if we are + BLANK_NULL mode. Leading spaces have already been skipped above, + trailing spaces are ignored by converting to '\0'. A space + between "NaN" and the optional perenthesis is not permitted. */ + while (w > 0) + { + *out = tolower (*p); + switch (*p) + { + case ' ': + if (dtp->u.p.blank_status == BLANK_ZERO) + { + *out = '0'; + break; + } + *out = '\0'; + if (seen_paren == 1) + goto bad_float; + break; + case '(': + seen_paren++; + *out = '\0'; + break; + case ')': + if (seen_paren++ != 1) + goto bad_float; + break; + default: + if (!isalnum (*out)) + goto bad_float; + } + --w; + ++p; + ++out; + } + + *out = '\0'; + + if (seen_paren != 0 && seen_paren != 2) + goto bad_float; + + if ((strcmp (save, "inf") == 0) || (strcmp (save, "infinity") == 0)) + { + if (seen_paren) + goto bad_float; + } + else if (strcmp (save, "nan") != 0) + goto bad_float; + + convert_real (dtp, dest, buffer, length); + return; + } + /* Process the mantissa string. */ while (w > 0) { |