diff options
| author | Paul Thomas <pault@gcc.gnu.org> | 2005-07-22 14:07:19 +0000 |
|---|---|---|
| committer | Paul Thomas <pault@gcc.gnu.org> | 2005-07-22 14:07:19 +0000 |
| commit | 94e2b58a2886f36597e5dc16282f84d8ebefff72 (patch) | |
| tree | fcec375eaaebffa27d8cb8491cb445907311a0ca /libgfortran/io/read.c | |
| parent | 17c7e33e8c288eda8ec9316dad5daea43299f584 (diff) | |
| download | gcc-94e2b58a2886f36597e5dc16282f84d8ebefff72.zip gcc-94e2b58a2886f36597e5dc16282f84d8ebefff72.tar.gz gcc-94e2b58a2886f36597e5dc16282f84d8ebefff72.tar.bz2 | |
[multiple changes]
2005-07-22 Jerry DeLisle <jvdelisle@verizon.net>
PR libfortran/21875 (FM111.f)
* io/read.c (next_char): Return a ' ' character when BLANK_ZERO
or BLANK_NULL are active.
(read_decimal): Interpret ' ' character correctly for BZ or BN.
(read_radix): Interpret ' ' character correctly for BZ or BN.
(read_f): Interpret ' ' character correctly for BZ or BN.
2005-07-22 Paul Thomas <pault@gcc.gnu.org>
PR libfortran/22570
* read.c (read_x): Correct the condition for doing the
x-editing during formatted input.
* transfer.c (formatted_transfer): Cast offset difference
as int, clean-up arithmetic with new variable, bytes_used,
zero counters for FMT_SLASH,
(data_transfer_init) Zero X- and T-editing counters
unconditionally.
(next_record_w) Zero X- and T-editing counters.
unconditionally.
From-SVN: r102284
Diffstat (limited to 'libgfortran/io/read.c')
| -rw-r--r-- | libgfortran/io/read.c | 60 |
1 files changed, 42 insertions, 18 deletions
diff --git a/libgfortran/io/read.c b/libgfortran/io/read.c index 4cfad8d..654475d 100644 --- a/libgfortran/io/read.c +++ b/libgfortran/io/read.c @@ -691,24 +691,46 @@ read_f (fnode * f, char *dest, int length) p++; w--; - while (w > 0) + if (g.blank_status == BLANK_UNSPECIFIED) /* Normal processing of exponent */ { - if (*p == ' ') + while (w > 0 && isdigit (*p)) { - if (g.blank_status == BLANK_ZERO) *p = '0'; - if (g.blank_status == BLANK_NULL) + exponent = 10 * exponent + *p - '0'; + p++; + w--; + } + + /* Only allow trailing blanks */ + + while (w > 0) + { + if (*p != ' ') + goto bad_float; + p++; + w--; + } + } + else /* BZ or BN status is enabled */ + { + while (w > 0) + { + if (*p == ' ') { - p++; - w--; - continue; + if (g.blank_status == BLANK_ZERO) *p = '0'; + if (g.blank_status == BLANK_NULL) + { + p++; + w--; + continue; + } } + else if (!isdigit (*p)) + goto bad_float; + + exponent = 10 * exponent + *p - '0'; + p++; + w--; } - if (!isdigit (*p)) - goto bad_float; - - exponent = 10 * exponent + *p - '0'; - p++; - w--; } exponent = exponent * exponent_sign; @@ -784,12 +806,14 @@ read_f (fnode * f, char *dest, int length) void read_x (fnode * f) { - int n, m; + int n; n = f->u.n; - m = (int)current_unit->bytes_left; - if (f->format == FMT_X) - n = (n > m) ? m : n; - if (n) + + if ((current_unit->flags.pad == PAD_NO || is_internal_unit ()) + && current_unit->bytes_left < n) + n = current_unit->bytes_left; + + if (n > 0) read_block (&n); } |
