diff options
author | Jerry DeLisle <jvdelisle@gcc.gnu.org> | 2014-06-27 04:23:36 +0000 |
---|---|---|
committer | Jerry DeLisle <jvdelisle@gcc.gnu.org> | 2014-06-27 04:23:36 +0000 |
commit | b896e6744e792e14403c788174424f6b547b9afa (patch) | |
tree | 11decf8910c0b2d6e4ad42bfdb73c274d648449c | |
parent | 5450a05c5b927454821a6f00e0600e600cbd134d (diff) | |
download | gcc-b896e6744e792e14403c788174424f6b547b9afa.zip gcc-b896e6744e792e14403c788174424f6b547b9afa.tar.gz gcc-b896e6744e792e14403c788174424f6b547b9afa.tar.bz2 |
re PR libfortran/61499 (Internal read of negative integer broken)
2014-06-26 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR libgfortran/61499
* io/list_read.c (eat_spaces): Use a 'for' loop instead of
'while' loop to skip the loop if there are no bytes left in the
string. Only seek if actual spaces can be skipped.
From-SVN: r212059
-rw-r--r-- | libgfortran/ChangeLog | 7 | ||||
-rw-r--r-- | libgfortran/io/list_read.c | 47 |
2 files changed, 25 insertions, 29 deletions
diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index 7ae6d5f..26825ca 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,10 @@ +2014-06-26 Jerry DeLisle <jvdelisle@gcc.gnu.org> + + PR libgfortran/61499 + * io/list_read.c (eat_spaces): Use a 'for' loop instead of + 'while' loop to skip the loop if there are no bytes left in the + string. Only seek if actual spaces can be skipped. + 2014-06-25 Tobias Burnus <burnus@net-b.de> * caf/single.c (assign_char4_from_char1, assign_char1_from_char4, diff --git a/libgfortran/io/list_read.c b/libgfortran/io/list_read.c index 3b04bd2..96db059 100644 --- a/libgfortran/io/list_read.c +++ b/libgfortran/io/list_read.c @@ -387,50 +387,39 @@ eat_spaces (st_parameter_dt *dtp) int c; /* If internal character array IO, peak ahead and seek past spaces. - This is an optimazation to eliminate numerous calls to - next character unique to character arrays with large character - lengths (PR38199). */ - if (is_array_io (dtp)) + This is an optimization unique to character arrays with large + character lengths (PR38199). This code eliminates numerous calls + to next_character. */ + if (is_array_io (dtp) && (dtp->u.p.last_char == EOF - 1)) { gfc_offset offset = stell (dtp->u.p.current_unit->s); - gfc_offset limit = offset + dtp->u.p.current_unit->bytes_left; + gfc_offset i; if (dtp->common.unit) /* kind=4 */ { - gfc_char4_t cc; - limit *= (sizeof (gfc_char4_t)); - do + for (i = 0; i < dtp->u.p.current_unit->bytes_left; i++) { - cc = dtp->internal_unit[offset]; - offset += (sizeof (gfc_char4_t)); - dtp->u.p.current_unit->bytes_left--; + if (dtp->internal_unit[offset + i * sizeof (gfc_char4_t)] + != (gfc_char4_t)' ') + break; } - while (offset < limit && cc == (gfc_char4_t)' '); - /* Back up, seek ahead, and fall through to complete the - process so that END conditions are handled correctly. */ - dtp->u.p.current_unit->bytes_left++; - - cc = dtp->internal_unit[offset]; - if (cc != (gfc_char4_t)' ') - sseek (dtp->u.p.current_unit->s, - offset-(sizeof (gfc_char4_t)), SEEK_SET); } else { - do + for (i = 0; i < dtp->u.p.current_unit->bytes_left; i++) { - c = dtp->internal_unit[offset++]; - dtp->u.p.current_unit->bytes_left--; + if (dtp->internal_unit[offset + i] != ' ') + break; } - while (offset < limit && c == ' '); - /* Back up, seek ahead, and fall through to complete the - process so that END conditions are handled correctly. */ - dtp->u.p.current_unit->bytes_left++; + } - if (dtp->internal_unit[offset] != ' ') - sseek (dtp->u.p.current_unit->s, offset - 1, SEEK_SET); + if (i != 0) + { + sseek (dtp->u.p.current_unit->s, offset + i, SEEK_SET); + dtp->u.p.current_unit->bytes_left -= i; } } + /* Now skip spaces, EOF and EOL are handled in next_char. */ do c = next_char (dtp); |