Patchwork [Fortran,committed] PR 43298 - Add NAN(alphanum) support for list-directed I/-

login
register
mail settings
Submitter Tobias Burnus
Date June 28, 2010, 8:05 p.m.
Message ID <4C290086.8050604@net-b.de>
Download mbox | patch
Permalink /patch/57186/
State New
Headers show

Comments

Tobias Burnus - June 28, 2010, 8:05 p.m.
For list-directed I/O, input of INF and NAN was supported - but not
NAN(alphanumeric) - which is what this patch adds. Approved by Jerry in
the PR.

Build and regtested on x86-64-linux. Committed as Rev. 161510.

Tobias

PS: Jerry's patch for the same PR is about formatted I/O where INF/NAN
was not yet supported.

Patch

2010-06-28  Tobias Burnus  <burnus@net-b.de>

	PR fortran/43298
	* list_read.c (parse_real, read_real): Support NAN(alphanum).

2010-06-28  Tobias Burnus  <burnus@net-b.de>

	PR fortran/43298
	* gfortran.dg/nan_6.f90: New.

Index: libgfortran/io/list_read.c
===================================================================
--- libgfortran/io/list_read.c	(revision 161412)
+++ libgfortran/io/list_read.c	(working copy)
@@ -1199,6 +1199,21 @@  parse_real (st_parameter_dt *dtp, void *
       push_char (dtp, 'n');
       push_char (dtp, 'a');
       push_char (dtp, 'n');
+      
+      /* Match "NAN(alphanum)".  */
+      if (c == '(')
+	{
+	  for ( ; c != ')'; c = next_char (dtp))
+	    if (is_separator (c))
+	      goto bad;
+	    else
+	      push_char (dtp, c);
+
+	  push_char (dtp, ')');
+	  c = next_char (dtp);
+	  if (is_separator (c))
+	    unget_char (dtp, c);
+	}
       goto done;
     }
 
@@ -1576,6 +1591,20 @@  read_real (st_parameter_dt *dtp, void *
 	goto unwind;
       c = next_char (dtp);
       l_push_char (dtp, c);
+
+      /* Match NAN(alphanum).  */
+      if (c == '(')
+	{
+	  for (c = next_char (dtp); c != ')'; c = next_char (dtp))
+	    if (is_separator (c))
+	      goto unwind;
+	    else
+	      l_push_char (dtp, c);
+
+	  l_push_char (dtp, ')');
+	  c = next_char (dtp);
+	  l_push_char (dtp, c);
+	}
     }
 
   if (!is_separator (c))
Index: gcc/testsuite/gfortran.dg/nan_6.f90
===================================================================
--- gcc/testsuite/gfortran.dg/nan_6.f90	(revision 0)
+++ gcc/testsuite/gfortran.dg/nan_6.f90	(revision 0)
@@ -0,0 +1,99 @@ 
+! { dg-do run }
+! { dg-add-options ieee }
+! { dg-skip-if "NaN not supported" { spu-*-* } { "*" } { "" } }
+!
+! List-directed part of PR fortran/43298
+! and follow up to PR fortran/34319.
+!
+! Check handling of "NAN(alphanum)"
+!
+character(len=200) :: str
+real :: r
+complex :: z
+
+! read_real:
+
+r = 1.0
+str = 'INfinity' ; read(str,*) r
+if (r < 0 .or. r /= r*1.1) call abort()
+
+r = 1.0
+str = '-INF' ; read(str,*) r
+if (r > 0 .or. r /= r*1.1) call abort()
+
+r = 1.0
+str = '+INF' ; read(str,*) r
+if (r < 0 .or. r /= r*1.1) call abort()
+
+r = 1.0
+str = '-inFiniTY' ; read(str,*) r
+if (r > 0 .or. r /= r*1.1) call abort()
+
+r = 1.0
+str = 'NAN' ; read(str,*) r
+if (.not. isnan(r)) call abort()
+
+r = 1.0
+str = '-NAN' ; read(str,*) r
+if (.not. isnan(r)) call abort()
+
+r = 1.0
+str = '+NAN' ; read(str,*) r
+if (.not. isnan(r)) call abort()
+
+r = 1.0
+str = 'NAN(0x111)' ; read(str,*) r
+if (.not. isnan(r)) call abort()
+
+r = 1.0
+str = '-NAN(123)' ; read(str,*) r
+if (.not. isnan(r)) call abort()
+
+r = 1.0
+str = '+NAN(0xFFE)' ; read(str,*) r
+if (.not. isnan(r)) call abort()
+
+
+! parse_real
+
+z = cmplx(-2.0,-4.0)
+str = '(0.0,INfinity)' ; read(str,*) z
+if (aimag(z) < 0 .or. aimag(z) /= aimag(z)*1.1) call abort()
+
+z = cmplx(-2.0,-4.0)
+str = '(-INF,0.0)' ; read(str,*) z
+if (real(z) > 0 .or. real(z) /= real(z)*1.1) call abort()
+
+z = cmplx(-2.0,-4.0)
+str = '(0.0,+INF)' ; read(str,*) z
+if (aimag(z) < 0 .or. aimag(z) /= aimag(z)*1.1) call abort()
+
+z = cmplx(-2.0,-4.0)
+str = '(-inFiniTY,0.0)' ; read(str,*) z
+if (real(z) > 0 .or. real(z) /= real(z)*1.1) call abort()
+
+z = cmplx(-2.0,-4.0)
+str = '(NAN,0.0)' ; read(str,*) z
+if (.not. isnan(real(z))) call abort()
+
+z = cmplx(-2.0,-4.0)
+str = '(0.0,-NAN)' ; read(str,*) z
+if (.not. isnan(aimag(z))) call abort()
+
+z = cmplx(-2.0,-4.0)
+str = '(+NAN,0.0)' ; read(str,*) z
+if (.not. isnan(real(z))) call abort()
+
+z = cmplx(-2.0,-4.0)
+str = '(NAN(0x111),0.0)' ; read(str,*) z
+if (.not. isnan(real(z))) call abort()
+
+z = cmplx(-2.0,-4.0)
+str = '(0.0,-NaN(123))' ; read(str,*) z
+if (.not. isnan(aimag(z))) call abort()
+
+z = cmplx(-2.0,-4.0)
+str = '(+nan(0xFFE),0.0)' ; read(str,*) z
+if (.not. isnan(real(z))) call abort()
+
+end