Commit e32883d1 by Jerry DeLisle

re PR libfortran/35132 (Formatted stream I/O write should truncate)

2008-02-20  Jerry DeLisle  <jvdelisle@gcc.gnu.org>

	PR libfortran/35132
	* io/transfer.c (next_record_w): Truncate after the last record for
	STREAM I/O.

	PR libfortran/34954
	* io/transfer.c (data_transfer_init): Initialize dtp->rec if writing.

	PR libfortran/34974
	* io/transfer.c (formatted_transfer_scalar): Flush the buffer if skips
	is less than zero. (next_record_w): Use sseek to position the file to
	the max position reached.

From-SVN: r132512
parent d5e0c0ae
2008-02-20 Jerry DeLisle <jvdelisle@gcc.gnu.org> 2008-02-20 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR libfortran/35132
* io/transfer.c (next_record_w): Truncate after the last record for
STREAM I/O.
PR libfortran/34954
* io/transfer.c (data_transfer_init): Initialize dtp->rec if writing.
PR libfortran/34974
* io/transfer.c (formatted_transfer_scalar): Flush the buffer if skips
is less than zero. (next_record_w): Use sseek to position the file to
the max position reached.
2008-02-20 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR libfortran/35036 PR libfortran/35036
* write_float.def (output_float): Add error checks for zero digits * write_float.def (output_float): Add error checks for zero digits
after decimal point in E and D format specifiers. after decimal point in E and D format specifiers.
......
...@@ -916,8 +916,8 @@ formatted_transfer_scalar (st_parameter_dt *dtp, bt type, void *p, int len, ...@@ -916,8 +916,8 @@ formatted_transfer_scalar (st_parameter_dt *dtp, bt type, void *p, int len,
the entire field has been read. The next read field will start right after the entire field has been read. The next read field will start right after
the comma in the stream. (Set to 0 for character reads). */ the comma in the stream. (Set to 0 for character reads). */
dtp->u.p.sf_read_comma = 1; dtp->u.p.sf_read_comma = 1;
dtp->u.p.line_buffer = scratch; dtp->u.p.line_buffer = scratch;
for (;;) for (;;)
{ {
/* If reversion has occurred and there is another real data item, /* If reversion has occurred and there is another real data item,
...@@ -1274,6 +1274,11 @@ formatted_transfer_scalar (st_parameter_dt *dtp, bt type, void *p, int len, ...@@ -1274,6 +1274,11 @@ formatted_transfer_scalar (st_parameter_dt *dtp, bt type, void *p, int len,
else else
read_x (dtp, dtp->u.p.skips); read_x (dtp, dtp->u.p.skips);
} }
else
{
if (dtp->u.p.skips < 0)
flush (dtp->u.p.current_unit->s);
}
break; break;
...@@ -2007,6 +2012,8 @@ data_transfer_init (st_parameter_dt *dtp, int read_flag) ...@@ -2007,6 +2012,8 @@ data_transfer_init (st_parameter_dt *dtp, int read_flag)
dtp->u.p.current_unit->strm_pos = dtp->rec; dtp->u.p.current_unit->strm_pos = dtp->rec;
} }
else
dtp->rec = 0;
/* Overwriting an existing sequential file ? /* Overwriting an existing sequential file ?
it is always safe to truncate the file on the first write */ it is always safe to truncate the file on the first write */
...@@ -2583,7 +2590,8 @@ next_record_w (st_parameter_dt *dtp, int done) ...@@ -2583,7 +2590,8 @@ next_record_w (st_parameter_dt *dtp, int done)
if (max_pos > m) if (max_pos > m)
{ {
length = (int) (max_pos - m); length = (int) (max_pos - m);
p = salloc_w (dtp->u.p.current_unit->s, &length); sseek (dtp->u.p.current_unit->s,
file_position (dtp->u.p.current_unit->s) + length);
} }
#ifdef HAVE_CRLF #ifdef HAVE_CRLF
len = 2; len = 2;
...@@ -2594,7 +2602,10 @@ next_record_w (st_parameter_dt *dtp, int done) ...@@ -2594,7 +2602,10 @@ next_record_w (st_parameter_dt *dtp, int done)
goto io_error; goto io_error;
if (is_stream_io (dtp)) if (is_stream_io (dtp))
{
dtp->u.p.current_unit->strm_pos += len; dtp->u.p.current_unit->strm_pos += len;
struncate(dtp->u.p.current_unit->s);
}
} }
break; break;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment