OSDN Git Service

2007-12-16 Jerry DeLisle <jvdelisle@gcc.gnu.org>
authorjvdelisle <jvdelisle@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 17 Dec 2007 00:47:14 +0000 (00:47 +0000)
committerjvdelisle <jvdelisle@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 17 Dec 2007 00:47:14 +0000 (00:47 +0000)
PR fortran/34427
* io/list_read.c (read_real): Handle intervening line ends and spaces.
(get_name): Don't push separators to saved_string.
(eat_separator): If in namelist mode eat spaces and line ends as well.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@131003 138bc75d-0d04-0410-961f-82ee72b054a4

libgfortran/ChangeLog
libgfortran/io/list_read.c

index d9706df..286524b 100644 (file)
@@ -1,3 +1,10 @@
+2007-12-16  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
+
+       PR fortran/34427
+       * io/list_read.c (read_real): Handle intervening line ends and spaces.
+       (get_name): Don't push separators to saved_string.
+       (eat_separator): If in namelist mode eat spaces and line ends as well.
+
 2007-12-13  Thomas Koenig  <tkoenig@gcc.gnu.org>
 
        PR libfortran/34370
index e63fca5..df43589 100644 (file)
@@ -307,15 +307,31 @@ eat_separator (st_parameter_dt *dtp)
       break;
 
     case '\r':
+      dtp->u.p.at_eol = 1;
       n = next_char(dtp);
       if (n == '\n')
-       dtp->u.p.at_eol = 1;
+       {
+         if (dtp->u.p.namelist_mode)
+           {
+             do
+               c = next_char (dtp);
+             while (c == '\n' || c == '\r' || c == ' ');
+             unget_char (dtp, c);
+           }
+       }
       else
        unget_char (dtp, n);
       break;
 
     case '\n':
       dtp->u.p.at_eol = 1;
+      if (dtp->u.p.namelist_mode)
+       {
+         do
+           c = next_char (dtp);
+         while (c == '\n' || c == '\r' || c == ' ');
+         unget_char (dtp, c);
+       }
       break;
 
     case '!':
@@ -1141,12 +1157,7 @@ parse_real (st_parameter_dt *dtp, void *buffer, int length)
 
  exp2:
   if (!isdigit (c))
-    {
-      if (c == 'i' || c == 'I' || c == 'n' || c == 'N')
-       goto inf_nan;
-      else
-       goto bad;
-    }
+    goto bad;
 
   push_char (dtp, c);
 
@@ -1315,7 +1326,7 @@ read_real (st_parameter_dt *dtp, int length)
 {
   char c, message[100];
   int seen_dp;
-  int is_inf, i;
+  int is_inf;
 
   seen_dp = 0;
 
@@ -1578,20 +1589,22 @@ read_real (st_parameter_dt *dtp, int length)
       l_push_char (dtp, c);
     }
 
-  if (!is_separator (c) || c == '=')
+  if (!is_separator (c))
     goto unwind;
 
-  if (dtp->u.p.namelist_mode && c != ',' && c != '/')
-    for (i = 0; i < 63; i++)
-    { 
-      eat_spaces (dtp);
-      c = next_char (dtp);
-      l_push_char (dtp, c);
-      if (c == '=')
-       goto unwind;
+  if (dtp->u.p.namelist_mode)
+    {  
+      if (c == ' ' || c =='\n' || c == '\r')
+       {
+         do
+           c = next_char (dtp);
+         while (c == ' ' || c =='\n' || c == '\r');
 
-      if (c == ',' || c == '/' || !is_separator(c))
-       break;
+         l_push_char (dtp, c);
+
+         if (c == '=')
+           goto unwind;
+       }
     }
 
   if (is_inf)
@@ -2594,7 +2607,8 @@ get_name:
 
   do
     {
-      push_char (dtp, tolower(c));
+      if (!is_separator (c))
+       push_char (dtp, tolower(c));
       c = next_char (dtp);
     } while (!( c=='=' || c==' ' || c=='\t' || c =='(' || c =='%' ));