Daily bump.
[official-gcc.git] / libgfortran / io / transfer.c
blobacaa88a01f9bd3572ab3c79d750bd6b34649aa42
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)
11 any later version.
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. */
30 #include "io.h"
31 #include "fbuf.h"
32 #include "format.h"
33 #include "unix.h"
34 #include <string.h>
35 #include <errno.h>
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
50 transfer_integer
51 transfer_logical
52 transfer_character
53 transfer_character_wide
54 transfer_real
55 transfer_complex
56 transfer_real128
57 transfer_complex128
59 and for WRITE
61 transfer_integer_write
62 transfer_logical_write
63 transfer_character_write
64 transfer_character_wide_write
65 transfer_real_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
76 transferred. */
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 *,
106 void *, int, int);
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,
116 gfc_charlen_type);
117 export_proto(transfer_array);
119 extern void transfer_array_write (st_parameter_dt *, gfc_array_char *, int,
120 gfc_charlen_type);
121 export_proto(transfer_array_write);
123 /* User defined derived type input/output. */
124 extern void
125 transfer_derived (st_parameter_dt *dtp, void *dtio_source, void *dtio_proc);
126 export_proto(transfer_derived);
128 extern void
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},
139 {"no", ADVANCE_NO},
140 {NULL, 0}
144 static const st_option decimal_opt[] = {
145 {"point", DECIMAL_POINT},
146 {"comma", DECIMAL_COMMA},
147 {NULL, 0}
150 static const st_option round_opt[] = {
151 {"up", ROUND_UP},
152 {"down", ROUND_DOWN},
153 {"zero", ROUND_ZERO},
154 {"nearest", ROUND_NEAREST},
155 {"compatible", ROUND_COMPATIBLE},
156 {"processor_defined", ROUND_PROCDEFINED},
157 {NULL, 0}
161 static const st_option sign_opt[] = {
162 {"plus", SIGN_SP},
163 {"suppress", SIGN_SS},
164 {"processor_defined", SIGN_S},
165 {NULL, 0}
168 static const st_option blank_opt[] = {
169 {"null", BLANK_NULL},
170 {"zero", BLANK_ZERO},
171 {NULL, 0}
174 static const st_option delim_opt[] = {
175 {"apostrophe", DELIM_APOSTROPHE},
176 {"quote", DELIM_QUOTE},
177 {"none", DELIM_NONE},
178 {NULL, 0}
181 static const st_option pad_opt[] = {
182 {"yes", PAD_YES},
183 {"no", PAD_NO},
184 {NULL, 0}
187 typedef enum
188 { FORMATTED_SEQUENTIAL, UNFORMATTED_SEQUENTIAL,
189 FORMATTED_DIRECT, UNFORMATTED_DIRECT, FORMATTED_STREAM, UNFORMATTED_STREAM
191 file_mode;
194 static file_mode
195 current_mode (st_parameter_dt *dtp)
197 file_mode m;
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;
217 return m;
221 /* Mid level data transfer statements. */
223 /* Read sequential file - internal unit */
225 static char *
226 read_sf_internal (st_parameter_dt *dtp, int *length)
228 static char *empty_string[0];
229 char *base = NULL;
230 int lorig;
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)
235 hit_eof (dtp);
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)
241 *length = 0;
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);
256 lorig = *length;
257 if (is_char4_unit(dtp))
259 int i;
260 gfc_char4_t *p = (gfc_char4_t *) mem_alloc_r4 (dtp->u.p.current_unit->s,
261 length);
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;
266 else
267 base = mem_alloc_r (dtp->u.p.current_unit->s, length);
269 if (unlikely (lorig > *length))
271 hit_eof (dtp);
272 return NULL;
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;
281 return base;
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
290 an I/O error.
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 */
299 static char *
300 read_sf (st_parameter_dt *dtp, int *length)
302 static char *empty_string[0];
303 int q, q2;
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)
310 *length = 0;
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);
325 n = seen_comma = 0;
327 /* Read data into format buffer and scan through it. */
328 lorig = *length;
330 while (n < *length)
332 q = fbuf_getc (dtp->u.p.current_unit);
333 if (q == EOF)
334 break;
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);
351 if (q2 == '\n')
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);
363 return NULL;
366 *length = n;
367 goto done;
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 */
372 else if (q == ',')
373 if (dtp->u.p.sf_read_comma == 1)
375 seen_comma = 1;
376 notify_std (&dtp->common, GFC_STD_GNU,
377 "Comma in formatted numeric read.");
378 break;
380 n++;
383 *length = n;
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)
389 if (n > 0)
391 if (dtp->u.p.advance_status == ADVANCE_NO)
393 if (dtp->u.p.current_unit->pad_status == PAD_NO)
395 hit_eof (dtp);
396 return NULL;
398 else
399 dtp->u.p.eor_condition = 1;
401 else
402 dtp->u.p.at_eof = 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)
409 hit_eof (dtp);
410 return NULL;
414 done:
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
434 read_block_direct.
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
439 short reads. */
441 void *
442 read_block_form (st_parameter_dt *dtp, int *nbytes)
444 char *source;
445 int norig;
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;
456 else
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);
463 return 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);
474 return NULL;
478 else
480 if (unlikely (dtp->u.p.current_unit->bytes_left == 0))
482 hit_eof (dtp);
483 return NULL;
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);
497 else
498 source = read_sf (dtp, nbytes);
500 dtp->u.p.current_unit->strm_pos +=
501 (gfc_offset) (*nbytes + dtp->u.p.sf_seen_eor);
502 return source;
505 /* If we reach here, we can assume it's direct access. */
507 dtp->u.p.current_unit->bytes_left -= (gfc_offset) *nbytes;
509 norig = *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);
523 source = NULL;
527 dtp->u.p.current_unit->strm_pos += (gfc_offset) *nbytes;
529 return source;
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
535 read_sf_internal. */
536 void *
537 read_block_form4 (st_parameter_dt *dtp, int *nbytes)
539 static gfc_char4_t *empty_string[0];
540 gfc_char4_t *source;
541 int lorig;
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)
549 hit_eof (dtp);
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)
555 *nbytes = 0;
556 /* Just return something that isn't a NULL pointer, otherwise the
557 caller thinks an error occurred. */
558 return empty_string;
561 lorig = *nbytes;
562 source = (gfc_char4_t *) mem_alloc_r4 (dtp->u.p.current_unit->s, nbytes);
564 if (unlikely (lorig > *nbytes))
566 hit_eof (dtp);
567 return NULL;
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;
576 return source;
580 /* Reads a block directly into application data space. This is for
581 unformatted files. */
583 static void
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;
590 int short_record;
592 if (is_stream_io (dtp))
594 have_read_record = sread (dtp->u.p.current_unit->s, buf,
595 nbytes);
596 if (unlikely (have_read_record < 0))
598 generate_error (&dtp->common, LIBERROR_OS, NULL);
599 return;
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. */
608 hit_eof (dtp);
610 return;
613 if (dtp->u.p.current_unit->flags.access == ACCESS_DIRECT)
615 if (dtp->u.p.current_unit->bytes_left < (gfc_offset) nbytes)
617 short_record = 1;
618 to_read_record = dtp->u.p.current_unit->bytes_left;
619 nbytes = to_read_record;
621 else
623 short_record = 0;
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);
633 return;
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. */
640 return;
643 if (unlikely (short_record))
645 generate_error (&dtp->common, LIBERROR_SHORT_RECORD, NULL);
647 return;
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;
660 short_record = 1;
662 else
664 to_read_record = nbytes;
665 short_record = 0;
667 have_read_record = 0;
669 while(1)
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;
677 else
679 to_read_subrecord = to_read_record;
680 to_read_record = 0;
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);
690 return;
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);
702 return;
705 if (to_read_record > 0)
707 if (likely (dtp->u.p.current_unit->continued))
709 next_record_r_unf (dtp, 0);
710 us_read (dtp, 1);
712 else
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);
720 return;
723 else
725 /* Normal exit, the read request has been fulfilled. */
726 break;
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);
734 return;
736 return;
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. */
745 void *
746 write_block (st_parameter_dt *dtp, int length)
748 char *dest;
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;
762 else
764 generate_error (&dtp->common, LIBERROR_EOR, NULL);
765 return 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. */
776 gfc_char4_t *dest4;
777 dest4 = mem_alloc_w4 (dtp->u.p.current_unit->s, &length);
778 if (dest4 == NULL)
780 generate_error (&dtp->common, LIBERROR_END, NULL);
781 return NULL;
783 return dest4;
785 else
786 dest = mem_alloc_w (dtp->u.p.current_unit->s, &length);
788 if (dest == NULL)
790 generate_error (&dtp->common, LIBERROR_END, NULL);
791 return NULL;
794 if (unlikely (dtp->u.p.current_unit->endfile == AT_ENDFILE))
795 generate_error (&dtp->common, LIBERROR_END, NULL);
797 else
799 dest = fbuf_alloc (dtp->u.p.current_unit, length);
800 if (dest == NULL)
802 generate_error (&dtp->common, LIBERROR_OS, NULL);
803 return 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;
813 return dest;
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. */
821 static bool
822 write_buf (st_parameter_dt *dtp, void *buf, size_t nbytes)
825 ssize_t have_written;
826 ssize_t to_write_subrecord;
827 int short_record;
829 /* Stream I/O. */
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);
837 return false;
840 dtp->u.p.current_unit->strm_pos += (gfc_offset) have_written;
842 return true;
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);
852 return false;
855 if (buf == NULL && nbytes == 0)
856 return true;
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);
862 return false;
865 dtp->u.p.current_unit->strm_pos += (gfc_offset) have_written;
866 dtp->u.p.current_unit->bytes_left -= (gfc_offset) have_written;
868 return true;
871 /* Unformatted sequential. */
873 have_written = 0;
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;
879 short_record = 1;
881 else
883 short_record = 0;
886 while (1)
889 to_write_subrecord =
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);
901 return false;
904 dtp->u.p.current_unit->strm_pos += (gfc_offset) to_write_subrecord;
905 nbytes -= to_write_subrecord;
906 have_written += to_write_subrecord;
908 if (nbytes == 0)
909 break;
911 next_record_w_unf (dtp, 1);
912 us_write (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);
918 return false;
920 return true;
924 /* Reverse memcpy - used for byte swapping. */
926 static void
927 reverse_memcpy (void *dest, const void *src, size_t n)
929 char *d, *s;
930 size_t i;
932 d = (char *) dest;
933 s = (char *) src + n - 1;
935 /* Write with ascending order - this is likely faster
936 on modern architectures because of write combining. */
937 for (i=0; i<n; i++)
938 *(d++) = *(s--);
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
945 allowed. */
947 static void
948 bswap_array (void *dest, const void *src, size_t size, size_t nelems)
950 const char *ps;
951 char *pd;
953 switch (size)
955 case 1:
956 break;
957 case 2:
958 for (size_t i = 0; i < nelems; i++)
959 ((uint16_t*)dest)[i] = __builtin_bswap16 (((uint16_t*)src)[i]);
960 break;
961 case 4:
962 for (size_t i = 0; i < nelems; i++)
963 ((uint32_t*)dest)[i] = __builtin_bswap32 (((uint32_t*)src)[i]);
964 break;
965 case 8:
966 for (size_t i = 0; i < nelems; i++)
967 ((uint64_t*)dest)[i] = __builtin_bswap64 (((uint64_t*)src)[i]);
968 break;
969 case 12:
970 ps = src;
971 pd = dest;
972 for (size_t i = 0; i < nelems; i++)
974 uint32_t tmp;
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);
979 ps += size;
980 pd += size;
982 break;
983 case 16:
984 ps = src;
985 pd = dest;
986 for (size_t i = 0; i < nelems; i++)
988 uint64_t tmp;
989 memcpy (&tmp, ps, 8);
990 *(uint64_t*)pd = __builtin_bswap64 (*(uint64_t*)(ps + 8));
991 *(uint64_t*)(pd + 8) = __builtin_bswap64 (tmp);
992 ps += size;
993 pd += size;
995 break;
996 default:
997 pd = dest;
998 if (dest != src)
1000 ps = src;
1001 for (size_t i = 0; i < nelems; i++)
1003 reverse_memcpy (pd, ps, size);
1004 ps += size;
1005 pd += size;
1008 else
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++)
1016 tmp = *low;
1017 *low = *high;
1018 *high = tmp;
1019 low++;
1020 high--;
1022 pd += size;
1029 /* Master function for unformatted reads. */
1031 static void
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] = "";
1039 char *child_iomsg;
1040 gfc_charlen_type child_iomsg_len;
1041 int noiostat;
1042 int *child_iostat = NULL;
1044 /* Set iostat, intent(out). */
1045 noiostat = 0;
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;
1055 else
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,
1064 child_iomsg_len);
1065 dtp->u.p.current_unit->child_dtio--;
1066 return;
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)
1074 && kind != 1)
1076 /* Handle wide chracters. */
1077 if (type == BT_CHARACTER)
1079 nelems *= size;
1080 size = kind;
1083 /* Break up complex into its constituent reals. */
1084 else if (type == BT_COMPLEX)
1086 nelems *= 2;
1087 size /= 2;
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. */
1099 static void
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] = "";
1107 char *child_iomsg;
1108 gfc_charlen_type child_iomsg_len;
1109 int noiostat;
1110 int *child_iostat = NULL;
1112 /* Set iostat, intent(out). */
1113 noiostat = 0;
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;
1123 else
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,
1132 child_iomsg_len);
1133 dtp->u.p.current_unit->child_dtio--;
1134 return;
1137 if (likely (dtp->u.p.current_unit->flags.convert == GFC_CONVERT_NATIVE)
1138 || kind == 1)
1140 size_t stride = type == BT_CHARACTER ?
1141 size * GFC_SIZE_OF_CHAR_KIND(kind) : size;
1143 write_buf (dtp, source, stride * nelems);
1145 else
1147 #define BSWAP_BUFSZ 512
1148 char buffer[BSWAP_BUFSZ];
1149 char *p;
1150 size_t nrem;
1152 p = source;
1154 /* Handle wide chracters. */
1155 if (type == BT_CHARACTER && kind != 1)
1157 nelems *= size;
1158 size = kind;
1161 /* Break up complex into its constituent reals. */
1162 if (type == BT_COMPLEX)
1164 nelems *= 2;
1165 size /= 2;
1168 /* By now, all complex variables have been split into their
1169 constituent reals. */
1171 nrem = nelems;
1174 size_t nc;
1175 if (size * nrem > BSWAP_BUFSZ)
1176 nc = BSWAP_BUFSZ / size;
1177 else
1178 nc = nrem;
1180 bswap_array (buffer, p, size, nc);
1181 write_buf (dtp, buffer, size * nc);
1182 p += size * nc;
1183 nrem -= nc;
1185 while (nrem > 0);
1190 /* Return a pointer to the name of a type. */
1192 const char *
1193 type_name (bt type)
1195 const char *p;
1197 switch (type)
1199 case BT_INTEGER:
1200 p = "INTEGER";
1201 break;
1202 case BT_LOGICAL:
1203 p = "LOGICAL";
1204 break;
1205 case BT_CHARACTER:
1206 p = "CHARACTER";
1207 break;
1208 case BT_REAL:
1209 p = "REAL";
1210 break;
1211 case BT_COMPLEX:
1212 p = "COMPLEX";
1213 break;
1214 case BT_CLASS:
1215 p = "CLASS or DERIVED";
1216 break;
1217 default:
1218 internal_error (NULL, "type_name(): Bad type");
1221 return p;
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. */
1229 static void
1230 write_constant_string (st_parameter_dt *dtp, const fnode *f)
1232 char c, delimiter, *p, *q;
1233 int length;
1235 length = f->u.string.length;
1236 if (length == 0)
1237 return;
1239 p = write_block (dtp, length);
1240 if (p == NULL)
1241 return;
1243 q = f->u.string.p;
1244 delimiter = q[-1];
1246 for (; length > 0; length--)
1248 c = *p++ = *q++;
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. */
1259 static int
1260 require_type (st_parameter_dt *dtp, bt expected, bt actual, const fnode *f)
1262 #define BUFLEN 100
1263 char buffer[BUFLEN];
1265 if (actual == expected)
1266 return 0;
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);
1274 return 1;
1278 /* Check that the dtio procedure required for formatted IO is present. */
1280 static int
1281 check_dtio_proc (st_parameter_dt *dtp, const fnode *f)
1283 char buffer[BUFLEN];
1285 if (dtp->u.p.fdtio_ptr != NULL)
1286 return 0;
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);
1294 return 1;
1298 static int
1299 require_numeric_type (st_parameter_dt *dtp, bt actual, const fnode *f)
1301 #define BUFLEN 100
1302 char buffer[BUFLEN];
1304 if (actual == BT_INTEGER || actual == BT_REAL || actual == BT_COMPLEX)
1305 return 0;
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);
1313 return 1;
1316 static char *
1317 get_dt_format (char *p, gfc_charlen_type *length)
1319 char delim = p[-1]; /* The delimiter is always the first character back. */
1320 char c, *q, *res;
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. */
1326 *q++ = 'D';
1327 *q++ = 'T';
1329 /* The string may contain doubled quotes so scan and skip as needed. */
1330 for (; len > 0; len--)
1332 c = *q++ = *p++;
1333 if (c == delim)
1334 p++; /* Skip the doubled delimiter. */
1337 /* Adjust the string length by two now that we are done. */
1338 *length += 2;
1340 return res;
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. */
1352 static void
1353 formatted_transfer_scalar_read (st_parameter_dt *dtp, bt type, void *p, int kind,
1354 size_t size)
1356 int pos, bytes_used;
1357 const fnode *f;
1358 format_token t;
1359 int n;
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)
1367 type = BT_REAL;
1368 size /= 2;
1371 /* If there's an EOR condition, we simulate finalizing the transfer
1372 by doing nothing. */
1373 if (dtp->u.p.eor_condition)
1374 return;
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;
1382 for (;;)
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)
1394 break;
1396 f = next_format (dtp);
1397 if (f == NULL)
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");
1403 return;
1406 t = f->format;
1408 bytes_used = (int)(dtp->u.p.current_unit->recl
1409 - dtp->u.p.current_unit->bytes_left);
1411 if (is_stream_io(dtp))
1412 bytes_used = 0;
1414 switch (t)
1416 case FMT_I:
1417 if (n == 0)
1418 goto need_read_data;
1419 if (require_type (dtp, BT_INTEGER, type, f))
1420 return;
1421 read_decimal (dtp, f, p, kind);
1422 break;
1424 case FMT_B:
1425 if (n == 0)
1426 goto need_read_data;
1427 if (!(compile_options.allow_std & GFC_STD_GNU)
1428 && require_numeric_type (dtp, type, f))
1429 return;
1430 if (!(compile_options.allow_std & GFC_STD_F2008)
1431 && require_type (dtp, BT_INTEGER, type, f))
1432 return;
1433 read_radix (dtp, f, p, kind, 2);
1434 break;
1436 case FMT_O:
1437 if (n == 0)
1438 goto need_read_data;
1439 if (!(compile_options.allow_std & GFC_STD_GNU)
1440 && require_numeric_type (dtp, type, f))
1441 return;
1442 if (!(compile_options.allow_std & GFC_STD_F2008)
1443 && require_type (dtp, BT_INTEGER, type, f))
1444 return;
1445 read_radix (dtp, f, p, kind, 8);
1446 break;
1448 case FMT_Z:
1449 if (n == 0)
1450 goto need_read_data;
1451 if (!(compile_options.allow_std & GFC_STD_GNU)
1452 && require_numeric_type (dtp, type, f))
1453 return;
1454 if (!(compile_options.allow_std & GFC_STD_F2008)
1455 && require_type (dtp, BT_INTEGER, type, f))
1456 return;
1457 read_radix (dtp, f, p, kind, 16);
1458 break;
1460 case FMT_A:
1461 if (n == 0)
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);
1469 else
1470 read_a (dtp, f, p, size);
1471 break;
1473 case FMT_L:
1474 if (n == 0)
1475 goto need_read_data;
1476 read_l (dtp, f, p, kind);
1477 break;
1479 case FMT_D:
1480 if (n == 0)
1481 goto need_read_data;
1482 if (require_type (dtp, BT_REAL, type, f))
1483 return;
1484 read_f (dtp, f, p, kind);
1485 break;
1487 case FMT_DT:
1488 if (n == 0)
1489 goto need_read_data;
1491 if (check_dtio_proc (dtp, f))
1492 return;
1493 if (require_type (dtp, BT_CLASS, type, f))
1494 return;
1495 int unit = dtp->u.p.current_unit->unit_number;
1496 char dt[] = "DT";
1497 char tmp_iomsg[IOMSG_LEN] = "";
1498 char *child_iomsg;
1499 gfc_charlen_type child_iomsg_len;
1500 int noiostat;
1501 int *child_iostat = NULL;
1502 char *iotype;
1503 gfc_charlen_type iotype_len = f->u.udf.string_len;
1505 /* Build the iotype string. */
1506 if (iotype_len == 0)
1508 iotype_len = 2;
1509 iotype = dt;
1511 else
1512 iotype = get_dt_format (f->u.udf.string, &iotype_len);
1514 /* Set iostat, intent(out). */
1515 noiostat = 0;
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;
1525 else
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)
1540 free (iotype);
1541 /* Note: vlist is freed in free_format_data. */
1542 break;
1544 case FMT_E:
1545 if (n == 0)
1546 goto need_read_data;
1547 if (require_type (dtp, BT_REAL, type, f))
1548 return;
1549 read_f (dtp, f, p, kind);
1550 break;
1552 case FMT_EN:
1553 if (n == 0)
1554 goto need_read_data;
1555 if (require_type (dtp, BT_REAL, type, f))
1556 return;
1557 read_f (dtp, f, p, kind);
1558 break;
1560 case FMT_ES:
1561 if (n == 0)
1562 goto need_read_data;
1563 if (require_type (dtp, BT_REAL, type, f))
1564 return;
1565 read_f (dtp, f, p, kind);
1566 break;
1568 case FMT_F:
1569 if (n == 0)
1570 goto need_read_data;
1571 if (require_type (dtp, BT_REAL, type, f))
1572 return;
1573 read_f (dtp, f, p, kind);
1574 break;
1576 case FMT_G:
1577 if (n == 0)
1578 goto need_read_data;
1579 switch (type)
1581 case BT_INTEGER:
1582 read_decimal (dtp, f, p, kind);
1583 break;
1584 case BT_LOGICAL:
1585 read_l (dtp, f, p, kind);
1586 break;
1587 case BT_CHARACTER:
1588 if (kind == 4)
1589 read_a_char4 (dtp, f, p, size);
1590 else
1591 read_a (dtp, f, p, size);
1592 break;
1593 case BT_REAL:
1594 read_f (dtp, f, p, kind);
1595 break;
1596 default:
1597 internal_error (&dtp->common, "formatted_transfer(): Bad type");
1599 break;
1601 case FMT_STRING:
1602 consume_data_flag = 0;
1603 format_error (dtp, f, "Constant string in input format");
1604 return;
1606 /* Format codes that don't transfer data. */
1607 case FMT_X:
1608 case FMT_TR:
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);
1614 break;
1616 case FMT_TL:
1617 case FMT_T:
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;
1633 else /* FMT_T */
1634 pos = f->u.n - 1;
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)
1648 break;
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;
1655 bytes_used = pos;
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);
1663 else
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;
1668 else
1669 read_x (dtp, dtp->u.p.skips);
1670 break;
1672 case FMT_S:
1673 consume_data_flag = 0;
1674 dtp->u.p.sign_status = SIGN_S;
1675 break;
1677 case FMT_SS:
1678 consume_data_flag = 0;
1679 dtp->u.p.sign_status = SIGN_SS;
1680 break;
1682 case FMT_SP:
1683 consume_data_flag = 0;
1684 dtp->u.p.sign_status = SIGN_SP;
1685 break;
1687 case FMT_BN:
1688 consume_data_flag = 0 ;
1689 dtp->u.p.blank_status = BLANK_NULL;
1690 break;
1692 case FMT_BZ:
1693 consume_data_flag = 0;
1694 dtp->u.p.blank_status = BLANK_ZERO;
1695 break;
1697 case FMT_DC:
1698 consume_data_flag = 0;
1699 dtp->u.p.current_unit->decimal_status = DECIMAL_COMMA;
1700 break;
1702 case FMT_DP:
1703 consume_data_flag = 0;
1704 dtp->u.p.current_unit->decimal_status = DECIMAL_POINT;
1705 break;
1707 case FMT_RC:
1708 consume_data_flag = 0;
1709 dtp->u.p.current_unit->round_status = ROUND_COMPATIBLE;
1710 break;
1712 case FMT_RD:
1713 consume_data_flag = 0;
1714 dtp->u.p.current_unit->round_status = ROUND_DOWN;
1715 break;
1717 case FMT_RN:
1718 consume_data_flag = 0;
1719 dtp->u.p.current_unit->round_status = ROUND_NEAREST;
1720 break;
1722 case FMT_RP:
1723 consume_data_flag = 0;
1724 dtp->u.p.current_unit->round_status = ROUND_PROCDEFINED;
1725 break;
1727 case FMT_RU:
1728 consume_data_flag = 0;
1729 dtp->u.p.current_unit->round_status = ROUND_UP;
1730 break;
1732 case FMT_RZ:
1733 consume_data_flag = 0;
1734 dtp->u.p.current_unit->round_status = ROUND_ZERO;
1735 break;
1737 case FMT_P:
1738 consume_data_flag = 0;
1739 dtp->u.p.scale_factor = f->u.k;
1740 break;
1742 case FMT_DOLLAR:
1743 consume_data_flag = 0;
1744 dtp->u.p.seen_dollar = 1;
1745 break;
1747 case FMT_SLASH:
1748 consume_data_flag = 0;
1749 dtp->u.p.skips = dtp->u.p.pending_spaces = 0;
1750 next_record (dtp, 0);
1751 break;
1753 case FMT_COLON:
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
1757 transferred. */
1758 consume_data_flag = 0;
1759 if (n == 0)
1760 return;
1761 break;
1763 default:
1764 internal_error (&dtp->common, "Bad format node");
1767 /* Adjust the item count and data pointer. */
1769 if ((consume_data_flag > 0) && (n > 0))
1771 n--;
1772 p = ((char *) p) + size;
1775 dtp->u.p.skips = 0;
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;
1781 return;
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. */
1786 need_read_data:
1787 unget_format (dtp, f);
1791 static void
1792 formatted_transfer_scalar_write (st_parameter_dt *dtp, bt type, void *p, int kind,
1793 size_t size)
1795 int pos, bytes_used;
1796 const fnode *f;
1797 format_token t;
1798 int n;
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)
1806 type = BT_REAL;
1807 size /= 2;
1810 /* If there's an EOR condition, we simulate finalizing the transfer
1811 by doing nothing. */
1812 if (dtp->u.p.eor_condition)
1813 return;
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;
1821 for (;;)
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)
1833 break;
1835 f = next_format (dtp);
1836 if (f == NULL)
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");
1842 return;
1845 /* Now discharge T, TR and X movements to the right. This is delayed
1846 until a data producing format to suppress trailing spaces. */
1848 t = f->format;
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
1854 || t == FMT_DT))
1855 || t == FMT_STRING))
1857 if (dtp->u.p.skips > 0)
1859 int tmp;
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);
1863 dtp->u.p.max_pos =
1864 dtp->u.p.max_pos > tmp ? dtp->u.p.max_pos : tmp;
1865 dtp->u.p.skips = 0;
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);
1871 else
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))
1882 bytes_used = 0;
1884 switch (t)
1886 case FMT_I:
1887 if (n == 0)
1888 goto need_data;
1889 if (require_type (dtp, BT_INTEGER, type, f))
1890 return;
1891 write_i (dtp, f, p, kind);
1892 break;
1894 case FMT_B:
1895 if (n == 0)
1896 goto need_data;
1897 if (!(compile_options.allow_std & GFC_STD_GNU)
1898 && require_numeric_type (dtp, type, f))
1899 return;
1900 if (!(compile_options.allow_std & GFC_STD_F2008)
1901 && require_type (dtp, BT_INTEGER, type, f))
1902 return;
1903 write_b (dtp, f, p, kind);
1904 break;
1906 case FMT_O:
1907 if (n == 0)
1908 goto need_data;
1909 if (!(compile_options.allow_std & GFC_STD_GNU)
1910 && require_numeric_type (dtp, type, f))
1911 return;
1912 if (!(compile_options.allow_std & GFC_STD_F2008)
1913 && require_type (dtp, BT_INTEGER, type, f))
1914 return;
1915 write_o (dtp, f, p, kind);
1916 break;
1918 case FMT_Z:
1919 if (n == 0)
1920 goto need_data;
1921 if (!(compile_options.allow_std & GFC_STD_GNU)
1922 && require_numeric_type (dtp, type, f))
1923 return;
1924 if (!(compile_options.allow_std & GFC_STD_F2008)
1925 && require_type (dtp, BT_INTEGER, type, f))
1926 return;
1927 write_z (dtp, f, p, kind);
1928 break;
1930 case FMT_A:
1931 if (n == 0)
1932 goto need_data;
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);
1939 else
1940 write_a (dtp, f, p, size);
1941 break;
1943 case FMT_L:
1944 if (n == 0)
1945 goto need_data;
1946 write_l (dtp, f, p, kind);
1947 break;
1949 case FMT_D:
1950 if (n == 0)
1951 goto need_data;
1952 if (require_type (dtp, BT_REAL, type, f))
1953 return;
1954 write_d (dtp, f, p, kind);
1955 break;
1957 case FMT_DT:
1958 if (n == 0)
1959 goto need_data;
1960 int unit = dtp->u.p.current_unit->unit_number;
1961 char dt[] = "DT";
1962 char tmp_iomsg[IOMSG_LEN] = "";
1963 char *child_iomsg;
1964 gfc_charlen_type child_iomsg_len;
1965 int noiostat;
1966 int *child_iostat = NULL;
1967 char *iotype;
1968 gfc_charlen_type iotype_len = f->u.udf.string_len;
1970 /* Build the iotype string. */
1971 if (iotype_len == 0)
1973 iotype_len = 2;
1974 iotype = dt;
1976 else
1977 iotype = get_dt_format (f->u.udf.string, &iotype_len);
1979 /* Set iostat, intent(out). */
1980 noiostat = 0;
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;
1990 else
1992 child_iomsg = tmp_iomsg;
1993 child_iomsg_len = IOMSG_LEN;
1996 if (check_dtio_proc (dtp, f))
1997 return;
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)
2008 free (iotype);
2009 /* Note: vlist is freed in free_format_data. */
2010 break;
2012 case FMT_E:
2013 if (n == 0)
2014 goto need_data;
2015 if (require_type (dtp, BT_REAL, type, f))
2016 return;
2017 write_e (dtp, f, p, kind);
2018 break;
2020 case FMT_EN:
2021 if (n == 0)
2022 goto need_data;
2023 if (require_type (dtp, BT_REAL, type, f))
2024 return;
2025 write_en (dtp, f, p, kind);
2026 break;
2028 case FMT_ES:
2029 if (n == 0)
2030 goto need_data;
2031 if (require_type (dtp, BT_REAL, type, f))
2032 return;
2033 write_es (dtp, f, p, kind);
2034 break;
2036 case FMT_F:
2037 if (n == 0)
2038 goto need_data;
2039 if (require_type (dtp, BT_REAL, type, f))
2040 return;
2041 write_f (dtp, f, p, kind);
2042 break;
2044 case FMT_G:
2045 if (n == 0)
2046 goto need_data;
2047 switch (type)
2049 case BT_INTEGER:
2050 write_i (dtp, f, p, kind);
2051 break;
2052 case BT_LOGICAL:
2053 write_l (dtp, f, p, kind);
2054 break;
2055 case BT_CHARACTER:
2056 if (kind == 4)
2057 write_a_char4 (dtp, f, p, size);
2058 else
2059 write_a (dtp, f, p, size);
2060 break;
2061 case BT_REAL:
2062 if (f->u.real.w == 0)
2063 write_real_g0 (dtp, p, kind, f->u.real.d);
2064 else
2065 write_d (dtp, f, p, kind);
2066 break;
2067 default:
2068 internal_error (&dtp->common,
2069 "formatted_transfer(): Bad type");
2071 break;
2073 case FMT_STRING:
2074 consume_data_flag = 0;
2075 write_constant_string (dtp, f);
2076 break;
2078 /* Format codes that don't transfer data. */
2079 case FMT_X:
2080 case FMT_TR:
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
2089 now. */
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;
2095 break;
2097 case FMT_TL:
2098 case FMT_T:
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;
2115 else /* FMT_T */
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;
2129 break;
2131 case FMT_S:
2132 consume_data_flag = 0;
2133 dtp->u.p.sign_status = SIGN_S;
2134 break;
2136 case FMT_SS:
2137 consume_data_flag = 0;
2138 dtp->u.p.sign_status = SIGN_SS;
2139 break;
2141 case FMT_SP:
2142 consume_data_flag = 0;
2143 dtp->u.p.sign_status = SIGN_SP;
2144 break;
2146 case FMT_BN:
2147 consume_data_flag = 0 ;
2148 dtp->u.p.blank_status = BLANK_NULL;
2149 break;
2151 case FMT_BZ:
2152 consume_data_flag = 0;
2153 dtp->u.p.blank_status = BLANK_ZERO;
2154 break;
2156 case FMT_DC:
2157 consume_data_flag = 0;
2158 dtp->u.p.current_unit->decimal_status = DECIMAL_COMMA;
2159 break;
2161 case FMT_DP:
2162 consume_data_flag = 0;
2163 dtp->u.p.current_unit->decimal_status = DECIMAL_POINT;
2164 break;
2166 case FMT_RC:
2167 consume_data_flag = 0;
2168 dtp->u.p.current_unit->round_status = ROUND_COMPATIBLE;
2169 break;
2171 case FMT_RD:
2172 consume_data_flag = 0;
2173 dtp->u.p.current_unit->round_status = ROUND_DOWN;
2174 break;
2176 case FMT_RN:
2177 consume_data_flag = 0;
2178 dtp->u.p.current_unit->round_status = ROUND_NEAREST;
2179 break;
2181 case FMT_RP:
2182 consume_data_flag = 0;
2183 dtp->u.p.current_unit->round_status = ROUND_PROCDEFINED;
2184 break;
2186 case FMT_RU:
2187 consume_data_flag = 0;
2188 dtp->u.p.current_unit->round_status = ROUND_UP;
2189 break;
2191 case FMT_RZ:
2192 consume_data_flag = 0;
2193 dtp->u.p.current_unit->round_status = ROUND_ZERO;
2194 break;
2196 case FMT_P:
2197 consume_data_flag = 0;
2198 dtp->u.p.scale_factor = f->u.k;
2199 break;
2201 case FMT_DOLLAR:
2202 consume_data_flag = 0;
2203 dtp->u.p.seen_dollar = 1;
2204 break;
2206 case FMT_SLASH:
2207 consume_data_flag = 0;
2208 dtp->u.p.skips = dtp->u.p.pending_spaces = 0;
2209 next_record (dtp, 0);
2210 break;
2212 case FMT_COLON:
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
2216 transferred. */
2217 consume_data_flag = 0;
2218 if (n == 0)
2219 return;
2220 break;
2222 default:
2223 internal_error (&dtp->common, "Bad format node");
2226 /* Adjust the item count and data pointer. */
2228 if ((consume_data_flag > 0) && (n > 0))
2230 n--;
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;
2238 return;
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. */
2243 need_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. */
2254 static void
2255 formatted_transfer (st_parameter_dt *dtp, bt type, void *p, int kind,
2256 size_t size, size_t nelems)
2258 size_t elem;
2259 char *tmp;
2261 tmp = (char *) p;
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);
2273 else
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. */
2289 void
2290 transfer_integer (st_parameter_dt *dtp, void *p, int kind)
2292 if ((dtp->common.flags & IOPARM_LIBRETURN_MASK) != IOPARM_LIBRETURN_OK)
2293 return;
2294 dtp->u.p.transfer (dtp, BT_INTEGER, p, kind, kind, 1);
2297 void
2298 transfer_integer_write (st_parameter_dt *dtp, void *p, int kind)
2300 transfer_integer (dtp, p, kind);
2303 void
2304 transfer_real (st_parameter_dt *dtp, void *p, int kind)
2306 size_t size;
2307 if ((dtp->common.flags & IOPARM_LIBRETURN_MASK) != IOPARM_LIBRETURN_OK)
2308 return;
2309 size = size_from_real_kind (kind);
2310 dtp->u.p.transfer (dtp, BT_REAL, p, kind, size, 1);
2313 void
2314 transfer_real_write (st_parameter_dt *dtp, void *p, int kind)
2316 transfer_real (dtp, p, kind);
2319 void
2320 transfer_logical (st_parameter_dt *dtp, void *p, int kind)
2322 if ((dtp->common.flags & IOPARM_LIBRETURN_MASK) != IOPARM_LIBRETURN_OK)
2323 return;
2324 dtp->u.p.transfer (dtp, BT_LOGICAL, p, kind, kind, 1);
2327 void
2328 transfer_logical_write (st_parameter_dt *dtp, void *p, int kind)
2330 transfer_logical (dtp, p, kind);
2333 void
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)
2339 return;
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)
2345 p = empty_string;
2347 /* Set kind here to 1. */
2348 dtp->u.p.transfer (dtp, BT_CHARACTER, p, 1, len, 1);
2351 void
2352 transfer_character_write (st_parameter_dt *dtp, void *p, int len)
2354 transfer_character (dtp, p, len);
2357 void
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)
2363 return;
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)
2369 p = empty_string;
2371 /* Here we pass the actual kind value. */
2372 dtp->u.p.transfer (dtp, BT_CHARACTER, p, kind, len, 1);
2375 void
2376 transfer_character_wide_write (st_parameter_dt *dtp, void *p, int len, int kind)
2378 transfer_character_wide (dtp, p, len, kind);
2381 void
2382 transfer_complex (st_parameter_dt *dtp, void *p, int kind)
2384 size_t size;
2385 if ((dtp->common.flags & IOPARM_LIBRETURN_MASK) != IOPARM_LIBRETURN_OK)
2386 return;
2387 size = size_from_complex_kind (kind);
2388 dtp->u.p.transfer (dtp, BT_COMPLEX, p, kind, size, 1);
2391 void
2392 transfer_complex_write (st_parameter_dt *dtp, void *p, int kind)
2394 transfer_complex (dtp, p, kind);
2397 void
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;
2405 size_t tsize;
2406 char *data;
2407 bt iotype;
2409 if ((dtp->common.flags & IOPARM_LIBRETURN_MASK) != IOPARM_LIBRETURN_OK)
2410 return;
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++)
2418 count[n] = 0;
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. */
2425 if (extent[n] <= 0)
2427 data = NULL;
2428 tsize = 0;
2429 dtp->u.p.transfer (dtp, iotype, data, kind, size, tsize);
2430 return;
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)
2439 tsize = extent[0];
2440 else
2441 tsize = 1;
2443 data = GFC_DESCRIPTOR_DATA (desc);
2445 while (data)
2447 dtp->u.p.transfer (dtp, iotype, data, kind, size, tsize);
2448 data += stride0 * tsize;
2449 count[0] += tsize;
2450 n = 0;
2451 while (count[n] == extent[n])
2453 count[n] = 0;
2454 data -= stride[n] * extent[n];
2455 n++;
2456 if (n == rank)
2458 data = NULL;
2459 break;
2461 else
2463 count[n]++;
2464 data += stride[n];
2470 void
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
2482 void
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;
2489 else
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. */
2498 static void
2499 us_read (st_parameter_dt *dtp, int continued)
2501 ssize_t n, nr;
2502 GFC_INTEGER_4 i4;
2503 GFC_INTEGER_8 i8;
2504 gfc_offset i;
2506 if (compile_options.record_marker == 0)
2507 n = sizeof (GFC_INTEGER_4);
2508 else
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);
2515 return;
2517 else if (nr == 0)
2519 hit_eof (dtp);
2520 return; /* end of file */
2522 else if (unlikely (n != nr))
2524 generate_error (&dtp->common, LIBERROR_BAD_US, NULL);
2525 return;
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))
2531 switch (nr)
2533 case sizeof(GFC_INTEGER_4):
2534 memcpy (&i4, &i, sizeof (i4));
2535 i = i4;
2536 break;
2538 case sizeof(GFC_INTEGER_8):
2539 memcpy (&i8, &i, sizeof (i8));
2540 i = i8;
2541 break;
2543 default:
2544 runtime_error ("Illegal value for record marker");
2545 break;
2548 else
2550 uint32_t u32;
2551 uint64_t u64;
2552 switch (nr)
2554 case sizeof(GFC_INTEGER_4):
2555 memcpy (&u32, &i, sizeof (u32));
2556 u32 = __builtin_bswap32 (u32);
2557 memcpy (&i4, &u32, sizeof (i4));
2558 i = i4;
2559 break;
2561 case sizeof(GFC_INTEGER_8):
2562 memcpy (&u64, &i, sizeof (u64));
2563 u64 = __builtin_bswap64 (u64);
2564 memcpy (&i8, &u64, sizeof (i8));
2565 i = i8;
2566 break;
2568 default:
2569 runtime_error ("Illegal value for record marker");
2570 break;
2574 if (i >= 0)
2576 dtp->u.p.current_unit->bytes_left_subrecord = i;
2577 dtp->u.p.current_unit->continued = 0;
2579 else
2581 dtp->u.p.current_unit->bytes_left_subrecord = -i;
2582 dtp->u.p.current_unit->continued = 1;
2585 if (! continued)
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. */
2593 static void
2594 us_write (st_parameter_dt *dtp, int continued)
2596 ssize_t nbytes;
2597 gfc_offset dummy;
2599 dummy = 0;
2601 if (compile_options.record_marker == 0)
2602 nbytes = sizeof (GFC_INTEGER_4);
2603 else
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
2621 record. */
2623 static void
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. */
2637 break;
2639 case UNFORMATTED_SEQUENTIAL:
2640 if (dtp->u.p.mode == READING)
2641 us_read (dtp, 0);
2642 else
2643 us_write (dtp, 0);
2645 break;
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;
2651 break;
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. */
2661 static void
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;
2675 dtp->u.p.cc.len = 0;
2677 if ((dtp->common.flags & IOPARM_LIBRETURN_MASK) != IOPARM_LIBRETURN_OK)
2678 return;
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=...)");
2689 return;
2691 else if (dtp->u.p.current_unit->s == NULL)
2692 { /* Open the unit with some default flags. */
2693 st_parameter_open opp;
2694 unit_convert conv;
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;
2704 else
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;
2726 switch (conv)
2728 case GFC_CONVERT_NATIVE:
2729 case GFC_CONVERT_SWAP:
2730 break;
2732 case GFC_CONVERT_BIG:
2733 conv = __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ ? GFC_CONVERT_NATIVE : GFC_CONVERT_SWAP;
2734 break;
2736 case GFC_CONVERT_LITTLE:
2737 conv = __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ ? GFC_CONVERT_SWAP : GFC_CONVERT_NATIVE;
2738 break;
2740 default:
2741 internal_error (&opp.common, "Illegal value for CONVERT");
2742 break;
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)
2753 return;
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;
2764 else
2765 dtp->u.p.current_unit->has_size = false;
2768 /* Check the action. */
2770 if (read_flag && dtp->u.p.current_unit->flags.action == ACTION_WRITE)
2772 generate_error (&dtp->common, LIBERROR_BAD_ACTION,
2773 "Cannot read from file opened for WRITE");
2774 return;
2777 if (!read_flag && dtp->u.p.current_unit->flags.action == ACTION_READ)
2779 generate_error (&dtp->common, LIBERROR_BAD_ACTION,
2780 "Cannot write to file opened for READ");
2781 return;
2784 dtp->u.p.first_item = 1;
2786 /* Check the format. */
2788 if ((cf & IOPARM_DT_HAS_FORMAT) != 0)
2789 parse_format (dtp);
2791 if (dtp->u.p.current_unit->flags.form == FORM_UNFORMATTED
2792 && (cf & (IOPARM_DT_HAS_FORMAT | IOPARM_DT_LIST_FORMAT))
2793 != 0)
2795 generate_error (&dtp->common, LIBERROR_OPTION_CONFLICT,
2796 "Format present for UNFORMATTED data transfer");
2797 return;
2800 if ((cf & IOPARM_DT_HAS_NAMELIST_NAME) != 0 && dtp->u.p.ionml != NULL)
2802 if ((cf & IOPARM_DT_HAS_FORMAT) != 0)
2804 generate_error (&dtp->common, LIBERROR_OPTION_CONFLICT,
2805 "A format cannot be specified with a namelist");
2806 return;
2809 else if (dtp->u.p.current_unit->flags.form == FORM_FORMATTED &&
2810 !(cf & (IOPARM_DT_HAS_FORMAT | IOPARM_DT_LIST_FORMAT)))
2812 generate_error (&dtp->common, LIBERROR_OPTION_CONFLICT,
2813 "Missing format for FORMATTED data transfer");
2814 return;
2817 if (is_internal_unit (dtp)
2818 && dtp->u.p.current_unit->flags.form == FORM_UNFORMATTED)
2820 generate_error (&dtp->common, LIBERROR_OPTION_CONFLICT,
2821 "Internal file cannot be accessed by UNFORMATTED "
2822 "data transfer");
2823 return;
2826 /* Check the record or position number. */
2828 if (dtp->u.p.current_unit->flags.access == ACCESS_DIRECT
2829 && (cf & IOPARM_DT_HAS_REC) == 0)
2831 generate_error (&dtp->common, LIBERROR_MISSING_OPTION,
2832 "Direct access data transfer requires record number");
2833 return;
2836 if (dtp->u.p.current_unit->flags.access == ACCESS_SEQUENTIAL)
2838 if ((cf & IOPARM_DT_HAS_REC) != 0)
2840 generate_error (&dtp->common, LIBERROR_OPTION_CONFLICT,
2841 "Record number not allowed for sequential access "
2842 "data transfer");
2843 return;
2846 if (compile_options.warn_std &&
2847 dtp->u.p.current_unit->endfile == AFTER_ENDFILE)
2849 generate_error (&dtp->common, LIBERROR_OPTION_CONFLICT,
2850 "Sequential READ or WRITE not allowed after "
2851 "EOF marker, possibly use REWIND or BACKSPACE");
2852 return;
2856 /* Process the ADVANCE option. */
2858 dtp->u.p.advance_status
2859 = !(cf & IOPARM_DT_HAS_ADVANCE) ? ADVANCE_UNSPECIFIED :
2860 find_option (&dtp->common, dtp->advance, dtp->advance_len, advance_opt,
2861 "Bad ADVANCE parameter in data transfer statement");
2863 if (dtp->u.p.advance_status != ADVANCE_UNSPECIFIED)
2865 if (dtp->u.p.current_unit->flags.access == ACCESS_DIRECT)
2867 generate_error (&dtp->common, LIBERROR_OPTION_CONFLICT,
2868 "ADVANCE specification conflicts with sequential "
2869 "access");
2870 return;
2873 if (is_internal_unit (dtp))
2875 generate_error (&dtp->common, LIBERROR_OPTION_CONFLICT,
2876 "ADVANCE specification conflicts with internal file");
2877 return;
2880 if ((cf & (IOPARM_DT_HAS_FORMAT | IOPARM_DT_LIST_FORMAT))
2881 != IOPARM_DT_HAS_FORMAT)
2883 generate_error (&dtp->common, LIBERROR_OPTION_CONFLICT,
2884 "ADVANCE specification requires an explicit format");
2885 return;
2889 /* Child IO is non-advancing and any ADVANCE= specifier is ignored.
2890 F2008 9.6.2.4 */
2891 if (dtp->u.p.current_unit->child_dtio > 0)
2892 dtp->u.p.advance_status = ADVANCE_NO;
2894 if (read_flag)
2896 dtp->u.p.current_unit->previous_nonadvancing_write = 0;
2898 if ((cf & IOPARM_EOR) != 0 && dtp->u.p.advance_status != ADVANCE_NO)
2900 generate_error (&dtp->common, LIBERROR_MISSING_OPTION,
2901 "EOR specification requires an ADVANCE specification "
2902 "of NO");
2903 return;
2906 if ((cf & IOPARM_DT_HAS_SIZE) != 0
2907 && dtp->u.p.advance_status != ADVANCE_NO)
2909 generate_error (&dtp->common, LIBERROR_MISSING_OPTION,
2910 "SIZE specification requires an ADVANCE "
2911 "specification of NO");
2912 return;
2915 else
2916 { /* Write constraints. */
2917 if ((cf & IOPARM_END) != 0)
2919 generate_error (&dtp->common, LIBERROR_OPTION_CONFLICT,
2920 "END specification cannot appear in a write "
2921 "statement");
2922 return;
2925 if ((cf & IOPARM_EOR) != 0)
2927 generate_error (&dtp->common, LIBERROR_OPTION_CONFLICT,
2928 "EOR specification cannot appear in a write "
2929 "statement");
2930 return;
2933 if ((cf & IOPARM_DT_HAS_SIZE) != 0)
2935 generate_error (&dtp->common, LIBERROR_OPTION_CONFLICT,
2936 "SIZE specification cannot appear in a write "
2937 "statement");
2938 return;
2942 if (dtp->u.p.advance_status == ADVANCE_UNSPECIFIED)
2943 dtp->u.p.advance_status = ADVANCE_YES;
2945 /* Check the decimal mode. */
2946 dtp->u.p.current_unit->decimal_status
2947 = !(cf & IOPARM_DT_HAS_DECIMAL) ? DECIMAL_UNSPECIFIED :
2948 find_option (&dtp->common, dtp->decimal, dtp->decimal_len,
2949 decimal_opt, "Bad DECIMAL parameter in data transfer "
2950 "statement");
2952 if (dtp->u.p.current_unit->decimal_status == DECIMAL_UNSPECIFIED)
2953 dtp->u.p.current_unit->decimal_status = dtp->u.p.current_unit->flags.decimal;
2955 /* Check the round mode. */
2956 dtp->u.p.current_unit->round_status
2957 = !(cf & IOPARM_DT_HAS_ROUND) ? ROUND_UNSPECIFIED :
2958 find_option (&dtp->common, dtp->round, dtp->round_len,
2959 round_opt, "Bad ROUND parameter in data transfer "
2960 "statement");
2962 if (dtp->u.p.current_unit->round_status == ROUND_UNSPECIFIED)
2963 dtp->u.p.current_unit->round_status = dtp->u.p.current_unit->flags.round;
2965 /* Check the sign mode. */
2966 dtp->u.p.sign_status
2967 = !(cf & IOPARM_DT_HAS_SIGN) ? SIGN_UNSPECIFIED :
2968 find_option (&dtp->common, dtp->sign, dtp->sign_len, sign_opt,
2969 "Bad SIGN parameter in data transfer statement");
2971 if (dtp->u.p.sign_status == SIGN_UNSPECIFIED)
2972 dtp->u.p.sign_status = dtp->u.p.current_unit->flags.sign;
2974 /* Check the blank mode. */
2975 dtp->u.p.blank_status
2976 = !(cf & IOPARM_DT_HAS_BLANK) ? BLANK_UNSPECIFIED :
2977 find_option (&dtp->common, dtp->blank, dtp->blank_len,
2978 blank_opt,
2979 "Bad BLANK parameter in data transfer statement");
2981 if (dtp->u.p.blank_status == BLANK_UNSPECIFIED)
2982 dtp->u.p.blank_status = dtp->u.p.current_unit->flags.blank;
2984 /* Check the delim mode. */
2985 dtp->u.p.current_unit->delim_status
2986 = !(cf & IOPARM_DT_HAS_DELIM) ? DELIM_UNSPECIFIED :
2987 find_option (&dtp->common, dtp->delim, dtp->delim_len,
2988 delim_opt, "Bad DELIM parameter in data transfer statement");
2990 if (dtp->u.p.current_unit->delim_status == DELIM_UNSPECIFIED)
2992 if (ionml && dtp->u.p.current_unit->flags.delim == DELIM_UNSPECIFIED)
2993 dtp->u.p.current_unit->delim_status = DELIM_QUOTE;
2994 else
2995 dtp->u.p.current_unit->delim_status = dtp->u.p.current_unit->flags.delim;
2998 /* Check the pad mode. */
2999 dtp->u.p.current_unit->pad_status
3000 = !(cf & IOPARM_DT_HAS_PAD) ? PAD_UNSPECIFIED :
3001 find_option (&dtp->common, dtp->pad, dtp->pad_len, pad_opt,
3002 "Bad PAD parameter in data transfer statement");
3004 if (dtp->u.p.current_unit->pad_status == PAD_UNSPECIFIED)
3005 dtp->u.p.current_unit->pad_status = dtp->u.p.current_unit->flags.pad;
3007 /* Check to see if we might be reading what we wrote before */
3009 if (dtp->u.p.mode != dtp->u.p.current_unit->mode
3010 && !is_internal_unit (dtp))
3012 int pos = fbuf_reset (dtp->u.p.current_unit);
3013 if (pos != 0)
3014 sseek (dtp->u.p.current_unit->s, pos, SEEK_CUR);
3015 sflush(dtp->u.p.current_unit->s);
3018 /* Check the POS= specifier: that it is in range and that it is used with a
3019 unit that has been connected for STREAM access. F2003 9.5.1.10. */
3021 if (((cf & IOPARM_DT_HAS_POS) != 0))
3023 if (is_stream_io (dtp))
3026 if (dtp->pos <= 0)
3028 generate_error (&dtp->common, LIBERROR_BAD_OPTION,
3029 "POS=specifier must be positive");
3030 return;
3033 if (dtp->pos >= dtp->u.p.current_unit->maxrec)
3035 generate_error (&dtp->common, LIBERROR_BAD_OPTION,
3036 "POS=specifier too large");
3037 return;
3040 dtp->rec = dtp->pos;
3042 if (dtp->u.p.mode == READING)
3044 /* Reset the endfile flag; if we hit EOF during reading
3045 we'll set the flag and generate an error at that point
3046 rather than worrying about it here. */
3047 dtp->u.p.current_unit->endfile = NO_ENDFILE;
3050 if (dtp->pos != dtp->u.p.current_unit->strm_pos)
3052 fbuf_flush (dtp->u.p.current_unit, dtp->u.p.mode);
3053 if (sseek (dtp->u.p.current_unit->s, dtp->pos - 1, SEEK_SET) < 0)
3055 generate_error (&dtp->common, LIBERROR_OS, NULL);
3056 return;
3058 dtp->u.p.current_unit->strm_pos = dtp->pos;
3061 else
3063 generate_error (&dtp->common, LIBERROR_BAD_OPTION,
3064 "POS=specifier not allowed, "
3065 "Try OPEN with ACCESS='stream'");
3066 return;
3071 /* Sanity checks on the record number. */
3072 if ((cf & IOPARM_DT_HAS_REC) != 0)
3074 if (dtp->rec <= 0)
3076 generate_error (&dtp->common, LIBERROR_BAD_OPTION,
3077 "Record number must be positive");
3078 return;
3081 if (dtp->rec >= dtp->u.p.current_unit->maxrec)
3083 generate_error (&dtp->common, LIBERROR_BAD_OPTION,
3084 "Record number too large");
3085 return;
3088 /* Make sure format buffer is reset. */
3089 if (dtp->u.p.current_unit->flags.form == FORM_FORMATTED)
3090 fbuf_reset (dtp->u.p.current_unit);
3093 /* Check whether the record exists to be read. Only
3094 a partial record needs to exist. */
3096 if (dtp->u.p.mode == READING && (dtp->rec - 1)
3097 * dtp->u.p.current_unit->recl >= ssize (dtp->u.p.current_unit->s))
3099 generate_error (&dtp->common, LIBERROR_BAD_OPTION,
3100 "Non-existing record number");
3101 return;
3104 /* Position the file. */
3105 if (sseek (dtp->u.p.current_unit->s, (gfc_offset) (dtp->rec - 1)
3106 * dtp->u.p.current_unit->recl, SEEK_SET) < 0)
3108 generate_error (&dtp->common, LIBERROR_OS, NULL);
3109 return;
3112 if (dtp->u.p.current_unit->flags.access == ACCESS_STREAM)
3114 generate_error (&dtp->common, LIBERROR_OPTION_CONFLICT,
3115 "Record number not allowed for stream access "
3116 "data transfer");
3117 return;
3121 /* Bugware for badly written mixed C-Fortran I/O. */
3122 if (!is_internal_unit (dtp))
3123 flush_if_preconnected(dtp->u.p.current_unit->s);
3125 dtp->u.p.current_unit->mode = dtp->u.p.mode;
3127 /* Set the maximum position reached from the previous I/O operation. This
3128 could be greater than zero from a previous non-advancing write. */
3129 dtp->u.p.max_pos = dtp->u.p.current_unit->saved_pos;
3131 pre_position (dtp);
3134 /* Set up the subroutine that will handle the transfers. */
3136 if (read_flag)
3138 if (dtp->u.p.current_unit->flags.form == FORM_UNFORMATTED)
3139 dtp->u.p.transfer = unformatted_read;
3140 else
3142 if ((cf & IOPARM_DT_LIST_FORMAT) != 0)
3144 if (dtp->u.p.current_unit->child_dtio == 0)
3145 dtp->u.p.current_unit->last_char = EOF - 1;
3146 dtp->u.p.transfer = list_formatted_read;
3148 else
3149 dtp->u.p.transfer = formatted_transfer;
3152 else
3154 if (dtp->u.p.current_unit->flags.form == FORM_UNFORMATTED)
3155 dtp->u.p.transfer = unformatted_write;
3156 else
3158 if ((cf & IOPARM_DT_LIST_FORMAT) != 0)
3159 dtp->u.p.transfer = list_formatted_write;
3160 else
3161 dtp->u.p.transfer = formatted_transfer;
3165 /* Make sure that we don't do a read after a nonadvancing write. */
3167 if (read_flag)
3169 if (dtp->u.p.current_unit->read_bad && !is_stream_io (dtp))
3171 generate_error (&dtp->common, LIBERROR_BAD_OPTION,
3172 "Cannot READ after a nonadvancing WRITE");
3173 return;
3176 else
3178 if (dtp->u.p.advance_status == ADVANCE_YES && !dtp->u.p.seen_dollar)
3179 dtp->u.p.current_unit->read_bad = 1;
3182 if (dtp->u.p.current_unit->flags.form == FORM_FORMATTED)
3184 #ifdef HAVE_USELOCALE
3185 dtp->u.p.old_locale = uselocale (c_locale);
3186 #else
3187 __gthread_mutex_lock (&old_locale_lock);
3188 if (!old_locale_ctr++)
3190 old_locale = setlocale (LC_NUMERIC, NULL);
3191 setlocale (LC_NUMERIC, "C");
3193 __gthread_mutex_unlock (&old_locale_lock);
3194 #endif
3195 /* Start the data transfer if we are doing a formatted transfer. */
3196 if ((cf & (IOPARM_DT_LIST_FORMAT | IOPARM_DT_HAS_NAMELIST_NAME)) == 0
3197 && dtp->u.p.ionml == NULL)
3198 formatted_transfer (dtp, 0, NULL, 0, 0, 1);
3203 /* Initialize an array_loop_spec given the array descriptor. The function
3204 returns the index of the last element of the array, and also returns
3205 starting record, where the first I/O goes to (necessary in case of
3206 negative strides). */
3208 gfc_offset
3209 init_loop_spec (gfc_array_char *desc, array_loop_spec *ls,
3210 gfc_offset *start_record)
3212 int rank = GFC_DESCRIPTOR_RANK(desc);
3213 int i;
3214 gfc_offset index;
3215 int empty;
3217 empty = 0;
3218 index = 1;
3219 *start_record = 0;
3221 for (i=0; i<rank; i++)
3223 ls[i].idx = GFC_DESCRIPTOR_LBOUND(desc,i);
3224 ls[i].start = GFC_DESCRIPTOR_LBOUND(desc,i);
3225 ls[i].end = GFC_DESCRIPTOR_UBOUND(desc,i);
3226 ls[i].step = GFC_DESCRIPTOR_STRIDE(desc,i);
3227 empty = empty || (GFC_DESCRIPTOR_UBOUND(desc,i)
3228 < GFC_DESCRIPTOR_LBOUND(desc,i));
3230 if (GFC_DESCRIPTOR_STRIDE(desc,i) > 0)
3232 index += (GFC_DESCRIPTOR_EXTENT(desc,i) - 1)
3233 * GFC_DESCRIPTOR_STRIDE(desc,i);
3235 else
3237 index -= (GFC_DESCRIPTOR_EXTENT(desc,i) - 1)
3238 * GFC_DESCRIPTOR_STRIDE(desc,i);
3239 *start_record -= (GFC_DESCRIPTOR_EXTENT(desc,i) - 1)
3240 * GFC_DESCRIPTOR_STRIDE(desc,i);
3244 if (empty)
3245 return 0;
3246 else
3247 return index;
3250 /* Determine the index to the next record in an internal unit array by
3251 by incrementing through the array_loop_spec. */
3253 gfc_offset
3254 next_array_record (st_parameter_dt *dtp, array_loop_spec *ls, int *finished)
3256 int i, carry;
3257 gfc_offset index;
3259 carry = 1;
3260 index = 0;
3262 for (i = 0; i < dtp->u.p.current_unit->rank; i++)
3264 if (carry)
3266 ls[i].idx++;
3267 if (ls[i].idx > ls[i].end)
3269 ls[i].idx = ls[i].start;
3270 carry = 1;
3272 else
3273 carry = 0;
3275 index = index + (ls[i].idx - ls[i].start) * ls[i].step;
3278 *finished = carry;
3280 return index;
3285 /* Skip to the end of the current record, taking care of an optional
3286 record marker of size bytes. If the file is not seekable, we
3287 read chunks of size MAX_READ until we get to the right
3288 position. */
3290 static void
3291 skip_record (st_parameter_dt *dtp, gfc_offset bytes)
3293 ssize_t rlength, readb;
3294 #define MAX_READ 4096
3295 char p[MAX_READ];
3297 dtp->u.p.current_unit->bytes_left_subrecord += bytes;
3298 if (dtp->u.p.current_unit->bytes_left_subrecord == 0)
3299 return;
3301 /* Direct access files do not generate END conditions,
3302 only I/O errors. */
3303 if (sseek (dtp->u.p.current_unit->s,
3304 dtp->u.p.current_unit->bytes_left_subrecord, SEEK_CUR) < 0)
3306 /* Seeking failed, fall back to seeking by reading data. */
3307 while (dtp->u.p.current_unit->bytes_left_subrecord > 0)
3309 rlength =
3310 (MAX_READ < dtp->u.p.current_unit->bytes_left_subrecord) ?
3311 MAX_READ : dtp->u.p.current_unit->bytes_left_subrecord;
3313 readb = sread (dtp->u.p.current_unit->s, p, rlength);
3314 if (readb < 0)
3316 generate_error (&dtp->common, LIBERROR_OS, NULL);
3317 return;
3320 dtp->u.p.current_unit->bytes_left_subrecord -= readb;
3322 return;
3324 dtp->u.p.current_unit->bytes_left_subrecord = 0;
3328 /* Advance to the next record reading unformatted files, taking
3329 care of subrecords. If complete_record is nonzero, we loop
3330 until all subrecords are cleared. */
3332 static void
3333 next_record_r_unf (st_parameter_dt *dtp, int complete_record)
3335 size_t bytes;
3337 bytes = compile_options.record_marker == 0 ?
3338 sizeof (GFC_INTEGER_4) : compile_options.record_marker;
3340 while(1)
3343 /* Skip over tail */
3345 skip_record (dtp, bytes);
3347 if ( ! (complete_record && dtp->u.p.current_unit->continued))
3348 return;
3350 us_read (dtp, 1);
3355 static gfc_offset
3356 min_off (gfc_offset a, gfc_offset b)
3358 return (a < b ? a : b);
3362 /* Space to the next record for read mode. */
3364 static void
3365 next_record_r (st_parameter_dt *dtp, int done)
3367 gfc_offset record;
3368 char p;
3369 int cc;
3371 switch (current_mode (dtp))
3373 /* No records in unformatted STREAM I/O. */
3374 case UNFORMATTED_STREAM:
3375 return;
3377 case UNFORMATTED_SEQUENTIAL:
3378 next_record_r_unf (dtp, 1);
3379 dtp->u.p.current_unit->bytes_left = dtp->u.p.current_unit->recl;
3380 break;
3382 case FORMATTED_DIRECT:
3383 case UNFORMATTED_DIRECT:
3384 skip_record (dtp, dtp->u.p.current_unit->bytes_left);
3385 break;
3387 case FORMATTED_STREAM:
3388 case FORMATTED_SEQUENTIAL:
3389 /* read_sf has already terminated input because of an '\n', or
3390 we have hit EOF. */
3391 if (dtp->u.p.sf_seen_eor)
3393 dtp->u.p.sf_seen_eor = 0;
3394 break;
3397 if (is_internal_unit (dtp))
3399 if (is_array_io (dtp))
3401 int finished;
3403 record = next_array_record (dtp, dtp->u.p.current_unit->ls,
3404 &finished);
3405 if (!done && finished)
3406 hit_eof (dtp);
3408 /* Now seek to this record. */
3409 record = record * dtp->u.p.current_unit->recl;
3410 if (sseek (dtp->u.p.current_unit->s, record, SEEK_SET) < 0)
3412 generate_error (&dtp->common, LIBERROR_INTERNAL_UNIT, NULL);
3413 break;
3415 dtp->u.p.current_unit->bytes_left = dtp->u.p.current_unit->recl;
3417 else
3419 gfc_offset bytes_left = dtp->u.p.current_unit->bytes_left;
3420 bytes_left = min_off (bytes_left,
3421 ssize (dtp->u.p.current_unit->s)
3422 - stell (dtp->u.p.current_unit->s));
3423 if (sseek (dtp->u.p.current_unit->s,
3424 bytes_left, SEEK_CUR) < 0)
3426 generate_error (&dtp->common, LIBERROR_INTERNAL_UNIT, NULL);
3427 break;
3429 dtp->u.p.current_unit->bytes_left
3430 = dtp->u.p.current_unit->recl;
3432 break;
3434 else if (dtp->u.p.current_unit->flags.cc != CC_NONE)
3438 errno = 0;
3439 cc = fbuf_getc (dtp->u.p.current_unit);
3440 if (cc == EOF)
3442 if (errno != 0)
3443 generate_error (&dtp->common, LIBERROR_OS, NULL);
3444 else
3446 if (is_stream_io (dtp)
3447 || dtp->u.p.current_unit->pad_status == PAD_NO
3448 || dtp->u.p.current_unit->bytes_left
3449 == dtp->u.p.current_unit->recl)
3450 hit_eof (dtp);
3452 break;
3455 if (is_stream_io (dtp))
3456 dtp->u.p.current_unit->strm_pos++;
3458 p = (char) cc;
3460 while (p != '\n');
3462 break;
3467 /* Small utility function to write a record marker, taking care of
3468 byte swapping and of choosing the correct size. */
3470 static int
3471 write_us_marker (st_parameter_dt *dtp, const gfc_offset buf)
3473 size_t len;
3474 GFC_INTEGER_4 buf4;
3475 GFC_INTEGER_8 buf8;
3477 if (compile_options.record_marker == 0)
3478 len = sizeof (GFC_INTEGER_4);
3479 else
3480 len = compile_options.record_marker;
3482 /* Only GFC_CONVERT_NATIVE and GFC_CONVERT_SWAP are valid here. */
3483 if (likely (dtp->u.p.current_unit->flags.convert == GFC_CONVERT_NATIVE))
3485 switch (len)
3487 case sizeof (GFC_INTEGER_4):
3488 buf4 = buf;
3489 return swrite (dtp->u.p.current_unit->s, &buf4, len);
3490 break;
3492 case sizeof (GFC_INTEGER_8):
3493 buf8 = buf;
3494 return swrite (dtp->u.p.current_unit->s, &buf8, len);
3495 break;
3497 default:
3498 runtime_error ("Illegal value for record marker");
3499 break;
3502 else
3504 uint32_t u32;
3505 uint64_t u64;
3506 switch (len)
3508 case sizeof (GFC_INTEGER_4):
3509 buf4 = buf;
3510 memcpy (&u32, &buf4, sizeof (u32));
3511 u32 = __builtin_bswap32 (u32);
3512 return swrite (dtp->u.p.current_unit->s, &u32, len);
3513 break;
3515 case sizeof (GFC_INTEGER_8):
3516 buf8 = buf;
3517 memcpy (&u64, &buf8, sizeof (u64));
3518 u64 = __builtin_bswap64 (u64);
3519 return swrite (dtp->u.p.current_unit->s, &u64, len);
3520 break;
3522 default:
3523 runtime_error ("Illegal value for record marker");
3524 break;
3530 /* Position to the next (sub)record in write mode for
3531 unformatted sequential files. */
3533 static void
3534 next_record_w_unf (st_parameter_dt *dtp, int next_subrecord)
3536 gfc_offset m, m_write, record_marker;
3538 /* Bytes written. */
3539 m = dtp->u.p.current_unit->recl_subrecord
3540 - dtp->u.p.current_unit->bytes_left_subrecord;
3542 if (compile_options.record_marker == 0)
3543 record_marker = sizeof (GFC_INTEGER_4);
3544 else
3545 record_marker = compile_options.record_marker;
3547 /* Seek to the head and overwrite the bogus length with the real
3548 length. */
3550 if (unlikely (sseek (dtp->u.p.current_unit->s, - m - record_marker,
3551 SEEK_CUR) < 0))
3552 goto io_error;
3554 if (next_subrecord)
3555 m_write = -m;
3556 else
3557 m_write = m;
3559 if (unlikely (write_us_marker (dtp, m_write) < 0))
3560 goto io_error;
3562 /* Seek past the end of the current record. */
3564 if (unlikely (sseek (dtp->u.p.current_unit->s, m, SEEK_CUR) < 0))
3565 goto io_error;
3567 /* Write the length tail. If we finish a record containing
3568 subrecords, we write out the negative length. */
3570 if (dtp->u.p.current_unit->continued)
3571 m_write = -m;
3572 else
3573 m_write = m;
3575 if (unlikely (write_us_marker (dtp, m_write) < 0))
3576 goto io_error;
3578 return;
3580 io_error:
3581 generate_error (&dtp->common, LIBERROR_OS, NULL);
3582 return;
3587 /* Utility function like memset() but operating on streams. Return
3588 value is same as for POSIX write(). */
3590 static gfc_offset
3591 sset (stream *s, int c, gfc_offset nbyte)
3593 #define WRITE_CHUNK 256
3594 char p[WRITE_CHUNK];
3595 gfc_offset bytes_left;
3596 ssize_t trans;
3598 if (nbyte < WRITE_CHUNK)
3599 memset (p, c, nbyte);
3600 else
3601 memset (p, c, WRITE_CHUNK);
3603 bytes_left = nbyte;
3604 while (bytes_left > 0)
3606 trans = (bytes_left < WRITE_CHUNK) ? bytes_left : WRITE_CHUNK;
3607 trans = swrite (s, p, trans);
3608 if (trans <= 0)
3609 return trans;
3610 bytes_left -= trans;
3613 return nbyte - bytes_left;
3617 /* Finish up a record according to the legacy carriagecontrol type, based
3618 on the first character in the record. */
3620 static void
3621 next_record_cc (st_parameter_dt *dtp)
3623 /* Only valid with CARRIAGECONTROL=FORTRAN. */
3624 if (dtp->u.p.current_unit->flags.cc != CC_FORTRAN)
3625 return;
3627 fbuf_seek (dtp->u.p.current_unit, 0, SEEK_END);
3628 if (dtp->u.p.cc.len > 0)
3630 char *p = fbuf_alloc (dtp->u.p.current_unit, dtp->u.p.cc.len);
3631 if (!p)
3632 generate_error (&dtp->common, LIBERROR_OS, NULL);
3634 /* Output CR for the first character with default CC setting. */
3635 *(p++) = dtp->u.p.cc.u.end;
3636 if (dtp->u.p.cc.len > 1)
3637 *p = dtp->u.p.cc.u.end;
3641 /* Position to the next record in write mode. */
3643 static void
3644 next_record_w (st_parameter_dt *dtp, int done)
3646 gfc_offset max_pos_off;
3648 /* Zero counters for X- and T-editing. */
3649 max_pos_off = dtp->u.p.max_pos;
3650 dtp->u.p.max_pos = dtp->u.p.skips = dtp->u.p.pending_spaces = 0;
3652 switch (current_mode (dtp))
3654 /* No records in unformatted STREAM I/O. */
3655 case UNFORMATTED_STREAM:
3656 return;
3658 case FORMATTED_DIRECT:
3659 if (dtp->u.p.current_unit->bytes_left == 0)
3660 break;
3662 fbuf_seek (dtp->u.p.current_unit, 0, SEEK_END);
3663 fbuf_flush (dtp->u.p.current_unit, WRITING);
3664 if (sset (dtp->u.p.current_unit->s, ' ',
3665 dtp->u.p.current_unit->bytes_left)
3666 != dtp->u.p.current_unit->bytes_left)
3667 goto io_error;
3669 break;
3671 case UNFORMATTED_DIRECT:
3672 if (dtp->u.p.current_unit->bytes_left > 0)
3674 gfc_offset length = dtp->u.p.current_unit->bytes_left;
3675 if (sset (dtp->u.p.current_unit->s, 0, length) != length)
3676 goto io_error;
3678 break;
3680 case UNFORMATTED_SEQUENTIAL:
3681 next_record_w_unf (dtp, 0);
3682 dtp->u.p.current_unit->bytes_left = dtp->u.p.current_unit->recl;
3683 break;
3685 case FORMATTED_STREAM:
3686 case FORMATTED_SEQUENTIAL:
3688 if (is_internal_unit (dtp))
3690 char *p;
3691 /* Internal unit, so must fit in memory. */
3692 ptrdiff_t length, m, record;
3693 ptrdiff_t max_pos = max_pos_off;
3694 if (is_array_io (dtp))
3696 int finished;
3698 length = dtp->u.p.current_unit->bytes_left;
3700 /* If the farthest position reached is greater than current
3701 position, adjust the position and set length to pad out
3702 whats left. Otherwise just pad whats left.
3703 (for character array unit) */
3704 m = dtp->u.p.current_unit->recl
3705 - dtp->u.p.current_unit->bytes_left;
3706 if (max_pos > m)
3708 length = (max_pos - m);
3709 if (sseek (dtp->u.p.current_unit->s,
3710 length, SEEK_CUR) < 0)
3712 generate_error (&dtp->common, LIBERROR_INTERNAL_UNIT, NULL);
3713 return;
3715 length = ((ptrdiff_t) dtp->u.p.current_unit->recl - max_pos);
3718 p = write_block (dtp, length);
3719 if (p == NULL)
3720 return;
3722 if (unlikely (is_char4_unit (dtp)))
3724 gfc_char4_t *p4 = (gfc_char4_t *) p;
3725 memset4 (p4, ' ', length);
3727 else
3728 memset (p, ' ', length);
3730 /* Now that the current record has been padded out,
3731 determine where the next record in the array is. */
3732 record = next_array_record (dtp, dtp->u.p.current_unit->ls,
3733 &finished);
3734 if (finished)
3735 dtp->u.p.current_unit->endfile = AT_ENDFILE;
3737 /* Now seek to this record */
3738 record = record * ((ptrdiff_t) dtp->u.p.current_unit->recl);
3740 if (sseek (dtp->u.p.current_unit->s, record, SEEK_SET) < 0)
3742 generate_error (&dtp->common, LIBERROR_INTERNAL_UNIT, NULL);
3743 return;
3746 dtp->u.p.current_unit->bytes_left = dtp->u.p.current_unit->recl;
3748 else
3750 length = 1;
3752 /* If this is the last call to next_record move to the farthest
3753 position reached and set length to pad out the remainder
3754 of the record. (for character scaler unit) */
3755 if (done)
3757 m = dtp->u.p.current_unit->recl
3758 - dtp->u.p.current_unit->bytes_left;
3759 if (max_pos > m)
3761 length = max_pos - m;
3762 if (sseek (dtp->u.p.current_unit->s,
3763 length, SEEK_CUR) < 0)
3765 generate_error (&dtp->common, LIBERROR_INTERNAL_UNIT, NULL);
3766 return;
3768 length = (ptrdiff_t) dtp->u.p.current_unit->recl
3769 - max_pos;
3771 else
3772 length = dtp->u.p.current_unit->bytes_left;
3774 if (length > 0)
3776 p = write_block (dtp, length);
3777 if (p == NULL)
3778 return;
3780 if (unlikely (is_char4_unit (dtp)))
3782 gfc_char4_t *p4 = (gfc_char4_t *) p;
3783 memset4 (p4, (gfc_char4_t) ' ', length);
3785 else
3786 memset (p, ' ', length);
3790 /* Handle legacy CARRIAGECONTROL line endings. */
3791 else if (dtp->u.p.current_unit->flags.cc == CC_FORTRAN)
3792 next_record_cc (dtp);
3793 else
3795 /* Skip newlines for CC=CC_NONE. */
3796 const int len = (dtp->u.p.current_unit->flags.cc == CC_NONE)
3798 #ifdef HAVE_CRLF
3799 : 2;
3800 #else
3801 : 1;
3802 #endif
3803 fbuf_seek (dtp->u.p.current_unit, 0, SEEK_END);
3804 if (dtp->u.p.current_unit->flags.cc != CC_NONE)
3806 char *p = fbuf_alloc (dtp->u.p.current_unit, len);
3807 if (!p)
3808 goto io_error;
3809 #ifdef HAVE_CRLF
3810 *(p++) = '\r';
3811 #endif
3812 *p = '\n';
3814 if (is_stream_io (dtp))
3816 dtp->u.p.current_unit->strm_pos += len;
3817 if (dtp->u.p.current_unit->strm_pos
3818 < ssize (dtp->u.p.current_unit->s))
3819 unit_truncate (dtp->u.p.current_unit,
3820 dtp->u.p.current_unit->strm_pos - 1,
3821 &dtp->common);
3825 break;
3827 io_error:
3828 generate_error (&dtp->common, LIBERROR_OS, NULL);
3829 break;
3833 /* Position to the next record, which means moving to the end of the
3834 current record. This can happen under several different
3835 conditions. If the done flag is not set, we get ready to process
3836 the next record. */
3838 void
3839 next_record (st_parameter_dt *dtp, int done)
3841 gfc_offset fp; /* File position. */
3843 dtp->u.p.current_unit->read_bad = 0;
3845 if (dtp->u.p.mode == READING)
3846 next_record_r (dtp, done);
3847 else
3848 next_record_w (dtp, done);
3850 fbuf_flush (dtp->u.p.current_unit, dtp->u.p.mode);
3852 if (!is_stream_io (dtp))
3854 /* Since we have changed the position, set it to unspecified so
3855 that INQUIRE(POSITION=) knows it needs to look into it. */
3856 if (done)
3857 dtp->u.p.current_unit->flags.position = POSITION_UNSPECIFIED;
3859 dtp->u.p.current_unit->current_record = 0;
3860 if (dtp->u.p.current_unit->flags.access == ACCESS_DIRECT)
3862 fp = stell (dtp->u.p.current_unit->s);
3863 /* Calculate next record, rounding up partial records. */
3864 dtp->u.p.current_unit->last_record =
3865 (fp + dtp->u.p.current_unit->recl) /
3866 dtp->u.p.current_unit->recl - 1;
3868 else
3869 dtp->u.p.current_unit->last_record++;
3872 if (!done)
3873 pre_position (dtp);
3875 smarkeor (dtp->u.p.current_unit->s);
3879 /* Finalize the current data transfer. For a nonadvancing transfer,
3880 this means advancing to the next record. For internal units close the
3881 stream associated with the unit. */
3883 static void
3884 finalize_transfer (st_parameter_dt *dtp)
3886 GFC_INTEGER_4 cf = dtp->common.flags;
3888 if ((dtp->u.p.ionml != NULL)
3889 && (cf & IOPARM_DT_HAS_NAMELIST_NAME) != 0)
3891 if ((cf & IOPARM_DT_NAMELIST_READ_MODE) != 0)
3892 namelist_read (dtp);
3893 else
3894 namelist_write (dtp);
3897 if ((dtp->common.flags & IOPARM_DT_HAS_SIZE) != 0)
3898 *dtp->size = dtp->u.p.current_unit->size_used;
3900 if (dtp->u.p.eor_condition)
3902 generate_error (&dtp->common, LIBERROR_EOR, NULL);
3903 goto done;
3906 if (dtp->u.p.current_unit && (dtp->u.p.current_unit->child_dtio > 0))
3908 if (cf & IOPARM_DT_HAS_FORMAT)
3910 free (dtp->u.p.fmt);
3911 free (dtp->format);
3913 return;
3916 if ((dtp->common.flags & IOPARM_LIBRETURN_MASK) != IOPARM_LIBRETURN_OK)
3918 if (dtp->u.p.current_unit && current_mode (dtp) == UNFORMATTED_SEQUENTIAL)
3919 dtp->u.p.current_unit->current_record = 0;
3920 goto done;
3923 dtp->u.p.transfer = NULL;
3924 if (dtp->u.p.current_unit == NULL)
3925 goto done;
3927 if ((cf & IOPARM_DT_LIST_FORMAT) != 0 && dtp->u.p.mode == READING)
3929 finish_list_read (dtp);
3930 goto done;
3933 if (dtp->u.p.mode == WRITING)
3934 dtp->u.p.current_unit->previous_nonadvancing_write
3935 = dtp->u.p.advance_status == ADVANCE_NO;
3937 if (is_stream_io (dtp))
3939 if (dtp->u.p.current_unit->flags.form == FORM_FORMATTED
3940 && dtp->u.p.advance_status != ADVANCE_NO)
3941 next_record (dtp, 1);
3943 goto done;
3946 dtp->u.p.current_unit->current_record = 0;
3948 if (!is_internal_unit (dtp) && dtp->u.p.seen_dollar)
3950 fbuf_flush (dtp->u.p.current_unit, dtp->u.p.mode);
3951 dtp->u.p.seen_dollar = 0;
3952 goto done;
3955 /* For non-advancing I/O, save the current maximum position for use in the
3956 next I/O operation if needed. */
3957 if (dtp->u.p.advance_status == ADVANCE_NO)
3959 if (dtp->u.p.skips > 0)
3961 int tmp;
3962 write_x (dtp, dtp->u.p.skips, dtp->u.p.pending_spaces);
3963 tmp = (int)(dtp->u.p.current_unit->recl
3964 - dtp->u.p.current_unit->bytes_left);
3965 dtp->u.p.max_pos =
3966 dtp->u.p.max_pos > tmp ? dtp->u.p.max_pos : tmp;
3967 dtp->u.p.skips = 0;
3969 int bytes_written = (int) (dtp->u.p.current_unit->recl
3970 - dtp->u.p.current_unit->bytes_left);
3971 dtp->u.p.current_unit->saved_pos =
3972 dtp->u.p.max_pos > 0 ? dtp->u.p.max_pos - bytes_written : 0;
3973 fbuf_flush (dtp->u.p.current_unit, dtp->u.p.mode);
3974 goto done;
3976 else if (dtp->u.p.current_unit->flags.form == FORM_FORMATTED
3977 && dtp->u.p.mode == WRITING && !is_internal_unit (dtp))
3978 fbuf_seek (dtp->u.p.current_unit, 0, SEEK_END);
3980 dtp->u.p.current_unit->saved_pos = 0;
3981 dtp->u.p.current_unit->last_char = EOF - 1;
3982 next_record (dtp, 1);
3984 done:
3985 #ifdef HAVE_USELOCALE
3986 if (dtp->u.p.old_locale != (locale_t) 0)
3988 uselocale (dtp->u.p.old_locale);
3989 dtp->u.p.old_locale = (locale_t) 0;
3991 #else
3992 __gthread_mutex_lock (&old_locale_lock);
3993 if (!--old_locale_ctr)
3995 setlocale (LC_NUMERIC, old_locale);
3996 old_locale = NULL;
3998 __gthread_mutex_unlock (&old_locale_lock);
3999 #endif
4002 /* Transfer function for IOLENGTH. It doesn't actually do any
4003 data transfer, it just updates the length counter. */
4005 static void
4006 iolength_transfer (st_parameter_dt *dtp, bt type __attribute__((unused)),
4007 void *dest __attribute__ ((unused)),
4008 int kind __attribute__((unused)),
4009 size_t size, size_t nelems)
4011 if ((dtp->common.flags & IOPARM_DT_HAS_IOLENGTH) != 0)
4012 *dtp->iolength += (GFC_IO_INT) (size * nelems);
4016 /* Initialize the IOLENGTH data transfer. This function is in essence
4017 a very much simplified version of data_transfer_init(), because it
4018 doesn't have to deal with units at all. */
4020 static void
4021 iolength_transfer_init (st_parameter_dt *dtp)
4023 if ((dtp->common.flags & IOPARM_DT_HAS_IOLENGTH) != 0)
4024 *dtp->iolength = 0;
4026 memset (&dtp->u.p, 0, sizeof (dtp->u.p));
4028 /* Set up the subroutine that will handle the transfers. */
4030 dtp->u.p.transfer = iolength_transfer;
4034 /* Library entry point for the IOLENGTH form of the INQUIRE
4035 statement. The IOLENGTH form requires no I/O to be performed, but
4036 it must still be a runtime library call so that we can determine
4037 the iolength for dynamic arrays and such. */
4039 extern void st_iolength (st_parameter_dt *);
4040 export_proto(st_iolength);
4042 void
4043 st_iolength (st_parameter_dt *dtp)
4045 library_start (&dtp->common);
4046 iolength_transfer_init (dtp);
4049 extern void st_iolength_done (st_parameter_dt *);
4050 export_proto(st_iolength_done);
4052 void
4053 st_iolength_done (st_parameter_dt *dtp __attribute__((unused)))
4055 free_ionml (dtp);
4056 library_end ();
4060 /* The READ statement. */
4062 extern void st_read (st_parameter_dt *);
4063 export_proto(st_read);
4065 void
4066 st_read (st_parameter_dt *dtp)
4068 library_start (&dtp->common);
4070 data_transfer_init (dtp, 1);
4073 extern void st_read_done (st_parameter_dt *);
4074 export_proto(st_read_done);
4076 void
4077 st_read_done (st_parameter_dt *dtp)
4079 finalize_transfer (dtp);
4081 free_ionml (dtp);
4083 /* If this is a parent READ statement we do not need to retain the
4084 internal unit structure for child use. */
4085 if (dtp->u.p.current_unit != NULL
4086 && dtp->u.p.current_unit->child_dtio == 0)
4088 if (is_internal_unit (dtp))
4090 if ((dtp->common.flags & IOPARM_DT_HAS_UDTIO) == 0)
4092 free (dtp->u.p.current_unit->filename);
4093 dtp->u.p.current_unit->filename = NULL;
4094 free (dtp->u.p.current_unit->s);
4095 dtp->u.p.current_unit->s = NULL;
4096 if (dtp->u.p.current_unit->ls)
4097 free (dtp->u.p.current_unit->ls);
4098 dtp->u.p.current_unit->ls = NULL;
4100 newunit_free (dtp->common.unit);
4102 if (is_internal_unit (dtp) || dtp->u.p.format_not_saved)
4104 free_format_data (dtp->u.p.fmt);
4105 free_format (dtp);
4107 unlock_unit (dtp->u.p.current_unit);
4110 library_end ();
4113 extern void st_write (st_parameter_dt *);
4114 export_proto(st_write);
4116 void
4117 st_write (st_parameter_dt *dtp)
4119 library_start (&dtp->common);
4120 data_transfer_init (dtp, 0);
4123 extern void st_write_done (st_parameter_dt *);
4124 export_proto(st_write_done);
4126 void
4127 st_write_done (st_parameter_dt *dtp)
4129 finalize_transfer (dtp);
4131 if (dtp->u.p.current_unit != NULL
4132 && dtp->u.p.current_unit->child_dtio == 0)
4134 /* Deal with endfile conditions associated with sequential files. */
4135 if (dtp->u.p.current_unit->flags.access == ACCESS_SEQUENTIAL)
4136 switch (dtp->u.p.current_unit->endfile)
4138 case AT_ENDFILE: /* Remain at the endfile record. */
4139 break;
4141 case AFTER_ENDFILE:
4142 dtp->u.p.current_unit->endfile = AT_ENDFILE; /* Just at it now. */
4143 break;
4145 case NO_ENDFILE:
4146 /* Get rid of whatever is after this record. */
4147 if (!is_internal_unit (dtp))
4148 unit_truncate (dtp->u.p.current_unit,
4149 stell (dtp->u.p.current_unit->s),
4150 &dtp->common);
4151 dtp->u.p.current_unit->endfile = AT_ENDFILE;
4152 break;
4155 free_ionml (dtp);
4157 /* If this is a parent WRITE statement we do not need to retain the
4158 internal unit structure for child use. */
4159 if (is_internal_unit (dtp))
4161 if ((dtp->common.flags & IOPARM_DT_HAS_UDTIO) == 0)
4163 free (dtp->u.p.current_unit->filename);
4164 dtp->u.p.current_unit->filename = NULL;
4165 free (dtp->u.p.current_unit->s);
4166 dtp->u.p.current_unit->s = NULL;
4167 if (dtp->u.p.current_unit->ls)
4168 free (dtp->u.p.current_unit->ls);
4169 dtp->u.p.current_unit->ls = NULL;
4171 newunit_free (dtp->common.unit);
4173 if (is_internal_unit (dtp) || dtp->u.p.format_not_saved)
4175 free_format_data (dtp->u.p.fmt);
4176 free_format (dtp);
4178 unlock_unit (dtp->u.p.current_unit);
4180 library_end ();
4184 /* F2003: This is a stub for the runtime portion of the WAIT statement. */
4185 void
4186 st_wait (st_parameter_wait *wtp __attribute__((unused)))
4191 /* Receives the scalar information for namelist objects and stores it
4192 in a linked list of namelist_info types. */
4194 static void
4195 set_nml_var (st_parameter_dt *dtp, void *var_addr, char *var_name,
4196 GFC_INTEGER_4 len, gfc_charlen_type string_length,
4197 GFC_INTEGER_4 dtype, void *dtio_sub, void *vtable)
4199 namelist_info *t1 = NULL;
4200 namelist_info *nml;
4201 size_t var_name_len = strlen (var_name);
4203 nml = (namelist_info*) xmalloc (sizeof (namelist_info));
4205 nml->mem_pos = var_addr;
4206 nml->dtio_sub = dtio_sub;
4207 nml->vtable = vtable;
4209 nml->var_name = (char*) xmalloc (var_name_len + 1);
4210 memcpy (nml->var_name, var_name, var_name_len);
4211 nml->var_name[var_name_len] = '\0';
4213 nml->len = (int) len;
4214 nml->string_length = (index_type) string_length;
4216 nml->var_rank = (int) (dtype & GFC_DTYPE_RANK_MASK);
4217 nml->size = (index_type) (dtype >> GFC_DTYPE_SIZE_SHIFT);
4218 nml->type = (bt) ((dtype & GFC_DTYPE_TYPE_MASK) >> GFC_DTYPE_TYPE_SHIFT);
4220 if (nml->var_rank > 0)
4222 nml->dim = (descriptor_dimension*)
4223 xmallocarray (nml->var_rank, sizeof (descriptor_dimension));
4224 nml->ls = (array_loop_spec*)
4225 xmallocarray (nml->var_rank, sizeof (array_loop_spec));
4227 else
4229 nml->dim = NULL;
4230 nml->ls = NULL;
4233 nml->next = NULL;
4235 if ((dtp->common.flags & IOPARM_DT_IONML_SET) == 0)
4237 dtp->common.flags |= IOPARM_DT_IONML_SET;
4238 dtp->u.p.ionml = nml;
4240 else
4242 for (t1 = dtp->u.p.ionml; t1->next; t1 = t1->next);
4243 t1->next = nml;
4247 extern void st_set_nml_var (st_parameter_dt *dtp, void *, char *,
4248 GFC_INTEGER_4, gfc_charlen_type, GFC_INTEGER_4);
4249 export_proto(st_set_nml_var);
4251 void
4252 st_set_nml_var (st_parameter_dt *dtp, void *var_addr, char *var_name,
4253 GFC_INTEGER_4 len, gfc_charlen_type string_length,
4254 GFC_INTEGER_4 dtype)
4256 set_nml_var (dtp, var_addr, var_name, len, string_length,
4257 dtype, NULL, NULL);
4261 /* Essentially the same as previous but carrying the dtio procedure
4262 and the vtable as additional arguments. */
4263 extern void st_set_nml_dtio_var (st_parameter_dt *dtp, void *, char *,
4264 GFC_INTEGER_4, gfc_charlen_type, GFC_INTEGER_4,
4265 void *, void *);
4266 export_proto(st_set_nml_dtio_var);
4269 void
4270 st_set_nml_dtio_var (st_parameter_dt *dtp, void *var_addr, char *var_name,
4271 GFC_INTEGER_4 len, gfc_charlen_type string_length,
4272 GFC_INTEGER_4 dtype, void *dtio_sub, void *vtable)
4274 set_nml_var (dtp, var_addr, var_name, len, string_length,
4275 dtype, dtio_sub, vtable);
4278 /* Store the dimensional information for the namelist object. */
4279 extern void st_set_nml_var_dim (st_parameter_dt *, GFC_INTEGER_4,
4280 index_type, index_type,
4281 index_type);
4282 export_proto(st_set_nml_var_dim);
4284 void
4285 st_set_nml_var_dim (st_parameter_dt *dtp, GFC_INTEGER_4 n_dim,
4286 index_type stride, index_type lbound,
4287 index_type ubound)
4289 namelist_info *nml;
4290 int n;
4292 n = (int)n_dim;
4294 for (nml = dtp->u.p.ionml; nml->next; nml = nml->next);
4296 GFC_DIMENSION_SET(nml->dim[n],lbound,ubound,stride);
4300 /* Once upon a time, a poor innocent Fortran program was reading a
4301 file, when suddenly it hit the end-of-file (EOF). Unfortunately
4302 the OS doesn't tell whether we're at the EOF or whether we already
4303 went past it. Luckily our hero, libgfortran, keeps track of this.
4304 Call this function when you detect an EOF condition. See Section
4305 9.10.2 in F2003. */
4307 void
4308 hit_eof (st_parameter_dt *dtp)
4310 dtp->u.p.current_unit->flags.position = POSITION_APPEND;
4312 if (dtp->u.p.current_unit->flags.access == ACCESS_SEQUENTIAL)
4313 switch (dtp->u.p.current_unit->endfile)
4315 case NO_ENDFILE:
4316 case AT_ENDFILE:
4317 generate_error (&dtp->common, LIBERROR_END, NULL);
4318 if (!is_internal_unit (dtp) && !dtp->u.p.namelist_mode)
4320 dtp->u.p.current_unit->endfile = AFTER_ENDFILE;
4321 dtp->u.p.current_unit->current_record = 0;
4323 else
4324 dtp->u.p.current_unit->endfile = AT_ENDFILE;
4325 break;
4327 case AFTER_ENDFILE:
4328 generate_error (&dtp->common, LIBERROR_ENDFILE, NULL);
4329 dtp->u.p.current_unit->current_record = 0;
4330 break;
4332 else
4334 /* Non-sequential files don't have an ENDFILE record, so we
4335 can't be at AFTER_ENDFILE. */
4336 dtp->u.p.current_unit->endfile = AT_ENDFILE;
4337 generate_error (&dtp->common, LIBERROR_END, NULL);
4338 dtp->u.p.current_unit->current_record = 0;