1 /* Copyright (C) 2002-2017 Free Software Foundation, Inc.
2 Contributed by Andy Vaught
3 Namelist transfer functions contributed by Paul Thomas
4 F2003 I/O support contributed by Jerry DeLisle
6 This file is part of the GNU Fortran runtime library (libgfortran).
8 Libgfortran is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3, or (at your option)
13 Libgfortran is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 Under Section 7 of GPL version 3, you are granted additional
19 permissions described in the GCC Runtime Library Exception, version
20 3.1, as published by the Free Software Foundation.
22 You should have received a copy of the GNU General Public License and
23 a copy of the GCC Runtime Library Exception along with this program;
24 see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
25 <http://www.gnu.org/licenses/>. */
28 /* transfer.c -- Top level handling of data transfer statements. */
38 /* Calling conventions: Data transfer statements are unlike other
39 library calls in that they extend over several calls.
41 The first call is always a call to st_read() or st_write(). These
42 subroutines return no status unless a namelist read or write is
43 being done, in which case there is the usual status. No further
44 calls are necessary in this case.
46 For other sorts of data transfer, there are zero or more data
47 transfer statement that depend on the format of the data transfer
48 statement. For READ (and for backwards compatibily: for WRITE), one has
53 transfer_character_wide
61 transfer_integer_write
62 transfer_logical_write
63 transfer_character_write
64 transfer_character_wide_write
66 transfer_complex_write
67 transfer_real128_write
68 transfer_complex128_write
70 These subroutines do not return status. The *128 functions
71 are in the file transfer128.c.
73 The last call is a call to st_[read|write]_done(). While
74 something can easily go wrong with the initial st_read() or
75 st_write(), an error inhibits any data from actually being
78 extern void transfer_integer (st_parameter_dt
*, void *, int);
79 export_proto(transfer_integer
);
81 extern void transfer_integer_write (st_parameter_dt
*, void *, int);
82 export_proto(transfer_integer_write
);
84 extern void transfer_real (st_parameter_dt
*, void *, int);
85 export_proto(transfer_real
);
87 extern void transfer_real_write (st_parameter_dt
*, void *, int);
88 export_proto(transfer_real_write
);
90 extern void transfer_logical (st_parameter_dt
*, void *, int);
91 export_proto(transfer_logical
);
93 extern void transfer_logical_write (st_parameter_dt
*, void *, int);
94 export_proto(transfer_logical_write
);
96 extern void transfer_character (st_parameter_dt
*, void *, int);
97 export_proto(transfer_character
);
99 extern void transfer_character_write (st_parameter_dt
*, void *, int);
100 export_proto(transfer_character_write
);
102 extern void transfer_character_wide (st_parameter_dt
*, void *, int, int);
103 export_proto(transfer_character_wide
);
105 extern void transfer_character_wide_write (st_parameter_dt
*,
107 export_proto(transfer_character_wide_write
);
109 extern void transfer_complex (st_parameter_dt
*, void *, int);
110 export_proto(transfer_complex
);
112 extern void transfer_complex_write (st_parameter_dt
*, void *, int);
113 export_proto(transfer_complex_write
);
115 extern void transfer_array (st_parameter_dt
*, gfc_array_char
*, int,
117 export_proto(transfer_array
);
119 extern void transfer_array_write (st_parameter_dt
*, gfc_array_char
*, int,
121 export_proto(transfer_array_write
);
123 /* User defined derived type input/output. */
125 transfer_derived (st_parameter_dt
*dtp
, void *dtio_source
, void *dtio_proc
);
126 export_proto(transfer_derived
);
129 transfer_derived_write (st_parameter_dt
*dtp
, void *dtio_source
, void *dtio_proc
);
130 export_proto(transfer_derived_write
);
132 static void us_read (st_parameter_dt
*, int);
133 static void us_write (st_parameter_dt
*, int);
134 static void next_record_r_unf (st_parameter_dt
*, int);
135 static void next_record_w_unf (st_parameter_dt
*, int);
137 static const st_option advance_opt
[] = {
138 {"yes", ADVANCE_YES
},
144 static const st_option decimal_opt
[] = {
145 {"point", DECIMAL_POINT
},
146 {"comma", DECIMAL_COMMA
},
150 static const st_option round_opt
[] = {
152 {"down", ROUND_DOWN
},
153 {"zero", ROUND_ZERO
},
154 {"nearest", ROUND_NEAREST
},
155 {"compatible", ROUND_COMPATIBLE
},
156 {"processor_defined", ROUND_PROCDEFINED
},
161 static const st_option sign_opt
[] = {
163 {"suppress", SIGN_SS
},
164 {"processor_defined", SIGN_S
},
168 static const st_option blank_opt
[] = {
169 {"null", BLANK_NULL
},
170 {"zero", BLANK_ZERO
},
174 static const st_option delim_opt
[] = {
175 {"apostrophe", DELIM_APOSTROPHE
},
176 {"quote", DELIM_QUOTE
},
177 {"none", DELIM_NONE
},
181 static const st_option pad_opt
[] = {
188 { FORMATTED_SEQUENTIAL
, UNFORMATTED_SEQUENTIAL
,
189 FORMATTED_DIRECT
, UNFORMATTED_DIRECT
, FORMATTED_STREAM
, UNFORMATTED_STREAM
195 current_mode (st_parameter_dt
*dtp
)
199 m
= FORM_UNSPECIFIED
;
201 if (dtp
->u
.p
.current_unit
->flags
.access
== ACCESS_DIRECT
)
203 m
= dtp
->u
.p
.current_unit
->flags
.form
== FORM_FORMATTED
?
204 FORMATTED_DIRECT
: UNFORMATTED_DIRECT
;
206 else if (dtp
->u
.p
.current_unit
->flags
.access
== ACCESS_SEQUENTIAL
)
208 m
= dtp
->u
.p
.current_unit
->flags
.form
== FORM_FORMATTED
?
209 FORMATTED_SEQUENTIAL
: UNFORMATTED_SEQUENTIAL
;
211 else if (dtp
->u
.p
.current_unit
->flags
.access
== ACCESS_STREAM
)
213 m
= dtp
->u
.p
.current_unit
->flags
.form
== FORM_FORMATTED
?
214 FORMATTED_STREAM
: UNFORMATTED_STREAM
;
221 /* Mid level data transfer statements. */
223 /* Read sequential file - internal unit */
226 read_sf_internal (st_parameter_dt
*dtp
, int *length
)
228 static char *empty_string
[0];
232 /* Zero size array gives internal unit len of 0. Nothing to read. */
233 if (dtp
->internal_unit_len
== 0
234 && dtp
->u
.p
.current_unit
->pad_status
== PAD_NO
)
237 /* If we have seen an eor previously, return a length of 0. The
238 caller is responsible for correctly padding the input field. */
239 if (dtp
->u
.p
.sf_seen_eor
)
242 /* Just return something that isn't a NULL pointer, otherwise the
243 caller thinks an error occurred. */
244 return (char*) empty_string
;
247 /* There are some cases with mixed DTIO where we have read a character
248 and saved it in the last character buffer, so we need to backup. */
249 if (unlikely (dtp
->u
.p
.current_unit
->child_dtio
> 0 &&
250 dtp
->u
.p
.current_unit
->last_char
!= EOF
- 1))
252 dtp
->u
.p
.current_unit
->last_char
= EOF
- 1;
253 sseek (dtp
->u
.p
.current_unit
->s
, -1, SEEK_CUR
);
257 if (is_char4_unit(dtp
))
260 gfc_char4_t
*p
= (gfc_char4_t
*) mem_alloc_r4 (dtp
->u
.p
.current_unit
->s
,
262 base
= fbuf_alloc (dtp
->u
.p
.current_unit
, lorig
);
263 for (i
= 0; i
< *length
; i
++, p
++)
264 base
[i
] = *p
> 255 ? '?' : (unsigned char) *p
;
267 base
= mem_alloc_r (dtp
->u
.p
.current_unit
->s
, length
);
269 if (unlikely (lorig
> *length
))
275 dtp
->u
.p
.current_unit
->bytes_left
-= *length
;
277 if (((dtp
->common
.flags
& IOPARM_DT_HAS_SIZE
) != 0) ||
278 dtp
->u
.p
.current_unit
->has_size
)
279 dtp
->u
.p
.current_unit
->size_used
+= (GFC_IO_INT
) *length
;
285 /* When reading sequential formatted records we have a problem. We
286 don't know how long the line is until we read the trailing newline,
287 and we don't want to read too much. If we read too much, we might
288 have to do a physical seek backwards depending on how much data is
289 present, and devices like terminals aren't seekable and would cause
292 Given this, the solution is to read a byte at a time, stopping if
293 we hit the newline. For small allocations, we use a static buffer.
294 For larger allocations, we are forced to allocate memory on the
295 heap. Hopefully this won't happen very often. */
297 /* Read sequential file - external unit */
300 read_sf (st_parameter_dt
*dtp
, int *length
)
302 static char *empty_string
[0];
304 int n
, lorig
, seen_comma
;
306 /* If we have seen an eor previously, return a length of 0. The
307 caller is responsible for correctly padding the input field. */
308 if (dtp
->u
.p
.sf_seen_eor
)
311 /* Just return something that isn't a NULL pointer, otherwise the
312 caller thinks an error occurred. */
313 return (char*) empty_string
;
316 /* There are some cases with mixed DTIO where we have read a character
317 and saved it in the last character buffer, so we need to backup. */
318 if (unlikely (dtp
->u
.p
.current_unit
->child_dtio
> 0 &&
319 dtp
->u
.p
.current_unit
->last_char
!= EOF
- 1))
321 dtp
->u
.p
.current_unit
->last_char
= EOF
- 1;
322 fbuf_seek (dtp
->u
.p
.current_unit
, -1, SEEK_CUR
);
327 /* Read data into format buffer and scan through it. */
332 q
= fbuf_getc (dtp
->u
.p
.current_unit
);
335 else if (dtp
->u
.p
.current_unit
->flags
.cc
!= CC_NONE
336 && (q
== '\n' || q
== '\r'))
338 /* Unexpected end of line. Set the position. */
339 dtp
->u
.p
.sf_seen_eor
= 1;
341 /* If we see an EOR during non-advancing I/O, we need to skip
342 the rest of the I/O statement. Set the corresponding flag. */
343 if (dtp
->u
.p
.advance_status
== ADVANCE_NO
|| dtp
->u
.p
.seen_dollar
)
344 dtp
->u
.p
.eor_condition
= 1;
346 /* If we encounter a CR, it might be a CRLF. */
347 if (q
== '\r') /* Probably a CRLF */
349 /* See if there is an LF. */
350 q2
= fbuf_getc (dtp
->u
.p
.current_unit
);
352 dtp
->u
.p
.sf_seen_eor
= 2;
353 else if (q2
!= EOF
) /* Oops, seek back. */
354 fbuf_seek (dtp
->u
.p
.current_unit
, -1, SEEK_CUR
);
357 /* Without padding, terminate the I/O statement without assigning
358 the value. With padding, the value still needs to be assigned,
359 so we can just continue with a short read. */
360 if (dtp
->u
.p
.current_unit
->pad_status
== PAD_NO
)
362 generate_error (&dtp
->common
, LIBERROR_EOR
, NULL
);
369 /* Short circuit the read if a comma is found during numeric input.
370 The flag is set to zero during character reads so that commas in
371 strings are not ignored */
373 if (dtp
->u
.p
.sf_read_comma
== 1)
376 notify_std (&dtp
->common
, GFC_STD_GNU
,
377 "Comma in formatted numeric read.");
385 /* A short read implies we hit EOF, unless we hit EOR, a comma, or
386 some other stuff. Set the relevant flags. */
387 if (lorig
> *length
&& !dtp
->u
.p
.sf_seen_eor
&& !seen_comma
)
391 if (dtp
->u
.p
.advance_status
== ADVANCE_NO
)
393 if (dtp
->u
.p
.current_unit
->pad_status
== PAD_NO
)
399 dtp
->u
.p
.eor_condition
= 1;
404 else if (dtp
->u
.p
.advance_status
== ADVANCE_NO
405 || dtp
->u
.p
.current_unit
->pad_status
== PAD_NO
406 || dtp
->u
.p
.current_unit
->bytes_left
407 == dtp
->u
.p
.current_unit
->recl
)
416 dtp
->u
.p
.current_unit
->bytes_left
-= n
;
418 if (((dtp
->common
.flags
& IOPARM_DT_HAS_SIZE
) != 0) ||
419 dtp
->u
.p
.current_unit
->has_size
)
420 dtp
->u
.p
.current_unit
->size_used
+= (GFC_IO_INT
) n
;
422 /* We can't call fbuf_getptr before the loop doing fbuf_getc, because
423 fbuf_getc might reallocate the buffer. So return current pointer
424 minus all the advances, which is n plus up to two characters
425 of newline or comma. */
426 return fbuf_getptr (dtp
->u
.p
.current_unit
)
427 - n
- dtp
->u
.p
.sf_seen_eor
- seen_comma
;
431 /* Function for reading the next couple of bytes from the current
432 file, advancing the current position. We return NULL on end of record or
433 end of file. This function is only for formatted I/O, unformatted uses
436 If the read is short, then it is because the current record does not
437 have enough data to satisfy the read request and the file was
438 opened with PAD=YES. The caller must assume tailing spaces for
442 read_block_form (st_parameter_dt
*dtp
, int *nbytes
)
447 if (!is_stream_io (dtp
))
449 if (dtp
->u
.p
.current_unit
->bytes_left
< (gfc_offset
) *nbytes
)
451 /* For preconnected units with default record length, set bytes left
452 to unit record length and proceed, otherwise error. */
453 if (dtp
->u
.p
.current_unit
->unit_number
== options
.stdin_unit
454 && dtp
->u
.p
.current_unit
->recl
== default_recl
)
455 dtp
->u
.p
.current_unit
->bytes_left
= dtp
->u
.p
.current_unit
->recl
;
458 if (unlikely (dtp
->u
.p
.current_unit
->pad_status
== PAD_NO
)
459 && !is_internal_unit (dtp
))
461 /* Not enough data left. */
462 generate_error (&dtp
->common
, LIBERROR_EOR
, NULL
);
467 if (is_internal_unit(dtp
))
469 if (*nbytes
> 0 && dtp
->u
.p
.current_unit
->bytes_left
== 0)
471 if (dtp
->u
.p
.advance_status
== ADVANCE_NO
)
473 generate_error (&dtp
->common
, LIBERROR_EOR
, NULL
);
480 if (unlikely (dtp
->u
.p
.current_unit
->bytes_left
== 0))
487 *nbytes
= dtp
->u
.p
.current_unit
->bytes_left
;
491 if (dtp
->u
.p
.current_unit
->flags
.form
== FORM_FORMATTED
&&
492 (dtp
->u
.p
.current_unit
->flags
.access
== ACCESS_SEQUENTIAL
||
493 dtp
->u
.p
.current_unit
->flags
.access
== ACCESS_STREAM
))
495 if (is_internal_unit (dtp
))
496 source
= read_sf_internal (dtp
, nbytes
);
498 source
= read_sf (dtp
, nbytes
);
500 dtp
->u
.p
.current_unit
->strm_pos
+=
501 (gfc_offset
) (*nbytes
+ dtp
->u
.p
.sf_seen_eor
);
505 /* If we reach here, we can assume it's direct access. */
507 dtp
->u
.p
.current_unit
->bytes_left
-= (gfc_offset
) *nbytes
;
510 source
= fbuf_read (dtp
->u
.p
.current_unit
, nbytes
);
511 fbuf_seek (dtp
->u
.p
.current_unit
, *nbytes
, SEEK_CUR
);
513 if (((dtp
->common
.flags
& IOPARM_DT_HAS_SIZE
) != 0) ||
514 dtp
->u
.p
.current_unit
->has_size
)
515 dtp
->u
.p
.current_unit
->size_used
+= (GFC_IO_INT
) *nbytes
;
517 if (norig
!= *nbytes
)
519 /* Short read, this shouldn't happen. */
520 if (dtp
->u
.p
.current_unit
->pad_status
== PAD_NO
)
522 generate_error (&dtp
->common
, LIBERROR_EOR
, NULL
);
527 dtp
->u
.p
.current_unit
->strm_pos
+= (gfc_offset
) *nbytes
;
533 /* Read a block from a character(kind=4) internal unit, to be transferred into
534 a character(kind=4) variable. Note: Portions of this code borrowed from
537 read_block_form4 (st_parameter_dt
*dtp
, int *nbytes
)
539 static gfc_char4_t
*empty_string
[0];
543 if (dtp
->u
.p
.current_unit
->bytes_left
< (gfc_offset
) *nbytes
)
544 *nbytes
= dtp
->u
.p
.current_unit
->bytes_left
;
546 /* Zero size array gives internal unit len of 0. Nothing to read. */
547 if (dtp
->internal_unit_len
== 0
548 && dtp
->u
.p
.current_unit
->pad_status
== PAD_NO
)
551 /* If we have seen an eor previously, return a length of 0. The
552 caller is responsible for correctly padding the input field. */
553 if (dtp
->u
.p
.sf_seen_eor
)
556 /* Just return something that isn't a NULL pointer, otherwise the
557 caller thinks an error occurred. */
562 source
= (gfc_char4_t
*) mem_alloc_r4 (dtp
->u
.p
.current_unit
->s
, nbytes
);
564 if (unlikely (lorig
> *nbytes
))
570 dtp
->u
.p
.current_unit
->bytes_left
-= *nbytes
;
572 if (((dtp
->common
.flags
& IOPARM_DT_HAS_SIZE
) != 0) ||
573 dtp
->u
.p
.current_unit
->has_size
)
574 dtp
->u
.p
.current_unit
->size_used
+= (GFC_IO_INT
) *nbytes
;
580 /* Reads a block directly into application data space. This is for
581 unformatted files. */
584 read_block_direct (st_parameter_dt
*dtp
, void *buf
, size_t nbytes
)
586 ssize_t to_read_record
;
587 ssize_t have_read_record
;
588 ssize_t to_read_subrecord
;
589 ssize_t have_read_subrecord
;
592 if (is_stream_io (dtp
))
594 have_read_record
= sread (dtp
->u
.p
.current_unit
->s
, buf
,
596 if (unlikely (have_read_record
< 0))
598 generate_error (&dtp
->common
, LIBERROR_OS
, NULL
);
602 dtp
->u
.p
.current_unit
->strm_pos
+= (gfc_offset
) have_read_record
;
604 if (unlikely ((ssize_t
) nbytes
!= have_read_record
))
606 /* Short read, e.g. if we hit EOF. For stream files,
607 we have to set the end-of-file condition. */
613 if (dtp
->u
.p
.current_unit
->flags
.access
== ACCESS_DIRECT
)
615 if (dtp
->u
.p
.current_unit
->bytes_left
< (gfc_offset
) nbytes
)
618 to_read_record
= dtp
->u
.p
.current_unit
->bytes_left
;
619 nbytes
= to_read_record
;
624 to_read_record
= nbytes
;
627 dtp
->u
.p
.current_unit
->bytes_left
-= to_read_record
;
629 to_read_record
= sread (dtp
->u
.p
.current_unit
->s
, buf
, to_read_record
);
630 if (unlikely (to_read_record
< 0))
632 generate_error (&dtp
->common
, LIBERROR_OS
, NULL
);
636 if (to_read_record
!= (ssize_t
) nbytes
)
638 /* Short read, e.g. if we hit EOF. Apparently, we read
639 more than was written to the last record. */
643 if (unlikely (short_record
))
645 generate_error (&dtp
->common
, LIBERROR_SHORT_RECORD
, NULL
);
650 /* Unformatted sequential. We loop over the subrecords, reading
651 until the request has been fulfilled or the record has run out
652 of continuation subrecords. */
654 /* Check whether we exceed the total record length. */
656 if (dtp
->u
.p
.current_unit
->flags
.has_recl
657 && ((gfc_offset
) nbytes
> dtp
->u
.p
.current_unit
->bytes_left
))
659 to_read_record
= dtp
->u
.p
.current_unit
->bytes_left
;
664 to_read_record
= nbytes
;
667 have_read_record
= 0;
671 if (dtp
->u
.p
.current_unit
->bytes_left_subrecord
672 < (gfc_offset
) to_read_record
)
674 to_read_subrecord
= dtp
->u
.p
.current_unit
->bytes_left_subrecord
;
675 to_read_record
-= to_read_subrecord
;
679 to_read_subrecord
= to_read_record
;
683 dtp
->u
.p
.current_unit
->bytes_left_subrecord
-= to_read_subrecord
;
685 have_read_subrecord
= sread (dtp
->u
.p
.current_unit
->s
,
686 buf
+ have_read_record
, to_read_subrecord
);
687 if (unlikely (have_read_subrecord
< 0))
689 generate_error (&dtp
->common
, LIBERROR_OS
, NULL
);
693 have_read_record
+= have_read_subrecord
;
695 if (unlikely (to_read_subrecord
!= have_read_subrecord
))
697 /* Short read, e.g. if we hit EOF. This means the record
698 structure has been corrupted, or the trailing record
699 marker would still be present. */
701 generate_error (&dtp
->common
, LIBERROR_CORRUPT_FILE
, NULL
);
705 if (to_read_record
> 0)
707 if (likely (dtp
->u
.p
.current_unit
->continued
))
709 next_record_r_unf (dtp
, 0);
714 /* Let's make sure the file position is correctly pre-positioned
715 for the next read statement. */
717 dtp
->u
.p
.current_unit
->current_record
= 0;
718 next_record_r_unf (dtp
, 0);
719 generate_error (&dtp
->common
, LIBERROR_SHORT_RECORD
, NULL
);
725 /* Normal exit, the read request has been fulfilled. */
730 dtp
->u
.p
.current_unit
->bytes_left
-= have_read_record
;
731 if (unlikely (short_record
))
733 generate_error (&dtp
->common
, LIBERROR_SHORT_RECORD
, NULL
);
740 /* Function for writing a block of bytes to the current file at the
741 current position, advancing the file pointer. We are given a length
742 and return a pointer to a buffer that the caller must (completely)
743 fill in. Returns NULL on error. */
746 write_block (st_parameter_dt
*dtp
, int length
)
750 if (!is_stream_io (dtp
))
752 if (dtp
->u
.p
.current_unit
->bytes_left
< (gfc_offset
) length
)
754 /* For preconnected units with default record length, set bytes left
755 to unit record length and proceed, otherwise error. */
756 if (likely ((dtp
->u
.p
.current_unit
->unit_number
757 == options
.stdout_unit
758 || dtp
->u
.p
.current_unit
->unit_number
759 == options
.stderr_unit
)
760 && dtp
->u
.p
.current_unit
->recl
== default_recl
))
761 dtp
->u
.p
.current_unit
->bytes_left
= dtp
->u
.p
.current_unit
->recl
;
764 generate_error (&dtp
->common
, LIBERROR_EOR
, NULL
);
769 dtp
->u
.p
.current_unit
->bytes_left
-= (gfc_offset
) length
;
772 if (is_internal_unit (dtp
))
774 if (is_char4_unit(dtp
)) /* char4 internel unit. */
777 dest4
= mem_alloc_w4 (dtp
->u
.p
.current_unit
->s
, &length
);
780 generate_error (&dtp
->common
, LIBERROR_END
, NULL
);
786 dest
= mem_alloc_w (dtp
->u
.p
.current_unit
->s
, &length
);
790 generate_error (&dtp
->common
, LIBERROR_END
, NULL
);
794 if (unlikely (dtp
->u
.p
.current_unit
->endfile
== AT_ENDFILE
))
795 generate_error (&dtp
->common
, LIBERROR_END
, NULL
);
799 dest
= fbuf_alloc (dtp
->u
.p
.current_unit
, length
);
802 generate_error (&dtp
->common
, LIBERROR_OS
, NULL
);
807 if (((dtp
->common
.flags
& IOPARM_DT_HAS_SIZE
) != 0) ||
808 dtp
->u
.p
.current_unit
->has_size
)
809 dtp
->u
.p
.current_unit
->size_used
+= (GFC_IO_INT
) length
;
811 dtp
->u
.p
.current_unit
->strm_pos
+= (gfc_offset
) length
;
817 /* High level interface to swrite(), taking care of errors. This is only
818 called for unformatted files. There are three cases to consider:
819 Stream I/O, unformatted direct, unformatted sequential. */
822 write_buf (st_parameter_dt
*dtp
, void *buf
, size_t nbytes
)
825 ssize_t have_written
;
826 ssize_t to_write_subrecord
;
831 if (is_stream_io (dtp
))
833 have_written
= swrite (dtp
->u
.p
.current_unit
->s
, buf
, nbytes
);
834 if (unlikely (have_written
< 0))
836 generate_error (&dtp
->common
, LIBERROR_OS
, NULL
);
840 dtp
->u
.p
.current_unit
->strm_pos
+= (gfc_offset
) have_written
;
845 /* Unformatted direct access. */
847 if (dtp
->u
.p
.current_unit
->flags
.access
== ACCESS_DIRECT
)
849 if (unlikely (dtp
->u
.p
.current_unit
->bytes_left
< (gfc_offset
) nbytes
))
851 generate_error (&dtp
->common
, LIBERROR_DIRECT_EOR
, NULL
);
855 if (buf
== NULL
&& nbytes
== 0)
858 have_written
= swrite (dtp
->u
.p
.current_unit
->s
, buf
, nbytes
);
859 if (unlikely (have_written
< 0))
861 generate_error (&dtp
->common
, LIBERROR_OS
, NULL
);
865 dtp
->u
.p
.current_unit
->strm_pos
+= (gfc_offset
) have_written
;
866 dtp
->u
.p
.current_unit
->bytes_left
-= (gfc_offset
) have_written
;
871 /* Unformatted sequential. */
875 if (dtp
->u
.p
.current_unit
->flags
.has_recl
876 && (gfc_offset
) nbytes
> dtp
->u
.p
.current_unit
->bytes_left
)
878 nbytes
= dtp
->u
.p
.current_unit
->bytes_left
;
890 (size_t) dtp
->u
.p
.current_unit
->bytes_left_subrecord
< nbytes
?
891 (size_t) dtp
->u
.p
.current_unit
->bytes_left_subrecord
: nbytes
;
893 dtp
->u
.p
.current_unit
->bytes_left_subrecord
-=
894 (gfc_offset
) to_write_subrecord
;
896 to_write_subrecord
= swrite (dtp
->u
.p
.current_unit
->s
,
897 buf
+ have_written
, to_write_subrecord
);
898 if (unlikely (to_write_subrecord
< 0))
900 generate_error (&dtp
->common
, LIBERROR_OS
, NULL
);
904 dtp
->u
.p
.current_unit
->strm_pos
+= (gfc_offset
) to_write_subrecord
;
905 nbytes
-= to_write_subrecord
;
906 have_written
+= to_write_subrecord
;
911 next_record_w_unf (dtp
, 1);
914 dtp
->u
.p
.current_unit
->bytes_left
-= have_written
;
915 if (unlikely (short_record
))
917 generate_error (&dtp
->common
, LIBERROR_SHORT_RECORD
, NULL
);
924 /* Reverse memcpy - used for byte swapping. */
927 reverse_memcpy (void *dest
, const void *src
, size_t n
)
933 s
= (char *) src
+ n
- 1;
935 /* Write with ascending order - this is likely faster
936 on modern architectures because of write combining. */
942 /* Utility function for byteswapping an array, using the bswap
943 builtins if possible. dest and src can overlap completely, or then
944 they must point to separate objects; partial overlaps are not
948 bswap_array (void *dest
, const void *src
, size_t size
, size_t nelems
)
958 for (size_t i
= 0; i
< nelems
; i
++)
959 ((uint16_t*)dest
)[i
] = __builtin_bswap16 (((uint16_t*)src
)[i
]);
962 for (size_t i
= 0; i
< nelems
; i
++)
963 ((uint32_t*)dest
)[i
] = __builtin_bswap32 (((uint32_t*)src
)[i
]);
966 for (size_t i
= 0; i
< nelems
; i
++)
967 ((uint64_t*)dest
)[i
] = __builtin_bswap64 (((uint64_t*)src
)[i
]);
972 for (size_t i
= 0; i
< nelems
; i
++)
975 memcpy (&tmp
, ps
, 4);
976 *(uint32_t*)pd
= __builtin_bswap32 (*(uint32_t*)(ps
+ 8));
977 *(uint32_t*)(pd
+ 4) = __builtin_bswap32 (*(uint32_t*)(ps
+ 4));
978 *(uint32_t*)(pd
+ 8) = __builtin_bswap32 (tmp
);
986 for (size_t i
= 0; i
< nelems
; i
++)
989 memcpy (&tmp
, ps
, 8);
990 *(uint64_t*)pd
= __builtin_bswap64 (*(uint64_t*)(ps
+ 8));
991 *(uint64_t*)(pd
+ 8) = __builtin_bswap64 (tmp
);
1001 for (size_t i
= 0; i
< nelems
; i
++)
1003 reverse_memcpy (pd
, ps
, size
);
1010 /* In-place byte swap. */
1011 for (size_t i
= 0; i
< nelems
; i
++)
1013 char tmp
, *low
= pd
, *high
= pd
+ size
- 1;
1014 for (size_t j
= 0; j
< size
/2; j
++)
1029 /* Master function for unformatted reads. */
1032 unformatted_read (st_parameter_dt
*dtp
, bt type
,
1033 void *dest
, int kind
, size_t size
, size_t nelems
)
1035 if (type
== BT_CLASS
)
1037 int unit
= dtp
->u
.p
.current_unit
->unit_number
;
1038 char tmp_iomsg
[IOMSG_LEN
] = "";
1040 gfc_charlen_type child_iomsg_len
;
1042 int *child_iostat
= NULL
;
1044 /* Set iostat, intent(out). */
1046 child_iostat
= (dtp
->common
.flags
& IOPARM_HAS_IOSTAT
) ?
1047 dtp
->common
.iostat
: &noiostat
;
1049 /* Set iomsg, intent(inout). */
1050 if (dtp
->common
.flags
& IOPARM_HAS_IOMSG
)
1052 child_iomsg
= dtp
->common
.iomsg
;
1053 child_iomsg_len
= dtp
->common
.iomsg_len
;
1057 child_iomsg
= tmp_iomsg
;
1058 child_iomsg_len
= IOMSG_LEN
;
1061 /* Call the user defined unformatted READ procedure. */
1062 dtp
->u
.p
.current_unit
->child_dtio
++;
1063 dtp
->u
.p
.ufdtio_ptr (dest
, &unit
, child_iostat
, child_iomsg
,
1065 dtp
->u
.p
.current_unit
->child_dtio
--;
1069 if (type
== BT_CHARACTER
)
1070 size
*= GFC_SIZE_OF_CHAR_KIND(kind
);
1071 read_block_direct (dtp
, dest
, size
* nelems
);
1073 if (unlikely (dtp
->u
.p
.current_unit
->flags
.convert
== GFC_CONVERT_SWAP
)
1076 /* Handle wide chracters. */
1077 if (type
== BT_CHARACTER
)
1083 /* Break up complex into its constituent reals. */
1084 else if (type
== BT_COMPLEX
)
1089 bswap_array (dest
, dest
, size
, nelems
);
1094 /* Master function for unformatted writes. NOTE: For kind=10 the size is 16
1095 bytes on 64 bit machines. The unused bytes are not initialized and never
1096 used, which can show an error with memory checking analyzers like
1097 valgrind. We us BT_CLASS to denote a User Defined I/O call. */
1100 unformatted_write (st_parameter_dt
*dtp
, bt type
,
1101 void *source
, int kind
, size_t size
, size_t nelems
)
1103 if (type
== BT_CLASS
)
1105 int unit
= dtp
->u
.p
.current_unit
->unit_number
;
1106 char tmp_iomsg
[IOMSG_LEN
] = "";
1108 gfc_charlen_type child_iomsg_len
;
1110 int *child_iostat
= NULL
;
1112 /* Set iostat, intent(out). */
1114 child_iostat
= (dtp
->common
.flags
& IOPARM_HAS_IOSTAT
) ?
1115 dtp
->common
.iostat
: &noiostat
;
1117 /* Set iomsg, intent(inout). */
1118 if (dtp
->common
.flags
& IOPARM_HAS_IOMSG
)
1120 child_iomsg
= dtp
->common
.iomsg
;
1121 child_iomsg_len
= dtp
->common
.iomsg_len
;
1125 child_iomsg
= tmp_iomsg
;
1126 child_iomsg_len
= IOMSG_LEN
;
1129 /* Call the user defined unformatted WRITE procedure. */
1130 dtp
->u
.p
.current_unit
->child_dtio
++;
1131 dtp
->u
.p
.ufdtio_ptr (source
, &unit
, child_iostat
, child_iomsg
,
1133 dtp
->u
.p
.current_unit
->child_dtio
--;
1137 if (likely (dtp
->u
.p
.current_unit
->flags
.convert
== GFC_CONVERT_NATIVE
)
1140 size_t stride
= type
== BT_CHARACTER
?
1141 size
* GFC_SIZE_OF_CHAR_KIND(kind
) : size
;
1143 write_buf (dtp
, source
, stride
* nelems
);
1147 #define BSWAP_BUFSZ 512
1148 char buffer
[BSWAP_BUFSZ
];
1154 /* Handle wide chracters. */
1155 if (type
== BT_CHARACTER
&& kind
!= 1)
1161 /* Break up complex into its constituent reals. */
1162 if (type
== BT_COMPLEX
)
1168 /* By now, all complex variables have been split into their
1169 constituent reals. */
1175 if (size
* nrem
> BSWAP_BUFSZ
)
1176 nc
= BSWAP_BUFSZ
/ size
;
1180 bswap_array (buffer
, p
, size
, nc
);
1181 write_buf (dtp
, buffer
, size
* nc
);
1190 /* Return a pointer to the name of a type. */
1215 p
= "CLASS or DERIVED";
1218 internal_error (NULL
, "type_name(): Bad type");
1225 /* Write a constant string to the output.
1226 This is complicated because the string can have doubled delimiters
1227 in it. The length in the format node is the true length. */
1230 write_constant_string (st_parameter_dt
*dtp
, const fnode
*f
)
1232 char c
, delimiter
, *p
, *q
;
1235 length
= f
->u
.string
.length
;
1239 p
= write_block (dtp
, length
);
1246 for (; length
> 0; length
--)
1249 if (c
== delimiter
&& c
!= 'H' && c
!= 'h')
1250 q
++; /* Skip the doubled delimiter. */
1255 /* Given actual and expected types in a formatted data transfer, make
1256 sure they agree. If not, an error message is generated. Returns
1257 nonzero if something went wrong. */
1260 require_type (st_parameter_dt
*dtp
, bt expected
, bt actual
, const fnode
*f
)
1263 char buffer
[BUFLEN
];
1265 if (actual
== expected
)
1268 /* Adjust item_count before emitting error message. */
1269 snprintf (buffer
, BUFLEN
,
1270 "Expected %s for item %d in formatted transfer, got %s",
1271 type_name (expected
), dtp
->u
.p
.item_count
- 1, type_name (actual
));
1273 format_error (dtp
, f
, buffer
);
1278 /* Check that the dtio procedure required for formatted IO is present. */
1281 check_dtio_proc (st_parameter_dt
*dtp
, const fnode
*f
)
1283 char buffer
[BUFLEN
];
1285 if (dtp
->u
.p
.fdtio_ptr
!= NULL
)
1288 snprintf (buffer
, BUFLEN
,
1289 "Missing DTIO procedure or intrinsic type passed for item %d "
1290 "in formatted transfer",
1291 dtp
->u
.p
.item_count
- 1);
1293 format_error (dtp
, f
, buffer
);
1299 require_numeric_type (st_parameter_dt
*dtp
, bt actual
, const fnode
*f
)
1302 char buffer
[BUFLEN
];
1304 if (actual
== BT_INTEGER
|| actual
== BT_REAL
|| actual
== BT_COMPLEX
)
1307 /* Adjust item_count before emitting error message. */
1308 snprintf (buffer
, BUFLEN
,
1309 "Expected numeric type for item %d in formatted transfer, got %s",
1310 dtp
->u
.p
.item_count
- 1, type_name (actual
));
1312 format_error (dtp
, f
, buffer
);
1317 get_dt_format (char *p
, gfc_charlen_type
*length
)
1319 char delim
= p
[-1]; /* The delimiter is always the first character back. */
1321 gfc_charlen_type len
= *length
; /* This length already correct, less 'DT'. */
1323 res
= q
= xmalloc (len
+ 2);
1325 /* Set the beginning of the string to 'DT', length adjusted below. */
1329 /* The string may contain doubled quotes so scan and skip as needed. */
1330 for (; len
> 0; len
--)
1334 p
++; /* Skip the doubled delimiter. */
1337 /* Adjust the string length by two now that we are done. */
1344 /* This function is in the main loop for a formatted data transfer
1345 statement. It would be natural to implement this as a coroutine
1346 with the user program, but C makes that awkward. We loop,
1347 processing format elements. When we actually have to transfer
1348 data instead of just setting flags, we return control to the user
1349 program which calls a function that supplies the address and type
1350 of the next element, then comes back here to process it. */
1353 formatted_transfer_scalar_read (st_parameter_dt
*dtp
, bt type
, void *p
, int kind
,
1356 int pos
, bytes_used
;
1360 int consume_data_flag
;
1362 /* Change a complex data item into a pair of reals. */
1364 n
= (p
== NULL
) ? 0 : ((type
!= BT_COMPLEX
) ? 1 : 2);
1365 if (type
== BT_COMPLEX
)
1371 /* If there's an EOR condition, we simulate finalizing the transfer
1372 by doing nothing. */
1373 if (dtp
->u
.p
.eor_condition
)
1376 /* Set this flag so that commas in reads cause the read to complete before
1377 the entire field has been read. The next read field will start right after
1378 the comma in the stream. (Set to 0 for character reads). */
1379 dtp
->u
.p
.sf_read_comma
=
1380 dtp
->u
.p
.current_unit
->decimal_status
== DECIMAL_COMMA
? 0 : 1;
1384 /* If reversion has occurred and there is another real data item,
1385 then we have to move to the next record. */
1386 if (dtp
->u
.p
.reversion_flag
&& n
> 0)
1388 dtp
->u
.p
.reversion_flag
= 0;
1389 next_record (dtp
, 0);
1392 consume_data_flag
= 1;
1393 if ((dtp
->common
.flags
& IOPARM_LIBRETURN_MASK
) != IOPARM_LIBRETURN_OK
)
1396 f
= next_format (dtp
);
1399 /* No data descriptors left. */
1400 if (unlikely (n
> 0))
1401 generate_error (&dtp
->common
, LIBERROR_FORMAT
,
1402 "Insufficient data descriptors in format after reversion");
1408 bytes_used
= (int)(dtp
->u
.p
.current_unit
->recl
1409 - dtp
->u
.p
.current_unit
->bytes_left
);
1411 if (is_stream_io(dtp
))
1418 goto need_read_data
;
1419 if (require_type (dtp
, BT_INTEGER
, type
, f
))
1421 read_decimal (dtp
, f
, p
, kind
);
1426 goto need_read_data
;
1427 if (!(compile_options
.allow_std
& GFC_STD_GNU
)
1428 && require_numeric_type (dtp
, type
, f
))
1430 if (!(compile_options
.allow_std
& GFC_STD_F2008
)
1431 && require_type (dtp
, BT_INTEGER
, type
, f
))
1433 read_radix (dtp
, f
, p
, kind
, 2);
1438 goto need_read_data
;
1439 if (!(compile_options
.allow_std
& GFC_STD_GNU
)
1440 && require_numeric_type (dtp
, type
, f
))
1442 if (!(compile_options
.allow_std
& GFC_STD_F2008
)
1443 && require_type (dtp
, BT_INTEGER
, type
, f
))
1445 read_radix (dtp
, f
, p
, kind
, 8);
1450 goto need_read_data
;
1451 if (!(compile_options
.allow_std
& GFC_STD_GNU
)
1452 && require_numeric_type (dtp
, type
, f
))
1454 if (!(compile_options
.allow_std
& GFC_STD_F2008
)
1455 && require_type (dtp
, BT_INTEGER
, type
, f
))
1457 read_radix (dtp
, f
, p
, kind
, 16);
1462 goto need_read_data
;
1464 /* It is possible to have FMT_A with something not BT_CHARACTER such
1465 as when writing out hollerith strings, so check both type
1466 and kind before calling wide character routines. */
1467 if (type
== BT_CHARACTER
&& kind
== 4)
1468 read_a_char4 (dtp
, f
, p
, size
);
1470 read_a (dtp
, f
, p
, size
);
1475 goto need_read_data
;
1476 read_l (dtp
, f
, p
, kind
);
1481 goto need_read_data
;
1482 if (require_type (dtp
, BT_REAL
, type
, f
))
1484 read_f (dtp
, f
, p
, kind
);
1489 goto need_read_data
;
1491 if (check_dtio_proc (dtp
, f
))
1493 if (require_type (dtp
, BT_CLASS
, type
, f
))
1495 int unit
= dtp
->u
.p
.current_unit
->unit_number
;
1497 char tmp_iomsg
[IOMSG_LEN
] = "";
1499 gfc_charlen_type child_iomsg_len
;
1501 int *child_iostat
= NULL
;
1503 gfc_charlen_type iotype_len
= f
->u
.udf
.string_len
;
1505 /* Build the iotype string. */
1506 if (iotype_len
== 0)
1512 iotype
= get_dt_format (f
->u
.udf
.string
, &iotype_len
);
1514 /* Set iostat, intent(out). */
1516 child_iostat
= (dtp
->common
.flags
& IOPARM_HAS_IOSTAT
) ?
1517 dtp
->common
.iostat
: &noiostat
;
1519 /* Set iomsg, intent(inout). */
1520 if (dtp
->common
.flags
& IOPARM_HAS_IOMSG
)
1522 child_iomsg
= dtp
->common
.iomsg
;
1523 child_iomsg_len
= dtp
->common
.iomsg_len
;
1527 child_iomsg
= tmp_iomsg
;
1528 child_iomsg_len
= IOMSG_LEN
;
1531 /* Call the user defined formatted READ procedure. */
1532 dtp
->u
.p
.current_unit
->child_dtio
++;
1533 dtp
->u
.p
.current_unit
->last_char
= EOF
- 1;
1534 dtp
->u
.p
.fdtio_ptr (p
, &unit
, iotype
, f
->u
.udf
.vlist
,
1535 child_iostat
, child_iomsg
,
1536 iotype_len
, child_iomsg_len
);
1537 dtp
->u
.p
.current_unit
->child_dtio
--;
1539 if (f
->u
.udf
.string_len
!= 0)
1541 /* Note: vlist is freed in free_format_data. */
1546 goto need_read_data
;
1547 if (require_type (dtp
, BT_REAL
, type
, f
))
1549 read_f (dtp
, f
, p
, kind
);
1554 goto need_read_data
;
1555 if (require_type (dtp
, BT_REAL
, type
, f
))
1557 read_f (dtp
, f
, p
, kind
);
1562 goto need_read_data
;
1563 if (require_type (dtp
, BT_REAL
, type
, f
))
1565 read_f (dtp
, f
, p
, kind
);
1570 goto need_read_data
;
1571 if (require_type (dtp
, BT_REAL
, type
, f
))
1573 read_f (dtp
, f
, p
, kind
);
1578 goto need_read_data
;
1582 read_decimal (dtp
, f
, p
, kind
);
1585 read_l (dtp
, f
, p
, kind
);
1589 read_a_char4 (dtp
, f
, p
, size
);
1591 read_a (dtp
, f
, p
, size
);
1594 read_f (dtp
, f
, p
, kind
);
1597 internal_error (&dtp
->common
, "formatted_transfer(): Bad type");
1602 consume_data_flag
= 0;
1603 format_error (dtp
, f
, "Constant string in input format");
1606 /* Format codes that don't transfer data. */
1609 consume_data_flag
= 0;
1610 dtp
->u
.p
.skips
+= f
->u
.n
;
1611 pos
= bytes_used
+ dtp
->u
.p
.skips
- 1;
1612 dtp
->u
.p
.pending_spaces
= pos
- dtp
->u
.p
.max_pos
+ 1;
1613 read_x (dtp
, f
->u
.n
);
1618 consume_data_flag
= 0;
1620 if (f
->format
== FMT_TL
)
1622 /* Handle the special case when no bytes have been used yet.
1623 Cannot go below zero. */
1624 if (bytes_used
== 0)
1626 dtp
->u
.p
.pending_spaces
-= f
->u
.n
;
1627 dtp
->u
.p
.skips
-= f
->u
.n
;
1628 dtp
->u
.p
.skips
= dtp
->u
.p
.skips
< 0 ? 0 : dtp
->u
.p
.skips
;
1631 pos
= bytes_used
- f
->u
.n
;
1636 /* Standard 10.6.1.1: excessive left tabbing is reset to the
1637 left tab limit. We do not check if the position has gone
1638 beyond the end of record because a subsequent tab could
1639 bring us back again. */
1640 pos
= pos
< 0 ? 0 : pos
;
1642 dtp
->u
.p
.skips
= dtp
->u
.p
.skips
+ pos
- bytes_used
;
1643 dtp
->u
.p
.pending_spaces
= dtp
->u
.p
.pending_spaces
1644 + pos
- dtp
->u
.p
.max_pos
;
1645 dtp
->u
.p
.pending_spaces
= dtp
->u
.p
.pending_spaces
< 0
1646 ? 0 : dtp
->u
.p
.pending_spaces
;
1647 if (dtp
->u
.p
.skips
== 0)
1650 /* Adjust everything for end-of-record condition */
1651 if (dtp
->u
.p
.sf_seen_eor
&& !is_internal_unit (dtp
))
1653 dtp
->u
.p
.current_unit
->bytes_left
-= dtp
->u
.p
.sf_seen_eor
;
1654 dtp
->u
.p
.skips
-= dtp
->u
.p
.sf_seen_eor
;
1656 if (dtp
->u
.p
.pending_spaces
== 0)
1657 dtp
->u
.p
.sf_seen_eor
= 0;
1659 if (dtp
->u
.p
.skips
< 0)
1661 if (is_internal_unit (dtp
))
1662 sseek (dtp
->u
.p
.current_unit
->s
, dtp
->u
.p
.skips
, SEEK_CUR
);
1664 fbuf_seek (dtp
->u
.p
.current_unit
, dtp
->u
.p
.skips
, SEEK_CUR
);
1665 dtp
->u
.p
.current_unit
->bytes_left
-= (gfc_offset
) dtp
->u
.p
.skips
;
1666 dtp
->u
.p
.skips
= dtp
->u
.p
.pending_spaces
= 0;
1669 read_x (dtp
, dtp
->u
.p
.skips
);
1673 consume_data_flag
= 0;
1674 dtp
->u
.p
.sign_status
= SIGN_S
;
1678 consume_data_flag
= 0;
1679 dtp
->u
.p
.sign_status
= SIGN_SS
;
1683 consume_data_flag
= 0;
1684 dtp
->u
.p
.sign_status
= SIGN_SP
;
1688 consume_data_flag
= 0 ;
1689 dtp
->u
.p
.blank_status
= BLANK_NULL
;
1693 consume_data_flag
= 0;
1694 dtp
->u
.p
.blank_status
= BLANK_ZERO
;
1698 consume_data_flag
= 0;
1699 dtp
->u
.p
.current_unit
->decimal_status
= DECIMAL_COMMA
;
1703 consume_data_flag
= 0;
1704 dtp
->u
.p
.current_unit
->decimal_status
= DECIMAL_POINT
;
1708 consume_data_flag
= 0;
1709 dtp
->u
.p
.current_unit
->round_status
= ROUND_COMPATIBLE
;
1713 consume_data_flag
= 0;
1714 dtp
->u
.p
.current_unit
->round_status
= ROUND_DOWN
;
1718 consume_data_flag
= 0;
1719 dtp
->u
.p
.current_unit
->round_status
= ROUND_NEAREST
;
1723 consume_data_flag
= 0;
1724 dtp
->u
.p
.current_unit
->round_status
= ROUND_PROCDEFINED
;
1728 consume_data_flag
= 0;
1729 dtp
->u
.p
.current_unit
->round_status
= ROUND_UP
;
1733 consume_data_flag
= 0;
1734 dtp
->u
.p
.current_unit
->round_status
= ROUND_ZERO
;
1738 consume_data_flag
= 0;
1739 dtp
->u
.p
.scale_factor
= f
->u
.k
;
1743 consume_data_flag
= 0;
1744 dtp
->u
.p
.seen_dollar
= 1;
1748 consume_data_flag
= 0;
1749 dtp
->u
.p
.skips
= dtp
->u
.p
.pending_spaces
= 0;
1750 next_record (dtp
, 0);
1754 /* A colon descriptor causes us to exit this loop (in
1755 particular preventing another / descriptor from being
1756 processed) unless there is another data item to be
1758 consume_data_flag
= 0;
1764 internal_error (&dtp
->common
, "Bad format node");
1767 /* Adjust the item count and data pointer. */
1769 if ((consume_data_flag
> 0) && (n
> 0))
1772 p
= ((char *) p
) + size
;
1777 pos
= (int)(dtp
->u
.p
.current_unit
->recl
- dtp
->u
.p
.current_unit
->bytes_left
);
1778 dtp
->u
.p
.max_pos
= (dtp
->u
.p
.max_pos
> pos
) ? dtp
->u
.p
.max_pos
: pos
;
1783 /* Come here when we need a data descriptor but don't have one. We
1784 push the current format node back onto the input, then return and
1785 let the user program call us back with the data. */
1787 unget_format (dtp
, f
);
1792 formatted_transfer_scalar_write (st_parameter_dt
*dtp
, bt type
, void *p
, int kind
,
1795 int pos
, bytes_used
;
1799 int consume_data_flag
;
1801 /* Change a complex data item into a pair of reals. */
1803 n
= (p
== NULL
) ? 0 : ((type
!= BT_COMPLEX
) ? 1 : 2);
1804 if (type
== BT_COMPLEX
)
1810 /* If there's an EOR condition, we simulate finalizing the transfer
1811 by doing nothing. */
1812 if (dtp
->u
.p
.eor_condition
)
1815 /* Set this flag so that commas in reads cause the read to complete before
1816 the entire field has been read. The next read field will start right after
1817 the comma in the stream. (Set to 0 for character reads). */
1818 dtp
->u
.p
.sf_read_comma
=
1819 dtp
->u
.p
.current_unit
->decimal_status
== DECIMAL_COMMA
? 0 : 1;
1823 /* If reversion has occurred and there is another real data item,
1824 then we have to move to the next record. */
1825 if (dtp
->u
.p
.reversion_flag
&& n
> 0)
1827 dtp
->u
.p
.reversion_flag
= 0;
1828 next_record (dtp
, 0);
1831 consume_data_flag
= 1;
1832 if ((dtp
->common
.flags
& IOPARM_LIBRETURN_MASK
) != IOPARM_LIBRETURN_OK
)
1835 f
= next_format (dtp
);
1838 /* No data descriptors left. */
1839 if (unlikely (n
> 0))
1840 generate_error (&dtp
->common
, LIBERROR_FORMAT
,
1841 "Insufficient data descriptors in format after reversion");
1845 /* Now discharge T, TR and X movements to the right. This is delayed
1846 until a data producing format to suppress trailing spaces. */
1849 if (dtp
->u
.p
.mode
== WRITING
&& dtp
->u
.p
.skips
!= 0
1850 && ((n
>0 && ( t
== FMT_I
|| t
== FMT_B
|| t
== FMT_O
1851 || t
== FMT_Z
|| t
== FMT_F
|| t
== FMT_E
1852 || t
== FMT_EN
|| t
== FMT_ES
|| t
== FMT_G
1853 || t
== FMT_L
|| t
== FMT_A
|| t
== FMT_D
1855 || t
== FMT_STRING
))
1857 if (dtp
->u
.p
.skips
> 0)
1860 write_x (dtp
, dtp
->u
.p
.skips
, dtp
->u
.p
.pending_spaces
);
1861 tmp
= (int)(dtp
->u
.p
.current_unit
->recl
1862 - dtp
->u
.p
.current_unit
->bytes_left
);
1864 dtp
->u
.p
.max_pos
> tmp
? dtp
->u
.p
.max_pos
: tmp
;
1867 if (dtp
->u
.p
.skips
< 0)
1869 if (is_internal_unit (dtp
))
1870 sseek (dtp
->u
.p
.current_unit
->s
, dtp
->u
.p
.skips
, SEEK_CUR
);
1872 fbuf_seek (dtp
->u
.p
.current_unit
, dtp
->u
.p
.skips
, SEEK_CUR
);
1873 dtp
->u
.p
.current_unit
->bytes_left
-= (gfc_offset
) dtp
->u
.p
.skips
;
1875 dtp
->u
.p
.skips
= dtp
->u
.p
.pending_spaces
= 0;
1878 bytes_used
= (int)(dtp
->u
.p
.current_unit
->recl
1879 - dtp
->u
.p
.current_unit
->bytes_left
);
1881 if (is_stream_io(dtp
))
1889 if (require_type (dtp
, BT_INTEGER
, type
, f
))
1891 write_i (dtp
, f
, p
, kind
);
1897 if (!(compile_options
.allow_std
& GFC_STD_GNU
)
1898 && require_numeric_type (dtp
, type
, f
))
1900 if (!(compile_options
.allow_std
& GFC_STD_F2008
)
1901 && require_type (dtp
, BT_INTEGER
, type
, f
))
1903 write_b (dtp
, f
, p
, kind
);
1909 if (!(compile_options
.allow_std
& GFC_STD_GNU
)
1910 && require_numeric_type (dtp
, type
, f
))
1912 if (!(compile_options
.allow_std
& GFC_STD_F2008
)
1913 && require_type (dtp
, BT_INTEGER
, type
, f
))
1915 write_o (dtp
, f
, p
, kind
);
1921 if (!(compile_options
.allow_std
& GFC_STD_GNU
)
1922 && require_numeric_type (dtp
, type
, f
))
1924 if (!(compile_options
.allow_std
& GFC_STD_F2008
)
1925 && require_type (dtp
, BT_INTEGER
, type
, f
))
1927 write_z (dtp
, f
, p
, kind
);
1934 /* It is possible to have FMT_A with something not BT_CHARACTER such
1935 as when writing out hollerith strings, so check both type
1936 and kind before calling wide character routines. */
1937 if (type
== BT_CHARACTER
&& kind
== 4)
1938 write_a_char4 (dtp
, f
, p
, size
);
1940 write_a (dtp
, f
, p
, size
);
1946 write_l (dtp
, f
, p
, kind
);
1952 if (require_type (dtp
, BT_REAL
, type
, f
))
1954 write_d (dtp
, f
, p
, kind
);
1960 int unit
= dtp
->u
.p
.current_unit
->unit_number
;
1962 char tmp_iomsg
[IOMSG_LEN
] = "";
1964 gfc_charlen_type child_iomsg_len
;
1966 int *child_iostat
= NULL
;
1968 gfc_charlen_type iotype_len
= f
->u
.udf
.string_len
;
1970 /* Build the iotype string. */
1971 if (iotype_len
== 0)
1977 iotype
= get_dt_format (f
->u
.udf
.string
, &iotype_len
);
1979 /* Set iostat, intent(out). */
1981 child_iostat
= (dtp
->common
.flags
& IOPARM_HAS_IOSTAT
) ?
1982 dtp
->common
.iostat
: &noiostat
;
1984 /* Set iomsg, intent(inout). */
1985 if (dtp
->common
.flags
& IOPARM_HAS_IOMSG
)
1987 child_iomsg
= dtp
->common
.iomsg
;
1988 child_iomsg_len
= dtp
->common
.iomsg_len
;
1992 child_iomsg
= tmp_iomsg
;
1993 child_iomsg_len
= IOMSG_LEN
;
1996 if (check_dtio_proc (dtp
, f
))
1999 /* Call the user defined formatted WRITE procedure. */
2000 dtp
->u
.p
.current_unit
->child_dtio
++;
2002 dtp
->u
.p
.fdtio_ptr (p
, &unit
, iotype
, f
->u
.udf
.vlist
,
2003 child_iostat
, child_iomsg
,
2004 iotype_len
, child_iomsg_len
);
2005 dtp
->u
.p
.current_unit
->child_dtio
--;
2007 if (f
->u
.udf
.string_len
!= 0)
2009 /* Note: vlist is freed in free_format_data. */
2015 if (require_type (dtp
, BT_REAL
, type
, f
))
2017 write_e (dtp
, f
, p
, kind
);
2023 if (require_type (dtp
, BT_REAL
, type
, f
))
2025 write_en (dtp
, f
, p
, kind
);
2031 if (require_type (dtp
, BT_REAL
, type
, f
))
2033 write_es (dtp
, f
, p
, kind
);
2039 if (require_type (dtp
, BT_REAL
, type
, f
))
2041 write_f (dtp
, f
, p
, kind
);
2050 write_i (dtp
, f
, p
, kind
);
2053 write_l (dtp
, f
, p
, kind
);
2057 write_a_char4 (dtp
, f
, p
, size
);
2059 write_a (dtp
, f
, p
, size
);
2062 if (f
->u
.real
.w
== 0)
2063 write_real_g0 (dtp
, p
, kind
, f
->u
.real
.d
);
2065 write_d (dtp
, f
, p
, kind
);
2068 internal_error (&dtp
->common
,
2069 "formatted_transfer(): Bad type");
2074 consume_data_flag
= 0;
2075 write_constant_string (dtp
, f
);
2078 /* Format codes that don't transfer data. */
2081 consume_data_flag
= 0;
2083 dtp
->u
.p
.skips
+= f
->u
.n
;
2084 pos
= bytes_used
+ dtp
->u
.p
.skips
- 1;
2085 dtp
->u
.p
.pending_spaces
= pos
- dtp
->u
.p
.max_pos
+ 1;
2086 /* Writes occur just before the switch on f->format, above, so
2087 that trailing blanks are suppressed, unless we are doing a
2088 non-advancing write in which case we want to output the blanks
2090 if (dtp
->u
.p
.advance_status
== ADVANCE_NO
)
2092 write_x (dtp
, dtp
->u
.p
.skips
, dtp
->u
.p
.pending_spaces
);
2093 dtp
->u
.p
.skips
= dtp
->u
.p
.pending_spaces
= 0;
2099 consume_data_flag
= 0;
2101 if (f
->format
== FMT_TL
)
2104 /* Handle the special case when no bytes have been used yet.
2105 Cannot go below zero. */
2106 if (bytes_used
== 0)
2108 dtp
->u
.p
.pending_spaces
-= f
->u
.n
;
2109 dtp
->u
.p
.skips
-= f
->u
.n
;
2110 dtp
->u
.p
.skips
= dtp
->u
.p
.skips
< 0 ? 0 : dtp
->u
.p
.skips
;
2113 pos
= bytes_used
- f
->u
.n
;
2116 pos
= f
->u
.n
- dtp
->u
.p
.pending_spaces
- 1;
2118 /* Standard 10.6.1.1: excessive left tabbing is reset to the
2119 left tab limit. We do not check if the position has gone
2120 beyond the end of record because a subsequent tab could
2121 bring us back again. */
2122 pos
= pos
< 0 ? 0 : pos
;
2124 dtp
->u
.p
.skips
= dtp
->u
.p
.skips
+ pos
- bytes_used
;
2125 dtp
->u
.p
.pending_spaces
= dtp
->u
.p
.pending_spaces
2126 + pos
- dtp
->u
.p
.max_pos
;
2127 dtp
->u
.p
.pending_spaces
= dtp
->u
.p
.pending_spaces
< 0
2128 ? 0 : dtp
->u
.p
.pending_spaces
;
2132 consume_data_flag
= 0;
2133 dtp
->u
.p
.sign_status
= SIGN_S
;
2137 consume_data_flag
= 0;
2138 dtp
->u
.p
.sign_status
= SIGN_SS
;
2142 consume_data_flag
= 0;
2143 dtp
->u
.p
.sign_status
= SIGN_SP
;
2147 consume_data_flag
= 0 ;
2148 dtp
->u
.p
.blank_status
= BLANK_NULL
;
2152 consume_data_flag
= 0;
2153 dtp
->u
.p
.blank_status
= BLANK_ZERO
;
2157 consume_data_flag
= 0;
2158 dtp
->u
.p
.current_unit
->decimal_status
= DECIMAL_COMMA
;
2162 consume_data_flag
= 0;
2163 dtp
->u
.p
.current_unit
->decimal_status
= DECIMAL_POINT
;
2167 consume_data_flag
= 0;
2168 dtp
->u
.p
.current_unit
->round_status
= ROUND_COMPATIBLE
;
2172 consume_data_flag
= 0;
2173 dtp
->u
.p
.current_unit
->round_status
= ROUND_DOWN
;
2177 consume_data_flag
= 0;
2178 dtp
->u
.p
.current_unit
->round_status
= ROUND_NEAREST
;
2182 consume_data_flag
= 0;
2183 dtp
->u
.p
.current_unit
->round_status
= ROUND_PROCDEFINED
;
2187 consume_data_flag
= 0;
2188 dtp
->u
.p
.current_unit
->round_status
= ROUND_UP
;
2192 consume_data_flag
= 0;
2193 dtp
->u
.p
.current_unit
->round_status
= ROUND_ZERO
;
2197 consume_data_flag
= 0;
2198 dtp
->u
.p
.scale_factor
= f
->u
.k
;
2202 consume_data_flag
= 0;
2203 dtp
->u
.p
.seen_dollar
= 1;
2207 consume_data_flag
= 0;
2208 dtp
->u
.p
.skips
= dtp
->u
.p
.pending_spaces
= 0;
2209 next_record (dtp
, 0);
2213 /* A colon descriptor causes us to exit this loop (in
2214 particular preventing another / descriptor from being
2215 processed) unless there is another data item to be
2217 consume_data_flag
= 0;
2223 internal_error (&dtp
->common
, "Bad format node");
2226 /* Adjust the item count and data pointer. */
2228 if ((consume_data_flag
> 0) && (n
> 0))
2231 p
= ((char *) p
) + size
;
2234 pos
= (int)(dtp
->u
.p
.current_unit
->recl
- dtp
->u
.p
.current_unit
->bytes_left
);
2235 dtp
->u
.p
.max_pos
= (dtp
->u
.p
.max_pos
> pos
) ? dtp
->u
.p
.max_pos
: pos
;
2240 /* Come here when we need a data descriptor but don't have one. We
2241 push the current format node back onto the input, then return and
2242 let the user program call us back with the data. */
2244 unget_format (dtp
, f
);
2247 /* This function is first called from data_init_transfer to initiate the loop
2248 over each item in the format, transferring data as required. Subsequent
2249 calls to this function occur for each data item foound in the READ/WRITE
2250 statement. The item_count is incremented for each call. Since the first
2251 call is from data_transfer_init, the item_count is always one greater than
2252 the actual count number of the item being transferred. */
2255 formatted_transfer (st_parameter_dt
*dtp
, bt type
, void *p
, int kind
,
2256 size_t size
, size_t nelems
)
2262 size_t stride
= type
== BT_CHARACTER
?
2263 size
* GFC_SIZE_OF_CHAR_KIND(kind
) : size
;
2264 if (dtp
->u
.p
.mode
== READING
)
2266 /* Big loop over all the elements. */
2267 for (elem
= 0; elem
< nelems
; elem
++)
2269 dtp
->u
.p
.item_count
++;
2270 formatted_transfer_scalar_read (dtp
, type
, tmp
+ stride
*elem
, kind
, size
);
2275 /* Big loop over all the elements. */
2276 for (elem
= 0; elem
< nelems
; elem
++)
2278 dtp
->u
.p
.item_count
++;
2279 formatted_transfer_scalar_write (dtp
, type
, tmp
+ stride
*elem
, kind
, size
);
2285 /* Data transfer entry points. The type of the data entity is
2286 implicit in the subroutine call. This prevents us from having to
2287 share a common enum with the compiler. */
2290 transfer_integer (st_parameter_dt
*dtp
, void *p
, int kind
)
2292 if ((dtp
->common
.flags
& IOPARM_LIBRETURN_MASK
) != IOPARM_LIBRETURN_OK
)
2294 dtp
->u
.p
.transfer (dtp
, BT_INTEGER
, p
, kind
, kind
, 1);
2298 transfer_integer_write (st_parameter_dt
*dtp
, void *p
, int kind
)
2300 transfer_integer (dtp
, p
, kind
);
2304 transfer_real (st_parameter_dt
*dtp
, void *p
, int kind
)
2307 if ((dtp
->common
.flags
& IOPARM_LIBRETURN_MASK
) != IOPARM_LIBRETURN_OK
)
2309 size
= size_from_real_kind (kind
);
2310 dtp
->u
.p
.transfer (dtp
, BT_REAL
, p
, kind
, size
, 1);
2314 transfer_real_write (st_parameter_dt
*dtp
, void *p
, int kind
)
2316 transfer_real (dtp
, p
, kind
);
2320 transfer_logical (st_parameter_dt
*dtp
, void *p
, int kind
)
2322 if ((dtp
->common
.flags
& IOPARM_LIBRETURN_MASK
) != IOPARM_LIBRETURN_OK
)
2324 dtp
->u
.p
.transfer (dtp
, BT_LOGICAL
, p
, kind
, kind
, 1);
2328 transfer_logical_write (st_parameter_dt
*dtp
, void *p
, int kind
)
2330 transfer_logical (dtp
, p
, kind
);
2334 transfer_character (st_parameter_dt
*dtp
, void *p
, int len
)
2336 static char *empty_string
[0];
2338 if ((dtp
->common
.flags
& IOPARM_LIBRETURN_MASK
) != IOPARM_LIBRETURN_OK
)
2341 /* Strings of zero length can have p == NULL, which confuses the
2342 transfer routines into thinking we need more data elements. To avoid
2343 this, we give them a nice pointer. */
2344 if (len
== 0 && p
== NULL
)
2347 /* Set kind here to 1. */
2348 dtp
->u
.p
.transfer (dtp
, BT_CHARACTER
, p
, 1, len
, 1);
2352 transfer_character_write (st_parameter_dt
*dtp
, void *p
, int len
)
2354 transfer_character (dtp
, p
, len
);
2358 transfer_character_wide (st_parameter_dt
*dtp
, void *p
, int len
, int kind
)
2360 static char *empty_string
[0];
2362 if ((dtp
->common
.flags
& IOPARM_LIBRETURN_MASK
) != IOPARM_LIBRETURN_OK
)
2365 /* Strings of zero length can have p == NULL, which confuses the
2366 transfer routines into thinking we need more data elements. To avoid
2367 this, we give them a nice pointer. */
2368 if (len
== 0 && p
== NULL
)
2371 /* Here we pass the actual kind value. */
2372 dtp
->u
.p
.transfer (dtp
, BT_CHARACTER
, p
, kind
, len
, 1);
2376 transfer_character_wide_write (st_parameter_dt
*dtp
, void *p
, int len
, int kind
)
2378 transfer_character_wide (dtp
, p
, len
, kind
);
2382 transfer_complex (st_parameter_dt
*dtp
, void *p
, int kind
)
2385 if ((dtp
->common
.flags
& IOPARM_LIBRETURN_MASK
) != IOPARM_LIBRETURN_OK
)
2387 size
= size_from_complex_kind (kind
);
2388 dtp
->u
.p
.transfer (dtp
, BT_COMPLEX
, p
, kind
, size
, 1);
2392 transfer_complex_write (st_parameter_dt
*dtp
, void *p
, int kind
)
2394 transfer_complex (dtp
, p
, kind
);
2398 transfer_array (st_parameter_dt
*dtp
, gfc_array_char
*desc
, int kind
,
2399 gfc_charlen_type charlen
)
2401 index_type count
[GFC_MAX_DIMENSIONS
];
2402 index_type extent
[GFC_MAX_DIMENSIONS
];
2403 index_type stride
[GFC_MAX_DIMENSIONS
];
2404 index_type stride0
, rank
, size
, n
;
2409 if ((dtp
->common
.flags
& IOPARM_LIBRETURN_MASK
) != IOPARM_LIBRETURN_OK
)
2412 iotype
= (bt
) GFC_DESCRIPTOR_TYPE (desc
);
2413 size
= iotype
== BT_CHARACTER
? charlen
: GFC_DESCRIPTOR_SIZE (desc
);
2415 rank
= GFC_DESCRIPTOR_RANK (desc
);
2416 for (n
= 0; n
< rank
; n
++)
2419 stride
[n
] = GFC_DESCRIPTOR_STRIDE_BYTES(desc
,n
);
2420 extent
[n
] = GFC_DESCRIPTOR_EXTENT(desc
,n
);
2422 /* If the extent of even one dimension is zero, then the entire
2423 array section contains zero elements, so we return after writing
2424 a zero array record. */
2429 dtp
->u
.p
.transfer (dtp
, iotype
, data
, kind
, size
, tsize
);
2434 stride0
= stride
[0];
2436 /* If the innermost dimension has a stride of 1, we can do the transfer
2437 in contiguous chunks. */
2438 if (stride0
== size
)
2443 data
= GFC_DESCRIPTOR_DATA (desc
);
2447 dtp
->u
.p
.transfer (dtp
, iotype
, data
, kind
, size
, tsize
);
2448 data
+= stride0
* tsize
;
2451 while (count
[n
] == extent
[n
])
2454 data
-= stride
[n
] * extent
[n
];
2471 transfer_array_write (st_parameter_dt
*dtp
, gfc_array_char
*desc
, int kind
,
2472 gfc_charlen_type charlen
)
2474 transfer_array (dtp
, desc
, kind
, charlen
);
2478 /* User defined input/output iomsg. */
2480 #define IOMSG_LEN 256
2483 transfer_derived (st_parameter_dt
*parent
, void *dtio_source
, void *dtio_proc
)
2485 if (parent
->u
.p
.current_unit
)
2487 if (parent
->u
.p
.current_unit
->flags
.form
== FORM_UNFORMATTED
)
2488 parent
->u
.p
.ufdtio_ptr
= (unformatted_dtio
) dtio_proc
;
2490 parent
->u
.p
.fdtio_ptr
= (formatted_dtio
) dtio_proc
;
2492 parent
->u
.p
.transfer (parent
, BT_CLASS
, dtio_source
, 0, 0, 1);
2496 /* Preposition a sequential unformatted file while reading. */
2499 us_read (st_parameter_dt
*dtp
, int continued
)
2506 if (compile_options
.record_marker
== 0)
2507 n
= sizeof (GFC_INTEGER_4
);
2509 n
= compile_options
.record_marker
;
2511 nr
= sread (dtp
->u
.p
.current_unit
->s
, &i
, n
);
2512 if (unlikely (nr
< 0))
2514 generate_error (&dtp
->common
, LIBERROR_BAD_US
, NULL
);
2520 return; /* end of file */
2522 else if (unlikely (n
!= nr
))
2524 generate_error (&dtp
->common
, LIBERROR_BAD_US
, NULL
);
2528 /* Only GFC_CONVERT_NATIVE and GFC_CONVERT_SWAP are valid here. */
2529 if (likely (dtp
->u
.p
.current_unit
->flags
.convert
== GFC_CONVERT_NATIVE
))
2533 case sizeof(GFC_INTEGER_4
):
2534 memcpy (&i4
, &i
, sizeof (i4
));
2538 case sizeof(GFC_INTEGER_8
):
2539 memcpy (&i8
, &i
, sizeof (i8
));
2544 runtime_error ("Illegal value for record marker");
2554 case sizeof(GFC_INTEGER_4
):
2555 memcpy (&u32
, &i
, sizeof (u32
));
2556 u32
= __builtin_bswap32 (u32
);
2557 memcpy (&i4
, &u32
, sizeof (i4
));
2561 case sizeof(GFC_INTEGER_8
):
2562 memcpy (&u64
, &i
, sizeof (u64
));
2563 u64
= __builtin_bswap64 (u64
);
2564 memcpy (&i8
, &u64
, sizeof (i8
));
2569 runtime_error ("Illegal value for record marker");
2576 dtp
->u
.p
.current_unit
->bytes_left_subrecord
= i
;
2577 dtp
->u
.p
.current_unit
->continued
= 0;
2581 dtp
->u
.p
.current_unit
->bytes_left_subrecord
= -i
;
2582 dtp
->u
.p
.current_unit
->continued
= 1;
2586 dtp
->u
.p
.current_unit
->bytes_left
= dtp
->u
.p
.current_unit
->recl
;
2590 /* Preposition a sequential unformatted file while writing. This
2591 amount to writing a bogus length that will be filled in later. */
2594 us_write (st_parameter_dt
*dtp
, int continued
)
2601 if (compile_options
.record_marker
== 0)
2602 nbytes
= sizeof (GFC_INTEGER_4
);
2604 nbytes
= compile_options
.record_marker
;
2606 if (swrite (dtp
->u
.p
.current_unit
->s
, &dummy
, nbytes
) != nbytes
)
2607 generate_error (&dtp
->common
, LIBERROR_OS
, NULL
);
2609 /* For sequential unformatted, if RECL= was not specified in the OPEN
2610 we write until we have more bytes than can fit in the subrecord
2611 markers, then we write a new subrecord. */
2613 dtp
->u
.p
.current_unit
->bytes_left_subrecord
=
2614 dtp
->u
.p
.current_unit
->recl_subrecord
;
2615 dtp
->u
.p
.current_unit
->continued
= continued
;
2619 /* Position to the next record prior to transfer. We are assumed to
2620 be before the next record. We also calculate the bytes in the next
2624 pre_position (st_parameter_dt
*dtp
)
2626 if (dtp
->u
.p
.current_unit
->current_record
)
2627 return; /* Already positioned. */
2629 switch (current_mode (dtp
))
2631 case FORMATTED_STREAM
:
2632 case UNFORMATTED_STREAM
:
2633 /* There are no records with stream I/O. If the position was specified
2634 data_transfer_init has already positioned the file. If no position
2635 was specified, we continue from where we last left off. I.e.
2636 there is nothing to do here. */
2639 case UNFORMATTED_SEQUENTIAL
:
2640 if (dtp
->u
.p
.mode
== READING
)
2647 case FORMATTED_SEQUENTIAL
:
2648 case FORMATTED_DIRECT
:
2649 case UNFORMATTED_DIRECT
:
2650 dtp
->u
.p
.current_unit
->bytes_left
= dtp
->u
.p
.current_unit
->recl
;
2654 dtp
->u
.p
.current_unit
->current_record
= 1;
2658 /* Initialize things for a data transfer. This code is common for
2659 both reading and writing. */
2662 data_transfer_init (st_parameter_dt
*dtp
, int read_flag
)
2664 unit_flags u_flags
; /* Used for creating a unit if needed. */
2665 GFC_INTEGER_4 cf
= dtp
->common
.flags
;
2666 namelist_info
*ionml
;
2668 ionml
= ((cf
& IOPARM_DT_IONML_SET
) != 0) ? dtp
->u
.p
.ionml
: NULL
;
2670 memset (&dtp
->u
.p
, 0, sizeof (dtp
->u
.p
));
2672 dtp
->u
.p
.ionml
= ionml
;
2673 dtp
->u
.p
.mode
= read_flag
? READING
: WRITING
;
2674 dtp
->u
.p
.namelist_mode
= 0;
2675 dtp
->u
.p
.cc
.len
= 0;
2677 if ((dtp
->common
.flags
& IOPARM_LIBRETURN_MASK
) != IOPARM_LIBRETURN_OK
)
2680 dtp
->u
.p
.current_unit
= get_unit (dtp
, 1);
2682 if (dtp
->u
.p
.current_unit
== NULL
)
2684 /* This means we tried to access an external unit < 0 without
2685 having opened it first with NEWUNIT=. */
2686 generate_error (&dtp
->common
, LIBERROR_BAD_OPTION
,
2687 "Unit number is negative and unit was not already "
2688 "opened with OPEN(NEWUNIT=...)");
2691 else if (dtp
->u
.p
.current_unit
->s
== NULL
)
2692 { /* Open the unit with some default flags. */
2693 st_parameter_open opp
;
2696 memset (&u_flags
, '\0', sizeof (u_flags
));
2697 u_flags
.access
= ACCESS_SEQUENTIAL
;
2698 u_flags
.action
= ACTION_READWRITE
;
2700 /* Is it unformatted? */
2701 if (!(cf
& (IOPARM_DT_HAS_FORMAT
| IOPARM_DT_LIST_FORMAT
2702 | IOPARM_DT_IONML_SET
)))
2703 u_flags
.form
= FORM_UNFORMATTED
;
2705 u_flags
.form
= FORM_UNSPECIFIED
;
2707 u_flags
.delim
= DELIM_UNSPECIFIED
;
2708 u_flags
.blank
= BLANK_UNSPECIFIED
;
2709 u_flags
.pad
= PAD_UNSPECIFIED
;
2710 u_flags
.decimal
= DECIMAL_UNSPECIFIED
;
2711 u_flags
.encoding
= ENCODING_UNSPECIFIED
;
2712 u_flags
.async
= ASYNC_UNSPECIFIED
;
2713 u_flags
.round
= ROUND_UNSPECIFIED
;
2714 u_flags
.sign
= SIGN_UNSPECIFIED
;
2715 u_flags
.share
= SHARE_UNSPECIFIED
;
2716 u_flags
.cc
= CC_UNSPECIFIED
;
2717 u_flags
.readonly
= 0;
2719 u_flags
.status
= STATUS_UNKNOWN
;
2721 conv
= get_unformatted_convert (dtp
->common
.unit
);
2723 if (conv
== GFC_CONVERT_NONE
)
2724 conv
= compile_options
.convert
;
2728 case GFC_CONVERT_NATIVE
:
2729 case GFC_CONVERT_SWAP
:
2732 case GFC_CONVERT_BIG
:
2733 conv
= __BYTE_ORDER__
== __ORDER_BIG_ENDIAN__
? GFC_CONVERT_NATIVE
: GFC_CONVERT_SWAP
;
2736 case GFC_CONVERT_LITTLE
:
2737 conv
= __BYTE_ORDER__
== __ORDER_BIG_ENDIAN__
? GFC_CONVERT_SWAP
: GFC_CONVERT_NATIVE
;
2741 internal_error (&opp
.common
, "Illegal value for CONVERT");
2745 u_flags
.convert
= conv
;
2747 opp
.common
= dtp
->common
;
2748 opp
.common
.flags
&= IOPARM_COMMON_MASK
;
2749 dtp
->u
.p
.current_unit
= new_unit (&opp
, dtp
->u
.p
.current_unit
, &u_flags
);
2750 dtp
->common
.flags
&= ~IOPARM_COMMON_MASK
;
2751 dtp
->common
.flags
|= (opp
.common
.flags
& IOPARM_COMMON_MASK
);
2752 if (dtp
->u
.p
.current_unit
== NULL
)
2756 if (dtp
->u
.p
.current_unit
->child_dtio
== 0)
2758 if ((cf
& IOPARM_DT_HAS_SIZE
) != 0)
2760 dtp
->u
.p
.current_unit
->has_size
= true;
2761 /* Initialize the count. */
2762 dtp
->u
.p
.current_unit
->size_used
= 0;
2765 dtp
->u
.p
.current_unit
->has_size
= false;
2767 else if (dtp
->u
.p
.current_unit
->internal_unit_kind
> 0)
2768 dtp
->u
.p
.unit_is_internal
= 1;
2770 /* Check the action. */
2772 if (read_flag
&& dtp
->u
.p
.current_unit
->flags
.action
== ACTION_WRITE
)
2774 generate_error (&dtp
->common
, LIBERROR_BAD_ACTION
,
2775 "Cannot read from file opened for WRITE");
2779 if (!read_flag
&& dtp
->u
.p
.current_unit
->flags
.action
== ACTION_READ
)
2781 generate_error (&dtp
->common
, LIBERROR_BAD_ACTION
,
2782 "Cannot write to file opened for READ");
2786 dtp
->u
.p
.first_item
= 1;
2788 /* Check the format. */
2790 if ((cf
& IOPARM_DT_HAS_FORMAT
) != 0)
2793 if (dtp
->u
.p
.current_unit
->flags
.form
== FORM_UNFORMATTED
2794 && (cf
& (IOPARM_DT_HAS_FORMAT
| IOPARM_DT_LIST_FORMAT
))
2797 generate_error (&dtp
->common
, LIBERROR_OPTION_CONFLICT
,
2798 "Format present for UNFORMATTED data transfer");
2802 if ((cf
& IOPARM_DT_HAS_NAMELIST_NAME
) != 0 && dtp
->u
.p
.ionml
!= NULL
)
2804 if ((cf
& IOPARM_DT_HAS_FORMAT
) != 0)
2806 generate_error (&dtp
->common
, LIBERROR_OPTION_CONFLICT
,
2807 "A format cannot be specified with a namelist");
2811 else if (dtp
->u
.p
.current_unit
->flags
.form
== FORM_FORMATTED
&&
2812 !(cf
& (IOPARM_DT_HAS_FORMAT
| IOPARM_DT_LIST_FORMAT
)))
2814 generate_error (&dtp
->common
, LIBERROR_OPTION_CONFLICT
,
2815 "Missing format for FORMATTED data transfer");
2819 if (is_internal_unit (dtp
)
2820 && dtp
->u
.p
.current_unit
->flags
.form
== FORM_UNFORMATTED
)
2822 generate_error (&dtp
->common
, LIBERROR_OPTION_CONFLICT
,
2823 "Internal file cannot be accessed by UNFORMATTED "
2828 /* Check the record or position number. */
2830 if (dtp
->u
.p
.current_unit
->flags
.access
== ACCESS_DIRECT
2831 && (cf
& IOPARM_DT_HAS_REC
) == 0)
2833 generate_error (&dtp
->common
, LIBERROR_MISSING_OPTION
,
2834 "Direct access data transfer requires record number");
2838 if (dtp
->u
.p
.current_unit
->flags
.access
== ACCESS_SEQUENTIAL
)
2840 if ((cf
& IOPARM_DT_HAS_REC
) != 0)
2842 generate_error (&dtp
->common
, LIBERROR_OPTION_CONFLICT
,
2843 "Record number not allowed for sequential access "
2848 if (compile_options
.warn_std
&&
2849 dtp
->u
.p
.current_unit
->endfile
== AFTER_ENDFILE
)
2851 generate_error (&dtp
->common
, LIBERROR_OPTION_CONFLICT
,
2852 "Sequential READ or WRITE not allowed after "
2853 "EOF marker, possibly use REWIND or BACKSPACE");
2858 /* Process the ADVANCE option. */
2860 dtp
->u
.p
.advance_status
2861 = !(cf
& IOPARM_DT_HAS_ADVANCE
) ? ADVANCE_UNSPECIFIED
:
2862 find_option (&dtp
->common
, dtp
->advance
, dtp
->advance_len
, advance_opt
,
2863 "Bad ADVANCE parameter in data transfer statement");
2865 if (dtp
->u
.p
.advance_status
!= ADVANCE_UNSPECIFIED
)
2867 if (dtp
->u
.p
.current_unit
->flags
.access
== ACCESS_DIRECT
)
2869 generate_error (&dtp
->common
, LIBERROR_OPTION_CONFLICT
,
2870 "ADVANCE specification conflicts with sequential "
2875 if (is_internal_unit (dtp
))
2877 generate_error (&dtp
->common
, LIBERROR_OPTION_CONFLICT
,
2878 "ADVANCE specification conflicts with internal file");
2882 if ((cf
& (IOPARM_DT_HAS_FORMAT
| IOPARM_DT_LIST_FORMAT
))
2883 != IOPARM_DT_HAS_FORMAT
)
2885 generate_error (&dtp
->common
, LIBERROR_OPTION_CONFLICT
,
2886 "ADVANCE specification requires an explicit format");
2891 /* Child IO is non-advancing and any ADVANCE= specifier is ignored.
2893 if (dtp
->u
.p
.current_unit
->child_dtio
> 0)
2894 dtp
->u
.p
.advance_status
= ADVANCE_NO
;
2898 dtp
->u
.p
.current_unit
->previous_nonadvancing_write
= 0;
2900 if ((cf
& IOPARM_EOR
) != 0 && dtp
->u
.p
.advance_status
!= ADVANCE_NO
)
2902 generate_error (&dtp
->common
, LIBERROR_MISSING_OPTION
,
2903 "EOR specification requires an ADVANCE specification "
2908 if ((cf
& IOPARM_DT_HAS_SIZE
) != 0
2909 && dtp
->u
.p
.advance_status
!= ADVANCE_NO
)
2911 generate_error (&dtp
->common
, LIBERROR_MISSING_OPTION
,
2912 "SIZE specification requires an ADVANCE "
2913 "specification of NO");
2918 { /* Write constraints. */
2919 if ((cf
& IOPARM_END
) != 0)
2921 generate_error (&dtp
->common
, LIBERROR_OPTION_CONFLICT
,
2922 "END specification cannot appear in a write "
2927 if ((cf
& IOPARM_EOR
) != 0)
2929 generate_error (&dtp
->common
, LIBERROR_OPTION_CONFLICT
,
2930 "EOR specification cannot appear in a write "
2935 if ((cf
& IOPARM_DT_HAS_SIZE
) != 0)
2937 generate_error (&dtp
->common
, LIBERROR_OPTION_CONFLICT
,
2938 "SIZE specification cannot appear in a write "
2944 if (dtp
->u
.p
.advance_status
== ADVANCE_UNSPECIFIED
)
2945 dtp
->u
.p
.advance_status
= ADVANCE_YES
;
2947 /* Check the decimal mode. */
2948 dtp
->u
.p
.current_unit
->decimal_status
2949 = !(cf
& IOPARM_DT_HAS_DECIMAL
) ? DECIMAL_UNSPECIFIED
:
2950 find_option (&dtp
->common
, dtp
->decimal
, dtp
->decimal_len
,
2951 decimal_opt
, "Bad DECIMAL parameter in data transfer "
2954 if (dtp
->u
.p
.current_unit
->decimal_status
== DECIMAL_UNSPECIFIED
)
2955 dtp
->u
.p
.current_unit
->decimal_status
= dtp
->u
.p
.current_unit
->flags
.decimal
;
2957 /* Check the round mode. */
2958 dtp
->u
.p
.current_unit
->round_status
2959 = !(cf
& IOPARM_DT_HAS_ROUND
) ? ROUND_UNSPECIFIED
:
2960 find_option (&dtp
->common
, dtp
->round
, dtp
->round_len
,
2961 round_opt
, "Bad ROUND parameter in data transfer "
2964 if (dtp
->u
.p
.current_unit
->round_status
== ROUND_UNSPECIFIED
)
2965 dtp
->u
.p
.current_unit
->round_status
= dtp
->u
.p
.current_unit
->flags
.round
;
2967 /* Check the sign mode. */
2968 dtp
->u
.p
.sign_status
2969 = !(cf
& IOPARM_DT_HAS_SIGN
) ? SIGN_UNSPECIFIED
:
2970 find_option (&dtp
->common
, dtp
->sign
, dtp
->sign_len
, sign_opt
,
2971 "Bad SIGN parameter in data transfer statement");
2973 if (dtp
->u
.p
.sign_status
== SIGN_UNSPECIFIED
)
2974 dtp
->u
.p
.sign_status
= dtp
->u
.p
.current_unit
->flags
.sign
;
2976 /* Check the blank mode. */
2977 dtp
->u
.p
.blank_status
2978 = !(cf
& IOPARM_DT_HAS_BLANK
) ? BLANK_UNSPECIFIED
:
2979 find_option (&dtp
->common
, dtp
->blank
, dtp
->blank_len
,
2981 "Bad BLANK parameter in data transfer statement");
2983 if (dtp
->u
.p
.blank_status
== BLANK_UNSPECIFIED
)
2984 dtp
->u
.p
.blank_status
= dtp
->u
.p
.current_unit
->flags
.blank
;
2986 /* Check the delim mode. */
2987 dtp
->u
.p
.current_unit
->delim_status
2988 = !(cf
& IOPARM_DT_HAS_DELIM
) ? DELIM_UNSPECIFIED
:
2989 find_option (&dtp
->common
, dtp
->delim
, dtp
->delim_len
,
2990 delim_opt
, "Bad DELIM parameter in data transfer statement");
2992 if (dtp
->u
.p
.current_unit
->delim_status
== DELIM_UNSPECIFIED
)
2994 if (ionml
&& dtp
->u
.p
.current_unit
->flags
.delim
== DELIM_UNSPECIFIED
)
2995 dtp
->u
.p
.current_unit
->delim_status
= DELIM_QUOTE
;
2997 dtp
->u
.p
.current_unit
->delim_status
= dtp
->u
.p
.current_unit
->flags
.delim
;
3000 /* Check the pad mode. */
3001 dtp
->u
.p
.current_unit
->pad_status
3002 = !(cf
& IOPARM_DT_HAS_PAD
) ? PAD_UNSPECIFIED
:
3003 find_option (&dtp
->common
, dtp
->pad
, dtp
->pad_len
, pad_opt
,
3004 "Bad PAD parameter in data transfer statement");
3006 if (dtp
->u
.p
.current_unit
->pad_status
== PAD_UNSPECIFIED
)
3007 dtp
->u
.p
.current_unit
->pad_status
= dtp
->u
.p
.current_unit
->flags
.pad
;
3009 /* Check to see if we might be reading what we wrote before */
3011 if (dtp
->u
.p
.mode
!= dtp
->u
.p
.current_unit
->mode
3012 && !is_internal_unit (dtp
))
3014 int pos
= fbuf_reset (dtp
->u
.p
.current_unit
);
3016 sseek (dtp
->u
.p
.current_unit
->s
, pos
, SEEK_CUR
);
3017 sflush(dtp
->u
.p
.current_unit
->s
);
3020 /* Check the POS= specifier: that it is in range and that it is used with a
3021 unit that has been connected for STREAM access. F2003 9.5.1.10. */
3023 if (((cf
& IOPARM_DT_HAS_POS
) != 0))
3025 if (is_stream_io (dtp
))
3030 generate_error (&dtp
->common
, LIBERROR_BAD_OPTION
,
3031 "POS=specifier must be positive");
3035 if (dtp
->pos
>= dtp
->u
.p
.current_unit
->maxrec
)
3037 generate_error (&dtp
->common
, LIBERROR_BAD_OPTION
,
3038 "POS=specifier too large");
3042 dtp
->rec
= dtp
->pos
;
3044 if (dtp
->u
.p
.mode
== READING
)
3046 /* Reset the endfile flag; if we hit EOF during reading
3047 we'll set the flag and generate an error at that point
3048 rather than worrying about it here. */
3049 dtp
->u
.p
.current_unit
->endfile
= NO_ENDFILE
;
3052 if (dtp
->pos
!= dtp
->u
.p
.current_unit
->strm_pos
)
3054 fbuf_flush (dtp
->u
.p
.current_unit
, dtp
->u
.p
.mode
);
3055 if (sseek (dtp
->u
.p
.current_unit
->s
, dtp
->pos
- 1, SEEK_SET
) < 0)
3057 generate_error (&dtp
->common
, LIBERROR_OS
, NULL
);
3060 dtp
->u
.p
.current_unit
->strm_pos
= dtp
->pos
;
3065 generate_error (&dtp
->common
, LIBERROR_BAD_OPTION
,
3066 "POS=specifier not allowed, "
3067 "Try OPEN with ACCESS='stream'");
3073 /* Sanity checks on the record number. */
3074 if ((cf
& IOPARM_DT_HAS_REC
) != 0)
3078 generate_error (&dtp
->common
, LIBERROR_BAD_OPTION
,
3079 "Record number must be positive");
3083 if (dtp
->rec
>= dtp
->u
.p
.current_unit
->maxrec
)
3085 generate_error (&dtp
->common
, LIBERROR_BAD_OPTION
,
3086 "Record number too large");
3090 /* Make sure format buffer is reset. */
3091 if (dtp
->u
.p
.current_unit
->flags
.form
== FORM_FORMATTED
)
3092 fbuf_reset (dtp
->u
.p
.current_unit
);
3095 /* Check whether the record exists to be read. Only
3096 a partial record needs to exist. */
3098 if (dtp
->u
.p
.mode
== READING
&& (dtp
->rec
- 1)
3099 * dtp
->u
.p
.current_unit
->recl
>= ssize (dtp
->u
.p
.current_unit
->s
))
3101 generate_error (&dtp
->common
, LIBERROR_BAD_OPTION
,
3102 "Non-existing record number");
3106 /* Position the file. */
3107 if (sseek (dtp
->u
.p
.current_unit
->s
, (gfc_offset
) (dtp
->rec
- 1)
3108 * dtp
->u
.p
.current_unit
->recl
, SEEK_SET
) < 0)
3110 generate_error (&dtp
->common
, LIBERROR_OS
, NULL
);
3114 if (dtp
->u
.p
.current_unit
->flags
.access
== ACCESS_STREAM
)
3116 generate_error (&dtp
->common
, LIBERROR_OPTION_CONFLICT
,
3117 "Record number not allowed for stream access "
3123 /* Bugware for badly written mixed C-Fortran I/O. */
3124 if (!is_internal_unit (dtp
))
3125 flush_if_preconnected(dtp
->u
.p
.current_unit
->s
);
3127 dtp
->u
.p
.current_unit
->mode
= dtp
->u
.p
.mode
;
3129 /* Set the maximum position reached from the previous I/O operation. This
3130 could be greater than zero from a previous non-advancing write. */
3131 dtp
->u
.p
.max_pos
= dtp
->u
.p
.current_unit
->saved_pos
;
3136 /* Set up the subroutine that will handle the transfers. */
3140 if (dtp
->u
.p
.current_unit
->flags
.form
== FORM_UNFORMATTED
)
3141 dtp
->u
.p
.transfer
= unformatted_read
;
3144 if ((cf
& IOPARM_DT_LIST_FORMAT
) != 0)
3146 if (dtp
->u
.p
.current_unit
->child_dtio
== 0)
3147 dtp
->u
.p
.current_unit
->last_char
= EOF
- 1;
3148 dtp
->u
.p
.transfer
= list_formatted_read
;
3151 dtp
->u
.p
.transfer
= formatted_transfer
;
3156 if (dtp
->u
.p
.current_unit
->flags
.form
== FORM_UNFORMATTED
)
3157 dtp
->u
.p
.transfer
= unformatted_write
;
3160 if ((cf
& IOPARM_DT_LIST_FORMAT
) != 0)
3161 dtp
->u
.p
.transfer
= list_formatted_write
;
3163 dtp
->u
.p
.transfer
= formatted_transfer
;
3167 /* Make sure that we don't do a read after a nonadvancing write. */
3171 if (dtp
->u
.p
.current_unit
->read_bad
&& !is_stream_io (dtp
))
3173 generate_error (&dtp
->common
, LIBERROR_BAD_OPTION
,
3174 "Cannot READ after a nonadvancing WRITE");
3180 if (dtp
->u
.p
.advance_status
== ADVANCE_YES
&& !dtp
->u
.p
.seen_dollar
)
3181 dtp
->u
.p
.current_unit
->read_bad
= 1;
3184 if (dtp
->u
.p
.current_unit
->flags
.form
== FORM_FORMATTED
)
3186 #ifdef HAVE_USELOCALE
3187 dtp
->u
.p
.old_locale
= uselocale (c_locale
);
3189 __gthread_mutex_lock (&old_locale_lock
);
3190 if (!old_locale_ctr
++)
3192 old_locale
= setlocale (LC_NUMERIC
, NULL
);
3193 setlocale (LC_NUMERIC
, "C");
3195 __gthread_mutex_unlock (&old_locale_lock
);
3197 /* Start the data transfer if we are doing a formatted transfer. */
3198 if ((cf
& (IOPARM_DT_LIST_FORMAT
| IOPARM_DT_HAS_NAMELIST_NAME
)) == 0
3199 && dtp
->u
.p
.ionml
== NULL
)
3200 formatted_transfer (dtp
, 0, NULL
, 0, 0, 1);
3205 /* Initialize an array_loop_spec given the array descriptor. The function
3206 returns the index of the last element of the array, and also returns
3207 starting record, where the first I/O goes to (necessary in case of
3208 negative strides). */
3211 init_loop_spec (gfc_array_char
*desc
, array_loop_spec
*ls
,
3212 gfc_offset
*start_record
)
3214 int rank
= GFC_DESCRIPTOR_RANK(desc
);
3223 for (i
=0; i
<rank
; i
++)
3225 ls
[i
].idx
= GFC_DESCRIPTOR_LBOUND(desc
,i
);
3226 ls
[i
].start
= GFC_DESCRIPTOR_LBOUND(desc
,i
);
3227 ls
[i
].end
= GFC_DESCRIPTOR_UBOUND(desc
,i
);
3228 ls
[i
].step
= GFC_DESCRIPTOR_STRIDE(desc
,i
);
3229 empty
= empty
|| (GFC_DESCRIPTOR_UBOUND(desc
,i
)
3230 < GFC_DESCRIPTOR_LBOUND(desc
,i
));
3232 if (GFC_DESCRIPTOR_STRIDE(desc
,i
) > 0)
3234 index
+= (GFC_DESCRIPTOR_EXTENT(desc
,i
) - 1)
3235 * GFC_DESCRIPTOR_STRIDE(desc
,i
);
3239 index
-= (GFC_DESCRIPTOR_EXTENT(desc
,i
) - 1)
3240 * GFC_DESCRIPTOR_STRIDE(desc
,i
);
3241 *start_record
-= (GFC_DESCRIPTOR_EXTENT(desc
,i
) - 1)
3242 * GFC_DESCRIPTOR_STRIDE(desc
,i
);
3252 /* Determine the index to the next record in an internal unit array by
3253 by incrementing through the array_loop_spec. */
3256 next_array_record (st_parameter_dt
*dtp
, array_loop_spec
*ls
, int *finished
)
3264 for (i
= 0; i
< dtp
->u
.p
.current_unit
->rank
; i
++)
3269 if (ls
[i
].idx
> ls
[i
].end
)
3271 ls
[i
].idx
= ls
[i
].start
;
3277 index
= index
+ (ls
[i
].idx
- ls
[i
].start
) * ls
[i
].step
;
3287 /* Skip to the end of the current record, taking care of an optional
3288 record marker of size bytes. If the file is not seekable, we
3289 read chunks of size MAX_READ until we get to the right
3293 skip_record (st_parameter_dt
*dtp
, gfc_offset bytes
)
3295 ssize_t rlength
, readb
;
3296 #define MAX_READ 4096
3299 dtp
->u
.p
.current_unit
->bytes_left_subrecord
+= bytes
;
3300 if (dtp
->u
.p
.current_unit
->bytes_left_subrecord
== 0)
3303 /* Direct access files do not generate END conditions,
3305 if (sseek (dtp
->u
.p
.current_unit
->s
,
3306 dtp
->u
.p
.current_unit
->bytes_left_subrecord
, SEEK_CUR
) < 0)
3308 /* Seeking failed, fall back to seeking by reading data. */
3309 while (dtp
->u
.p
.current_unit
->bytes_left_subrecord
> 0)
3312 (MAX_READ
< dtp
->u
.p
.current_unit
->bytes_left_subrecord
) ?
3313 MAX_READ
: dtp
->u
.p
.current_unit
->bytes_left_subrecord
;
3315 readb
= sread (dtp
->u
.p
.current_unit
->s
, p
, rlength
);
3318 generate_error (&dtp
->common
, LIBERROR_OS
, NULL
);
3322 dtp
->u
.p
.current_unit
->bytes_left_subrecord
-= readb
;
3326 dtp
->u
.p
.current_unit
->bytes_left_subrecord
= 0;
3330 /* Advance to the next record reading unformatted files, taking
3331 care of subrecords. If complete_record is nonzero, we loop
3332 until all subrecords are cleared. */
3335 next_record_r_unf (st_parameter_dt
*dtp
, int complete_record
)
3339 bytes
= compile_options
.record_marker
== 0 ?
3340 sizeof (GFC_INTEGER_4
) : compile_options
.record_marker
;
3345 /* Skip over tail */
3347 skip_record (dtp
, bytes
);
3349 if ( ! (complete_record
&& dtp
->u
.p
.current_unit
->continued
))
3358 min_off (gfc_offset a
, gfc_offset b
)
3360 return (a
< b
? a
: b
);
3364 /* Space to the next record for read mode. */
3367 next_record_r (st_parameter_dt
*dtp
, int done
)
3373 switch (current_mode (dtp
))
3375 /* No records in unformatted STREAM I/O. */
3376 case UNFORMATTED_STREAM
:
3379 case UNFORMATTED_SEQUENTIAL
:
3380 next_record_r_unf (dtp
, 1);
3381 dtp
->u
.p
.current_unit
->bytes_left
= dtp
->u
.p
.current_unit
->recl
;
3384 case FORMATTED_DIRECT
:
3385 case UNFORMATTED_DIRECT
:
3386 skip_record (dtp
, dtp
->u
.p
.current_unit
->bytes_left
);
3389 case FORMATTED_STREAM
:
3390 case FORMATTED_SEQUENTIAL
:
3391 /* read_sf has already terminated input because of an '\n', or
3393 if (dtp
->u
.p
.sf_seen_eor
)
3395 dtp
->u
.p
.sf_seen_eor
= 0;
3399 if (is_internal_unit (dtp
))
3401 if (is_array_io (dtp
))
3405 record
= next_array_record (dtp
, dtp
->u
.p
.current_unit
->ls
,
3407 if (!done
&& finished
)
3410 /* Now seek to this record. */
3411 record
= record
* dtp
->u
.p
.current_unit
->recl
;
3412 if (sseek (dtp
->u
.p
.current_unit
->s
, record
, SEEK_SET
) < 0)
3414 generate_error (&dtp
->common
, LIBERROR_INTERNAL_UNIT
, NULL
);
3417 dtp
->u
.p
.current_unit
->bytes_left
= dtp
->u
.p
.current_unit
->recl
;
3421 gfc_offset bytes_left
= dtp
->u
.p
.current_unit
->bytes_left
;
3422 bytes_left
= min_off (bytes_left
,
3423 ssize (dtp
->u
.p
.current_unit
->s
)
3424 - stell (dtp
->u
.p
.current_unit
->s
));
3425 if (sseek (dtp
->u
.p
.current_unit
->s
,
3426 bytes_left
, SEEK_CUR
) < 0)
3428 generate_error (&dtp
->common
, LIBERROR_INTERNAL_UNIT
, NULL
);
3431 dtp
->u
.p
.current_unit
->bytes_left
3432 = dtp
->u
.p
.current_unit
->recl
;
3436 else if (dtp
->u
.p
.current_unit
->flags
.cc
!= CC_NONE
)
3441 cc
= fbuf_getc (dtp
->u
.p
.current_unit
);
3445 generate_error (&dtp
->common
, LIBERROR_OS
, NULL
);
3448 if (is_stream_io (dtp
)
3449 || dtp
->u
.p
.current_unit
->pad_status
== PAD_NO
3450 || dtp
->u
.p
.current_unit
->bytes_left
3451 == dtp
->u
.p
.current_unit
->recl
)
3457 if (is_stream_io (dtp
))
3458 dtp
->u
.p
.current_unit
->strm_pos
++;
3469 /* Small utility function to write a record marker, taking care of
3470 byte swapping and of choosing the correct size. */
3473 write_us_marker (st_parameter_dt
*dtp
, const gfc_offset buf
)
3479 if (compile_options
.record_marker
== 0)
3480 len
= sizeof (GFC_INTEGER_4
);
3482 len
= compile_options
.record_marker
;
3484 /* Only GFC_CONVERT_NATIVE and GFC_CONVERT_SWAP are valid here. */
3485 if (likely (dtp
->u
.p
.current_unit
->flags
.convert
== GFC_CONVERT_NATIVE
))
3489 case sizeof (GFC_INTEGER_4
):
3491 return swrite (dtp
->u
.p
.current_unit
->s
, &buf4
, len
);
3494 case sizeof (GFC_INTEGER_8
):
3496 return swrite (dtp
->u
.p
.current_unit
->s
, &buf8
, len
);
3500 runtime_error ("Illegal value for record marker");
3510 case sizeof (GFC_INTEGER_4
):
3512 memcpy (&u32
, &buf4
, sizeof (u32
));
3513 u32
= __builtin_bswap32 (u32
);
3514 return swrite (dtp
->u
.p
.current_unit
->s
, &u32
, len
);
3517 case sizeof (GFC_INTEGER_8
):
3519 memcpy (&u64
, &buf8
, sizeof (u64
));
3520 u64
= __builtin_bswap64 (u64
);
3521 return swrite (dtp
->u
.p
.current_unit
->s
, &u64
, len
);
3525 runtime_error ("Illegal value for record marker");
3532 /* Position to the next (sub)record in write mode for
3533 unformatted sequential files. */
3536 next_record_w_unf (st_parameter_dt
*dtp
, int next_subrecord
)
3538 gfc_offset m
, m_write
, record_marker
;
3540 /* Bytes written. */
3541 m
= dtp
->u
.p
.current_unit
->recl_subrecord
3542 - dtp
->u
.p
.current_unit
->bytes_left_subrecord
;
3544 if (compile_options
.record_marker
== 0)
3545 record_marker
= sizeof (GFC_INTEGER_4
);
3547 record_marker
= compile_options
.record_marker
;
3549 /* Seek to the head and overwrite the bogus length with the real
3552 if (unlikely (sseek (dtp
->u
.p
.current_unit
->s
, - m
- record_marker
,
3561 if (unlikely (write_us_marker (dtp
, m_write
) < 0))
3564 /* Seek past the end of the current record. */
3566 if (unlikely (sseek (dtp
->u
.p
.current_unit
->s
, m
, SEEK_CUR
) < 0))
3569 /* Write the length tail. If we finish a record containing
3570 subrecords, we write out the negative length. */
3572 if (dtp
->u
.p
.current_unit
->continued
)
3577 if (unlikely (write_us_marker (dtp
, m_write
) < 0))
3583 generate_error (&dtp
->common
, LIBERROR_OS
, NULL
);
3589 /* Utility function like memset() but operating on streams. Return
3590 value is same as for POSIX write(). */
3593 sset (stream
*s
, int c
, gfc_offset nbyte
)
3595 #define WRITE_CHUNK 256
3596 char p
[WRITE_CHUNK
];
3597 gfc_offset bytes_left
;
3600 if (nbyte
< WRITE_CHUNK
)
3601 memset (p
, c
, nbyte
);
3603 memset (p
, c
, WRITE_CHUNK
);
3606 while (bytes_left
> 0)
3608 trans
= (bytes_left
< WRITE_CHUNK
) ? bytes_left
: WRITE_CHUNK
;
3609 trans
= swrite (s
, p
, trans
);
3612 bytes_left
-= trans
;
3615 return nbyte
- bytes_left
;
3619 /* Finish up a record according to the legacy carriagecontrol type, based
3620 on the first character in the record. */
3623 next_record_cc (st_parameter_dt
*dtp
)
3625 /* Only valid with CARRIAGECONTROL=FORTRAN. */
3626 if (dtp
->u
.p
.current_unit
->flags
.cc
!= CC_FORTRAN
)
3629 fbuf_seek (dtp
->u
.p
.current_unit
, 0, SEEK_END
);
3630 if (dtp
->u
.p
.cc
.len
> 0)
3632 char *p
= fbuf_alloc (dtp
->u
.p
.current_unit
, dtp
->u
.p
.cc
.len
);
3634 generate_error (&dtp
->common
, LIBERROR_OS
, NULL
);
3636 /* Output CR for the first character with default CC setting. */
3637 *(p
++) = dtp
->u
.p
.cc
.u
.end
;
3638 if (dtp
->u
.p
.cc
.len
> 1)
3639 *p
= dtp
->u
.p
.cc
.u
.end
;
3643 /* Position to the next record in write mode. */
3646 next_record_w (st_parameter_dt
*dtp
, int done
)
3648 gfc_offset max_pos_off
;
3650 /* Zero counters for X- and T-editing. */
3651 max_pos_off
= dtp
->u
.p
.max_pos
;
3652 dtp
->u
.p
.max_pos
= dtp
->u
.p
.skips
= dtp
->u
.p
.pending_spaces
= 0;
3654 switch (current_mode (dtp
))
3656 /* No records in unformatted STREAM I/O. */
3657 case UNFORMATTED_STREAM
:
3660 case FORMATTED_DIRECT
:
3661 if (dtp
->u
.p
.current_unit
->bytes_left
== 0)
3664 fbuf_seek (dtp
->u
.p
.current_unit
, 0, SEEK_END
);
3665 fbuf_flush (dtp
->u
.p
.current_unit
, WRITING
);
3666 if (sset (dtp
->u
.p
.current_unit
->s
, ' ',
3667 dtp
->u
.p
.current_unit
->bytes_left
)
3668 != dtp
->u
.p
.current_unit
->bytes_left
)
3673 case UNFORMATTED_DIRECT
:
3674 if (dtp
->u
.p
.current_unit
->bytes_left
> 0)
3676 gfc_offset length
= dtp
->u
.p
.current_unit
->bytes_left
;
3677 if (sset (dtp
->u
.p
.current_unit
->s
, 0, length
) != length
)
3682 case UNFORMATTED_SEQUENTIAL
:
3683 next_record_w_unf (dtp
, 0);
3684 dtp
->u
.p
.current_unit
->bytes_left
= dtp
->u
.p
.current_unit
->recl
;
3687 case FORMATTED_STREAM
:
3688 case FORMATTED_SEQUENTIAL
:
3690 if (is_internal_unit (dtp
))
3693 /* Internal unit, so must fit in memory. */
3694 ptrdiff_t length
, m
, record
;
3695 ptrdiff_t max_pos
= max_pos_off
;
3696 if (is_array_io (dtp
))
3700 length
= dtp
->u
.p
.current_unit
->bytes_left
;
3702 /* If the farthest position reached is greater than current
3703 position, adjust the position and set length to pad out
3704 whats left. Otherwise just pad whats left.
3705 (for character array unit) */
3706 m
= dtp
->u
.p
.current_unit
->recl
3707 - dtp
->u
.p
.current_unit
->bytes_left
;
3710 length
= (max_pos
- m
);
3711 if (sseek (dtp
->u
.p
.current_unit
->s
,
3712 length
, SEEK_CUR
) < 0)
3714 generate_error (&dtp
->common
, LIBERROR_INTERNAL_UNIT
, NULL
);
3717 length
= ((ptrdiff_t) dtp
->u
.p
.current_unit
->recl
- max_pos
);
3720 p
= write_block (dtp
, length
);
3724 if (unlikely (is_char4_unit (dtp
)))
3726 gfc_char4_t
*p4
= (gfc_char4_t
*) p
;
3727 memset4 (p4
, ' ', length
);
3730 memset (p
, ' ', length
);
3732 /* Now that the current record has been padded out,
3733 determine where the next record in the array is. */
3734 record
= next_array_record (dtp
, dtp
->u
.p
.current_unit
->ls
,
3737 dtp
->u
.p
.current_unit
->endfile
= AT_ENDFILE
;
3739 /* Now seek to this record */
3740 record
= record
* ((ptrdiff_t) dtp
->u
.p
.current_unit
->recl
);
3742 if (sseek (dtp
->u
.p
.current_unit
->s
, record
, SEEK_SET
) < 0)
3744 generate_error (&dtp
->common
, LIBERROR_INTERNAL_UNIT
, NULL
);
3748 dtp
->u
.p
.current_unit
->bytes_left
= dtp
->u
.p
.current_unit
->recl
;
3754 /* If this is the last call to next_record move to the farthest
3755 position reached and set length to pad out the remainder
3756 of the record. (for character scaler unit) */
3759 m
= dtp
->u
.p
.current_unit
->recl
3760 - dtp
->u
.p
.current_unit
->bytes_left
;
3763 length
= max_pos
- m
;
3764 if (sseek (dtp
->u
.p
.current_unit
->s
,
3765 length
, SEEK_CUR
) < 0)
3767 generate_error (&dtp
->common
, LIBERROR_INTERNAL_UNIT
, NULL
);
3770 length
= (ptrdiff_t) dtp
->u
.p
.current_unit
->recl
3774 length
= dtp
->u
.p
.current_unit
->bytes_left
;
3778 p
= write_block (dtp
, length
);
3782 if (unlikely (is_char4_unit (dtp
)))
3784 gfc_char4_t
*p4
= (gfc_char4_t
*) p
;
3785 memset4 (p4
, (gfc_char4_t
) ' ', length
);
3788 memset (p
, ' ', length
);
3792 /* Handle legacy CARRIAGECONTROL line endings. */
3793 else if (dtp
->u
.p
.current_unit
->flags
.cc
== CC_FORTRAN
)
3794 next_record_cc (dtp
);
3797 /* Skip newlines for CC=CC_NONE. */
3798 const int len
= (dtp
->u
.p
.current_unit
->flags
.cc
== CC_NONE
)
3805 fbuf_seek (dtp
->u
.p
.current_unit
, 0, SEEK_END
);
3806 if (dtp
->u
.p
.current_unit
->flags
.cc
!= CC_NONE
)
3808 char *p
= fbuf_alloc (dtp
->u
.p
.current_unit
, len
);
3816 if (is_stream_io (dtp
))
3818 dtp
->u
.p
.current_unit
->strm_pos
+= len
;
3819 if (dtp
->u
.p
.current_unit
->strm_pos
3820 < ssize (dtp
->u
.p
.current_unit
->s
))
3821 unit_truncate (dtp
->u
.p
.current_unit
,
3822 dtp
->u
.p
.current_unit
->strm_pos
- 1,
3830 generate_error (&dtp
->common
, LIBERROR_OS
, NULL
);
3835 /* Position to the next record, which means moving to the end of the
3836 current record. This can happen under several different
3837 conditions. If the done flag is not set, we get ready to process
3841 next_record (st_parameter_dt
*dtp
, int done
)
3843 gfc_offset fp
; /* File position. */
3845 dtp
->u
.p
.current_unit
->read_bad
= 0;
3847 if (dtp
->u
.p
.mode
== READING
)
3848 next_record_r (dtp
, done
);
3850 next_record_w (dtp
, done
);
3852 fbuf_flush (dtp
->u
.p
.current_unit
, dtp
->u
.p
.mode
);
3854 if (!is_stream_io (dtp
))
3856 /* Since we have changed the position, set it to unspecified so
3857 that INQUIRE(POSITION=) knows it needs to look into it. */
3859 dtp
->u
.p
.current_unit
->flags
.position
= POSITION_UNSPECIFIED
;
3861 dtp
->u
.p
.current_unit
->current_record
= 0;
3862 if (dtp
->u
.p
.current_unit
->flags
.access
== ACCESS_DIRECT
)
3864 fp
= stell (dtp
->u
.p
.current_unit
->s
);
3865 /* Calculate next record, rounding up partial records. */
3866 dtp
->u
.p
.current_unit
->last_record
=
3867 (fp
+ dtp
->u
.p
.current_unit
->recl
) /
3868 dtp
->u
.p
.current_unit
->recl
- 1;
3871 dtp
->u
.p
.current_unit
->last_record
++;
3877 smarkeor (dtp
->u
.p
.current_unit
->s
);
3881 /* Finalize the current data transfer. For a nonadvancing transfer,
3882 this means advancing to the next record. For internal units close the
3883 stream associated with the unit. */
3886 finalize_transfer (st_parameter_dt
*dtp
)
3888 GFC_INTEGER_4 cf
= dtp
->common
.flags
;
3890 if ((dtp
->u
.p
.ionml
!= NULL
)
3891 && (cf
& IOPARM_DT_HAS_NAMELIST_NAME
) != 0)
3893 dtp
->u
.p
.namelist_mode
= 1;
3894 if ((cf
& IOPARM_DT_NAMELIST_READ_MODE
) != 0)
3895 namelist_read (dtp
);
3897 namelist_write (dtp
);
3900 if ((dtp
->common
.flags
& IOPARM_DT_HAS_SIZE
) != 0)
3901 *dtp
->size
= dtp
->u
.p
.current_unit
->size_used
;
3903 if (dtp
->u
.p
.eor_condition
)
3905 generate_error (&dtp
->common
, LIBERROR_EOR
, NULL
);
3909 if (dtp
->u
.p
.current_unit
&& (dtp
->u
.p
.current_unit
->child_dtio
> 0))
3911 if (cf
& IOPARM_DT_HAS_FORMAT
)
3913 free (dtp
->u
.p
.fmt
);
3919 if ((dtp
->common
.flags
& IOPARM_LIBRETURN_MASK
) != IOPARM_LIBRETURN_OK
)
3921 if (dtp
->u
.p
.current_unit
&& current_mode (dtp
) == UNFORMATTED_SEQUENTIAL
)
3922 dtp
->u
.p
.current_unit
->current_record
= 0;
3926 dtp
->u
.p
.transfer
= NULL
;
3927 if (dtp
->u
.p
.current_unit
== NULL
)
3930 if ((cf
& IOPARM_DT_LIST_FORMAT
) != 0 && dtp
->u
.p
.mode
== READING
)
3932 finish_list_read (dtp
);
3936 if (dtp
->u
.p
.mode
== WRITING
)
3937 dtp
->u
.p
.current_unit
->previous_nonadvancing_write
3938 = dtp
->u
.p
.advance_status
== ADVANCE_NO
;
3940 if (is_stream_io (dtp
))
3942 if (dtp
->u
.p
.current_unit
->flags
.form
== FORM_FORMATTED
3943 && dtp
->u
.p
.advance_status
!= ADVANCE_NO
)
3944 next_record (dtp
, 1);
3949 dtp
->u
.p
.current_unit
->current_record
= 0;
3951 if (!is_internal_unit (dtp
) && dtp
->u
.p
.seen_dollar
)
3953 fbuf_flush (dtp
->u
.p
.current_unit
, dtp
->u
.p
.mode
);
3954 dtp
->u
.p
.seen_dollar
= 0;
3958 /* For non-advancing I/O, save the current maximum position for use in the
3959 next I/O operation if needed. */
3960 if (dtp
->u
.p
.advance_status
== ADVANCE_NO
)
3962 if (dtp
->u
.p
.skips
> 0)
3965 write_x (dtp
, dtp
->u
.p
.skips
, dtp
->u
.p
.pending_spaces
);
3966 tmp
= (int)(dtp
->u
.p
.current_unit
->recl
3967 - dtp
->u
.p
.current_unit
->bytes_left
);
3969 dtp
->u
.p
.max_pos
> tmp
? dtp
->u
.p
.max_pos
: tmp
;
3972 int bytes_written
= (int) (dtp
->u
.p
.current_unit
->recl
3973 - dtp
->u
.p
.current_unit
->bytes_left
);
3974 dtp
->u
.p
.current_unit
->saved_pos
=
3975 dtp
->u
.p
.max_pos
> 0 ? dtp
->u
.p
.max_pos
- bytes_written
: 0;
3976 fbuf_flush (dtp
->u
.p
.current_unit
, dtp
->u
.p
.mode
);
3979 else if (dtp
->u
.p
.current_unit
->flags
.form
== FORM_FORMATTED
3980 && dtp
->u
.p
.mode
== WRITING
&& !is_internal_unit (dtp
))
3981 fbuf_seek (dtp
->u
.p
.current_unit
, 0, SEEK_END
);
3983 dtp
->u
.p
.current_unit
->saved_pos
= 0;
3984 dtp
->u
.p
.current_unit
->last_char
= EOF
- 1;
3985 next_record (dtp
, 1);
3989 if (dtp
->u
.p
.unit_is_internal
)
3991 fbuf_destroy (dtp
->u
.p
.current_unit
);
3992 if (dtp
->u
.p
.current_unit
3993 && (dtp
->u
.p
.current_unit
->child_dtio
== 0)
3994 && dtp
->u
.p
.current_unit
->s
)
3996 sclose (dtp
->u
.p
.current_unit
->s
);
3997 dtp
->u
.p
.current_unit
->s
= NULL
;
4001 #ifdef HAVE_USELOCALE
4002 if (dtp
->u
.p
.old_locale
!= (locale_t
) 0)
4004 uselocale (dtp
->u
.p
.old_locale
);
4005 dtp
->u
.p
.old_locale
= (locale_t
) 0;
4008 __gthread_mutex_lock (&old_locale_lock
);
4009 if (!--old_locale_ctr
)
4011 setlocale (LC_NUMERIC
, old_locale
);
4014 __gthread_mutex_unlock (&old_locale_lock
);
4018 /* Transfer function for IOLENGTH. It doesn't actually do any
4019 data transfer, it just updates the length counter. */
4022 iolength_transfer (st_parameter_dt
*dtp
, bt type
__attribute__((unused
)),
4023 void *dest
__attribute__ ((unused
)),
4024 int kind
__attribute__((unused
)),
4025 size_t size
, size_t nelems
)
4027 if ((dtp
->common
.flags
& IOPARM_DT_HAS_IOLENGTH
) != 0)
4028 *dtp
->iolength
+= (GFC_IO_INT
) (size
* nelems
);
4032 /* Initialize the IOLENGTH data transfer. This function is in essence
4033 a very much simplified version of data_transfer_init(), because it
4034 doesn't have to deal with units at all. */
4037 iolength_transfer_init (st_parameter_dt
*dtp
)
4039 if ((dtp
->common
.flags
& IOPARM_DT_HAS_IOLENGTH
) != 0)
4042 memset (&dtp
->u
.p
, 0, sizeof (dtp
->u
.p
));
4044 /* Set up the subroutine that will handle the transfers. */
4046 dtp
->u
.p
.transfer
= iolength_transfer
;
4050 /* Library entry point for the IOLENGTH form of the INQUIRE
4051 statement. The IOLENGTH form requires no I/O to be performed, but
4052 it must still be a runtime library call so that we can determine
4053 the iolength for dynamic arrays and such. */
4055 extern void st_iolength (st_parameter_dt
*);
4056 export_proto(st_iolength
);
4059 st_iolength (st_parameter_dt
*dtp
)
4061 library_start (&dtp
->common
);
4062 iolength_transfer_init (dtp
);
4065 extern void st_iolength_done (st_parameter_dt
*);
4066 export_proto(st_iolength_done
);
4069 st_iolength_done (st_parameter_dt
*dtp
__attribute__((unused
)))
4076 /* The READ statement. */
4078 extern void st_read (st_parameter_dt
*);
4079 export_proto(st_read
);
4082 st_read (st_parameter_dt
*dtp
)
4084 library_start (&dtp
->common
);
4086 data_transfer_init (dtp
, 1);
4089 extern void st_read_done (st_parameter_dt
*);
4090 export_proto(st_read_done
);
4093 st_read_done (st_parameter_dt
*dtp
)
4095 finalize_transfer (dtp
);
4099 /* If this is a parent READ statement we do not need to retain the
4100 internal unit structure for child use. */
4101 if (dtp
->u
.p
.current_unit
!= NULL
4102 && dtp
->u
.p
.current_unit
->child_dtio
== 0)
4104 if (dtp
->u
.p
.unit_is_internal
)
4106 if ((dtp
->common
.flags
& IOPARM_DT_HAS_UDTIO
) == 0)
4108 free (dtp
->u
.p
.current_unit
->filename
);
4109 dtp
->u
.p
.current_unit
->filename
= NULL
;
4110 if (dtp
->u
.p
.current_unit
->ls
)
4111 free (dtp
->u
.p
.current_unit
->ls
);
4112 dtp
->u
.p
.current_unit
->ls
= NULL
;
4114 newunit_free (dtp
->common
.unit
);
4116 if (dtp
->u
.p
.unit_is_internal
|| dtp
->u
.p
.format_not_saved
)
4118 free_format_data (dtp
->u
.p
.fmt
);
4121 unlock_unit (dtp
->u
.p
.current_unit
);
4127 extern void st_write (st_parameter_dt
*);
4128 export_proto(st_write
);
4131 st_write (st_parameter_dt
*dtp
)
4133 library_start (&dtp
->common
);
4134 data_transfer_init (dtp
, 0);
4137 extern void st_write_done (st_parameter_dt
*);
4138 export_proto(st_write_done
);
4141 st_write_done (st_parameter_dt
*dtp
)
4143 finalize_transfer (dtp
);
4145 if (dtp
->u
.p
.current_unit
!= NULL
4146 && dtp
->u
.p
.current_unit
->child_dtio
== 0)
4148 /* Deal with endfile conditions associated with sequential files. */
4149 if (dtp
->u
.p
.current_unit
->flags
.access
== ACCESS_SEQUENTIAL
)
4150 switch (dtp
->u
.p
.current_unit
->endfile
)
4152 case AT_ENDFILE
: /* Remain at the endfile record. */
4156 dtp
->u
.p
.current_unit
->endfile
= AT_ENDFILE
; /* Just at it now. */
4160 /* Get rid of whatever is after this record. */
4161 if (!is_internal_unit (dtp
))
4162 unit_truncate (dtp
->u
.p
.current_unit
,
4163 stell (dtp
->u
.p
.current_unit
->s
),
4165 dtp
->u
.p
.current_unit
->endfile
= AT_ENDFILE
;
4171 /* If this is a parent WRITE statement we do not need to retain the
4172 internal unit structure for child use. */
4173 if (dtp
->u
.p
.unit_is_internal
)
4175 if ((dtp
->common
.flags
& IOPARM_DT_HAS_UDTIO
) == 0)
4177 free (dtp
->u
.p
.current_unit
->filename
);
4178 dtp
->u
.p
.current_unit
->filename
= NULL
;
4179 if (dtp
->u
.p
.current_unit
->ls
)
4180 free (dtp
->u
.p
.current_unit
->ls
);
4181 dtp
->u
.p
.current_unit
->ls
= NULL
;
4183 newunit_free (dtp
->common
.unit
);
4185 if (dtp
->u
.p
.unit_is_internal
|| dtp
->u
.p
.format_not_saved
)
4187 free_format_data (dtp
->u
.p
.fmt
);
4190 unlock_unit (dtp
->u
.p
.current_unit
);
4196 /* F2003: This is a stub for the runtime portion of the WAIT statement. */
4198 st_wait (st_parameter_wait
*wtp
__attribute__((unused
)))
4203 /* Receives the scalar information for namelist objects and stores it
4204 in a linked list of namelist_info types. */
4207 set_nml_var (st_parameter_dt
*dtp
, void *var_addr
, char *var_name
,
4208 GFC_INTEGER_4 len
, gfc_charlen_type string_length
,
4209 GFC_INTEGER_4 dtype
, void *dtio_sub
, void *vtable
)
4211 namelist_info
*t1
= NULL
;
4213 size_t var_name_len
= strlen (var_name
);
4215 nml
= (namelist_info
*) xmalloc (sizeof (namelist_info
));
4217 nml
->mem_pos
= var_addr
;
4218 nml
->dtio_sub
= dtio_sub
;
4219 nml
->vtable
= vtable
;
4221 nml
->var_name
= (char*) xmalloc (var_name_len
+ 1);
4222 memcpy (nml
->var_name
, var_name
, var_name_len
);
4223 nml
->var_name
[var_name_len
] = '\0';
4225 nml
->len
= (int) len
;
4226 nml
->string_length
= (index_type
) string_length
;
4228 nml
->var_rank
= (int) (dtype
& GFC_DTYPE_RANK_MASK
);
4229 nml
->size
= (index_type
) (dtype
>> GFC_DTYPE_SIZE_SHIFT
);
4230 nml
->type
= (bt
) ((dtype
& GFC_DTYPE_TYPE_MASK
) >> GFC_DTYPE_TYPE_SHIFT
);
4232 if (nml
->var_rank
> 0)
4234 nml
->dim
= (descriptor_dimension
*)
4235 xmallocarray (nml
->var_rank
, sizeof (descriptor_dimension
));
4236 nml
->ls
= (array_loop_spec
*)
4237 xmallocarray (nml
->var_rank
, sizeof (array_loop_spec
));
4247 if ((dtp
->common
.flags
& IOPARM_DT_IONML_SET
) == 0)
4249 dtp
->common
.flags
|= IOPARM_DT_IONML_SET
;
4250 dtp
->u
.p
.ionml
= nml
;
4254 for (t1
= dtp
->u
.p
.ionml
; t1
->next
; t1
= t1
->next
);
4259 extern void st_set_nml_var (st_parameter_dt
*dtp
, void *, char *,
4260 GFC_INTEGER_4
, gfc_charlen_type
, GFC_INTEGER_4
);
4261 export_proto(st_set_nml_var
);
4264 st_set_nml_var (st_parameter_dt
*dtp
, void *var_addr
, char *var_name
,
4265 GFC_INTEGER_4 len
, gfc_charlen_type string_length
,
4266 GFC_INTEGER_4 dtype
)
4268 set_nml_var (dtp
, var_addr
, var_name
, len
, string_length
,
4273 /* Essentially the same as previous but carrying the dtio procedure
4274 and the vtable as additional arguments. */
4275 extern void st_set_nml_dtio_var (st_parameter_dt
*dtp
, void *, char *,
4276 GFC_INTEGER_4
, gfc_charlen_type
, GFC_INTEGER_4
,
4278 export_proto(st_set_nml_dtio_var
);
4282 st_set_nml_dtio_var (st_parameter_dt
*dtp
, void *var_addr
, char *var_name
,
4283 GFC_INTEGER_4 len
, gfc_charlen_type string_length
,
4284 GFC_INTEGER_4 dtype
, void *dtio_sub
, void *vtable
)
4286 set_nml_var (dtp
, var_addr
, var_name
, len
, string_length
,
4287 dtype
, dtio_sub
, vtable
);
4290 /* Store the dimensional information for the namelist object. */
4291 extern void st_set_nml_var_dim (st_parameter_dt
*, GFC_INTEGER_4
,
4292 index_type
, index_type
,
4294 export_proto(st_set_nml_var_dim
);
4297 st_set_nml_var_dim (st_parameter_dt
*dtp
, GFC_INTEGER_4 n_dim
,
4298 index_type stride
, index_type lbound
,
4306 for (nml
= dtp
->u
.p
.ionml
; nml
->next
; nml
= nml
->next
);
4308 GFC_DIMENSION_SET(nml
->dim
[n
],lbound
,ubound
,stride
);
4312 /* Once upon a time, a poor innocent Fortran program was reading a
4313 file, when suddenly it hit the end-of-file (EOF). Unfortunately
4314 the OS doesn't tell whether we're at the EOF or whether we already
4315 went past it. Luckily our hero, libgfortran, keeps track of this.
4316 Call this function when you detect an EOF condition. See Section
4320 hit_eof (st_parameter_dt
*dtp
)
4322 dtp
->u
.p
.current_unit
->flags
.position
= POSITION_APPEND
;
4324 if (dtp
->u
.p
.current_unit
->flags
.access
== ACCESS_SEQUENTIAL
)
4325 switch (dtp
->u
.p
.current_unit
->endfile
)
4329 generate_error (&dtp
->common
, LIBERROR_END
, NULL
);
4330 if (!is_internal_unit (dtp
) && !dtp
->u
.p
.namelist_mode
)
4332 dtp
->u
.p
.current_unit
->endfile
= AFTER_ENDFILE
;
4333 dtp
->u
.p
.current_unit
->current_record
= 0;
4336 dtp
->u
.p
.current_unit
->endfile
= AT_ENDFILE
;
4340 generate_error (&dtp
->common
, LIBERROR_ENDFILE
, NULL
);
4341 dtp
->u
.p
.current_unit
->current_record
= 0;
4346 /* Non-sequential files don't have an ENDFILE record, so we
4347 can't be at AFTER_ENDFILE. */
4348 dtp
->u
.p
.current_unit
->endfile
= AT_ENDFILE
;
4349 generate_error (&dtp
->common
, LIBERROR_END
, NULL
);
4350 dtp
->u
.p
.current_unit
->current_record
= 0;