OSDN Git Service

2008-09-22 Jerry DeLisle <jvdelisle@gcc.gnu.org
[pf3gnuchains/gcc-fork.git] / libgfortran / io / read.c
index 8d25493..e35a7b1 100644 (file)
@@ -439,9 +439,10 @@ read_a (st_parameter_dt *dtp, const fnode *f, char *p, int length)
     read_utf8_char1 (dtp, p, length, w);
   else
     read_default_char1 (dtp, p, length, w);
-  
-  dtp->u.p.sf_read_comma =
-    dtp->u.p.decimal_status == DECIMAL_COMMA ? 0 : 1;
+
+  dtp->u.p.sf_read_comma = 1;
+  if (dtp->common.flags & IOPARM_DT_HAS_F2003)
+    dtp->u.p.sf_read_comma = dtp->u.p.decimal_status == DECIMAL_COMMA ? 0 : 1;
 }
 
 
@@ -467,8 +468,9 @@ read_a_char4 (st_parameter_dt *dtp, const fnode *f, char *p, int length)
   else
     read_default_char4 (dtp, p, length, w);
   
-  dtp->u.p.sf_read_comma =
-    dtp->u.p.decimal_status == DECIMAL_COMMA ? 0 : 1;
+  dtp->u.p.sf_read_comma = 1;
+  if (dtp->common.flags & IOPARM_DT_HAS_F2003)
+    dtp->u.p.sf_read_comma = dtp->u.p.decimal_status == DECIMAL_COMMA ? 0 : 1;
 }
 
 /* eat_leading_spaces()-- Given a character pointer and a width,
@@ -840,8 +842,11 @@ read_f (st_parameter_dt *dtp, const fnode *f, char *dest, int length)
       switch (*p)
        {
        case ',':
-         if (dtp->u.p.decimal_status == DECIMAL_COMMA && *p == ',')
-           *p = '.';
+         if ((dtp->common.flags & IOPARM_DT_HAS_F2003)
+             && (dtp->u.p.decimal_status == DECIMAL_COMMA && *p == ','))
+               *p = '.';
+         else
+           goto bad_float;
          /* Fall through */
        case '.':
          if (seen_dp)
@@ -1074,9 +1079,17 @@ read_f (st_parameter_dt *dtp, const fnode *f, char *dest, int length)
 void
 read_x (st_parameter_dt * dtp, int n)
 {
-  if ((dtp->u.p.pad_status == PAD_NO || is_internal_unit (dtp))
-      && dtp->u.p.current_unit->bytes_left < n)
-    n = dtp->u.p.current_unit->bytes_left;
+  if (dtp->common.flags & IOPARM_DT_HAS_F2003)
+    {
+      if ((dtp->u.p.pad_status == PAD_NO || is_internal_unit (dtp))
+         && dtp->u.p.current_unit->bytes_left < n)
+       n = dtp->u.p.current_unit->bytes_left;
+    }
+  else
+    {
+      if (is_internal_unit (dtp) && dtp->u.p.current_unit->bytes_left < n)
+       n = dtp->u.p.current_unit->bytes_left;
+    }
 
   dtp->u.p.sf_read_comma = 0;
   if (n > 0)