1 /* Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
2 Free Software Foundation, Inc.
3 Contributed by Andy Vaught
4 Namelist transfer functions contributed by Paul Thomas
5 F2003 I/O support contributed by Jerry DeLisle
7 This file is part of the GNU Fortran runtime library (libgfortran).
9 Libgfortran is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3, or (at your option)
14 Libgfortran is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 Under Section 7 of GPL version 3, you are granted additional
20 permissions described in the GCC Runtime Library Exception, version
21 3.1, as published by the Free Software Foundation.
23 You should have received a copy of the GNU General Public License and
24 a copy of the GCC Runtime Library Exception along with this program;
25 see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
26 <http://www.gnu.org/licenses/>. */
29 /* transfer.c -- Top level handling of data transfer statements. */
41 /* Calling conventions: Data transfer statements are unlike other
42 library calls in that they extend over several calls.
44 The first call is always a call to st_read() or st_write(). These
45 subroutines return no status unless a namelist read or write is
46 being done, in which case there is the usual status. No further
47 calls are necessary in this case.
49 For other sorts of data transfer, there are zero or more data
50 transfer statement that depend on the format of the data transfer
51 statement. For READ (and for backwards compatibily: for WRITE), one has
56 transfer_character_wide
64 transfer_integer_write
65 transfer_logical_write
66 transfer_character_write
67 transfer_character_wide_write
69 transfer_complex_write
70 transfer_real128_write
71 transfer_complex128_write
73 These subroutines do not return status. The *128 functions
74 are in the file transfer128.c.
76 The last call is a call to st_[read|write]_done(). While
77 something can easily go wrong with the initial st_read() or
78 st_write(), an error inhibits any data from actually being
81 extern void transfer_integer (st_parameter_dt
*, void *, int);
82 export_proto(transfer_integer
);
84 extern void transfer_integer_write (st_parameter_dt
*, void *, int);
85 export_proto(transfer_integer_write
);
87 extern void transfer_real (st_parameter_dt
*, void *, int);
88 export_proto(transfer_real
);
90 extern void transfer_real_write (st_parameter_dt
*, void *, int);
91 export_proto(transfer_real_write
);
93 extern void transfer_logical (st_parameter_dt
*, void *, int);
94 export_proto(transfer_logical
);
96 extern void transfer_logical_write (st_parameter_dt
*, void *, int);
97 export_proto(transfer_logical_write
);
99 extern void transfer_character (st_parameter_dt
*, void *, int);
100 export_proto(transfer_character
);
102 extern void transfer_character_write (st_parameter_dt
*, void *, int);
103 export_proto(transfer_character_write
);
105 extern void transfer_character_wide (st_parameter_dt
*, void *, int, int);
106 export_proto(transfer_character_wide
);
108 extern void transfer_character_wide_write (st_parameter_dt
*,
110 export_proto(transfer_character_wide_write
);
112 extern void transfer_complex (st_parameter_dt
*, void *, int);
113 export_proto(transfer_complex
);
115 extern void transfer_complex_write (st_parameter_dt
*, void *, int);
116 export_proto(transfer_complex_write
);
118 extern void transfer_array (st_parameter_dt
*, gfc_array_char
*, int,
120 export_proto(transfer_array
);
122 extern void transfer_array_write (st_parameter_dt
*, gfc_array_char
*, int,
124 export_proto(transfer_array_write
);
126 static void us_read (st_parameter_dt
*, int);
127 static void us_write (st_parameter_dt
*, int);
128 static void next_record_r_unf (st_parameter_dt
*, int);
129 static void next_record_w_unf (st_parameter_dt
*, int);
131 static const st_option advance_opt
[] = {
132 {"yes", ADVANCE_YES
},
138 static const st_option decimal_opt
[] = {
139 {"point", DECIMAL_POINT
},
140 {"comma", DECIMAL_COMMA
},
144 static const st_option round_opt
[] = {
146 {"down", ROUND_DOWN
},
147 {"zero", ROUND_ZERO
},
148 {"nearest", ROUND_NEAREST
},
149 {"compatible", ROUND_COMPATIBLE
},
150 {"processor_defined", ROUND_PROCDEFINED
},
155 static const st_option sign_opt
[] = {
157 {"suppress", SIGN_SS
},
158 {"processor_defined", SIGN_S
},
162 static const st_option blank_opt
[] = {
163 {"null", BLANK_NULL
},
164 {"zero", BLANK_ZERO
},
168 static const st_option delim_opt
[] = {
169 {"apostrophe", DELIM_APOSTROPHE
},
170 {"quote", DELIM_QUOTE
},
171 {"none", DELIM_NONE
},
175 static const st_option pad_opt
[] = {
182 { FORMATTED_SEQUENTIAL
, UNFORMATTED_SEQUENTIAL
,
183 FORMATTED_DIRECT
, UNFORMATTED_DIRECT
, FORMATTED_STREAM
, UNFORMATTED_STREAM
189 current_mode (st_parameter_dt
*dtp
)
193 m
= FORM_UNSPECIFIED
;
195 if (dtp
->u
.p
.current_unit
->flags
.access
== ACCESS_DIRECT
)
197 m
= dtp
->u
.p
.current_unit
->flags
.form
== FORM_FORMATTED
?
198 FORMATTED_DIRECT
: UNFORMATTED_DIRECT
;
200 else if (dtp
->u
.p
.current_unit
->flags
.access
== ACCESS_SEQUENTIAL
)
202 m
= dtp
->u
.p
.current_unit
->flags
.form
== FORM_FORMATTED
?
203 FORMATTED_SEQUENTIAL
: UNFORMATTED_SEQUENTIAL
;
205 else if (dtp
->u
.p
.current_unit
->flags
.access
== ACCESS_STREAM
)
207 m
= dtp
->u
.p
.current_unit
->flags
.form
== FORM_FORMATTED
?
208 FORMATTED_STREAM
: UNFORMATTED_STREAM
;
215 /* Mid level data transfer statements. */
217 /* Read sequential file - internal unit */
220 read_sf_internal (st_parameter_dt
*dtp
, int * length
)
222 static char *empty_string
[0];
226 /* Zero size array gives internal unit len of 0. Nothing to read. */
227 if (dtp
->internal_unit_len
== 0
228 && dtp
->u
.p
.current_unit
->pad_status
== PAD_NO
)
231 /* If we have seen an eor previously, return a length of 0. The
232 caller is responsible for correctly padding the input field. */
233 if (dtp
->u
.p
.sf_seen_eor
)
236 /* Just return something that isn't a NULL pointer, otherwise the
237 caller thinks an error occured. */
238 return (char*) empty_string
;
242 if (is_char4_unit(dtp
))
245 gfc_char4_t
*p
= (gfc_char4_t
*) mem_alloc_r4 (dtp
->u
.p
.current_unit
->s
,
247 base
= fbuf_alloc (dtp
->u
.p
.current_unit
, lorig
);
248 for (i
= 0; i
< *length
; i
++, p
++)
249 base
[i
] = *p
> 255 ? '?' : (unsigned char) *p
;
252 base
= mem_alloc_r (dtp
->u
.p
.current_unit
->s
, length
);
254 if (unlikely (lorig
> *length
))
260 dtp
->u
.p
.current_unit
->bytes_left
-= *length
;
262 if ((dtp
->common
.flags
& IOPARM_DT_HAS_SIZE
) != 0)
263 dtp
->u
.p
.size_used
+= (GFC_IO_INT
) *length
;
269 /* When reading sequential formatted records we have a problem. We
270 don't know how long the line is until we read the trailing newline,
271 and we don't want to read too much. If we read too much, we might
272 have to do a physical seek backwards depending on how much data is
273 present, and devices like terminals aren't seekable and would cause
276 Given this, the solution is to read a byte at a time, stopping if
277 we hit the newline. For small allocations, we use a static buffer.
278 For larger allocations, we are forced to allocate memory on the
279 heap. Hopefully this won't happen very often. */
281 /* Read sequential file - external unit */
284 read_sf (st_parameter_dt
*dtp
, int * length
)
286 static char *empty_string
[0];
288 int n
, lorig
, seen_comma
;
290 /* If we have seen an eor previously, return a length of 0. The
291 caller is responsible for correctly padding the input field. */
292 if (dtp
->u
.p
.sf_seen_eor
)
295 /* Just return something that isn't a NULL pointer, otherwise the
296 caller thinks an error occured. */
297 return (char*) empty_string
;
302 /* Read data into format buffer and scan through it. */
307 q
= fbuf_getc (dtp
->u
.p
.current_unit
);
310 else if (q
== '\n' || q
== '\r')
312 /* Unexpected end of line. Set the position. */
313 dtp
->u
.p
.sf_seen_eor
= 1;
315 /* If we see an EOR during non-advancing I/O, we need to skip
316 the rest of the I/O statement. Set the corresponding flag. */
317 if (dtp
->u
.p
.advance_status
== ADVANCE_NO
|| dtp
->u
.p
.seen_dollar
)
318 dtp
->u
.p
.eor_condition
= 1;
320 /* If we encounter a CR, it might be a CRLF. */
321 if (q
== '\r') /* Probably a CRLF */
323 /* See if there is an LF. */
324 q2
= fbuf_getc (dtp
->u
.p
.current_unit
);
326 dtp
->u
.p
.sf_seen_eor
= 2;
327 else if (q2
!= EOF
) /* Oops, seek back. */
328 fbuf_seek (dtp
->u
.p
.current_unit
, -1, SEEK_CUR
);
331 /* Without padding, terminate the I/O statement without assigning
332 the value. With padding, the value still needs to be assigned,
333 so we can just continue with a short read. */
334 if (dtp
->u
.p
.current_unit
->pad_status
== PAD_NO
)
336 generate_error (&dtp
->common
, LIBERROR_EOR
, NULL
);
343 /* Short circuit the read if a comma is found during numeric input.
344 The flag is set to zero during character reads so that commas in
345 strings are not ignored */
347 if (dtp
->u
.p
.sf_read_comma
== 1)
350 notify_std (&dtp
->common
, GFC_STD_GNU
,
351 "Comma in formatted numeric read.");
359 /* A short read implies we hit EOF, unless we hit EOR, a comma, or
360 some other stuff. Set the relevant flags. */
361 if (lorig
> *length
&& !dtp
->u
.p
.sf_seen_eor
&& !seen_comma
)
365 if (dtp
->u
.p
.advance_status
== ADVANCE_NO
)
367 if (dtp
->u
.p
.current_unit
->pad_status
== PAD_NO
)
373 dtp
->u
.p
.eor_condition
= 1;
378 else if (dtp
->u
.p
.advance_status
== ADVANCE_NO
379 || dtp
->u
.p
.current_unit
->pad_status
== PAD_NO
380 || dtp
->u
.p
.current_unit
->bytes_left
381 == dtp
->u
.p
.current_unit
->recl
)
390 dtp
->u
.p
.current_unit
->bytes_left
-= n
;
392 if ((dtp
->common
.flags
& IOPARM_DT_HAS_SIZE
) != 0)
393 dtp
->u
.p
.size_used
+= (GFC_IO_INT
) n
;
395 /* We can't call fbuf_getptr before the loop doing fbuf_getc, because
396 fbuf_getc might reallocate the buffer. So return current pointer
397 minus all the advances, which is n plus up to two characters
398 of newline or comma. */
399 return fbuf_getptr (dtp
->u
.p
.current_unit
)
400 - n
- dtp
->u
.p
.sf_seen_eor
- seen_comma
;
404 /* Function for reading the next couple of bytes from the current
405 file, advancing the current position. We return FAILURE on end of record or
406 end of file. This function is only for formatted I/O, unformatted uses
409 If the read is short, then it is because the current record does not
410 have enough data to satisfy the read request and the file was
411 opened with PAD=YES. The caller must assume tailing spaces for
415 read_block_form (st_parameter_dt
*dtp
, int * nbytes
)
420 if (!is_stream_io (dtp
))
422 if (dtp
->u
.p
.current_unit
->bytes_left
< (gfc_offset
) *nbytes
)
424 /* For preconnected units with default record length, set bytes left
425 to unit record length and proceed, otherwise error. */
426 if (dtp
->u
.p
.current_unit
->unit_number
== options
.stdin_unit
427 && dtp
->u
.p
.current_unit
->recl
== DEFAULT_RECL
)
428 dtp
->u
.p
.current_unit
->bytes_left
= dtp
->u
.p
.current_unit
->recl
;
431 if (unlikely (dtp
->u
.p
.current_unit
->pad_status
== PAD_NO
)
432 && !is_internal_unit (dtp
))
434 /* Not enough data left. */
435 generate_error (&dtp
->common
, LIBERROR_EOR
, NULL
);
440 if (unlikely (dtp
->u
.p
.current_unit
->bytes_left
== 0
441 && !is_internal_unit(dtp
)))
447 *nbytes
= dtp
->u
.p
.current_unit
->bytes_left
;
451 if (dtp
->u
.p
.current_unit
->flags
.form
== FORM_FORMATTED
&&
452 (dtp
->u
.p
.current_unit
->flags
.access
== ACCESS_SEQUENTIAL
||
453 dtp
->u
.p
.current_unit
->flags
.access
== ACCESS_STREAM
))
455 if (is_internal_unit (dtp
))
456 source
= read_sf_internal (dtp
, nbytes
);
458 source
= read_sf (dtp
, nbytes
);
460 dtp
->u
.p
.current_unit
->strm_pos
+=
461 (gfc_offset
) (*nbytes
+ dtp
->u
.p
.sf_seen_eor
);
465 /* If we reach here, we can assume it's direct access. */
467 dtp
->u
.p
.current_unit
->bytes_left
-= (gfc_offset
) *nbytes
;
470 source
= fbuf_read (dtp
->u
.p
.current_unit
, nbytes
);
471 fbuf_seek (dtp
->u
.p
.current_unit
, *nbytes
, SEEK_CUR
);
473 if ((dtp
->common
.flags
& IOPARM_DT_HAS_SIZE
) != 0)
474 dtp
->u
.p
.size_used
+= (GFC_IO_INT
) *nbytes
;
476 if (norig
!= *nbytes
)
478 /* Short read, this shouldn't happen. */
479 if (!dtp
->u
.p
.current_unit
->pad_status
== PAD_YES
)
481 generate_error (&dtp
->common
, LIBERROR_EOR
, NULL
);
486 dtp
->u
.p
.current_unit
->strm_pos
+= (gfc_offset
) *nbytes
;
492 /* Read a block from a character(kind=4) internal unit, to be transferred into
493 a character(kind=4) variable. Note: Portions of this code borrowed from
496 read_block_form4 (st_parameter_dt
*dtp
, int * nbytes
)
498 static gfc_char4_t
*empty_string
[0];
502 if (dtp
->u
.p
.current_unit
->bytes_left
< (gfc_offset
) *nbytes
)
503 *nbytes
= dtp
->u
.p
.current_unit
->bytes_left
;
505 /* Zero size array gives internal unit len of 0. Nothing to read. */
506 if (dtp
->internal_unit_len
== 0
507 && dtp
->u
.p
.current_unit
->pad_status
== PAD_NO
)
510 /* If we have seen an eor previously, return a length of 0. The
511 caller is responsible for correctly padding the input field. */
512 if (dtp
->u
.p
.sf_seen_eor
)
515 /* Just return something that isn't a NULL pointer, otherwise the
516 caller thinks an error occured. */
521 source
= (gfc_char4_t
*) mem_alloc_r4 (dtp
->u
.p
.current_unit
->s
, nbytes
);
523 if (unlikely (lorig
> *nbytes
))
529 dtp
->u
.p
.current_unit
->bytes_left
-= *nbytes
;
531 if ((dtp
->common
.flags
& IOPARM_DT_HAS_SIZE
) != 0)
532 dtp
->u
.p
.size_used
+= (GFC_IO_INT
) *nbytes
;
538 /* Reads a block directly into application data space. This is for
539 unformatted files. */
542 read_block_direct (st_parameter_dt
*dtp
, void *buf
, size_t nbytes
)
544 ssize_t to_read_record
;
545 ssize_t have_read_record
;
546 ssize_t to_read_subrecord
;
547 ssize_t have_read_subrecord
;
550 if (is_stream_io (dtp
))
552 have_read_record
= sread (dtp
->u
.p
.current_unit
->s
, buf
,
554 if (unlikely (have_read_record
< 0))
556 generate_error (&dtp
->common
, LIBERROR_OS
, NULL
);
560 dtp
->u
.p
.current_unit
->strm_pos
+= (gfc_offset
) have_read_record
;
562 if (unlikely ((ssize_t
) nbytes
!= have_read_record
))
564 /* Short read, e.g. if we hit EOF. For stream files,
565 we have to set the end-of-file condition. */
571 if (dtp
->u
.p
.current_unit
->flags
.access
== ACCESS_DIRECT
)
573 if (dtp
->u
.p
.current_unit
->bytes_left
< (gfc_offset
) nbytes
)
576 to_read_record
= dtp
->u
.p
.current_unit
->bytes_left
;
577 nbytes
= to_read_record
;
582 to_read_record
= nbytes
;
585 dtp
->u
.p
.current_unit
->bytes_left
-= to_read_record
;
587 to_read_record
= sread (dtp
->u
.p
.current_unit
->s
, buf
, to_read_record
);
588 if (unlikely (to_read_record
< 0))
590 generate_error (&dtp
->common
, LIBERROR_OS
, NULL
);
594 if (to_read_record
!= (ssize_t
) nbytes
)
596 /* Short read, e.g. if we hit EOF. Apparently, we read
597 more than was written to the last record. */
601 if (unlikely (short_record
))
603 generate_error (&dtp
->common
, LIBERROR_SHORT_RECORD
, NULL
);
608 /* Unformatted sequential. We loop over the subrecords, reading
609 until the request has been fulfilled or the record has run out
610 of continuation subrecords. */
612 /* Check whether we exceed the total record length. */
614 if (dtp
->u
.p
.current_unit
->flags
.has_recl
615 && ((gfc_offset
) nbytes
> dtp
->u
.p
.current_unit
->bytes_left
))
617 to_read_record
= dtp
->u
.p
.current_unit
->bytes_left
;
622 to_read_record
= nbytes
;
625 have_read_record
= 0;
629 if (dtp
->u
.p
.current_unit
->bytes_left_subrecord
630 < (gfc_offset
) to_read_record
)
632 to_read_subrecord
= dtp
->u
.p
.current_unit
->bytes_left_subrecord
;
633 to_read_record
-= to_read_subrecord
;
637 to_read_subrecord
= to_read_record
;
641 dtp
->u
.p
.current_unit
->bytes_left_subrecord
-= to_read_subrecord
;
643 have_read_subrecord
= sread (dtp
->u
.p
.current_unit
->s
,
644 buf
+ have_read_record
, to_read_subrecord
);
645 if (unlikely (have_read_subrecord
) < 0)
647 generate_error (&dtp
->common
, LIBERROR_OS
, NULL
);
651 have_read_record
+= have_read_subrecord
;
653 if (unlikely (to_read_subrecord
!= have_read_subrecord
))
655 /* Short read, e.g. if we hit EOF. This means the record
656 structure has been corrupted, or the trailing record
657 marker would still be present. */
659 generate_error (&dtp
->common
, LIBERROR_CORRUPT_FILE
, NULL
);
663 if (to_read_record
> 0)
665 if (likely (dtp
->u
.p
.current_unit
->continued
))
667 next_record_r_unf (dtp
, 0);
672 /* Let's make sure the file position is correctly pre-positioned
673 for the next read statement. */
675 dtp
->u
.p
.current_unit
->current_record
= 0;
676 next_record_r_unf (dtp
, 0);
677 generate_error (&dtp
->common
, LIBERROR_SHORT_RECORD
, NULL
);
683 /* Normal exit, the read request has been fulfilled. */
688 dtp
->u
.p
.current_unit
->bytes_left
-= have_read_record
;
689 if (unlikely (short_record
))
691 generate_error (&dtp
->common
, LIBERROR_SHORT_RECORD
, NULL
);
698 /* Function for writing a block of bytes to the current file at the
699 current position, advancing the file pointer. We are given a length
700 and return a pointer to a buffer that the caller must (completely)
701 fill in. Returns NULL on error. */
704 write_block (st_parameter_dt
*dtp
, int length
)
708 if (!is_stream_io (dtp
))
710 if (dtp
->u
.p
.current_unit
->bytes_left
< (gfc_offset
) length
)
712 /* For preconnected units with default record length, set bytes left
713 to unit record length and proceed, otherwise error. */
714 if (likely ((dtp
->u
.p
.current_unit
->unit_number
715 == options
.stdout_unit
716 || dtp
->u
.p
.current_unit
->unit_number
717 == options
.stderr_unit
)
718 && dtp
->u
.p
.current_unit
->recl
== DEFAULT_RECL
))
719 dtp
->u
.p
.current_unit
->bytes_left
= dtp
->u
.p
.current_unit
->recl
;
722 generate_error (&dtp
->common
, LIBERROR_EOR
, NULL
);
727 dtp
->u
.p
.current_unit
->bytes_left
-= (gfc_offset
) length
;
730 if (is_internal_unit (dtp
))
732 if (dtp
->common
.unit
) /* char4 internel unit. */
735 dest4
= mem_alloc_w4 (dtp
->u
.p
.current_unit
->s
, &length
);
738 generate_error (&dtp
->common
, LIBERROR_END
, NULL
);
744 dest
= mem_alloc_w (dtp
->u
.p
.current_unit
->s
, &length
);
748 generate_error (&dtp
->common
, LIBERROR_END
, NULL
);
752 if (unlikely (dtp
->u
.p
.current_unit
->endfile
== AT_ENDFILE
))
753 generate_error (&dtp
->common
, LIBERROR_END
, NULL
);
757 dest
= fbuf_alloc (dtp
->u
.p
.current_unit
, length
);
760 generate_error (&dtp
->common
, LIBERROR_OS
, NULL
);
765 if ((dtp
->common
.flags
& IOPARM_DT_HAS_SIZE
) != 0)
766 dtp
->u
.p
.size_used
+= (GFC_IO_INT
) length
;
768 dtp
->u
.p
.current_unit
->strm_pos
+= (gfc_offset
) length
;
774 /* High level interface to swrite(), taking care of errors. This is only
775 called for unformatted files. There are three cases to consider:
776 Stream I/O, unformatted direct, unformatted sequential. */
779 write_buf (st_parameter_dt
*dtp
, void *buf
, size_t nbytes
)
782 ssize_t have_written
;
783 ssize_t to_write_subrecord
;
788 if (is_stream_io (dtp
))
790 have_written
= swrite (dtp
->u
.p
.current_unit
->s
, buf
, nbytes
);
791 if (unlikely (have_written
< 0))
793 generate_error (&dtp
->common
, LIBERROR_OS
, NULL
);
797 dtp
->u
.p
.current_unit
->strm_pos
+= (gfc_offset
) have_written
;
802 /* Unformatted direct access. */
804 if (dtp
->u
.p
.current_unit
->flags
.access
== ACCESS_DIRECT
)
806 if (unlikely (dtp
->u
.p
.current_unit
->bytes_left
< (gfc_offset
) nbytes
))
808 generate_error (&dtp
->common
, LIBERROR_DIRECT_EOR
, NULL
);
812 if (buf
== NULL
&& nbytes
== 0)
815 have_written
= swrite (dtp
->u
.p
.current_unit
->s
, buf
, nbytes
);
816 if (unlikely (have_written
< 0))
818 generate_error (&dtp
->common
, LIBERROR_OS
, NULL
);
822 dtp
->u
.p
.current_unit
->strm_pos
+= (gfc_offset
) have_written
;
823 dtp
->u
.p
.current_unit
->bytes_left
-= (gfc_offset
) have_written
;
828 /* Unformatted sequential. */
832 if (dtp
->u
.p
.current_unit
->flags
.has_recl
833 && (gfc_offset
) nbytes
> dtp
->u
.p
.current_unit
->bytes_left
)
835 nbytes
= dtp
->u
.p
.current_unit
->bytes_left
;
847 (size_t) dtp
->u
.p
.current_unit
->bytes_left_subrecord
< nbytes
?
848 (size_t) dtp
->u
.p
.current_unit
->bytes_left_subrecord
: nbytes
;
850 dtp
->u
.p
.current_unit
->bytes_left_subrecord
-=
851 (gfc_offset
) to_write_subrecord
;
853 to_write_subrecord
= swrite (dtp
->u
.p
.current_unit
->s
,
854 buf
+ have_written
, to_write_subrecord
);
855 if (unlikely (to_write_subrecord
< 0))
857 generate_error (&dtp
->common
, LIBERROR_OS
, NULL
);
861 dtp
->u
.p
.current_unit
->strm_pos
+= (gfc_offset
) to_write_subrecord
;
862 nbytes
-= to_write_subrecord
;
863 have_written
+= to_write_subrecord
;
868 next_record_w_unf (dtp
, 1);
871 dtp
->u
.p
.current_unit
->bytes_left
-= have_written
;
872 if (unlikely (short_record
))
874 generate_error (&dtp
->common
, LIBERROR_SHORT_RECORD
, NULL
);
881 /* Master function for unformatted reads. */
884 unformatted_read (st_parameter_dt
*dtp
, bt type
,
885 void *dest
, int kind
, size_t size
, size_t nelems
)
887 if (likely (dtp
->u
.p
.current_unit
->flags
.convert
== GFC_CONVERT_NATIVE
)
890 if (type
== BT_CHARACTER
)
891 size
*= GFC_SIZE_OF_CHAR_KIND(kind
);
892 read_block_direct (dtp
, dest
, size
* nelems
);
902 /* Handle wide chracters. */
903 if (type
== BT_CHARACTER
&& kind
!= 1)
909 /* Break up complex into its constituent reals. */
910 if (type
== BT_COMPLEX
)
916 /* By now, all complex variables have been split into their
917 constituent reals. */
919 for (i
= 0; i
< nelems
; i
++)
921 read_block_direct (dtp
, buffer
, size
);
922 reverse_memcpy (p
, buffer
, size
);
929 /* Master function for unformatted writes. NOTE: For kind=10 the size is 16
930 bytes on 64 bit machines. The unused bytes are not initialized and never
931 used, which can show an error with memory checking analyzers like
935 unformatted_write (st_parameter_dt
*dtp
, bt type
,
936 void *source
, int kind
, size_t size
, size_t nelems
)
938 if (likely (dtp
->u
.p
.current_unit
->flags
.convert
== GFC_CONVERT_NATIVE
)
941 size_t stride
= type
== BT_CHARACTER
?
942 size
* GFC_SIZE_OF_CHAR_KIND(kind
) : size
;
944 write_buf (dtp
, source
, stride
* nelems
);
954 /* Handle wide chracters. */
955 if (type
== BT_CHARACTER
&& kind
!= 1)
961 /* Break up complex into its constituent reals. */
962 if (type
== BT_COMPLEX
)
968 /* By now, all complex variables have been split into their
969 constituent reals. */
971 for (i
= 0; i
< nelems
; i
++)
973 reverse_memcpy(buffer
, p
, size
);
975 write_buf (dtp
, buffer
, size
);
981 /* Return a pointer to the name of a type. */
1006 internal_error (NULL
, "type_name(): Bad type");
1013 /* Write a constant string to the output.
1014 This is complicated because the string can have doubled delimiters
1015 in it. The length in the format node is the true length. */
1018 write_constant_string (st_parameter_dt
*dtp
, const fnode
*f
)
1020 char c
, delimiter
, *p
, *q
;
1023 length
= f
->u
.string
.length
;
1027 p
= write_block (dtp
, length
);
1034 for (; length
> 0; length
--)
1037 if (c
== delimiter
&& c
!= 'H' && c
!= 'h')
1038 q
++; /* Skip the doubled delimiter. */
1043 /* Given actual and expected types in a formatted data transfer, make
1044 sure they agree. If not, an error message is generated. Returns
1045 nonzero if something went wrong. */
1048 require_type (st_parameter_dt
*dtp
, bt expected
, bt actual
, const fnode
*f
)
1051 char buffer
[BUFLEN
];
1053 if (actual
== expected
)
1056 /* Adjust item_count before emitting error message. */
1057 snprintf (buffer
, BUFLEN
,
1058 "Expected %s for item %d in formatted transfer, got %s",
1059 type_name (expected
), dtp
->u
.p
.item_count
- 1, type_name (actual
));
1061 format_error (dtp
, f
, buffer
);
1066 /* This function is in the main loop for a formatted data transfer
1067 statement. It would be natural to implement this as a coroutine
1068 with the user program, but C makes that awkward. We loop,
1069 processing format elements. When we actually have to transfer
1070 data instead of just setting flags, we return control to the user
1071 program which calls a function that supplies the address and type
1072 of the next element, then comes back here to process it. */
1075 formatted_transfer_scalar_read (st_parameter_dt
*dtp
, bt type
, void *p
, int kind
,
1078 int pos
, bytes_used
;
1082 int consume_data_flag
;
1084 /* Change a complex data item into a pair of reals. */
1086 n
= (p
== NULL
) ? 0 : ((type
!= BT_COMPLEX
) ? 1 : 2);
1087 if (type
== BT_COMPLEX
)
1093 /* If there's an EOR condition, we simulate finalizing the transfer
1094 by doing nothing. */
1095 if (dtp
->u
.p
.eor_condition
)
1098 /* Set this flag so that commas in reads cause the read to complete before
1099 the entire field has been read. The next read field will start right after
1100 the comma in the stream. (Set to 0 for character reads). */
1101 dtp
->u
.p
.sf_read_comma
=
1102 dtp
->u
.p
.current_unit
->decimal_status
== DECIMAL_COMMA
? 0 : 1;
1106 /* If reversion has occurred and there is another real data item,
1107 then we have to move to the next record. */
1108 if (dtp
->u
.p
.reversion_flag
&& n
> 0)
1110 dtp
->u
.p
.reversion_flag
= 0;
1111 next_record (dtp
, 0);
1114 consume_data_flag
= 1;
1115 if ((dtp
->common
.flags
& IOPARM_LIBRETURN_MASK
) != IOPARM_LIBRETURN_OK
)
1118 f
= next_format (dtp
);
1121 /* No data descriptors left. */
1122 if (unlikely (n
> 0))
1123 generate_error (&dtp
->common
, LIBERROR_FORMAT
,
1124 "Insufficient data descriptors in format after reversion");
1130 bytes_used
= (int)(dtp
->u
.p
.current_unit
->recl
1131 - dtp
->u
.p
.current_unit
->bytes_left
);
1133 if (is_stream_io(dtp
))
1140 goto need_read_data
;
1141 if (require_type (dtp
, BT_INTEGER
, type
, f
))
1143 read_decimal (dtp
, f
, p
, kind
);
1148 goto need_read_data
;
1149 if (!(compile_options
.allow_std
& GFC_STD_GNU
)
1150 && require_type (dtp
, BT_INTEGER
, type
, f
))
1152 read_radix (dtp
, f
, p
, kind
, 2);
1157 goto need_read_data
;
1158 if (!(compile_options
.allow_std
& GFC_STD_GNU
)
1159 && require_type (dtp
, BT_INTEGER
, type
, f
))
1161 read_radix (dtp
, f
, p
, kind
, 8);
1166 goto need_read_data
;
1167 if (!(compile_options
.allow_std
& GFC_STD_GNU
)
1168 && require_type (dtp
, BT_INTEGER
, type
, f
))
1170 read_radix (dtp
, f
, p
, kind
, 16);
1175 goto need_read_data
;
1177 /* It is possible to have FMT_A with something not BT_CHARACTER such
1178 as when writing out hollerith strings, so check both type
1179 and kind before calling wide character routines. */
1180 if (type
== BT_CHARACTER
&& kind
== 4)
1181 read_a_char4 (dtp
, f
, p
, size
);
1183 read_a (dtp
, f
, p
, size
);
1188 goto need_read_data
;
1189 read_l (dtp
, f
, p
, kind
);
1194 goto need_read_data
;
1195 if (require_type (dtp
, BT_REAL
, type
, f
))
1197 read_f (dtp
, f
, p
, kind
);
1202 goto need_read_data
;
1203 if (require_type (dtp
, BT_REAL
, type
, f
))
1205 read_f (dtp
, f
, p
, kind
);
1210 goto need_read_data
;
1211 if (require_type (dtp
, BT_REAL
, type
, f
))
1213 read_f (dtp
, f
, p
, kind
);
1218 goto need_read_data
;
1219 if (require_type (dtp
, BT_REAL
, type
, f
))
1221 read_f (dtp
, f
, p
, kind
);
1226 goto need_read_data
;
1227 if (require_type (dtp
, BT_REAL
, type
, f
))
1229 read_f (dtp
, f
, p
, kind
);
1234 goto need_read_data
;
1238 read_decimal (dtp
, f
, p
, kind
);
1241 read_l (dtp
, f
, p
, kind
);
1245 read_a_char4 (dtp
, f
, p
, size
);
1247 read_a (dtp
, f
, p
, size
);
1250 read_f (dtp
, f
, p
, kind
);
1253 internal_error (&dtp
->common
, "formatted_transfer(): Bad type");
1258 consume_data_flag
= 0;
1259 format_error (dtp
, f
, "Constant string in input format");
1262 /* Format codes that don't transfer data. */
1265 consume_data_flag
= 0;
1266 dtp
->u
.p
.skips
+= f
->u
.n
;
1267 pos
= bytes_used
+ dtp
->u
.p
.skips
- 1;
1268 dtp
->u
.p
.pending_spaces
= pos
- dtp
->u
.p
.max_pos
+ 1;
1269 read_x (dtp
, f
->u
.n
);
1274 consume_data_flag
= 0;
1276 if (f
->format
== FMT_TL
)
1278 /* Handle the special case when no bytes have been used yet.
1279 Cannot go below zero. */
1280 if (bytes_used
== 0)
1282 dtp
->u
.p
.pending_spaces
-= f
->u
.n
;
1283 dtp
->u
.p
.skips
-= f
->u
.n
;
1284 dtp
->u
.p
.skips
= dtp
->u
.p
.skips
< 0 ? 0 : dtp
->u
.p
.skips
;
1287 pos
= bytes_used
- f
->u
.n
;
1292 /* Standard 10.6.1.1: excessive left tabbing is reset to the
1293 left tab limit. We do not check if the position has gone
1294 beyond the end of record because a subsequent tab could
1295 bring us back again. */
1296 pos
= pos
< 0 ? 0 : pos
;
1298 dtp
->u
.p
.skips
= dtp
->u
.p
.skips
+ pos
- bytes_used
;
1299 dtp
->u
.p
.pending_spaces
= dtp
->u
.p
.pending_spaces
1300 + pos
- dtp
->u
.p
.max_pos
;
1301 dtp
->u
.p
.pending_spaces
= dtp
->u
.p
.pending_spaces
< 0
1302 ? 0 : dtp
->u
.p
.pending_spaces
;
1303 if (dtp
->u
.p
.skips
== 0)
1306 /* Adjust everything for end-of-record condition */
1307 if (dtp
->u
.p
.sf_seen_eor
&& !is_internal_unit (dtp
))
1309 dtp
->u
.p
.current_unit
->bytes_left
-= dtp
->u
.p
.sf_seen_eor
;
1310 dtp
->u
.p
.skips
-= dtp
->u
.p
.sf_seen_eor
;
1312 dtp
->u
.p
.sf_seen_eor
= 0;
1314 if (dtp
->u
.p
.skips
< 0)
1316 if (is_internal_unit (dtp
))
1317 sseek (dtp
->u
.p
.current_unit
->s
, dtp
->u
.p
.skips
, SEEK_CUR
);
1319 fbuf_seek (dtp
->u
.p
.current_unit
, dtp
->u
.p
.skips
, SEEK_CUR
);
1320 dtp
->u
.p
.current_unit
->bytes_left
-= (gfc_offset
) dtp
->u
.p
.skips
;
1321 dtp
->u
.p
.skips
= dtp
->u
.p
.pending_spaces
= 0;
1324 read_x (dtp
, dtp
->u
.p
.skips
);
1328 consume_data_flag
= 0;
1329 dtp
->u
.p
.sign_status
= SIGN_S
;
1333 consume_data_flag
= 0;
1334 dtp
->u
.p
.sign_status
= SIGN_SS
;
1338 consume_data_flag
= 0;
1339 dtp
->u
.p
.sign_status
= SIGN_SP
;
1343 consume_data_flag
= 0 ;
1344 dtp
->u
.p
.blank_status
= BLANK_NULL
;
1348 consume_data_flag
= 0;
1349 dtp
->u
.p
.blank_status
= BLANK_ZERO
;
1353 consume_data_flag
= 0;
1354 dtp
->u
.p
.current_unit
->decimal_status
= DECIMAL_COMMA
;
1358 consume_data_flag
= 0;
1359 dtp
->u
.p
.current_unit
->decimal_status
= DECIMAL_POINT
;
1363 consume_data_flag
= 0;
1364 dtp
->u
.p
.current_unit
->round_status
= ROUND_COMPATIBLE
;
1368 consume_data_flag
= 0;
1369 dtp
->u
.p
.current_unit
->round_status
= ROUND_DOWN
;
1373 consume_data_flag
= 0;
1374 dtp
->u
.p
.current_unit
->round_status
= ROUND_NEAREST
;
1378 consume_data_flag
= 0;
1379 dtp
->u
.p
.current_unit
->round_status
= ROUND_PROCDEFINED
;
1383 consume_data_flag
= 0;
1384 dtp
->u
.p
.current_unit
->round_status
= ROUND_UP
;
1388 consume_data_flag
= 0;
1389 dtp
->u
.p
.current_unit
->round_status
= ROUND_ZERO
;
1393 consume_data_flag
= 0;
1394 dtp
->u
.p
.scale_factor
= f
->u
.k
;
1398 consume_data_flag
= 0;
1399 dtp
->u
.p
.seen_dollar
= 1;
1403 consume_data_flag
= 0;
1404 dtp
->u
.p
.skips
= dtp
->u
.p
.pending_spaces
= 0;
1405 next_record (dtp
, 0);
1409 /* A colon descriptor causes us to exit this loop (in
1410 particular preventing another / descriptor from being
1411 processed) unless there is another data item to be
1413 consume_data_flag
= 0;
1419 internal_error (&dtp
->common
, "Bad format node");
1422 /* Adjust the item count and data pointer. */
1424 if ((consume_data_flag
> 0) && (n
> 0))
1427 p
= ((char *) p
) + size
;
1432 pos
= (int)(dtp
->u
.p
.current_unit
->recl
- dtp
->u
.p
.current_unit
->bytes_left
);
1433 dtp
->u
.p
.max_pos
= (dtp
->u
.p
.max_pos
> pos
) ? dtp
->u
.p
.max_pos
: pos
;
1438 /* Come here when we need a data descriptor but don't have one. We
1439 push the current format node back onto the input, then return and
1440 let the user program call us back with the data. */
1442 unget_format (dtp
, f
);
1447 formatted_transfer_scalar_write (st_parameter_dt
*dtp
, bt type
, void *p
, int kind
,
1450 int pos
, bytes_used
;
1454 int consume_data_flag
;
1456 /* Change a complex data item into a pair of reals. */
1458 n
= (p
== NULL
) ? 0 : ((type
!= BT_COMPLEX
) ? 1 : 2);
1459 if (type
== BT_COMPLEX
)
1465 /* If there's an EOR condition, we simulate finalizing the transfer
1466 by doing nothing. */
1467 if (dtp
->u
.p
.eor_condition
)
1470 /* Set this flag so that commas in reads cause the read to complete before
1471 the entire field has been read. The next read field will start right after
1472 the comma in the stream. (Set to 0 for character reads). */
1473 dtp
->u
.p
.sf_read_comma
=
1474 dtp
->u
.p
.current_unit
->decimal_status
== DECIMAL_COMMA
? 0 : 1;
1478 /* If reversion has occurred and there is another real data item,
1479 then we have to move to the next record. */
1480 if (dtp
->u
.p
.reversion_flag
&& n
> 0)
1482 dtp
->u
.p
.reversion_flag
= 0;
1483 next_record (dtp
, 0);
1486 consume_data_flag
= 1;
1487 if ((dtp
->common
.flags
& IOPARM_LIBRETURN_MASK
) != IOPARM_LIBRETURN_OK
)
1490 f
= next_format (dtp
);
1493 /* No data descriptors left. */
1494 if (unlikely (n
> 0))
1495 generate_error (&dtp
->common
, LIBERROR_FORMAT
,
1496 "Insufficient data descriptors in format after reversion");
1500 /* Now discharge T, TR and X movements to the right. This is delayed
1501 until a data producing format to suppress trailing spaces. */
1504 if (dtp
->u
.p
.mode
== WRITING
&& dtp
->u
.p
.skips
!= 0
1505 && ((n
>0 && ( t
== FMT_I
|| t
== FMT_B
|| t
== FMT_O
1506 || t
== FMT_Z
|| t
== FMT_F
|| t
== FMT_E
1507 || t
== FMT_EN
|| t
== FMT_ES
|| t
== FMT_G
1508 || t
== FMT_L
|| t
== FMT_A
|| t
== FMT_D
))
1509 || t
== FMT_STRING
))
1511 if (dtp
->u
.p
.skips
> 0)
1514 write_x (dtp
, dtp
->u
.p
.skips
, dtp
->u
.p
.pending_spaces
);
1515 tmp
= (int)(dtp
->u
.p
.current_unit
->recl
1516 - dtp
->u
.p
.current_unit
->bytes_left
);
1518 dtp
->u
.p
.max_pos
> tmp
? dtp
->u
.p
.max_pos
: tmp
;
1520 if (dtp
->u
.p
.skips
< 0)
1522 if (is_internal_unit (dtp
))
1523 sseek (dtp
->u
.p
.current_unit
->s
, dtp
->u
.p
.skips
, SEEK_CUR
);
1525 fbuf_seek (dtp
->u
.p
.current_unit
, dtp
->u
.p
.skips
, SEEK_CUR
);
1526 dtp
->u
.p
.current_unit
->bytes_left
-= (gfc_offset
) dtp
->u
.p
.skips
;
1528 dtp
->u
.p
.skips
= dtp
->u
.p
.pending_spaces
= 0;
1531 bytes_used
= (int)(dtp
->u
.p
.current_unit
->recl
1532 - dtp
->u
.p
.current_unit
->bytes_left
);
1534 if (is_stream_io(dtp
))
1542 if (require_type (dtp
, BT_INTEGER
, type
, f
))
1544 write_i (dtp
, f
, p
, kind
);
1550 if (!(compile_options
.allow_std
& GFC_STD_GNU
)
1551 && require_type (dtp
, BT_INTEGER
, type
, f
))
1553 write_b (dtp
, f
, p
, kind
);
1559 if (!(compile_options
.allow_std
& GFC_STD_GNU
)
1560 && require_type (dtp
, BT_INTEGER
, type
, f
))
1562 write_o (dtp
, f
, p
, kind
);
1568 if (!(compile_options
.allow_std
& GFC_STD_GNU
)
1569 && require_type (dtp
, BT_INTEGER
, type
, f
))
1571 write_z (dtp
, f
, p
, kind
);
1578 /* It is possible to have FMT_A with something not BT_CHARACTER such
1579 as when writing out hollerith strings, so check both type
1580 and kind before calling wide character routines. */
1581 if (type
== BT_CHARACTER
&& kind
== 4)
1582 write_a_char4 (dtp
, f
, p
, size
);
1584 write_a (dtp
, f
, p
, size
);
1590 write_l (dtp
, f
, p
, kind
);
1596 if (require_type (dtp
, BT_REAL
, type
, f
))
1598 write_d (dtp
, f
, p
, kind
);
1604 if (require_type (dtp
, BT_REAL
, type
, f
))
1606 write_e (dtp
, f
, p
, kind
);
1612 if (require_type (dtp
, BT_REAL
, type
, f
))
1614 write_en (dtp
, f
, p
, kind
);
1620 if (require_type (dtp
, BT_REAL
, type
, f
))
1622 write_es (dtp
, f
, p
, kind
);
1628 if (require_type (dtp
, BT_REAL
, type
, f
))
1630 write_f (dtp
, f
, p
, kind
);
1639 write_i (dtp
, f
, p
, kind
);
1642 write_l (dtp
, f
, p
, kind
);
1646 write_a_char4 (dtp
, f
, p
, size
);
1648 write_a (dtp
, f
, p
, size
);
1651 if (f
->u
.real
.w
== 0)
1652 write_real_g0 (dtp
, p
, kind
, f
->u
.real
.d
);
1654 write_d (dtp
, f
, p
, kind
);
1657 internal_error (&dtp
->common
,
1658 "formatted_transfer(): Bad type");
1663 consume_data_flag
= 0;
1664 write_constant_string (dtp
, f
);
1667 /* Format codes that don't transfer data. */
1670 consume_data_flag
= 0;
1672 dtp
->u
.p
.skips
+= f
->u
.n
;
1673 pos
= bytes_used
+ dtp
->u
.p
.skips
- 1;
1674 dtp
->u
.p
.pending_spaces
= pos
- dtp
->u
.p
.max_pos
+ 1;
1675 /* Writes occur just before the switch on f->format, above, so
1676 that trailing blanks are suppressed, unless we are doing a
1677 non-advancing write in which case we want to output the blanks
1679 if (dtp
->u
.p
.advance_status
== ADVANCE_NO
)
1681 write_x (dtp
, dtp
->u
.p
.skips
, dtp
->u
.p
.pending_spaces
);
1682 dtp
->u
.p
.skips
= dtp
->u
.p
.pending_spaces
= 0;
1688 consume_data_flag
= 0;
1690 if (f
->format
== FMT_TL
)
1693 /* Handle the special case when no bytes have been used yet.
1694 Cannot go below zero. */
1695 if (bytes_used
== 0)
1697 dtp
->u
.p
.pending_spaces
-= f
->u
.n
;
1698 dtp
->u
.p
.skips
-= f
->u
.n
;
1699 dtp
->u
.p
.skips
= dtp
->u
.p
.skips
< 0 ? 0 : dtp
->u
.p
.skips
;
1702 pos
= bytes_used
- f
->u
.n
;
1705 pos
= f
->u
.n
- dtp
->u
.p
.pending_spaces
- 1;
1707 /* Standard 10.6.1.1: excessive left tabbing is reset to the
1708 left tab limit. We do not check if the position has gone
1709 beyond the end of record because a subsequent tab could
1710 bring us back again. */
1711 pos
= pos
< 0 ? 0 : pos
;
1713 dtp
->u
.p
.skips
= dtp
->u
.p
.skips
+ pos
- bytes_used
;
1714 dtp
->u
.p
.pending_spaces
= dtp
->u
.p
.pending_spaces
1715 + pos
- dtp
->u
.p
.max_pos
;
1716 dtp
->u
.p
.pending_spaces
= dtp
->u
.p
.pending_spaces
< 0
1717 ? 0 : dtp
->u
.p
.pending_spaces
;
1721 consume_data_flag
= 0;
1722 dtp
->u
.p
.sign_status
= SIGN_S
;
1726 consume_data_flag
= 0;
1727 dtp
->u
.p
.sign_status
= SIGN_SS
;
1731 consume_data_flag
= 0;
1732 dtp
->u
.p
.sign_status
= SIGN_SP
;
1736 consume_data_flag
= 0 ;
1737 dtp
->u
.p
.blank_status
= BLANK_NULL
;
1741 consume_data_flag
= 0;
1742 dtp
->u
.p
.blank_status
= BLANK_ZERO
;
1746 consume_data_flag
= 0;
1747 dtp
->u
.p
.current_unit
->decimal_status
= DECIMAL_COMMA
;
1751 consume_data_flag
= 0;
1752 dtp
->u
.p
.current_unit
->decimal_status
= DECIMAL_POINT
;
1756 consume_data_flag
= 0;
1757 dtp
->u
.p
.current_unit
->round_status
= ROUND_COMPATIBLE
;
1761 consume_data_flag
= 0;
1762 dtp
->u
.p
.current_unit
->round_status
= ROUND_DOWN
;
1766 consume_data_flag
= 0;
1767 dtp
->u
.p
.current_unit
->round_status
= ROUND_NEAREST
;
1771 consume_data_flag
= 0;
1772 dtp
->u
.p
.current_unit
->round_status
= ROUND_PROCDEFINED
;
1776 consume_data_flag
= 0;
1777 dtp
->u
.p
.current_unit
->round_status
= ROUND_UP
;
1781 consume_data_flag
= 0;
1782 dtp
->u
.p
.current_unit
->round_status
= ROUND_ZERO
;
1786 consume_data_flag
= 0;
1787 dtp
->u
.p
.scale_factor
= f
->u
.k
;
1791 consume_data_flag
= 0;
1792 dtp
->u
.p
.seen_dollar
= 1;
1796 consume_data_flag
= 0;
1797 dtp
->u
.p
.skips
= dtp
->u
.p
.pending_spaces
= 0;
1798 next_record (dtp
, 0);
1802 /* A colon descriptor causes us to exit this loop (in
1803 particular preventing another / descriptor from being
1804 processed) unless there is another data item to be
1806 consume_data_flag
= 0;
1812 internal_error (&dtp
->common
, "Bad format node");
1815 /* Adjust the item count and data pointer. */
1817 if ((consume_data_flag
> 0) && (n
> 0))
1820 p
= ((char *) p
) + size
;
1823 pos
= (int)(dtp
->u
.p
.current_unit
->recl
- dtp
->u
.p
.current_unit
->bytes_left
);
1824 dtp
->u
.p
.max_pos
= (dtp
->u
.p
.max_pos
> pos
) ? dtp
->u
.p
.max_pos
: pos
;
1829 /* Come here when we need a data descriptor but don't have one. We
1830 push the current format node back onto the input, then return and
1831 let the user program call us back with the data. */
1833 unget_format (dtp
, f
);
1836 /* This function is first called from data_init_transfer to initiate the loop
1837 over each item in the format, transferring data as required. Subsequent
1838 calls to this function occur for each data item foound in the READ/WRITE
1839 statement. The item_count is incremented for each call. Since the first
1840 call is from data_transfer_init, the item_count is always one greater than
1841 the actual count number of the item being transferred. */
1844 formatted_transfer (st_parameter_dt
*dtp
, bt type
, void *p
, int kind
,
1845 size_t size
, size_t nelems
)
1851 size_t stride
= type
== BT_CHARACTER
?
1852 size
* GFC_SIZE_OF_CHAR_KIND(kind
) : size
;
1853 if (dtp
->u
.p
.mode
== READING
)
1855 /* Big loop over all the elements. */
1856 for (elem
= 0; elem
< nelems
; elem
++)
1858 dtp
->u
.p
.item_count
++;
1859 formatted_transfer_scalar_read (dtp
, type
, tmp
+ stride
*elem
, kind
, size
);
1864 /* Big loop over all the elements. */
1865 for (elem
= 0; elem
< nelems
; elem
++)
1867 dtp
->u
.p
.item_count
++;
1868 formatted_transfer_scalar_write (dtp
, type
, tmp
+ stride
*elem
, kind
, size
);
1874 /* Data transfer entry points. The type of the data entity is
1875 implicit in the subroutine call. This prevents us from having to
1876 share a common enum with the compiler. */
1879 transfer_integer (st_parameter_dt
*dtp
, void *p
, int kind
)
1881 if ((dtp
->common
.flags
& IOPARM_LIBRETURN_MASK
) != IOPARM_LIBRETURN_OK
)
1883 dtp
->u
.p
.transfer (dtp
, BT_INTEGER
, p
, kind
, kind
, 1);
1887 transfer_integer_write (st_parameter_dt
*dtp
, void *p
, int kind
)
1889 transfer_integer (dtp
, p
, kind
);
1893 transfer_real (st_parameter_dt
*dtp
, void *p
, int kind
)
1896 if ((dtp
->common
.flags
& IOPARM_LIBRETURN_MASK
) != IOPARM_LIBRETURN_OK
)
1898 size
= size_from_real_kind (kind
);
1899 dtp
->u
.p
.transfer (dtp
, BT_REAL
, p
, kind
, size
, 1);
1903 transfer_real_write (st_parameter_dt
*dtp
, void *p
, int kind
)
1905 transfer_real (dtp
, p
, kind
);
1909 transfer_logical (st_parameter_dt
*dtp
, void *p
, int kind
)
1911 if ((dtp
->common
.flags
& IOPARM_LIBRETURN_MASK
) != IOPARM_LIBRETURN_OK
)
1913 dtp
->u
.p
.transfer (dtp
, BT_LOGICAL
, p
, kind
, kind
, 1);
1917 transfer_logical_write (st_parameter_dt
*dtp
, void *p
, int kind
)
1919 transfer_logical (dtp
, p
, kind
);
1923 transfer_character (st_parameter_dt
*dtp
, void *p
, int len
)
1925 static char *empty_string
[0];
1927 if ((dtp
->common
.flags
& IOPARM_LIBRETURN_MASK
) != IOPARM_LIBRETURN_OK
)
1930 /* Strings of zero length can have p == NULL, which confuses the
1931 transfer routines into thinking we need more data elements. To avoid
1932 this, we give them a nice pointer. */
1933 if (len
== 0 && p
== NULL
)
1936 /* Set kind here to 1. */
1937 dtp
->u
.p
.transfer (dtp
, BT_CHARACTER
, p
, 1, len
, 1);
1941 transfer_character_write (st_parameter_dt
*dtp
, void *p
, int len
)
1943 transfer_character (dtp
, p
, len
);
1947 transfer_character_wide (st_parameter_dt
*dtp
, void *p
, int len
, int kind
)
1949 static char *empty_string
[0];
1951 if ((dtp
->common
.flags
& IOPARM_LIBRETURN_MASK
) != IOPARM_LIBRETURN_OK
)
1954 /* Strings of zero length can have p == NULL, which confuses the
1955 transfer routines into thinking we need more data elements. To avoid
1956 this, we give them a nice pointer. */
1957 if (len
== 0 && p
== NULL
)
1960 /* Here we pass the actual kind value. */
1961 dtp
->u
.p
.transfer (dtp
, BT_CHARACTER
, p
, kind
, len
, 1);
1965 transfer_character_wide_write (st_parameter_dt
*dtp
, void *p
, int len
, int kind
)
1967 transfer_character_wide (dtp
, p
, len
, kind
);
1971 transfer_complex (st_parameter_dt
*dtp
, void *p
, int kind
)
1974 if ((dtp
->common
.flags
& IOPARM_LIBRETURN_MASK
) != IOPARM_LIBRETURN_OK
)
1976 size
= size_from_complex_kind (kind
);
1977 dtp
->u
.p
.transfer (dtp
, BT_COMPLEX
, p
, kind
, size
, 1);
1981 transfer_complex_write (st_parameter_dt
*dtp
, void *p
, int kind
)
1983 transfer_complex (dtp
, p
, kind
);
1987 transfer_array (st_parameter_dt
*dtp
, gfc_array_char
*desc
, int kind
,
1988 gfc_charlen_type charlen
)
1990 index_type count
[GFC_MAX_DIMENSIONS
];
1991 index_type extent
[GFC_MAX_DIMENSIONS
];
1992 index_type stride
[GFC_MAX_DIMENSIONS
];
1993 index_type stride0
, rank
, size
, n
;
1998 if ((dtp
->common
.flags
& IOPARM_LIBRETURN_MASK
) != IOPARM_LIBRETURN_OK
)
2001 iotype
= (bt
) GFC_DESCRIPTOR_TYPE (desc
);
2002 size
= iotype
== BT_CHARACTER
? charlen
: GFC_DESCRIPTOR_SIZE (desc
);
2004 rank
= GFC_DESCRIPTOR_RANK (desc
);
2005 for (n
= 0; n
< rank
; n
++)
2008 stride
[n
] = GFC_DESCRIPTOR_STRIDE_BYTES(desc
,n
);
2009 extent
[n
] = GFC_DESCRIPTOR_EXTENT(desc
,n
);
2011 /* If the extent of even one dimension is zero, then the entire
2012 array section contains zero elements, so we return after writing
2013 a zero array record. */
2018 dtp
->u
.p
.transfer (dtp
, iotype
, data
, kind
, size
, tsize
);
2023 stride0
= stride
[0];
2025 /* If the innermost dimension has a stride of 1, we can do the transfer
2026 in contiguous chunks. */
2027 if (stride0
== size
)
2032 data
= GFC_DESCRIPTOR_DATA (desc
);
2036 dtp
->u
.p
.transfer (dtp
, iotype
, data
, kind
, size
, tsize
);
2037 data
+= stride0
* tsize
;
2040 while (count
[n
] == extent
[n
])
2043 data
-= stride
[n
] * extent
[n
];
2060 transfer_array_write (st_parameter_dt
*dtp
, gfc_array_char
*desc
, int kind
,
2061 gfc_charlen_type charlen
)
2063 transfer_array (dtp
, desc
, kind
, charlen
);
2066 /* Preposition a sequential unformatted file while reading. */
2069 us_read (st_parameter_dt
*dtp
, int continued
)
2076 if (compile_options
.record_marker
== 0)
2077 n
= sizeof (GFC_INTEGER_4
);
2079 n
= compile_options
.record_marker
;
2081 nr
= sread (dtp
->u
.p
.current_unit
->s
, &i
, n
);
2082 if (unlikely (nr
< 0))
2084 generate_error (&dtp
->common
, LIBERROR_BAD_US
, NULL
);
2090 return; /* end of file */
2092 else if (unlikely (n
!= nr
))
2094 generate_error (&dtp
->common
, LIBERROR_BAD_US
, NULL
);
2098 /* Only GFC_CONVERT_NATIVE and GFC_CONVERT_SWAP are valid here. */
2099 if (likely (dtp
->u
.p
.current_unit
->flags
.convert
== GFC_CONVERT_NATIVE
))
2103 case sizeof(GFC_INTEGER_4
):
2104 memcpy (&i4
, &i
, sizeof (i4
));
2108 case sizeof(GFC_INTEGER_8
):
2109 memcpy (&i8
, &i
, sizeof (i8
));
2114 runtime_error ("Illegal value for record marker");
2121 case sizeof(GFC_INTEGER_4
):
2122 reverse_memcpy (&i4
, &i
, sizeof (i4
));
2126 case sizeof(GFC_INTEGER_8
):
2127 reverse_memcpy (&i8
, &i
, sizeof (i8
));
2132 runtime_error ("Illegal value for record marker");
2138 dtp
->u
.p
.current_unit
->bytes_left_subrecord
= i
;
2139 dtp
->u
.p
.current_unit
->continued
= 0;
2143 dtp
->u
.p
.current_unit
->bytes_left_subrecord
= -i
;
2144 dtp
->u
.p
.current_unit
->continued
= 1;
2148 dtp
->u
.p
.current_unit
->bytes_left
= dtp
->u
.p
.current_unit
->recl
;
2152 /* Preposition a sequential unformatted file while writing. This
2153 amount to writing a bogus length that will be filled in later. */
2156 us_write (st_parameter_dt
*dtp
, int continued
)
2163 if (compile_options
.record_marker
== 0)
2164 nbytes
= sizeof (GFC_INTEGER_4
);
2166 nbytes
= compile_options
.record_marker
;
2168 if (swrite (dtp
->u
.p
.current_unit
->s
, &dummy
, nbytes
) != nbytes
)
2169 generate_error (&dtp
->common
, LIBERROR_OS
, NULL
);
2171 /* For sequential unformatted, if RECL= was not specified in the OPEN
2172 we write until we have more bytes than can fit in the subrecord
2173 markers, then we write a new subrecord. */
2175 dtp
->u
.p
.current_unit
->bytes_left_subrecord
=
2176 dtp
->u
.p
.current_unit
->recl_subrecord
;
2177 dtp
->u
.p
.current_unit
->continued
= continued
;
2181 /* Position to the next record prior to transfer. We are assumed to
2182 be before the next record. We also calculate the bytes in the next
2186 pre_position (st_parameter_dt
*dtp
)
2188 if (dtp
->u
.p
.current_unit
->current_record
)
2189 return; /* Already positioned. */
2191 switch (current_mode (dtp
))
2193 case FORMATTED_STREAM
:
2194 case UNFORMATTED_STREAM
:
2195 /* There are no records with stream I/O. If the position was specified
2196 data_transfer_init has already positioned the file. If no position
2197 was specified, we continue from where we last left off. I.e.
2198 there is nothing to do here. */
2201 case UNFORMATTED_SEQUENTIAL
:
2202 if (dtp
->u
.p
.mode
== READING
)
2209 case FORMATTED_SEQUENTIAL
:
2210 case FORMATTED_DIRECT
:
2211 case UNFORMATTED_DIRECT
:
2212 dtp
->u
.p
.current_unit
->bytes_left
= dtp
->u
.p
.current_unit
->recl
;
2216 dtp
->u
.p
.current_unit
->current_record
= 1;
2220 /* Initialize things for a data transfer. This code is common for
2221 both reading and writing. */
2224 data_transfer_init (st_parameter_dt
*dtp
, int read_flag
)
2226 unit_flags u_flags
; /* Used for creating a unit if needed. */
2227 GFC_INTEGER_4 cf
= dtp
->common
.flags
;
2228 namelist_info
*ionml
;
2230 ionml
= ((cf
& IOPARM_DT_IONML_SET
) != 0) ? dtp
->u
.p
.ionml
: NULL
;
2232 memset (&dtp
->u
.p
, 0, sizeof (dtp
->u
.p
));
2234 dtp
->u
.p
.ionml
= ionml
;
2235 dtp
->u
.p
.mode
= read_flag
? READING
: WRITING
;
2237 if ((dtp
->common
.flags
& IOPARM_LIBRETURN_MASK
) != IOPARM_LIBRETURN_OK
)
2240 if ((cf
& IOPARM_DT_HAS_SIZE
) != 0)
2241 dtp
->u
.p
.size_used
= 0; /* Initialize the count. */
2243 dtp
->u
.p
.current_unit
= get_unit (dtp
, 1);
2244 if (dtp
->u
.p
.current_unit
->s
== NULL
)
2245 { /* Open the unit with some default flags. */
2246 st_parameter_open opp
;
2249 if (dtp
->common
.unit
< 0)
2251 close_unit (dtp
->u
.p
.current_unit
);
2252 dtp
->u
.p
.current_unit
= NULL
;
2253 generate_error (&dtp
->common
, LIBERROR_BAD_OPTION
,
2254 "Bad unit number in statement");
2257 memset (&u_flags
, '\0', sizeof (u_flags
));
2258 u_flags
.access
= ACCESS_SEQUENTIAL
;
2259 u_flags
.action
= ACTION_READWRITE
;
2261 /* Is it unformatted? */
2262 if (!(cf
& (IOPARM_DT_HAS_FORMAT
| IOPARM_DT_LIST_FORMAT
2263 | IOPARM_DT_IONML_SET
)))
2264 u_flags
.form
= FORM_UNFORMATTED
;
2266 u_flags
.form
= FORM_UNSPECIFIED
;
2268 u_flags
.delim
= DELIM_UNSPECIFIED
;
2269 u_flags
.blank
= BLANK_UNSPECIFIED
;
2270 u_flags
.pad
= PAD_UNSPECIFIED
;
2271 u_flags
.decimal
= DECIMAL_UNSPECIFIED
;
2272 u_flags
.encoding
= ENCODING_UNSPECIFIED
;
2273 u_flags
.async
= ASYNC_UNSPECIFIED
;
2274 u_flags
.round
= ROUND_UNSPECIFIED
;
2275 u_flags
.sign
= SIGN_UNSPECIFIED
;
2277 u_flags
.status
= STATUS_UNKNOWN
;
2279 conv
= get_unformatted_convert (dtp
->common
.unit
);
2281 if (conv
== GFC_CONVERT_NONE
)
2282 conv
= compile_options
.convert
;
2284 /* We use big_endian, which is 0 on little-endian machines
2285 and 1 on big-endian machines. */
2288 case GFC_CONVERT_NATIVE
:
2289 case GFC_CONVERT_SWAP
:
2292 case GFC_CONVERT_BIG
:
2293 conv
= big_endian
? GFC_CONVERT_NATIVE
: GFC_CONVERT_SWAP
;
2296 case GFC_CONVERT_LITTLE
:
2297 conv
= big_endian
? GFC_CONVERT_SWAP
: GFC_CONVERT_NATIVE
;
2301 internal_error (&opp
.common
, "Illegal value for CONVERT");
2305 u_flags
.convert
= conv
;
2307 opp
.common
= dtp
->common
;
2308 opp
.common
.flags
&= IOPARM_COMMON_MASK
;
2309 dtp
->u
.p
.current_unit
= new_unit (&opp
, dtp
->u
.p
.current_unit
, &u_flags
);
2310 dtp
->common
.flags
&= ~IOPARM_COMMON_MASK
;
2311 dtp
->common
.flags
|= (opp
.common
.flags
& IOPARM_COMMON_MASK
);
2312 if (dtp
->u
.p
.current_unit
== NULL
)
2316 /* Check the action. */
2318 if (read_flag
&& dtp
->u
.p
.current_unit
->flags
.action
== ACTION_WRITE
)
2320 generate_error (&dtp
->common
, LIBERROR_BAD_ACTION
,
2321 "Cannot read from file opened for WRITE");
2325 if (!read_flag
&& dtp
->u
.p
.current_unit
->flags
.action
== ACTION_READ
)
2327 generate_error (&dtp
->common
, LIBERROR_BAD_ACTION
,
2328 "Cannot write to file opened for READ");
2332 dtp
->u
.p
.first_item
= 1;
2334 /* Check the format. */
2336 if ((cf
& IOPARM_DT_HAS_FORMAT
) != 0)
2339 if (dtp
->u
.p
.current_unit
->flags
.form
== FORM_UNFORMATTED
2340 && (cf
& (IOPARM_DT_HAS_FORMAT
| IOPARM_DT_LIST_FORMAT
))
2343 generate_error (&dtp
->common
, LIBERROR_OPTION_CONFLICT
,
2344 "Format present for UNFORMATTED data transfer");
2348 if ((cf
& IOPARM_DT_HAS_NAMELIST_NAME
) != 0 && dtp
->u
.p
.ionml
!= NULL
)
2350 if ((cf
& IOPARM_DT_HAS_FORMAT
) != 0)
2351 generate_error (&dtp
->common
, LIBERROR_OPTION_CONFLICT
,
2352 "A format cannot be specified with a namelist");
2354 else if (dtp
->u
.p
.current_unit
->flags
.form
== FORM_FORMATTED
&&
2355 !(cf
& (IOPARM_DT_HAS_FORMAT
| IOPARM_DT_LIST_FORMAT
)))
2357 generate_error (&dtp
->common
, LIBERROR_OPTION_CONFLICT
,
2358 "Missing format for FORMATTED data transfer");
2361 if (is_internal_unit (dtp
)
2362 && dtp
->u
.p
.current_unit
->flags
.form
== FORM_UNFORMATTED
)
2364 generate_error (&dtp
->common
, LIBERROR_OPTION_CONFLICT
,
2365 "Internal file cannot be accessed by UNFORMATTED "
2370 /* Check the record or position number. */
2372 if (dtp
->u
.p
.current_unit
->flags
.access
== ACCESS_DIRECT
2373 && (cf
& IOPARM_DT_HAS_REC
) == 0)
2375 generate_error (&dtp
->common
, LIBERROR_MISSING_OPTION
,
2376 "Direct access data transfer requires record number");
2380 if (dtp
->u
.p
.current_unit
->flags
.access
== ACCESS_SEQUENTIAL
)
2382 if ((cf
& IOPARM_DT_HAS_REC
) != 0)
2384 generate_error (&dtp
->common
, LIBERROR_OPTION_CONFLICT
,
2385 "Record number not allowed for sequential access "
2390 if (dtp
->u
.p
.current_unit
->endfile
== AFTER_ENDFILE
)
2392 generate_error (&dtp
->common
, LIBERROR_OPTION_CONFLICT
,
2393 "Sequential READ or WRITE not allowed after "
2394 "EOF marker, possibly use REWIND or BACKSPACE");
2399 /* Process the ADVANCE option. */
2401 dtp
->u
.p
.advance_status
2402 = !(cf
& IOPARM_DT_HAS_ADVANCE
) ? ADVANCE_UNSPECIFIED
:
2403 find_option (&dtp
->common
, dtp
->advance
, dtp
->advance_len
, advance_opt
,
2404 "Bad ADVANCE parameter in data transfer statement");
2406 if (dtp
->u
.p
.advance_status
!= ADVANCE_UNSPECIFIED
)
2408 if (dtp
->u
.p
.current_unit
->flags
.access
== ACCESS_DIRECT
)
2410 generate_error (&dtp
->common
, LIBERROR_OPTION_CONFLICT
,
2411 "ADVANCE specification conflicts with sequential "
2416 if (is_internal_unit (dtp
))
2418 generate_error (&dtp
->common
, LIBERROR_OPTION_CONFLICT
,
2419 "ADVANCE specification conflicts with internal file");
2423 if ((cf
& (IOPARM_DT_HAS_FORMAT
| IOPARM_DT_LIST_FORMAT
))
2424 != IOPARM_DT_HAS_FORMAT
)
2426 generate_error (&dtp
->common
, LIBERROR_OPTION_CONFLICT
,
2427 "ADVANCE specification requires an explicit format");
2434 dtp
->u
.p
.current_unit
->previous_nonadvancing_write
= 0;
2436 if ((cf
& IOPARM_EOR
) != 0 && dtp
->u
.p
.advance_status
!= ADVANCE_NO
)
2438 generate_error (&dtp
->common
, LIBERROR_MISSING_OPTION
,
2439 "EOR specification requires an ADVANCE specification "
2444 if ((cf
& IOPARM_DT_HAS_SIZE
) != 0
2445 && dtp
->u
.p
.advance_status
!= ADVANCE_NO
)
2447 generate_error (&dtp
->common
, LIBERROR_MISSING_OPTION
,
2448 "SIZE specification requires an ADVANCE "
2449 "specification of NO");
2454 { /* Write constraints. */
2455 if ((cf
& IOPARM_END
) != 0)
2457 generate_error (&dtp
->common
, LIBERROR_OPTION_CONFLICT
,
2458 "END specification cannot appear in a write "
2463 if ((cf
& IOPARM_EOR
) != 0)
2465 generate_error (&dtp
->common
, LIBERROR_OPTION_CONFLICT
,
2466 "EOR specification cannot appear in a write "
2471 if ((cf
& IOPARM_DT_HAS_SIZE
) != 0)
2473 generate_error (&dtp
->common
, LIBERROR_OPTION_CONFLICT
,
2474 "SIZE specification cannot appear in a write "
2480 if (dtp
->u
.p
.advance_status
== ADVANCE_UNSPECIFIED
)
2481 dtp
->u
.p
.advance_status
= ADVANCE_YES
;
2483 /* Check the decimal mode. */
2484 dtp
->u
.p
.current_unit
->decimal_status
2485 = !(cf
& IOPARM_DT_HAS_DECIMAL
) ? DECIMAL_UNSPECIFIED
:
2486 find_option (&dtp
->common
, dtp
->decimal
, dtp
->decimal_len
,
2487 decimal_opt
, "Bad DECIMAL parameter in data transfer "
2490 if (dtp
->u
.p
.current_unit
->decimal_status
== DECIMAL_UNSPECIFIED
)
2491 dtp
->u
.p
.current_unit
->decimal_status
= dtp
->u
.p
.current_unit
->flags
.decimal
;
2493 /* Check the round mode. */
2494 dtp
->u
.p
.current_unit
->round_status
2495 = !(cf
& IOPARM_DT_HAS_ROUND
) ? ROUND_UNSPECIFIED
:
2496 find_option (&dtp
->common
, dtp
->round
, dtp
->round_len
,
2497 round_opt
, "Bad ROUND parameter in data transfer "
2500 if (dtp
->u
.p
.current_unit
->round_status
== ROUND_UNSPECIFIED
)
2501 dtp
->u
.p
.current_unit
->round_status
= dtp
->u
.p
.current_unit
->flags
.round
;
2503 /* Check the sign mode. */
2504 dtp
->u
.p
.sign_status
2505 = !(cf
& IOPARM_DT_HAS_SIGN
) ? SIGN_UNSPECIFIED
:
2506 find_option (&dtp
->common
, dtp
->sign
, dtp
->sign_len
, sign_opt
,
2507 "Bad SIGN parameter in data transfer statement");
2509 if (dtp
->u
.p
.sign_status
== SIGN_UNSPECIFIED
)
2510 dtp
->u
.p
.sign_status
= dtp
->u
.p
.current_unit
->flags
.sign
;
2512 /* Check the blank mode. */
2513 dtp
->u
.p
.blank_status
2514 = !(cf
& IOPARM_DT_HAS_BLANK
) ? BLANK_UNSPECIFIED
:
2515 find_option (&dtp
->common
, dtp
->blank
, dtp
->blank_len
,
2517 "Bad BLANK parameter in data transfer statement");
2519 if (dtp
->u
.p
.blank_status
== BLANK_UNSPECIFIED
)
2520 dtp
->u
.p
.blank_status
= dtp
->u
.p
.current_unit
->flags
.blank
;
2522 /* Check the delim mode. */
2523 dtp
->u
.p
.current_unit
->delim_status
2524 = !(cf
& IOPARM_DT_HAS_DELIM
) ? DELIM_UNSPECIFIED
:
2525 find_option (&dtp
->common
, dtp
->delim
, dtp
->delim_len
,
2526 delim_opt
, "Bad DELIM parameter in data transfer statement");
2528 if (dtp
->u
.p
.current_unit
->delim_status
== DELIM_UNSPECIFIED
)
2529 dtp
->u
.p
.current_unit
->delim_status
= dtp
->u
.p
.current_unit
->flags
.delim
;
2531 /* Check the pad mode. */
2532 dtp
->u
.p
.current_unit
->pad_status
2533 = !(cf
& IOPARM_DT_HAS_PAD
) ? PAD_UNSPECIFIED
:
2534 find_option (&dtp
->common
, dtp
->pad
, dtp
->pad_len
, pad_opt
,
2535 "Bad PAD parameter in data transfer statement");
2537 if (dtp
->u
.p
.current_unit
->pad_status
== PAD_UNSPECIFIED
)
2538 dtp
->u
.p
.current_unit
->pad_status
= dtp
->u
.p
.current_unit
->flags
.pad
;
2540 /* Check to see if we might be reading what we wrote before */
2542 if (dtp
->u
.p
.mode
!= dtp
->u
.p
.current_unit
->mode
2543 && !is_internal_unit (dtp
))
2545 int pos
= fbuf_reset (dtp
->u
.p
.current_unit
);
2547 sseek (dtp
->u
.p
.current_unit
->s
, pos
, SEEK_CUR
);
2548 sflush(dtp
->u
.p
.current_unit
->s
);
2551 /* Check the POS= specifier: that it is in range and that it is used with a
2552 unit that has been connected for STREAM access. F2003 9.5.1.10. */
2554 if (((cf
& IOPARM_DT_HAS_POS
) != 0))
2556 if (is_stream_io (dtp
))
2561 generate_error (&dtp
->common
, LIBERROR_BAD_OPTION
,
2562 "POS=specifier must be positive");
2566 if (dtp
->pos
>= dtp
->u
.p
.current_unit
->maxrec
)
2568 generate_error (&dtp
->common
, LIBERROR_BAD_OPTION
,
2569 "POS=specifier too large");
2573 dtp
->rec
= dtp
->pos
;
2575 if (dtp
->u
.p
.mode
== READING
)
2577 /* Reset the endfile flag; if we hit EOF during reading
2578 we'll set the flag and generate an error at that point
2579 rather than worrying about it here. */
2580 dtp
->u
.p
.current_unit
->endfile
= NO_ENDFILE
;
2583 if (dtp
->pos
!= dtp
->u
.p
.current_unit
->strm_pos
)
2585 fbuf_flush (dtp
->u
.p
.current_unit
, dtp
->u
.p
.mode
);
2586 if (sseek (dtp
->u
.p
.current_unit
->s
, dtp
->pos
- 1, SEEK_SET
) < 0)
2588 generate_error (&dtp
->common
, LIBERROR_OS
, NULL
);
2591 dtp
->u
.p
.current_unit
->strm_pos
= dtp
->pos
;
2596 generate_error (&dtp
->common
, LIBERROR_BAD_OPTION
,
2597 "POS=specifier not allowed, "
2598 "Try OPEN with ACCESS='stream'");
2604 /* Sanity checks on the record number. */
2605 if ((cf
& IOPARM_DT_HAS_REC
) != 0)
2609 generate_error (&dtp
->common
, LIBERROR_BAD_OPTION
,
2610 "Record number must be positive");
2614 if (dtp
->rec
>= dtp
->u
.p
.current_unit
->maxrec
)
2616 generate_error (&dtp
->common
, LIBERROR_BAD_OPTION
,
2617 "Record number too large");
2621 /* Make sure format buffer is reset. */
2622 if (dtp
->u
.p
.current_unit
->flags
.form
== FORM_FORMATTED
)
2623 fbuf_reset (dtp
->u
.p
.current_unit
);
2626 /* Check whether the record exists to be read. Only
2627 a partial record needs to exist. */
2629 if (dtp
->u
.p
.mode
== READING
&& (dtp
->rec
- 1)
2630 * dtp
->u
.p
.current_unit
->recl
>= file_length (dtp
->u
.p
.current_unit
->s
))
2632 generate_error (&dtp
->common
, LIBERROR_BAD_OPTION
,
2633 "Non-existing record number");
2637 /* Position the file. */
2638 if (sseek (dtp
->u
.p
.current_unit
->s
, (gfc_offset
) (dtp
->rec
- 1)
2639 * dtp
->u
.p
.current_unit
->recl
, SEEK_SET
) < 0)
2641 generate_error (&dtp
->common
, LIBERROR_OS
, NULL
);
2645 /* TODO: This is required to maintain compatibility between
2646 4.3 and 4.4 runtime. Remove when ABI changes from 4.3 */
2648 if (is_stream_io (dtp
))
2649 dtp
->u
.p
.current_unit
->strm_pos
= dtp
->rec
;
2651 /* TODO: Un-comment this code when ABI changes from 4.3.
2652 if (dtp->u.p.current_unit->flags.access == ACCESS_STREAM)
2654 generate_error (&dtp->common, LIBERROR_OPTION_CONFLICT,
2655 "Record number not allowed for stream access "
2661 /* Bugware for badly written mixed C-Fortran I/O. */
2662 if (!is_internal_unit (dtp
))
2663 flush_if_preconnected(dtp
->u
.p
.current_unit
->s
);
2665 dtp
->u
.p
.current_unit
->mode
= dtp
->u
.p
.mode
;
2667 /* Set the maximum position reached from the previous I/O operation. This
2668 could be greater than zero from a previous non-advancing write. */
2669 dtp
->u
.p
.max_pos
= dtp
->u
.p
.current_unit
->saved_pos
;
2674 /* Set up the subroutine that will handle the transfers. */
2678 if (dtp
->u
.p
.current_unit
->flags
.form
== FORM_UNFORMATTED
)
2679 dtp
->u
.p
.transfer
= unformatted_read
;
2682 if ((cf
& IOPARM_DT_LIST_FORMAT
) != 0)
2684 dtp
->u
.p
.last_char
= EOF
- 1;
2685 dtp
->u
.p
.transfer
= list_formatted_read
;
2688 dtp
->u
.p
.transfer
= formatted_transfer
;
2693 if (dtp
->u
.p
.current_unit
->flags
.form
== FORM_UNFORMATTED
)
2694 dtp
->u
.p
.transfer
= unformatted_write
;
2697 if ((cf
& IOPARM_DT_LIST_FORMAT
) != 0)
2698 dtp
->u
.p
.transfer
= list_formatted_write
;
2700 dtp
->u
.p
.transfer
= formatted_transfer
;
2704 /* Make sure that we don't do a read after a nonadvancing write. */
2708 if (dtp
->u
.p
.current_unit
->read_bad
&& !is_stream_io (dtp
))
2710 generate_error (&dtp
->common
, LIBERROR_BAD_OPTION
,
2711 "Cannot READ after a nonadvancing WRITE");
2717 if (dtp
->u
.p
.advance_status
== ADVANCE_YES
&& !dtp
->u
.p
.seen_dollar
)
2718 dtp
->u
.p
.current_unit
->read_bad
= 1;
2721 /* Start the data transfer if we are doing a formatted transfer. */
2722 if (dtp
->u
.p
.current_unit
->flags
.form
== FORM_FORMATTED
2723 && ((cf
& (IOPARM_DT_LIST_FORMAT
| IOPARM_DT_HAS_NAMELIST_NAME
)) == 0)
2724 && dtp
->u
.p
.ionml
== NULL
)
2725 formatted_transfer (dtp
, 0, NULL
, 0, 0, 1);
2728 /* Initialize an array_loop_spec given the array descriptor. The function
2729 returns the index of the last element of the array, and also returns
2730 starting record, where the first I/O goes to (necessary in case of
2731 negative strides). */
2734 init_loop_spec (gfc_array_char
*desc
, array_loop_spec
*ls
,
2735 gfc_offset
*start_record
)
2737 int rank
= GFC_DESCRIPTOR_RANK(desc
);
2746 for (i
=0; i
<rank
; i
++)
2748 ls
[i
].idx
= GFC_DESCRIPTOR_LBOUND(desc
,i
);
2749 ls
[i
].start
= GFC_DESCRIPTOR_LBOUND(desc
,i
);
2750 ls
[i
].end
= GFC_DESCRIPTOR_UBOUND(desc
,i
);
2751 ls
[i
].step
= GFC_DESCRIPTOR_STRIDE(desc
,i
);
2752 empty
= empty
|| (GFC_DESCRIPTOR_UBOUND(desc
,i
)
2753 < GFC_DESCRIPTOR_LBOUND(desc
,i
));
2755 if (GFC_DESCRIPTOR_STRIDE(desc
,i
) > 0)
2757 index
+= (GFC_DESCRIPTOR_EXTENT(desc
,i
) - 1)
2758 * GFC_DESCRIPTOR_STRIDE(desc
,i
);
2762 index
-= (GFC_DESCRIPTOR_EXTENT(desc
,i
) - 1)
2763 * GFC_DESCRIPTOR_STRIDE(desc
,i
);
2764 *start_record
-= (GFC_DESCRIPTOR_EXTENT(desc
,i
) - 1)
2765 * GFC_DESCRIPTOR_STRIDE(desc
,i
);
2775 /* Determine the index to the next record in an internal unit array by
2776 by incrementing through the array_loop_spec. */
2779 next_array_record (st_parameter_dt
*dtp
, array_loop_spec
*ls
, int *finished
)
2787 for (i
= 0; i
< dtp
->u
.p
.current_unit
->rank
; i
++)
2792 if (ls
[i
].idx
> ls
[i
].end
)
2794 ls
[i
].idx
= ls
[i
].start
;
2800 index
= index
+ (ls
[i
].idx
- ls
[i
].start
) * ls
[i
].step
;
2810 /* Skip to the end of the current record, taking care of an optional
2811 record marker of size bytes. If the file is not seekable, we
2812 read chunks of size MAX_READ until we get to the right
2816 skip_record (st_parameter_dt
*dtp
, ssize_t bytes
)
2818 ssize_t rlength
, readb
;
2819 static const ssize_t MAX_READ
= 4096;
2822 dtp
->u
.p
.current_unit
->bytes_left_subrecord
+= bytes
;
2823 if (dtp
->u
.p
.current_unit
->bytes_left_subrecord
== 0)
2826 if (is_seekable (dtp
->u
.p
.current_unit
->s
))
2828 /* Direct access files do not generate END conditions,
2830 if (sseek (dtp
->u
.p
.current_unit
->s
,
2831 dtp
->u
.p
.current_unit
->bytes_left_subrecord
, SEEK_CUR
) < 0)
2832 generate_error (&dtp
->common
, LIBERROR_OS
, NULL
);
2834 dtp
->u
.p
.current_unit
->bytes_left_subrecord
= 0;
2837 { /* Seek by reading data. */
2838 while (dtp
->u
.p
.current_unit
->bytes_left_subrecord
> 0)
2841 (MAX_READ
< dtp
->u
.p
.current_unit
->bytes_left_subrecord
) ?
2842 MAX_READ
: dtp
->u
.p
.current_unit
->bytes_left_subrecord
;
2844 readb
= sread (dtp
->u
.p
.current_unit
->s
, p
, rlength
);
2847 generate_error (&dtp
->common
, LIBERROR_OS
, NULL
);
2851 dtp
->u
.p
.current_unit
->bytes_left_subrecord
-= readb
;
2858 /* Advance to the next record reading unformatted files, taking
2859 care of subrecords. If complete_record is nonzero, we loop
2860 until all subrecords are cleared. */
2863 next_record_r_unf (st_parameter_dt
*dtp
, int complete_record
)
2867 bytes
= compile_options
.record_marker
== 0 ?
2868 sizeof (GFC_INTEGER_4
) : compile_options
.record_marker
;
2873 /* Skip over tail */
2875 skip_record (dtp
, bytes
);
2877 if ( ! (complete_record
&& dtp
->u
.p
.current_unit
->continued
))
2885 static inline gfc_offset
2886 min_off (gfc_offset a
, gfc_offset b
)
2888 return (a
< b
? a
: b
);
2892 /* Space to the next record for read mode. */
2895 next_record_r (st_parameter_dt
*dtp
, int done
)
2902 switch (current_mode (dtp
))
2904 /* No records in unformatted STREAM I/O. */
2905 case UNFORMATTED_STREAM
:
2908 case UNFORMATTED_SEQUENTIAL
:
2909 next_record_r_unf (dtp
, 1);
2910 dtp
->u
.p
.current_unit
->bytes_left
= dtp
->u
.p
.current_unit
->recl
;
2913 case FORMATTED_DIRECT
:
2914 case UNFORMATTED_DIRECT
:
2915 skip_record (dtp
, dtp
->u
.p
.current_unit
->bytes_left
);
2918 case FORMATTED_STREAM
:
2919 case FORMATTED_SEQUENTIAL
:
2920 /* read_sf has already terminated input because of an '\n', or
2922 if (dtp
->u
.p
.sf_seen_eor
)
2924 dtp
->u
.p
.sf_seen_eor
= 0;
2928 if (is_internal_unit (dtp
))
2930 if (is_array_io (dtp
))
2934 record
= next_array_record (dtp
, dtp
->u
.p
.current_unit
->ls
,
2936 if (!done
&& finished
)
2939 /* Now seek to this record. */
2940 record
= record
* dtp
->u
.p
.current_unit
->recl
;
2941 if (sseek (dtp
->u
.p
.current_unit
->s
, record
, SEEK_SET
) < 0)
2943 generate_error (&dtp
->common
, LIBERROR_INTERNAL_UNIT
, NULL
);
2946 dtp
->u
.p
.current_unit
->bytes_left
= dtp
->u
.p
.current_unit
->recl
;
2950 bytes_left
= (int) dtp
->u
.p
.current_unit
->bytes_left
;
2951 bytes_left
= min_off (bytes_left
,
2952 file_length (dtp
->u
.p
.current_unit
->s
)
2953 - stell (dtp
->u
.p
.current_unit
->s
));
2954 if (sseek (dtp
->u
.p
.current_unit
->s
,
2955 bytes_left
, SEEK_CUR
) < 0)
2957 generate_error (&dtp
->common
, LIBERROR_INTERNAL_UNIT
, NULL
);
2960 dtp
->u
.p
.current_unit
->bytes_left
2961 = dtp
->u
.p
.current_unit
->recl
;
2970 cc
= fbuf_getc (dtp
->u
.p
.current_unit
);
2974 generate_error (&dtp
->common
, LIBERROR_OS
, NULL
);
2977 if (is_stream_io (dtp
)
2978 || dtp
->u
.p
.current_unit
->pad_status
== PAD_NO
2979 || dtp
->u
.p
.current_unit
->bytes_left
2980 == dtp
->u
.p
.current_unit
->recl
)
2986 if (is_stream_io (dtp
))
2987 dtp
->u
.p
.current_unit
->strm_pos
++;
2998 /* Small utility function to write a record marker, taking care of
2999 byte swapping and of choosing the correct size. */
3002 write_us_marker (st_parameter_dt
*dtp
, const gfc_offset buf
)
3007 char p
[sizeof (GFC_INTEGER_8
)];
3009 if (compile_options
.record_marker
== 0)
3010 len
= sizeof (GFC_INTEGER_4
);
3012 len
= compile_options
.record_marker
;
3014 /* Only GFC_CONVERT_NATIVE and GFC_CONVERT_SWAP are valid here. */
3015 if (likely (dtp
->u
.p
.current_unit
->flags
.convert
== GFC_CONVERT_NATIVE
))
3019 case sizeof (GFC_INTEGER_4
):
3021 return swrite (dtp
->u
.p
.current_unit
->s
, &buf4
, len
);
3024 case sizeof (GFC_INTEGER_8
):
3026 return swrite (dtp
->u
.p
.current_unit
->s
, &buf8
, len
);
3030 runtime_error ("Illegal value for record marker");
3038 case sizeof (GFC_INTEGER_4
):
3040 reverse_memcpy (p
, &buf4
, sizeof (GFC_INTEGER_4
));
3041 return swrite (dtp
->u
.p
.current_unit
->s
, p
, len
);
3044 case sizeof (GFC_INTEGER_8
):
3046 reverse_memcpy (p
, &buf8
, sizeof (GFC_INTEGER_8
));
3047 return swrite (dtp
->u
.p
.current_unit
->s
, p
, len
);
3051 runtime_error ("Illegal value for record marker");
3058 /* Position to the next (sub)record in write mode for
3059 unformatted sequential files. */
3062 next_record_w_unf (st_parameter_dt
*dtp
, int next_subrecord
)
3064 gfc_offset m
, m_write
, record_marker
;
3066 /* Bytes written. */
3067 m
= dtp
->u
.p
.current_unit
->recl_subrecord
3068 - dtp
->u
.p
.current_unit
->bytes_left_subrecord
;
3070 /* Write the length tail. If we finish a record containing
3071 subrecords, we write out the negative length. */
3073 if (dtp
->u
.p
.current_unit
->continued
)
3078 if (unlikely (write_us_marker (dtp
, m_write
) < 0))
3081 if (compile_options
.record_marker
== 0)
3082 record_marker
= sizeof (GFC_INTEGER_4
);
3084 record_marker
= compile_options
.record_marker
;
3086 /* Seek to the head and overwrite the bogus length with the real
3089 if (unlikely (sseek (dtp
->u
.p
.current_unit
->s
, - m
- 2 * record_marker
,
3098 if (unlikely (write_us_marker (dtp
, m_write
) < 0))
3101 /* Seek past the end of the current record. */
3103 if (unlikely (sseek (dtp
->u
.p
.current_unit
->s
, m
+ record_marker
,
3110 generate_error (&dtp
->common
, LIBERROR_OS
, NULL
);
3116 /* Utility function like memset() but operating on streams. Return
3117 value is same as for POSIX write(). */
3120 sset (stream
* s
, int c
, ssize_t nbyte
)
3122 static const int WRITE_CHUNK
= 256;
3123 char p
[WRITE_CHUNK
];
3124 ssize_t bytes_left
, trans
;
3126 if (nbyte
< WRITE_CHUNK
)
3127 memset (p
, c
, nbyte
);
3129 memset (p
, c
, WRITE_CHUNK
);
3132 while (bytes_left
> 0)
3134 trans
= (bytes_left
< WRITE_CHUNK
) ? bytes_left
: WRITE_CHUNK
;
3135 trans
= swrite (s
, p
, trans
);
3138 bytes_left
-= trans
;
3141 return nbyte
- bytes_left
;
3145 memset4 (gfc_char4_t
*p
, gfc_char4_t c
, int k
)
3148 for (j
= 0; j
< k
; j
++)
3152 /* Position to the next record in write mode. */
3155 next_record_w (st_parameter_dt
*dtp
, int done
)
3157 gfc_offset m
, record
, max_pos
;
3160 /* Zero counters for X- and T-editing. */
3161 max_pos
= dtp
->u
.p
.max_pos
;
3162 dtp
->u
.p
.max_pos
= dtp
->u
.p
.skips
= dtp
->u
.p
.pending_spaces
= 0;
3164 switch (current_mode (dtp
))
3166 /* No records in unformatted STREAM I/O. */
3167 case UNFORMATTED_STREAM
:
3170 case FORMATTED_DIRECT
:
3171 if (dtp
->u
.p
.current_unit
->bytes_left
== 0)
3174 fbuf_seek (dtp
->u
.p
.current_unit
, 0, SEEK_END
);
3175 fbuf_flush (dtp
->u
.p
.current_unit
, WRITING
);
3176 if (sset (dtp
->u
.p
.current_unit
->s
, ' ',
3177 dtp
->u
.p
.current_unit
->bytes_left
)
3178 != dtp
->u
.p
.current_unit
->bytes_left
)
3183 case UNFORMATTED_DIRECT
:
3184 if (dtp
->u
.p
.current_unit
->bytes_left
> 0)
3186 length
= (int) dtp
->u
.p
.current_unit
->bytes_left
;
3187 if (sset (dtp
->u
.p
.current_unit
->s
, 0, length
) != length
)
3192 case UNFORMATTED_SEQUENTIAL
:
3193 next_record_w_unf (dtp
, 0);
3194 dtp
->u
.p
.current_unit
->bytes_left
= dtp
->u
.p
.current_unit
->recl
;
3197 case FORMATTED_STREAM
:
3198 case FORMATTED_SEQUENTIAL
:
3200 if (is_internal_unit (dtp
))
3203 if (is_array_io (dtp
))
3207 length
= (int) dtp
->u
.p
.current_unit
->bytes_left
;
3209 /* If the farthest position reached is greater than current
3210 position, adjust the position and set length to pad out
3211 whats left. Otherwise just pad whats left.
3212 (for character array unit) */
3213 m
= dtp
->u
.p
.current_unit
->recl
3214 - dtp
->u
.p
.current_unit
->bytes_left
;
3217 length
= (int) (max_pos
- m
);
3218 if (sseek (dtp
->u
.p
.current_unit
->s
,
3219 length
, SEEK_CUR
) < 0)
3221 generate_error (&dtp
->common
, LIBERROR_INTERNAL_UNIT
, NULL
);
3224 length
= (int) (dtp
->u
.p
.current_unit
->recl
- max_pos
);
3227 p
= write_block (dtp
, length
);
3231 if (unlikely (is_char4_unit (dtp
)))
3233 gfc_char4_t
*p4
= (gfc_char4_t
*) p
;
3234 memset4 (p4
, ' ', length
);
3237 memset (p
, ' ', length
);
3239 /* Now that the current record has been padded out,
3240 determine where the next record in the array is. */
3241 record
= next_array_record (dtp
, dtp
->u
.p
.current_unit
->ls
,
3244 dtp
->u
.p
.current_unit
->endfile
= AT_ENDFILE
;
3246 /* Now seek to this record */
3247 record
= record
* dtp
->u
.p
.current_unit
->recl
;
3249 if (sseek (dtp
->u
.p
.current_unit
->s
, record
, SEEK_SET
) < 0)
3251 generate_error (&dtp
->common
, LIBERROR_INTERNAL_UNIT
, NULL
);
3255 dtp
->u
.p
.current_unit
->bytes_left
= dtp
->u
.p
.current_unit
->recl
;
3261 /* If this is the last call to next_record move to the farthest
3262 position reached and set length to pad out the remainder
3263 of the record. (for character scaler unit) */
3266 m
= dtp
->u
.p
.current_unit
->recl
3267 - dtp
->u
.p
.current_unit
->bytes_left
;
3270 length
= (int) (max_pos
- m
);
3271 if (sseek (dtp
->u
.p
.current_unit
->s
,
3272 length
, SEEK_CUR
) < 0)
3274 generate_error (&dtp
->common
, LIBERROR_INTERNAL_UNIT
, NULL
);
3277 length
= (int) (dtp
->u
.p
.current_unit
->recl
- max_pos
);
3280 length
= (int) dtp
->u
.p
.current_unit
->bytes_left
;
3284 p
= write_block (dtp
, length
);
3288 if (unlikely (is_char4_unit (dtp
)))
3290 gfc_char4_t
*p4
= (gfc_char4_t
*) p
;
3291 memset4 (p4
, (gfc_char4_t
) ' ', length
);
3294 memset (p
, ' ', length
);
3305 fbuf_seek (dtp
->u
.p
.current_unit
, 0, SEEK_END
);
3306 char * p
= fbuf_alloc (dtp
->u
.p
.current_unit
, len
);
3313 if (is_stream_io (dtp
))
3315 dtp
->u
.p
.current_unit
->strm_pos
+= len
;
3316 if (dtp
->u
.p
.current_unit
->strm_pos
3317 < file_length (dtp
->u
.p
.current_unit
->s
))
3318 unit_truncate (dtp
->u
.p
.current_unit
,
3319 dtp
->u
.p
.current_unit
->strm_pos
- 1,
3327 generate_error (&dtp
->common
, LIBERROR_OS
, NULL
);
3332 /* Position to the next record, which means moving to the end of the
3333 current record. This can happen under several different
3334 conditions. If the done flag is not set, we get ready to process
3338 next_record (st_parameter_dt
*dtp
, int done
)
3340 gfc_offset fp
; /* File position. */
3342 dtp
->u
.p
.current_unit
->read_bad
= 0;
3344 if (dtp
->u
.p
.mode
== READING
)
3345 next_record_r (dtp
, done
);
3347 next_record_w (dtp
, done
);
3349 if (!is_stream_io (dtp
))
3351 /* Keep position up to date for INQUIRE */
3353 update_position (dtp
->u
.p
.current_unit
);
3355 dtp
->u
.p
.current_unit
->current_record
= 0;
3356 if (dtp
->u
.p
.current_unit
->flags
.access
== ACCESS_DIRECT
)
3358 fp
= stell (dtp
->u
.p
.current_unit
->s
);
3359 /* Calculate next record, rounding up partial records. */
3360 dtp
->u
.p
.current_unit
->last_record
=
3361 (fp
+ dtp
->u
.p
.current_unit
->recl
- 1) /
3362 dtp
->u
.p
.current_unit
->recl
;
3365 dtp
->u
.p
.current_unit
->last_record
++;
3371 fbuf_flush (dtp
->u
.p
.current_unit
, dtp
->u
.p
.mode
);
3375 /* Finalize the current data transfer. For a nonadvancing transfer,
3376 this means advancing to the next record. For internal units close the
3377 stream associated with the unit. */
3380 finalize_transfer (st_parameter_dt
*dtp
)
3382 GFC_INTEGER_4 cf
= dtp
->common
.flags
;
3384 if ((dtp
->common
.flags
& IOPARM_DT_HAS_SIZE
) != 0)
3385 *dtp
->size
= dtp
->u
.p
.size_used
;
3387 if (dtp
->u
.p
.eor_condition
)
3389 generate_error (&dtp
->common
, LIBERROR_EOR
, NULL
);
3393 if ((dtp
->common
.flags
& IOPARM_LIBRETURN_MASK
) != IOPARM_LIBRETURN_OK
)
3395 if (dtp
->u
.p
.current_unit
&& current_mode (dtp
) == UNFORMATTED_SEQUENTIAL
)
3396 dtp
->u
.p
.current_unit
->current_record
= 0;
3400 if ((dtp
->u
.p
.ionml
!= NULL
)
3401 && (cf
& IOPARM_DT_HAS_NAMELIST_NAME
) != 0)
3403 if ((cf
& IOPARM_DT_NAMELIST_READ_MODE
) != 0)
3404 namelist_read (dtp
);
3406 namelist_write (dtp
);
3409 dtp
->u
.p
.transfer
= NULL
;
3410 if (dtp
->u
.p
.current_unit
== NULL
)
3413 if ((cf
& IOPARM_DT_LIST_FORMAT
) != 0 && dtp
->u
.p
.mode
== READING
)
3415 finish_list_read (dtp
);
3419 if (dtp
->u
.p
.mode
== WRITING
)
3420 dtp
->u
.p
.current_unit
->previous_nonadvancing_write
3421 = dtp
->u
.p
.advance_status
== ADVANCE_NO
;
3423 if (is_stream_io (dtp
))
3425 if (dtp
->u
.p
.current_unit
->flags
.form
== FORM_FORMATTED
3426 && dtp
->u
.p
.advance_status
!= ADVANCE_NO
)
3427 next_record (dtp
, 1);
3432 dtp
->u
.p
.current_unit
->current_record
= 0;
3434 if (!is_internal_unit (dtp
) && dtp
->u
.p
.seen_dollar
)
3436 fbuf_flush (dtp
->u
.p
.current_unit
, dtp
->u
.p
.mode
);
3437 dtp
->u
.p
.seen_dollar
= 0;
3441 /* For non-advancing I/O, save the current maximum position for use in the
3442 next I/O operation if needed. */
3443 if (dtp
->u
.p
.advance_status
== ADVANCE_NO
)
3445 int bytes_written
= (int) (dtp
->u
.p
.current_unit
->recl
3446 - dtp
->u
.p
.current_unit
->bytes_left
);
3447 dtp
->u
.p
.current_unit
->saved_pos
=
3448 dtp
->u
.p
.max_pos
> 0 ? dtp
->u
.p
.max_pos
- bytes_written
: 0;
3449 fbuf_flush (dtp
->u
.p
.current_unit
, dtp
->u
.p
.mode
);
3452 else if (dtp
->u
.p
.current_unit
->flags
.form
== FORM_FORMATTED
3453 && dtp
->u
.p
.mode
== WRITING
&& !is_internal_unit (dtp
))
3454 fbuf_seek (dtp
->u
.p
.current_unit
, 0, SEEK_END
);
3456 dtp
->u
.p
.current_unit
->saved_pos
= 0;
3458 next_record (dtp
, 1);
3461 /* Transfer function for IOLENGTH. It doesn't actually do any
3462 data transfer, it just updates the length counter. */
3465 iolength_transfer (st_parameter_dt
*dtp
, bt type
__attribute__((unused
)),
3466 void *dest
__attribute__ ((unused
)),
3467 int kind
__attribute__((unused
)),
3468 size_t size
, size_t nelems
)
3470 if ((dtp
->common
.flags
& IOPARM_DT_HAS_IOLENGTH
) != 0)
3471 *dtp
->iolength
+= (GFC_IO_INT
) (size
* nelems
);
3475 /* Initialize the IOLENGTH data transfer. This function is in essence
3476 a very much simplified version of data_transfer_init(), because it
3477 doesn't have to deal with units at all. */
3480 iolength_transfer_init (st_parameter_dt
*dtp
)
3482 if ((dtp
->common
.flags
& IOPARM_DT_HAS_IOLENGTH
) != 0)
3485 memset (&dtp
->u
.p
, 0, sizeof (dtp
->u
.p
));
3487 /* Set up the subroutine that will handle the transfers. */
3489 dtp
->u
.p
.transfer
= iolength_transfer
;
3493 /* Library entry point for the IOLENGTH form of the INQUIRE
3494 statement. The IOLENGTH form requires no I/O to be performed, but
3495 it must still be a runtime library call so that we can determine
3496 the iolength for dynamic arrays and such. */
3498 extern void st_iolength (st_parameter_dt
*);
3499 export_proto(st_iolength
);
3502 st_iolength (st_parameter_dt
*dtp
)
3504 library_start (&dtp
->common
);
3505 iolength_transfer_init (dtp
);
3508 extern void st_iolength_done (st_parameter_dt
*);
3509 export_proto(st_iolength_done
);
3512 st_iolength_done (st_parameter_dt
*dtp
__attribute__((unused
)))
3519 /* The READ statement. */
3521 extern void st_read (st_parameter_dt
*);
3522 export_proto(st_read
);
3525 st_read (st_parameter_dt
*dtp
)
3527 library_start (&dtp
->common
);
3529 data_transfer_init (dtp
, 1);
3532 extern void st_read_done (st_parameter_dt
*);
3533 export_proto(st_read_done
);
3536 st_read_done (st_parameter_dt
*dtp
)
3538 finalize_transfer (dtp
);
3539 if (is_internal_unit (dtp
) || dtp
->u
.p
.format_not_saved
)
3540 free_format_data (dtp
->u
.p
.fmt
);
3542 if (dtp
->u
.p
.current_unit
!= NULL
)
3543 unlock_unit (dtp
->u
.p
.current_unit
);
3545 free_internal_unit (dtp
);
3550 extern void st_write (st_parameter_dt
*);
3551 export_proto(st_write
);
3554 st_write (st_parameter_dt
*dtp
)
3556 library_start (&dtp
->common
);
3557 data_transfer_init (dtp
, 0);
3560 extern void st_write_done (st_parameter_dt
*);
3561 export_proto(st_write_done
);
3564 st_write_done (st_parameter_dt
*dtp
)
3566 finalize_transfer (dtp
);
3568 /* Deal with endfile conditions associated with sequential files. */
3570 if (dtp
->u
.p
.current_unit
!= NULL
3571 && dtp
->u
.p
.current_unit
->flags
.access
== ACCESS_SEQUENTIAL
)
3572 switch (dtp
->u
.p
.current_unit
->endfile
)
3574 case AT_ENDFILE
: /* Remain at the endfile record. */
3578 dtp
->u
.p
.current_unit
->endfile
= AT_ENDFILE
; /* Just at it now. */
3582 /* Get rid of whatever is after this record. */
3583 if (!is_internal_unit (dtp
))
3584 unit_truncate (dtp
->u
.p
.current_unit
,
3585 stell (dtp
->u
.p
.current_unit
->s
),
3587 dtp
->u
.p
.current_unit
->endfile
= AT_ENDFILE
;
3591 if (is_internal_unit (dtp
) || dtp
->u
.p
.format_not_saved
)
3592 free_format_data (dtp
->u
.p
.fmt
);
3594 if (dtp
->u
.p
.current_unit
!= NULL
)
3595 unlock_unit (dtp
->u
.p
.current_unit
);
3597 free_internal_unit (dtp
);
3603 /* F2003: This is a stub for the runtime portion of the WAIT statement. */
3605 st_wait (st_parameter_wait
*wtp
__attribute__((unused
)))
3610 /* Receives the scalar information for namelist objects and stores it
3611 in a linked list of namelist_info types. */
3613 extern void st_set_nml_var (st_parameter_dt
*dtp
, void *, char *,
3614 GFC_INTEGER_4
, gfc_charlen_type
, GFC_INTEGER_4
);
3615 export_proto(st_set_nml_var
);
3619 st_set_nml_var (st_parameter_dt
*dtp
, void * var_addr
, char * var_name
,
3620 GFC_INTEGER_4 len
, gfc_charlen_type string_length
,
3621 GFC_INTEGER_4 dtype
)
3623 namelist_info
*t1
= NULL
;
3625 size_t var_name_len
= strlen (var_name
);
3627 nml
= (namelist_info
*) get_mem (sizeof (namelist_info
));
3629 nml
->mem_pos
= var_addr
;
3631 nml
->var_name
= (char*) get_mem (var_name_len
+ 1);
3632 memcpy (nml
->var_name
, var_name
, var_name_len
);
3633 nml
->var_name
[var_name_len
] = '\0';
3635 nml
->len
= (int) len
;
3636 nml
->string_length
= (index_type
) string_length
;
3638 nml
->var_rank
= (int) (dtype
& GFC_DTYPE_RANK_MASK
);
3639 nml
->size
= (index_type
) (dtype
>> GFC_DTYPE_SIZE_SHIFT
);
3640 nml
->type
= (bt
) ((dtype
& GFC_DTYPE_TYPE_MASK
) >> GFC_DTYPE_TYPE_SHIFT
);
3642 if (nml
->var_rank
> 0)
3644 nml
->dim
= (descriptor_dimension
*)
3645 get_mem (nml
->var_rank
* sizeof (descriptor_dimension
));
3646 nml
->ls
= (array_loop_spec
*)
3647 get_mem (nml
->var_rank
* sizeof (array_loop_spec
));
3657 if ((dtp
->common
.flags
& IOPARM_DT_IONML_SET
) == 0)
3659 dtp
->common
.flags
|= IOPARM_DT_IONML_SET
;
3660 dtp
->u
.p
.ionml
= nml
;
3664 for (t1
= dtp
->u
.p
.ionml
; t1
->next
; t1
= t1
->next
);
3669 /* Store the dimensional information for the namelist object. */
3670 extern void st_set_nml_var_dim (st_parameter_dt
*, GFC_INTEGER_4
,
3671 index_type
, index_type
,
3673 export_proto(st_set_nml_var_dim
);
3676 st_set_nml_var_dim (st_parameter_dt
*dtp
, GFC_INTEGER_4 n_dim
,
3677 index_type stride
, index_type lbound
,
3680 namelist_info
* nml
;
3685 for (nml
= dtp
->u
.p
.ionml
; nml
->next
; nml
= nml
->next
);
3687 GFC_DIMENSION_SET(nml
->dim
[n
],lbound
,ubound
,stride
);
3690 /* Reverse memcpy - used for byte swapping. */
3692 void reverse_memcpy (void *dest
, const void *src
, size_t n
)
3698 s
= (char *) src
+ n
- 1;
3700 /* Write with ascending order - this is likely faster
3701 on modern architectures because of write combining. */
3707 /* Once upon a time, a poor innocent Fortran program was reading a
3708 file, when suddenly it hit the end-of-file (EOF). Unfortunately
3709 the OS doesn't tell whether we're at the EOF or whether we already
3710 went past it. Luckily our hero, libgfortran, keeps track of this.
3711 Call this function when you detect an EOF condition. See Section
3715 hit_eof (st_parameter_dt
* dtp
)
3717 dtp
->u
.p
.current_unit
->flags
.position
= POSITION_APPEND
;
3719 if (dtp
->u
.p
.current_unit
->flags
.access
== ACCESS_SEQUENTIAL
)
3720 switch (dtp
->u
.p
.current_unit
->endfile
)
3724 generate_error (&dtp
->common
, LIBERROR_END
, NULL
);
3725 if (!is_internal_unit (dtp
))
3727 dtp
->u
.p
.current_unit
->endfile
= AFTER_ENDFILE
;
3728 dtp
->u
.p
.current_unit
->current_record
= 0;
3731 dtp
->u
.p
.current_unit
->endfile
= AT_ENDFILE
;
3735 generate_error (&dtp
->common
, LIBERROR_ENDFILE
, NULL
);
3736 dtp
->u
.p
.current_unit
->current_record
= 0;
3741 /* Non-sequential files don't have an ENDFILE record, so we
3742 can't be at AFTER_ENDFILE. */
3743 dtp
->u
.p
.current_unit
->endfile
= AT_ENDFILE
;
3744 generate_error (&dtp
->common
, LIBERROR_END
, NULL
);
3745 dtp
->u
.p
.current_unit
->current_record
= 0;