diff options
Diffstat (limited to 'libgfortran')
-rw-r--r-- | libgfortran/ChangeLog | 22 | ||||
-rw-r--r-- | libgfortran/io/read.c | 60 | ||||
-rw-r--r-- | libgfortran/io/transfer.c | 22 |
3 files changed, 78 insertions, 26 deletions
diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index 6b9c245db37..b9bfc492818 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,25 @@ +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. + 2005-07-17 Jerry DeLisle <jvdelisle@verizon.net> * io/write.c (write_float): Fix field width checks for diff --git a/libgfortran/io/read.c b/libgfortran/io/read.c index 4cfad8d7785..654475dd079 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); } diff --git a/libgfortran/io/transfer.c b/libgfortran/io/transfer.c index 161e5cca402..85d0dd91cfa 100644 --- a/libgfortran/io/transfer.c +++ b/libgfortran/io/transfer.c @@ -444,7 +444,7 @@ require_type (bt expected, bt actual, fnode * f) static void formatted_transfer (bt type, void *p, int len) { - int pos; + int pos, bytes_used; fnode *f; format_token t; int n; @@ -489,10 +489,12 @@ formatted_transfer (bt type, void *p, int len) || t == FMT_STRING)) { write_x (skips, pending_spaces); - max_pos = current_unit->recl - current_unit->bytes_left; + max_pos = (int)(current_unit->recl - current_unit->bytes_left); skips = pending_spaces = 0; } + bytes_used = (int)(current_unit->recl - current_unit->bytes_left); + switch (t) { case FMT_I: @@ -687,8 +689,8 @@ formatted_transfer (bt type, void *p, int len) case FMT_TR: consume_data_flag = 0 ; - pos = current_unit->recl - current_unit->bytes_left + f->u.n; - skips = f->u.n; + pos = bytes_used + f->u.n + skips; + skips = f->u.n + skips; pending_spaces = pos - max_pos; /* Writes occur just before the switch on f->format, above, so that @@ -701,7 +703,7 @@ formatted_transfer (bt type, void *p, int len) case FMT_TL: case FMT_T: if (f->format == FMT_TL) - pos = current_unit->recl - current_unit->bytes_left - f->u.n; + pos = bytes_used - f->u.n; else /* FMT_T */ { consume_data_flag = 0; @@ -714,7 +716,7 @@ formatted_transfer (bt type, void *p, int len) bring us back again. */ pos = pos < 0 ? 0 : pos; - skips = skips + pos - (current_unit->recl - current_unit->bytes_left); + skips = skips + pos - bytes_used; pending_spaces = pending_spaces + pos - max_pos; if (skips == 0) @@ -776,6 +778,8 @@ formatted_transfer (bt type, void *p, int len) case FMT_SLASH: consume_data_flag = 0 ; + skips = pending_spaces = 0; + current_unit->bytes_left = 0; next_record (0); break; @@ -1225,8 +1229,7 @@ data_transfer_init (int read_flag) } /* Reset counters for T and X-editing. */ - if (current_unit->flags.form == FORM_FORMATTED) - max_pos = skips = pending_spaces = 0; + max_pos = skips = pending_spaces = 0; /* Start the data transfer if we are doing a formatted transfer. */ if (current_unit->flags.form == FORM_FORMATTED && !ioparm.list_format @@ -1339,6 +1342,9 @@ next_record_w (void) int length; char *p; + /* Zero counters for X- and T-editing. */ + max_pos = skips = pending_spaces = 0; + switch (current_mode ()) { case FORMATTED_DIRECT: |