PR 78534 Revert r244011
[gcc.git] / libgfortran / io / transfer.c
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
5
6 This file is part of the GNU Fortran runtime library (libgfortran).
7
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.
12
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.
17
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.
21
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/>. */
26
27
28 /* transfer.c -- Top level handling of data transfer statements. */
29
30 #include "io.h"
31 #include "fbuf.h"
32 #include "format.h"
33 #include "unix.h"
34 #include <string.h>
35 #include <errno.h>
36
37
38 /* Calling conventions: Data transfer statements are unlike other
39 library calls in that they extend over several calls.
40
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.
45
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
49
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
58
59 and for WRITE
60
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
69
70 These subroutines do not return status. The *128 functions
71 are in the file transfer128.c.
72
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. */
77
78 extern void transfer_integer (st_parameter_dt *, void *, int);
79 export_proto(transfer_integer);
80
81 extern void transfer_integer_write (st_parameter_dt *, void *, int);
82 export_proto(transfer_integer_write);
83
84 extern void transfer_real (st_parameter_dt *, void *, int);
85 export_proto(transfer_real);
86
87 extern void transfer_real_write (st_parameter_dt *, void *, int);
88 export_proto(transfer_real_write);
89
90 extern void transfer_logical (st_parameter_dt *, void *, int);
91 export_proto(transfer_logical);
92
93 extern void transfer_logical_write (st_parameter_dt *, void *, int);
94 export_proto(transfer_logical_write);
95
96 extern void transfer_character (st_parameter_dt *, void *, int);
97 export_proto(transfer_character);
98
99 extern void transfer_character_write (st_parameter_dt *, void *, int);
100 export_proto(transfer_character_write);
101
102 extern void transfer_character_wide (st_parameter_dt *, void *, int, int);
103 export_proto(transfer_character_wide);
104
105 extern void transfer_character_wide_write (st_parameter_dt *,
106 void *, int, int);
107 export_proto(transfer_character_wide_write);
108
109 extern void transfer_complex (st_parameter_dt *, void *, int);
110 export_proto(transfer_complex);
111
112 extern void transfer_complex_write (st_parameter_dt *, void *, int);
113 export_proto(transfer_complex_write);
114
115 extern void transfer_array (st_parameter_dt *, gfc_array_char *, int,
116 gfc_charlen_type);
117 export_proto(transfer_array);
118
119 extern void transfer_array_write (st_parameter_dt *, gfc_array_char *, int,
120 gfc_charlen_type);
121 export_proto(transfer_array_write);
122
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);
127
128 extern void
129 transfer_derived_write (st_parameter_dt *dtp, void *dtio_source, void *dtio_proc);
130 export_proto(transfer_derived_write);
131
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);
136
137 static const st_option advance_opt[] = {
138 {"yes", ADVANCE_YES},
139 {"no", ADVANCE_NO},
140 {NULL, 0}
141 };
142
143
144 static const st_option decimal_opt[] = {
145 {"point", DECIMAL_POINT},
146 {"comma", DECIMAL_COMMA},
147 {NULL, 0}
148 };
149
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}
158 };
159
160
161 static const st_option sign_opt[] = {
162 {"plus", SIGN_SP},
163 {"suppress", SIGN_SS},
164 {"processor_defined", SIGN_S},
165 {NULL, 0}
166 };
167
168 static const st_option blank_opt[] = {
169 {"null", BLANK_NULL},
170 {"zero", BLANK_ZERO},
171 {NULL, 0}
172 };
173
174 static const st_option delim_opt[] = {
175 {"apostrophe", DELIM_APOSTROPHE},
176 {"quote", DELIM_QUOTE},
177 {"none", DELIM_NONE},
178 {NULL, 0}
179 };
180
181 static const st_option pad_opt[] = {
182 {"yes", PAD_YES},
183 {"no", PAD_NO},
184 {NULL, 0}
185 };
186
187 typedef enum
188 { FORMATTED_SEQUENTIAL, UNFORMATTED_SEQUENTIAL,
189 FORMATTED_DIRECT, UNFORMATTED_DIRECT, FORMATTED_STREAM, UNFORMATTED_STREAM
190 }
191 file_mode;
192
193
194 static file_mode
195 current_mode (st_parameter_dt *dtp)
196 {
197 file_mode m;
198
199 m = FORM_UNSPECIFIED;
200
201 if (dtp->u.p.current_unit->flags.access == ACCESS_DIRECT)
202 {
203 m = dtp->u.p.current_unit->flags.form == FORM_FORMATTED ?
204 FORMATTED_DIRECT : UNFORMATTED_DIRECT;
205 }
206 else if (dtp->u.p.current_unit->flags.access == ACCESS_SEQUENTIAL)
207 {
208 m = dtp->u.p.current_unit->flags.form == FORM_FORMATTED ?
209 FORMATTED_SEQUENTIAL : UNFORMATTED_SEQUENTIAL;
210 }
211 else if (dtp->u.p.current_unit->flags.access == ACCESS_STREAM)
212 {
213 m = dtp->u.p.current_unit->flags.form == FORM_FORMATTED ?
214 FORMATTED_STREAM : UNFORMATTED_STREAM;
215 }
216
217 return m;
218 }
219
220
221 /* Mid level data transfer statements. */
222
223 /* Read sequential file - internal unit */
224
225 static char *
226 read_sf_internal (st_parameter_dt *dtp, int * length)
227 {
228 static char *empty_string[0];
229 char *base;
230 int lorig;
231
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);
236
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)
240 {
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;
245 }
246
247 lorig = *length;
248 if (is_char4_unit(dtp))
249 {
250 int i;
251 gfc_char4_t *p = (gfc_char4_t *) mem_alloc_r4 (dtp->u.p.current_unit->s,
252 length);
253 base = fbuf_alloc (dtp->u.p.current_unit, lorig);
254 for (i = 0; i < *length; i++, p++)
255 base[i] = *p > 255 ? '?' : (unsigned char) *p;
256 }
257 else
258 base = mem_alloc_r (dtp->u.p.current_unit->s, length);
259
260 if (unlikely (lorig > *length))
261 {
262 hit_eof (dtp);
263 return NULL;
264 }
265
266 dtp->u.p.current_unit->bytes_left -= *length;
267
268 if (((dtp->common.flags & IOPARM_DT_HAS_SIZE) != 0) ||
269 dtp->u.p.current_unit->has_size)
270 dtp->u.p.current_unit->size_used += (GFC_IO_INT) *length;
271
272 return base;
273
274 }
275
276 /* When reading sequential formatted records we have a problem. We
277 don't know how long the line is until we read the trailing newline,
278 and we don't want to read too much. If we read too much, we might
279 have to do a physical seek backwards depending on how much data is
280 present, and devices like terminals aren't seekable and would cause
281 an I/O error.
282
283 Given this, the solution is to read a byte at a time, stopping if
284 we hit the newline. For small allocations, we use a static buffer.
285 For larger allocations, we are forced to allocate memory on the
286 heap. Hopefully this won't happen very often. */
287
288 /* Read sequential file - external unit */
289
290 static char *
291 read_sf (st_parameter_dt *dtp, int * length)
292 {
293 static char *empty_string[0];
294 int q, q2;
295 int n, lorig, seen_comma;
296
297 /* If we have seen an eor previously, return a length of 0. The
298 caller is responsible for correctly padding the input field. */
299 if (dtp->u.p.sf_seen_eor)
300 {
301 *length = 0;
302 /* Just return something that isn't a NULL pointer, otherwise the
303 caller thinks an error occurred. */
304 return (char*) empty_string;
305 }
306
307 n = seen_comma = 0;
308
309 /* Read data into format buffer and scan through it. */
310 lorig = *length;
311
312 while (n < *length)
313 {
314 q = fbuf_getc (dtp->u.p.current_unit);
315 if (q == EOF)
316 break;
317 else if (dtp->u.p.current_unit->flags.cc != CC_NONE
318 && (q == '\n' || q == '\r'))
319 {
320 /* Unexpected end of line. Set the position. */
321 dtp->u.p.sf_seen_eor = 1;
322
323 /* If we see an EOR during non-advancing I/O, we need to skip
324 the rest of the I/O statement. Set the corresponding flag. */
325 if (dtp->u.p.advance_status == ADVANCE_NO || dtp->u.p.seen_dollar)
326 dtp->u.p.eor_condition = 1;
327
328 /* If we encounter a CR, it might be a CRLF. */
329 if (q == '\r') /* Probably a CRLF */
330 {
331 /* See if there is an LF. */
332 q2 = fbuf_getc (dtp->u.p.current_unit);
333 if (q2 == '\n')
334 dtp->u.p.sf_seen_eor = 2;
335 else if (q2 != EOF) /* Oops, seek back. */
336 fbuf_seek (dtp->u.p.current_unit, -1, SEEK_CUR);
337 }
338
339 /* Without padding, terminate the I/O statement without assigning
340 the value. With padding, the value still needs to be assigned,
341 so we can just continue with a short read. */
342 if (dtp->u.p.current_unit->pad_status == PAD_NO)
343 {
344 generate_error (&dtp->common, LIBERROR_EOR, NULL);
345 return NULL;
346 }
347
348 *length = n;
349 goto done;
350 }
351 /* Short circuit the read if a comma is found during numeric input.
352 The flag is set to zero during character reads so that commas in
353 strings are not ignored */
354 else if (q == ',')
355 if (dtp->u.p.sf_read_comma == 1)
356 {
357 seen_comma = 1;
358 notify_std (&dtp->common, GFC_STD_GNU,
359 "Comma in formatted numeric read.");
360 break;
361 }
362 n++;
363 }
364
365 *length = n;
366
367 /* A short read implies we hit EOF, unless we hit EOR, a comma, or
368 some other stuff. Set the relevant flags. */
369 if (lorig > *length && !dtp->u.p.sf_seen_eor && !seen_comma)
370 {
371 if (n > 0)
372 {
373 if (dtp->u.p.advance_status == ADVANCE_NO)
374 {
375 if (dtp->u.p.current_unit->pad_status == PAD_NO)
376 {
377 hit_eof (dtp);
378 return NULL;
379 }
380 else
381 dtp->u.p.eor_condition = 1;
382 }
383 else
384 dtp->u.p.at_eof = 1;
385 }
386 else if (dtp->u.p.advance_status == ADVANCE_NO
387 || dtp->u.p.current_unit->pad_status == PAD_NO
388 || dtp->u.p.current_unit->bytes_left
389 == dtp->u.p.current_unit->recl)
390 {
391 hit_eof (dtp);
392 return NULL;
393 }
394 }
395
396 done:
397
398 dtp->u.p.current_unit->bytes_left -= n;
399
400 if (((dtp->common.flags & IOPARM_DT_HAS_SIZE) != 0) ||
401 dtp->u.p.current_unit->has_size)
402 dtp->u.p.current_unit->size_used += (GFC_IO_INT) n;
403
404 /* We can't call fbuf_getptr before the loop doing fbuf_getc, because
405 fbuf_getc might reallocate the buffer. So return current pointer
406 minus all the advances, which is n plus up to two characters
407 of newline or comma. */
408 return fbuf_getptr (dtp->u.p.current_unit)
409 - n - dtp->u.p.sf_seen_eor - seen_comma;
410 }
411
412
413 /* Function for reading the next couple of bytes from the current
414 file, advancing the current position. We return NULL on end of record or
415 end of file. This function is only for formatted I/O, unformatted uses
416 read_block_direct.
417
418 If the read is short, then it is because the current record does not
419 have enough data to satisfy the read request and the file was
420 opened with PAD=YES. The caller must assume tailing spaces for
421 short reads. */
422
423 void *
424 read_block_form (st_parameter_dt *dtp, int * nbytes)
425 {
426 char *source;
427 int norig;
428
429 if (!is_stream_io (dtp))
430 {
431 if (dtp->u.p.current_unit->bytes_left < (gfc_offset) *nbytes)
432 {
433 /* For preconnected units with default record length, set bytes left
434 to unit record length and proceed, otherwise error. */
435 if (dtp->u.p.current_unit->unit_number == options.stdin_unit
436 && dtp->u.p.current_unit->recl == DEFAULT_RECL)
437 dtp->u.p.current_unit->bytes_left = dtp->u.p.current_unit->recl;
438 else
439 {
440 if (unlikely (dtp->u.p.current_unit->pad_status == PAD_NO)
441 && !is_internal_unit (dtp))
442 {
443 /* Not enough data left. */
444 generate_error (&dtp->common, LIBERROR_EOR, NULL);
445 return NULL;
446 }
447 }
448
449 if (unlikely (dtp->u.p.current_unit->bytes_left == 0
450 && !is_internal_unit(dtp)))
451 {
452 hit_eof (dtp);
453 return NULL;
454 }
455
456 *nbytes = dtp->u.p.current_unit->bytes_left;
457 }
458 }
459
460 if (dtp->u.p.current_unit->flags.form == FORM_FORMATTED &&
461 (dtp->u.p.current_unit->flags.access == ACCESS_SEQUENTIAL ||
462 dtp->u.p.current_unit->flags.access == ACCESS_STREAM))
463 {
464 if (is_internal_unit (dtp))
465 source = read_sf_internal (dtp, nbytes);
466 else
467 source = read_sf (dtp, nbytes);
468
469 dtp->u.p.current_unit->strm_pos +=
470 (gfc_offset) (*nbytes + dtp->u.p.sf_seen_eor);
471 return source;
472 }
473
474 /* If we reach here, we can assume it's direct access. */
475
476 dtp->u.p.current_unit->bytes_left -= (gfc_offset) *nbytes;
477
478 norig = *nbytes;
479 source = fbuf_read (dtp->u.p.current_unit, nbytes);
480 fbuf_seek (dtp->u.p.current_unit, *nbytes, SEEK_CUR);
481
482 if (((dtp->common.flags & IOPARM_DT_HAS_SIZE) != 0) ||
483 dtp->u.p.current_unit->has_size)
484 dtp->u.p.current_unit->size_used += (GFC_IO_INT) *nbytes;
485
486 if (norig != *nbytes)
487 {
488 /* Short read, this shouldn't happen. */
489 if (dtp->u.p.current_unit->pad_status == PAD_NO)
490 {
491 generate_error (&dtp->common, LIBERROR_EOR, NULL);
492 source = NULL;
493 }
494 }
495
496 dtp->u.p.current_unit->strm_pos += (gfc_offset) *nbytes;
497
498 return source;
499 }
500
501
502 /* Read a block from a character(kind=4) internal unit, to be transferred into
503 a character(kind=4) variable. Note: Portions of this code borrowed from
504 read_sf_internal. */
505 void *
506 read_block_form4 (st_parameter_dt *dtp, int * nbytes)
507 {
508 static gfc_char4_t *empty_string[0];
509 gfc_char4_t *source;
510 int lorig;
511
512 if (dtp->u.p.current_unit->bytes_left < (gfc_offset) *nbytes)
513 *nbytes = dtp->u.p.current_unit->bytes_left;
514
515 /* Zero size array gives internal unit len of 0. Nothing to read. */
516 if (dtp->internal_unit_len == 0
517 && dtp->u.p.current_unit->pad_status == PAD_NO)
518 hit_eof (dtp);
519
520 /* If we have seen an eor previously, return a length of 0. The
521 caller is responsible for correctly padding the input field. */
522 if (dtp->u.p.sf_seen_eor)
523 {
524 *nbytes = 0;
525 /* Just return something that isn't a NULL pointer, otherwise the
526 caller thinks an error occurred. */
527 return empty_string;
528 }
529
530 lorig = *nbytes;
531 source = (gfc_char4_t *) mem_alloc_r4 (dtp->u.p.current_unit->s, nbytes);
532
533 if (unlikely (lorig > *nbytes))
534 {
535 hit_eof (dtp);
536 return NULL;
537 }
538
539 dtp->u.p.current_unit->bytes_left -= *nbytes;
540
541 if (((dtp->common.flags & IOPARM_DT_HAS_SIZE) != 0) ||
542 dtp->u.p.current_unit->has_size)
543 dtp->u.p.current_unit->size_used += (GFC_IO_INT) *nbytes;
544
545 return source;
546 }
547
548
549 /* Reads a block directly into application data space. This is for
550 unformatted files. */
551
552 static void
553 read_block_direct (st_parameter_dt *dtp, void *buf, size_t nbytes)
554 {
555 ssize_t to_read_record;
556 ssize_t have_read_record;
557 ssize_t to_read_subrecord;
558 ssize_t have_read_subrecord;
559 int short_record;
560
561 if (is_stream_io (dtp))
562 {
563 have_read_record = sread (dtp->u.p.current_unit->s, buf,
564 nbytes);
565 if (unlikely (have_read_record < 0))
566 {
567 generate_error (&dtp->common, LIBERROR_OS, NULL);
568 return;
569 }
570
571 dtp->u.p.current_unit->strm_pos += (gfc_offset) have_read_record;
572
573 if (unlikely ((ssize_t) nbytes != have_read_record))
574 {
575 /* Short read, e.g. if we hit EOF. For stream files,
576 we have to set the end-of-file condition. */
577 hit_eof (dtp);
578 }
579 return;
580 }
581
582 if (dtp->u.p.current_unit->flags.access == ACCESS_DIRECT)
583 {
584 if (dtp->u.p.current_unit->bytes_left < (gfc_offset) nbytes)
585 {
586 short_record = 1;
587 to_read_record = dtp->u.p.current_unit->bytes_left;
588 nbytes = to_read_record;
589 }
590 else
591 {
592 short_record = 0;
593 to_read_record = nbytes;
594 }
595
596 dtp->u.p.current_unit->bytes_left -= to_read_record;
597
598 to_read_record = sread (dtp->u.p.current_unit->s, buf, to_read_record);
599 if (unlikely (to_read_record < 0))
600 {
601 generate_error (&dtp->common, LIBERROR_OS, NULL);
602 return;
603 }
604
605 if (to_read_record != (ssize_t) nbytes)
606 {
607 /* Short read, e.g. if we hit EOF. Apparently, we read
608 more than was written to the last record. */
609 return;
610 }
611
612 if (unlikely (short_record))
613 {
614 generate_error (&dtp->common, LIBERROR_SHORT_RECORD, NULL);
615 }
616 return;
617 }
618
619 /* Unformatted sequential. We loop over the subrecords, reading
620 until the request has been fulfilled or the record has run out
621 of continuation subrecords. */
622
623 /* Check whether we exceed the total record length. */
624
625 if (dtp->u.p.current_unit->flags.has_recl
626 && ((gfc_offset) nbytes > dtp->u.p.current_unit->bytes_left))
627 {
628 to_read_record = dtp->u.p.current_unit->bytes_left;
629 short_record = 1;
630 }
631 else
632 {
633 to_read_record = nbytes;
634 short_record = 0;
635 }
636 have_read_record = 0;
637
638 while(1)
639 {
640 if (dtp->u.p.current_unit->bytes_left_subrecord
641 < (gfc_offset) to_read_record)
642 {
643 to_read_subrecord = dtp->u.p.current_unit->bytes_left_subrecord;
644 to_read_record -= to_read_subrecord;
645 }
646 else
647 {
648 to_read_subrecord = to_read_record;
649 to_read_record = 0;
650 }
651
652 dtp->u.p.current_unit->bytes_left_subrecord -= to_read_subrecord;
653
654 have_read_subrecord = sread (dtp->u.p.current_unit->s,
655 buf + have_read_record, to_read_subrecord);
656 if (unlikely (have_read_subrecord < 0))
657 {
658 generate_error (&dtp->common, LIBERROR_OS, NULL);
659 return;
660 }
661
662 have_read_record += have_read_subrecord;
663
664 if (unlikely (to_read_subrecord != have_read_subrecord))
665 {
666 /* Short read, e.g. if we hit EOF. This means the record
667 structure has been corrupted, or the trailing record
668 marker would still be present. */
669
670 generate_error (&dtp->common, LIBERROR_CORRUPT_FILE, NULL);
671 return;
672 }
673
674 if (to_read_record > 0)
675 {
676 if (likely (dtp->u.p.current_unit->continued))
677 {
678 next_record_r_unf (dtp, 0);
679 us_read (dtp, 1);
680 }
681 else
682 {
683 /* Let's make sure the file position is correctly pre-positioned
684 for the next read statement. */
685
686 dtp->u.p.current_unit->current_record = 0;
687 next_record_r_unf (dtp, 0);
688 generate_error (&dtp->common, LIBERROR_SHORT_RECORD, NULL);
689 return;
690 }
691 }
692 else
693 {
694 /* Normal exit, the read request has been fulfilled. */
695 break;
696 }
697 }
698
699 dtp->u.p.current_unit->bytes_left -= have_read_record;
700 if (unlikely (short_record))
701 {
702 generate_error (&dtp->common, LIBERROR_SHORT_RECORD, NULL);
703 return;
704 }
705 return;
706 }
707
708
709 /* Function for writing a block of bytes to the current file at the
710 current position, advancing the file pointer. We are given a length
711 and return a pointer to a buffer that the caller must (completely)
712 fill in. Returns NULL on error. */
713
714 void *
715 write_block (st_parameter_dt *dtp, int length)
716 {
717 char *dest;
718
719 if (!is_stream_io (dtp))
720 {
721 if (dtp->u.p.current_unit->bytes_left < (gfc_offset) length)
722 {
723 /* For preconnected units with default record length, set bytes left
724 to unit record length and proceed, otherwise error. */
725 if (likely ((dtp->u.p.current_unit->unit_number
726 == options.stdout_unit
727 || dtp->u.p.current_unit->unit_number
728 == options.stderr_unit)
729 && dtp->u.p.current_unit->recl == DEFAULT_RECL))
730 dtp->u.p.current_unit->bytes_left = dtp->u.p.current_unit->recl;
731 else
732 {
733 generate_error (&dtp->common, LIBERROR_EOR, NULL);
734 return NULL;
735 }
736 }
737
738 dtp->u.p.current_unit->bytes_left -= (gfc_offset) length;
739 }
740
741 if (is_internal_unit (dtp))
742 {
743 if (is_char4_unit(dtp)) /* char4 internel unit. */
744 {
745 gfc_char4_t *dest4;
746 dest4 = mem_alloc_w4 (dtp->u.p.current_unit->s, &length);
747 if (dest4 == NULL)
748 {
749 generate_error (&dtp->common, LIBERROR_END, NULL);
750 return NULL;
751 }
752 return dest4;
753 }
754 else
755 dest = mem_alloc_w (dtp->u.p.current_unit->s, &length);
756
757 if (dest == NULL)
758 {
759 generate_error (&dtp->common, LIBERROR_END, NULL);
760 return NULL;
761 }
762
763 if (unlikely (dtp->u.p.current_unit->endfile == AT_ENDFILE))
764 generate_error (&dtp->common, LIBERROR_END, NULL);
765 }
766 else
767 {
768 dest = fbuf_alloc (dtp->u.p.current_unit, length);
769 if (dest == NULL)
770 {
771 generate_error (&dtp->common, LIBERROR_OS, NULL);
772 return NULL;
773 }
774 }
775
776 if (((dtp->common.flags & IOPARM_DT_HAS_SIZE) != 0) ||
777 dtp->u.p.current_unit->has_size)
778 dtp->u.p.current_unit->size_used += (GFC_IO_INT) length;
779
780 dtp->u.p.current_unit->strm_pos += (gfc_offset) length;
781
782 return dest;
783 }
784
785
786 /* High level interface to swrite(), taking care of errors. This is only
787 called for unformatted files. There are three cases to consider:
788 Stream I/O, unformatted direct, unformatted sequential. */
789
790 static bool
791 write_buf (st_parameter_dt *dtp, void *buf, size_t nbytes)
792 {
793
794 ssize_t have_written;
795 ssize_t to_write_subrecord;
796 int short_record;
797
798 /* Stream I/O. */
799
800 if (is_stream_io (dtp))
801 {
802 have_written = swrite (dtp->u.p.current_unit->s, buf, nbytes);
803 if (unlikely (have_written < 0))
804 {
805 generate_error (&dtp->common, LIBERROR_OS, NULL);
806 return false;
807 }
808
809 dtp->u.p.current_unit->strm_pos += (gfc_offset) have_written;
810
811 return true;
812 }
813
814 /* Unformatted direct access. */
815
816 if (dtp->u.p.current_unit->flags.access == ACCESS_DIRECT)
817 {
818 if (unlikely (dtp->u.p.current_unit->bytes_left < (gfc_offset) nbytes))
819 {
820 generate_error (&dtp->common, LIBERROR_DIRECT_EOR, NULL);
821 return false;
822 }
823
824 if (buf == NULL && nbytes == 0)
825 return true;
826
827 have_written = swrite (dtp->u.p.current_unit->s, buf, nbytes);
828 if (unlikely (have_written < 0))
829 {
830 generate_error (&dtp->common, LIBERROR_OS, NULL);
831 return false;
832 }
833
834 dtp->u.p.current_unit->strm_pos += (gfc_offset) have_written;
835 dtp->u.p.current_unit->bytes_left -= (gfc_offset) have_written;
836
837 return true;
838 }
839
840 /* Unformatted sequential. */
841
842 have_written = 0;
843
844 if (dtp->u.p.current_unit->flags.has_recl
845 && (gfc_offset) nbytes > dtp->u.p.current_unit->bytes_left)
846 {
847 nbytes = dtp->u.p.current_unit->bytes_left;
848 short_record = 1;
849 }
850 else
851 {
852 short_record = 0;
853 }
854
855 while (1)
856 {
857
858 to_write_subrecord =
859 (size_t) dtp->u.p.current_unit->bytes_left_subrecord < nbytes ?
860 (size_t) dtp->u.p.current_unit->bytes_left_subrecord : nbytes;
861
862 dtp->u.p.current_unit->bytes_left_subrecord -=
863 (gfc_offset) to_write_subrecord;
864
865 to_write_subrecord = swrite (dtp->u.p.current_unit->s,
866 buf + have_written, to_write_subrecord);
867 if (unlikely (to_write_subrecord < 0))
868 {
869 generate_error (&dtp->common, LIBERROR_OS, NULL);
870 return false;
871 }
872
873 dtp->u.p.current_unit->strm_pos += (gfc_offset) to_write_subrecord;
874 nbytes -= to_write_subrecord;
875 have_written += to_write_subrecord;
876
877 if (nbytes == 0)
878 break;
879
880 next_record_w_unf (dtp, 1);
881 us_write (dtp, 1);
882 }
883 dtp->u.p.current_unit->bytes_left -= have_written;
884 if (unlikely (short_record))
885 {
886 generate_error (&dtp->common, LIBERROR_SHORT_RECORD, NULL);
887 return false;
888 }
889 return true;
890 }
891
892
893 /* Reverse memcpy - used for byte swapping. */
894
895 static void
896 reverse_memcpy (void *dest, const void *src, size_t n)
897 {
898 char *d, *s;
899 size_t i;
900
901 d = (char *) dest;
902 s = (char *) src + n - 1;
903
904 /* Write with ascending order - this is likely faster
905 on modern architectures because of write combining. */
906 for (i=0; i<n; i++)
907 *(d++) = *(s--);
908 }
909
910
911 /* Utility function for byteswapping an array, using the bswap
912 builtins if possible. dest and src can overlap completely, or then
913 they must point to separate objects; partial overlaps are not
914 allowed. */
915
916 static void
917 bswap_array (void *dest, const void *src, size_t size, size_t nelems)
918 {
919 const char *ps;
920 char *pd;
921
922 switch (size)
923 {
924 case 1:
925 break;
926 case 2:
927 for (size_t i = 0; i < nelems; i++)
928 ((uint16_t*)dest)[i] = __builtin_bswap16 (((uint16_t*)src)[i]);
929 break;
930 case 4:
931 for (size_t i = 0; i < nelems; i++)
932 ((uint32_t*)dest)[i] = __builtin_bswap32 (((uint32_t*)src)[i]);
933 break;
934 case 8:
935 for (size_t i = 0; i < nelems; i++)
936 ((uint64_t*)dest)[i] = __builtin_bswap64 (((uint64_t*)src)[i]);
937 break;
938 case 12:
939 ps = src;
940 pd = dest;
941 for (size_t i = 0; i < nelems; i++)
942 {
943 uint32_t tmp;
944 memcpy (&tmp, ps, 4);
945 *(uint32_t*)pd = __builtin_bswap32 (*(uint32_t*)(ps + 8));
946 *(uint32_t*)(pd + 4) = __builtin_bswap32 (*(uint32_t*)(ps + 4));
947 *(uint32_t*)(pd + 8) = __builtin_bswap32 (tmp);
948 ps += size;
949 pd += size;
950 }
951 break;
952 case 16:
953 ps = src;
954 pd = dest;
955 for (size_t i = 0; i < nelems; i++)
956 {
957 uint64_t tmp;
958 memcpy (&tmp, ps, 8);
959 *(uint64_t*)pd = __builtin_bswap64 (*(uint64_t*)(ps + 8));
960 *(uint64_t*)(pd + 8) = __builtin_bswap64 (tmp);
961 ps += size;
962 pd += size;
963 }
964 break;
965 default:
966 pd = dest;
967 if (dest != src)
968 {
969 ps = src;
970 for (size_t i = 0; i < nelems; i++)
971 {
972 reverse_memcpy (pd, ps, size);
973 ps += size;
974 pd += size;
975 }
976 }
977 else
978 {
979 /* In-place byte swap. */
980 for (size_t i = 0; i < nelems; i++)
981 {
982 char tmp, *low = pd, *high = pd + size - 1;
983 for (size_t j = 0; j < size/2; j++)
984 {
985 tmp = *low;
986 *low = *high;
987 *high = tmp;
988 low++;
989 high--;
990 }
991 pd += size;
992 }
993 }
994 }
995 }
996
997
998 /* Master function for unformatted reads. */
999
1000 static void
1001 unformatted_read (st_parameter_dt *dtp, bt type,
1002 void *dest, int kind, size_t size, size_t nelems)
1003 {
1004 if (type == BT_CLASS)
1005 {
1006 int unit = dtp->u.p.current_unit->unit_number;
1007 char tmp_iomsg[IOMSG_LEN] = "";
1008 char *child_iomsg;
1009 gfc_charlen_type child_iomsg_len;
1010 int noiostat;
1011 int *child_iostat = NULL;
1012
1013 /* Set iostat, intent(out). */
1014 noiostat = 0;
1015 child_iostat = (dtp->common.flags & IOPARM_HAS_IOSTAT) ?
1016 dtp->common.iostat : &noiostat;
1017
1018 /* Set iomsg, intent(inout). */
1019 if (dtp->common.flags & IOPARM_HAS_IOMSG)
1020 {
1021 child_iomsg = dtp->common.iomsg;
1022 child_iomsg_len = dtp->common.iomsg_len;
1023 }
1024 else
1025 {
1026 child_iomsg = tmp_iomsg;
1027 child_iomsg_len = IOMSG_LEN;
1028 }
1029
1030 /* Call the user defined unformatted READ procedure. */
1031 dtp->u.p.current_unit->child_dtio++;
1032 dtp->u.p.ufdtio_ptr (dest, &unit, child_iostat, child_iomsg,
1033 child_iomsg_len);
1034 dtp->u.p.current_unit->child_dtio--;
1035 return;
1036 }
1037
1038 if (type == BT_CHARACTER)
1039 size *= GFC_SIZE_OF_CHAR_KIND(kind);
1040 read_block_direct (dtp, dest, size * nelems);
1041
1042 if (unlikely (dtp->u.p.current_unit->flags.convert == GFC_CONVERT_SWAP)
1043 && kind != 1)
1044 {
1045 /* Handle wide chracters. */
1046 if (type == BT_CHARACTER)
1047 {
1048 nelems *= size;
1049 size = kind;
1050 }
1051
1052 /* Break up complex into its constituent reals. */
1053 else if (type == BT_COMPLEX)
1054 {
1055 nelems *= 2;
1056 size /= 2;
1057 }
1058 bswap_array (dest, dest, size, nelems);
1059 }
1060 }
1061
1062
1063 /* Master function for unformatted writes. NOTE: For kind=10 the size is 16
1064 bytes on 64 bit machines. The unused bytes are not initialized and never
1065 used, which can show an error with memory checking analyzers like
1066 valgrind. We us BT_CLASS to denote a User Defined I/O call. */
1067
1068 static void
1069 unformatted_write (st_parameter_dt *dtp, bt type,
1070 void *source, int kind, size_t size, size_t nelems)
1071 {
1072 if (type == BT_CLASS)
1073 {
1074 int unit = dtp->u.p.current_unit->unit_number;
1075 char tmp_iomsg[IOMSG_LEN] = "";
1076 char *child_iomsg;
1077 gfc_charlen_type child_iomsg_len;
1078 int noiostat;
1079 int *child_iostat = NULL;
1080
1081 /* Set iostat, intent(out). */
1082 noiostat = 0;
1083 child_iostat = (dtp->common.flags & IOPARM_HAS_IOSTAT) ?
1084 dtp->common.iostat : &noiostat;
1085
1086 /* Set iomsg, intent(inout). */
1087 if (dtp->common.flags & IOPARM_HAS_IOMSG)
1088 {
1089 child_iomsg = dtp->common.iomsg;
1090 child_iomsg_len = dtp->common.iomsg_len;
1091 }
1092 else
1093 {
1094 child_iomsg = tmp_iomsg;
1095 child_iomsg_len = IOMSG_LEN;
1096 }
1097
1098 /* Call the user defined unformatted WRITE procedure. */
1099 dtp->u.p.current_unit->child_dtio++;
1100 dtp->u.p.ufdtio_ptr (source, &unit, child_iostat, child_iomsg,
1101 child_iomsg_len);
1102 dtp->u.p.current_unit->child_dtio--;
1103 return;
1104 }
1105
1106 if (likely (dtp->u.p.current_unit->flags.convert == GFC_CONVERT_NATIVE)
1107 || kind == 1)
1108 {
1109 size_t stride = type == BT_CHARACTER ?
1110 size * GFC_SIZE_OF_CHAR_KIND(kind) : size;
1111
1112 write_buf (dtp, source, stride * nelems);
1113 }
1114 else
1115 {
1116 #define BSWAP_BUFSZ 512
1117 char buffer[BSWAP_BUFSZ];
1118 char *p;
1119 size_t nrem;
1120
1121 p = source;
1122
1123 /* Handle wide chracters. */
1124 if (type == BT_CHARACTER && kind != 1)
1125 {
1126 nelems *= size;
1127 size = kind;
1128 }
1129
1130 /* Break up complex into its constituent reals. */
1131 if (type == BT_COMPLEX)
1132 {
1133 nelems *= 2;
1134 size /= 2;
1135 }
1136
1137 /* By now, all complex variables have been split into their
1138 constituent reals. */
1139
1140 nrem = nelems;
1141 do
1142 {
1143 size_t nc;
1144 if (size * nrem > BSWAP_BUFSZ)
1145 nc = BSWAP_BUFSZ / size;
1146 else
1147 nc = nrem;
1148
1149 bswap_array (buffer, p, size, nc);
1150 write_buf (dtp, buffer, size * nc);
1151 p += size * nc;
1152 nrem -= nc;
1153 }
1154 while (nrem > 0);
1155 }
1156 }
1157
1158
1159 /* Return a pointer to the name of a type. */
1160
1161 const char *
1162 type_name (bt type)
1163 {
1164 const char *p;
1165
1166 switch (type)
1167 {
1168 case BT_INTEGER:
1169 p = "INTEGER";
1170 break;
1171 case BT_LOGICAL:
1172 p = "LOGICAL";
1173 break;
1174 case BT_CHARACTER:
1175 p = "CHARACTER";
1176 break;
1177 case BT_REAL:
1178 p = "REAL";
1179 break;
1180 case BT_COMPLEX:
1181 p = "COMPLEX";
1182 break;
1183 case BT_CLASS:
1184 p = "CLASS or DERIVED";
1185 break;
1186 default:
1187 internal_error (NULL, "type_name(): Bad type");
1188 }
1189
1190 return p;
1191 }
1192
1193
1194 /* Write a constant string to the output.
1195 This is complicated because the string can have doubled delimiters
1196 in it. The length in the format node is the true length. */
1197
1198 static void
1199 write_constant_string (st_parameter_dt *dtp, const fnode *f)
1200 {
1201 char c, delimiter, *p, *q;
1202 int length;
1203
1204 length = f->u.string.length;
1205 if (length == 0)
1206 return;
1207
1208 p = write_block (dtp, length);
1209 if (p == NULL)
1210 return;
1211
1212 q = f->u.string.p;
1213 delimiter = q[-1];
1214
1215 for (; length > 0; length--)
1216 {
1217 c = *p++ = *q++;
1218 if (c == delimiter && c != 'H' && c != 'h')
1219 q++; /* Skip the doubled delimiter. */
1220 }
1221 }
1222
1223
1224 /* Given actual and expected types in a formatted data transfer, make
1225 sure they agree. If not, an error message is generated. Returns
1226 nonzero if something went wrong. */
1227
1228 static int
1229 require_type (st_parameter_dt *dtp, bt expected, bt actual, const fnode *f)
1230 {
1231 #define BUFLEN 100
1232 char buffer[BUFLEN];
1233
1234 if (actual == expected)
1235 return 0;
1236
1237 /* Adjust item_count before emitting error message. */
1238 snprintf (buffer, BUFLEN,
1239 "Expected %s for item %d in formatted transfer, got %s",
1240 type_name (expected), dtp->u.p.item_count - 1, type_name (actual));
1241
1242 format_error (dtp, f, buffer);
1243 return 1;
1244 }
1245
1246
1247 static int
1248 require_numeric_type (st_parameter_dt *dtp, bt actual, const fnode *f)
1249 {
1250 #define BUFLEN 100
1251 char buffer[BUFLEN];
1252
1253 if (actual == BT_INTEGER || actual == BT_REAL || actual == BT_COMPLEX)
1254 return 0;
1255
1256 /* Adjust item_count before emitting error message. */
1257 snprintf (buffer, BUFLEN,
1258 "Expected numeric type for item %d in formatted transfer, got %s",
1259 dtp->u.p.item_count - 1, type_name (actual));
1260
1261 format_error (dtp, f, buffer);
1262 return 1;
1263 }
1264
1265 static char *
1266 get_dt_format (char *p, gfc_charlen_type *length)
1267 {
1268 char delim = p[-1]; /* The delimiter is always the first character back. */
1269 char c, *q, *res;
1270 gfc_charlen_type len = *length; /* This length already correct, less 'DT'. */
1271
1272 res = q = xmalloc (len + 2);
1273
1274 /* Set the beginning of the string to 'DT', length adjusted below. */
1275 *q++ = 'D';
1276 *q++ = 'T';
1277
1278 /* The string may contain doubled quotes so scan and skip as needed. */
1279 for (; len > 0; len--)
1280 {
1281 c = *q++ = *p++;
1282 if (c == delim)
1283 p++; /* Skip the doubled delimiter. */
1284 }
1285
1286 /* Adjust the string length by two now that we are done. */
1287 *length += 2;
1288
1289 return res;
1290 }
1291
1292
1293 /* This function is in the main loop for a formatted data transfer
1294 statement. It would be natural to implement this as a coroutine
1295 with the user program, but C makes that awkward. We loop,
1296 processing format elements. When we actually have to transfer
1297 data instead of just setting flags, we return control to the user
1298 program which calls a function that supplies the address and type
1299 of the next element, then comes back here to process it. */
1300
1301 static void
1302 formatted_transfer_scalar_read (st_parameter_dt *dtp, bt type, void *p, int kind,
1303 size_t size)
1304 {
1305 int pos, bytes_used;
1306 const fnode *f;
1307 format_token t;
1308 int n;
1309 int consume_data_flag;
1310
1311 /* Change a complex data item into a pair of reals. */
1312
1313 n = (p == NULL) ? 0 : ((type != BT_COMPLEX) ? 1 : 2);
1314 if (type == BT_COMPLEX)
1315 {
1316 type = BT_REAL;
1317 size /= 2;
1318 }
1319
1320 /* If there's an EOR condition, we simulate finalizing the transfer
1321 by doing nothing. */
1322 if (dtp->u.p.eor_condition)
1323 return;
1324
1325 /* Set this flag so that commas in reads cause the read to complete before
1326 the entire field has been read. The next read field will start right after
1327 the comma in the stream. (Set to 0 for character reads). */
1328 dtp->u.p.sf_read_comma =
1329 dtp->u.p.current_unit->decimal_status == DECIMAL_COMMA ? 0 : 1;
1330
1331 for (;;)
1332 {
1333 /* If reversion has occurred and there is another real data item,
1334 then we have to move to the next record. */
1335 if (dtp->u.p.reversion_flag && n > 0)
1336 {
1337 dtp->u.p.reversion_flag = 0;
1338 next_record (dtp, 0);
1339 }
1340
1341 consume_data_flag = 1;
1342 if ((dtp->common.flags & IOPARM_LIBRETURN_MASK) != IOPARM_LIBRETURN_OK)
1343 break;
1344
1345 f = next_format (dtp);
1346 if (f == NULL)
1347 {
1348 /* No data descriptors left. */
1349 if (unlikely (n > 0))
1350 generate_error (&dtp->common, LIBERROR_FORMAT,
1351 "Insufficient data descriptors in format after reversion");
1352 return;
1353 }
1354
1355 t = f->format;
1356
1357 bytes_used = (int)(dtp->u.p.current_unit->recl
1358 - dtp->u.p.current_unit->bytes_left);
1359
1360 if (is_stream_io(dtp))
1361 bytes_used = 0;
1362
1363 switch (t)
1364 {
1365 case FMT_I:
1366 if (n == 0)
1367 goto need_read_data;
1368 if (require_type (dtp, BT_INTEGER, type, f))
1369 return;
1370 read_decimal (dtp, f, p, kind);
1371 break;
1372
1373 case FMT_B:
1374 if (n == 0)
1375 goto need_read_data;
1376 if (!(compile_options.allow_std & GFC_STD_GNU)
1377 && require_numeric_type (dtp, type, f))
1378 return;
1379 if (!(compile_options.allow_std & GFC_STD_F2008)
1380 && require_type (dtp, BT_INTEGER, type, f))
1381 return;
1382 read_radix (dtp, f, p, kind, 2);
1383 break;
1384
1385 case FMT_O:
1386 if (n == 0)
1387 goto need_read_data;
1388 if (!(compile_options.allow_std & GFC_STD_GNU)
1389 && require_numeric_type (dtp, type, f))
1390 return;
1391 if (!(compile_options.allow_std & GFC_STD_F2008)
1392 && require_type (dtp, BT_INTEGER, type, f))
1393 return;
1394 read_radix (dtp, f, p, kind, 8);
1395 break;
1396
1397 case FMT_Z:
1398 if (n == 0)
1399 goto need_read_data;
1400 if (!(compile_options.allow_std & GFC_STD_GNU)
1401 && require_numeric_type (dtp, type, f))
1402 return;
1403 if (!(compile_options.allow_std & GFC_STD_F2008)
1404 && require_type (dtp, BT_INTEGER, type, f))
1405 return;
1406 read_radix (dtp, f, p, kind, 16);
1407 break;
1408
1409 case FMT_A:
1410 if (n == 0)
1411 goto need_read_data;
1412
1413 /* It is possible to have FMT_A with something not BT_CHARACTER such
1414 as when writing out hollerith strings, so check both type
1415 and kind before calling wide character routines. */
1416 if (type == BT_CHARACTER && kind == 4)
1417 read_a_char4 (dtp, f, p, size);
1418 else
1419 read_a (dtp, f, p, size);
1420 break;
1421
1422 case FMT_L:
1423 if (n == 0)
1424 goto need_read_data;
1425 read_l (dtp, f, p, kind);
1426 break;
1427
1428 case FMT_D:
1429 if (n == 0)
1430 goto need_read_data;
1431 if (require_type (dtp, BT_REAL, type, f))
1432 return;
1433 read_f (dtp, f, p, kind);
1434 break;
1435
1436 case FMT_DT:
1437 if (n == 0)
1438 goto need_read_data;
1439 if (require_type (dtp, BT_CLASS, type, f))
1440 return;
1441 int unit = dtp->u.p.current_unit->unit_number;
1442 char dt[] = "DT";
1443 char tmp_iomsg[IOMSG_LEN] = "";
1444 char *child_iomsg;
1445 gfc_charlen_type child_iomsg_len;
1446 int noiostat;
1447 int *child_iostat = NULL;
1448 char *iotype;
1449 gfc_charlen_type iotype_len = f->u.udf.string_len;
1450
1451 /* Build the iotype string. */
1452 if (iotype_len == 0)
1453 {
1454 iotype_len = 2;
1455 iotype = dt;
1456 }
1457 else
1458 iotype = get_dt_format (f->u.udf.string, &iotype_len);
1459
1460 /* Set iostat, intent(out). */
1461 noiostat = 0;
1462 child_iostat = (dtp->common.flags & IOPARM_HAS_IOSTAT) ?
1463 dtp->common.iostat : &noiostat;
1464
1465 /* Set iomsg, intent(inout). */
1466 if (dtp->common.flags & IOPARM_HAS_IOMSG)
1467 {
1468 child_iomsg = dtp->common.iomsg;
1469 child_iomsg_len = dtp->common.iomsg_len;
1470 }
1471 else
1472 {
1473 child_iomsg = tmp_iomsg;
1474 child_iomsg_len = IOMSG_LEN;
1475 }
1476
1477 /* Call the user defined formatted READ procedure. */
1478 dtp->u.p.current_unit->child_dtio++;
1479 dtp->u.p.fdtio_ptr (p, &unit, iotype, f->u.udf.vlist,
1480 child_iostat, child_iomsg,
1481 iotype_len, child_iomsg_len);
1482 dtp->u.p.current_unit->child_dtio--;
1483
1484 if (f->u.udf.string_len != 0)
1485 free (iotype);
1486 /* Note: vlist is freed in free_format_data. */
1487 break;
1488
1489 case FMT_E:
1490 if (n == 0)
1491 goto need_read_data;
1492 if (require_type (dtp, BT_REAL, type, f))
1493 return;
1494 read_f (dtp, f, p, kind);
1495 break;
1496
1497 case FMT_EN:
1498 if (n == 0)
1499 goto need_read_data;
1500 if (require_type (dtp, BT_REAL, type, f))
1501 return;
1502 read_f (dtp, f, p, kind);
1503 break;
1504
1505 case FMT_ES:
1506 if (n == 0)
1507 goto need_read_data;
1508 if (require_type (dtp, BT_REAL, type, f))
1509 return;
1510 read_f (dtp, f, p, kind);
1511 break;
1512
1513 case FMT_F:
1514 if (n == 0)
1515 goto need_read_data;
1516 if (require_type (dtp, BT_REAL, type, f))
1517 return;
1518 read_f (dtp, f, p, kind);
1519 break;
1520
1521 case FMT_G:
1522 if (n == 0)
1523 goto need_read_data;
1524 switch (type)
1525 {
1526 case BT_INTEGER:
1527 read_decimal (dtp, f, p, kind);
1528 break;
1529 case BT_LOGICAL:
1530 read_l (dtp, f, p, kind);
1531 break;
1532 case BT_CHARACTER:
1533 if (kind == 4)
1534 read_a_char4 (dtp, f, p, size);
1535 else
1536 read_a (dtp, f, p, size);
1537 break;
1538 case BT_REAL:
1539 read_f (dtp, f, p, kind);
1540 break;
1541 default:
1542 internal_error (&dtp->common, "formatted_transfer(): Bad type");
1543 }
1544 break;
1545
1546 case FMT_STRING:
1547 consume_data_flag = 0;
1548 format_error (dtp, f, "Constant string in input format");
1549 return;
1550
1551 /* Format codes that don't transfer data. */
1552 case FMT_X:
1553 case FMT_TR:
1554 consume_data_flag = 0;
1555 dtp->u.p.skips += f->u.n;
1556 pos = bytes_used + dtp->u.p.skips - 1;
1557 dtp->u.p.pending_spaces = pos - dtp->u.p.max_pos + 1;
1558 read_x (dtp, f->u.n);
1559 break;
1560
1561 case FMT_TL:
1562 case FMT_T:
1563 consume_data_flag = 0;
1564
1565 if (f->format == FMT_TL)
1566 {
1567 /* Handle the special case when no bytes have been used yet.
1568 Cannot go below zero. */
1569 if (bytes_used == 0)
1570 {
1571 dtp->u.p.pending_spaces -= f->u.n;
1572 dtp->u.p.skips -= f->u.n;
1573 dtp->u.p.skips = dtp->u.p.skips < 0 ? 0 : dtp->u.p.skips;
1574 }
1575
1576 pos = bytes_used - f->u.n;
1577 }
1578 else /* FMT_T */
1579 pos = f->u.n - 1;
1580
1581 /* Standard 10.6.1.1: excessive left tabbing is reset to the
1582 left tab limit. We do not check if the position has gone
1583 beyond the end of record because a subsequent tab could
1584 bring us back again. */
1585 pos = pos < 0 ? 0 : pos;
1586
1587 dtp->u.p.skips = dtp->u.p.skips + pos - bytes_used;
1588 dtp->u.p.pending_spaces = dtp->u.p.pending_spaces
1589 + pos - dtp->u.p.max_pos;
1590 dtp->u.p.pending_spaces = dtp->u.p.pending_spaces < 0
1591 ? 0 : dtp->u.p.pending_spaces;
1592 if (dtp->u.p.skips == 0)
1593 break;
1594
1595 /* Adjust everything for end-of-record condition */
1596 if (dtp->u.p.sf_seen_eor && !is_internal_unit (dtp))
1597 {
1598 dtp->u.p.current_unit->bytes_left -= dtp->u.p.sf_seen_eor;
1599 dtp->u.p.skips -= dtp->u.p.sf_seen_eor;
1600 bytes_used = pos;
1601 if (dtp->u.p.pending_spaces == 0)
1602 dtp->u.p.sf_seen_eor = 0;
1603 }
1604 if (dtp->u.p.skips < 0)
1605 {
1606 if (is_internal_unit (dtp))
1607 sseek (dtp->u.p.current_unit->s, dtp->u.p.skips, SEEK_CUR);
1608 else
1609 fbuf_seek (dtp->u.p.current_unit, dtp->u.p.skips, SEEK_CUR);
1610 dtp->u.p.current_unit->bytes_left -= (gfc_offset) dtp->u.p.skips;
1611 dtp->u.p.skips = dtp->u.p.pending_spaces = 0;
1612 }
1613 else
1614 read_x (dtp, dtp->u.p.skips);
1615 break;
1616
1617 case FMT_S:
1618 consume_data_flag = 0;
1619 dtp->u.p.sign_status = SIGN_S;
1620 break;
1621
1622 case FMT_SS:
1623 consume_data_flag = 0;
1624 dtp->u.p.sign_status = SIGN_SS;
1625 break;
1626
1627 case FMT_SP:
1628 consume_data_flag = 0;
1629 dtp->u.p.sign_status = SIGN_SP;
1630 break;
1631
1632 case FMT_BN:
1633 consume_data_flag = 0 ;
1634 dtp->u.p.blank_status = BLANK_NULL;
1635 break;
1636
1637 case FMT_BZ:
1638 consume_data_flag = 0;
1639 dtp->u.p.blank_status = BLANK_ZERO;
1640 break;
1641
1642 case FMT_DC:
1643 consume_data_flag = 0;
1644 dtp->u.p.current_unit->decimal_status = DECIMAL_COMMA;
1645 break;
1646
1647 case FMT_DP:
1648 consume_data_flag = 0;
1649 dtp->u.p.current_unit->decimal_status = DECIMAL_POINT;
1650 break;
1651
1652 case FMT_RC:
1653 consume_data_flag = 0;
1654 dtp->u.p.current_unit->round_status = ROUND_COMPATIBLE;
1655 break;
1656
1657 case FMT_RD:
1658 consume_data_flag = 0;
1659 dtp->u.p.current_unit->round_status = ROUND_DOWN;
1660 break;
1661
1662 case FMT_RN:
1663 consume_data_flag = 0;
1664 dtp->u.p.current_unit->round_status = ROUND_NEAREST;
1665 break;
1666
1667 case FMT_RP:
1668 consume_data_flag = 0;
1669 dtp->u.p.current_unit->round_status = ROUND_PROCDEFINED;
1670 break;
1671
1672 case FMT_RU:
1673 consume_data_flag = 0;
1674 dtp->u.p.current_unit->round_status = ROUND_UP;
1675 break;
1676
1677 case FMT_RZ:
1678 consume_data_flag = 0;
1679 dtp->u.p.current_unit->round_status = ROUND_ZERO;
1680 break;
1681
1682 case FMT_P:
1683 consume_data_flag = 0;
1684 dtp->u.p.scale_factor = f->u.k;
1685 break;
1686
1687 case FMT_DOLLAR:
1688 consume_data_flag = 0;
1689 dtp->u.p.seen_dollar = 1;
1690 break;
1691
1692 case FMT_SLASH:
1693 consume_data_flag = 0;
1694 dtp->u.p.skips = dtp->u.p.pending_spaces = 0;
1695 next_record (dtp, 0);
1696 break;
1697
1698 case FMT_COLON:
1699 /* A colon descriptor causes us to exit this loop (in
1700 particular preventing another / descriptor from being
1701 processed) unless there is another data item to be
1702 transferred. */
1703 consume_data_flag = 0;
1704 if (n == 0)
1705 return;
1706 break;
1707
1708 default:
1709 internal_error (&dtp->common, "Bad format node");
1710 }
1711
1712 /* Adjust the item count and data pointer. */
1713
1714 if ((consume_data_flag > 0) && (n > 0))
1715 {
1716 n--;
1717 p = ((char *) p) + size;
1718 }
1719
1720 dtp->u.p.skips = 0;
1721
1722 pos = (int)(dtp->u.p.current_unit->recl - dtp->u.p.current_unit->bytes_left);
1723 dtp->u.p.max_pos = (dtp->u.p.max_pos > pos) ? dtp->u.p.max_pos : pos;
1724 }
1725
1726 return;
1727
1728 /* Come here when we need a data descriptor but don't have one. We
1729 push the current format node back onto the input, then return and
1730 let the user program call us back with the data. */
1731 need_read_data:
1732 unget_format (dtp, f);
1733 }
1734
1735
1736 static void
1737 formatted_transfer_scalar_write (st_parameter_dt *dtp, bt type, void *p, int kind,
1738 size_t size)
1739 {
1740 int pos, bytes_used;
1741 const fnode *f;
1742 format_token t;
1743 int n;
1744 int consume_data_flag;
1745
1746 /* Change a complex data item into a pair of reals. */
1747
1748 n = (p == NULL) ? 0 : ((type != BT_COMPLEX) ? 1 : 2);
1749 if (type == BT_COMPLEX)
1750 {
1751 type = BT_REAL;
1752 size /= 2;
1753 }
1754
1755 /* If there's an EOR condition, we simulate finalizing the transfer
1756 by doing nothing. */
1757 if (dtp->u.p.eor_condition)
1758 return;
1759
1760 /* Set this flag so that commas in reads cause the read to complete before
1761 the entire field has been read. The next read field will start right after
1762 the comma in the stream. (Set to 0 for character reads). */
1763 dtp->u.p.sf_read_comma =
1764 dtp->u.p.current_unit->decimal_status == DECIMAL_COMMA ? 0 : 1;
1765
1766 for (;;)
1767 {
1768 /* If reversion has occurred and there is another real data item,
1769 then we have to move to the next record. */
1770 if (dtp->u.p.reversion_flag && n > 0)
1771 {
1772 dtp->u.p.reversion_flag = 0;
1773 next_record (dtp, 0);
1774 }
1775
1776 consume_data_flag = 1;
1777 if ((dtp->common.flags & IOPARM_LIBRETURN_MASK) != IOPARM_LIBRETURN_OK)
1778 break;
1779
1780 f = next_format (dtp);
1781 if (f == NULL)
1782 {
1783 /* No data descriptors left. */
1784 if (unlikely (n > 0))
1785 generate_error (&dtp->common, LIBERROR_FORMAT,
1786 "Insufficient data descriptors in format after reversion");
1787 return;
1788 }
1789
1790 /* Now discharge T, TR and X movements to the right. This is delayed
1791 until a data producing format to suppress trailing spaces. */
1792
1793 t = f->format;
1794 if (dtp->u.p.mode == WRITING && dtp->u.p.skips != 0
1795 && ((n>0 && ( t == FMT_I || t == FMT_B || t == FMT_O
1796 || t == FMT_Z || t == FMT_F || t == FMT_E
1797 || t == FMT_EN || t == FMT_ES || t == FMT_G
1798 || t == FMT_L || t == FMT_A || t == FMT_D
1799 || t == FMT_DT))
1800 || t == FMT_STRING))
1801 {
1802 if (dtp->u.p.skips > 0)
1803 {
1804 int tmp;
1805 write_x (dtp, dtp->u.p.skips, dtp->u.p.pending_spaces);
1806 tmp = (int)(dtp->u.p.current_unit->recl
1807 - dtp->u.p.current_unit->bytes_left);
1808 dtp->u.p.max_pos =
1809 dtp->u.p.max_pos > tmp ? dtp->u.p.max_pos : tmp;
1810 dtp->u.p.skips = 0;
1811 }
1812 if (dtp->u.p.skips < 0)
1813 {
1814 if (is_internal_unit (dtp))
1815 sseek (dtp->u.p.current_unit->s, dtp->u.p.skips, SEEK_CUR);
1816 else
1817 fbuf_seek (dtp->u.p.current_unit, dtp->u.p.skips, SEEK_CUR);
1818 dtp->u.p.current_unit->bytes_left -= (gfc_offset) dtp->u.p.skips;
1819 }
1820 dtp->u.p.skips = dtp->u.p.pending_spaces = 0;
1821 }
1822
1823 bytes_used = (int)(dtp->u.p.current_unit->recl
1824 - dtp->u.p.current_unit->bytes_left);
1825
1826 if (is_stream_io(dtp))
1827 bytes_used = 0;
1828
1829 switch (t)
1830 {
1831 case FMT_I:
1832 if (n == 0)
1833 goto need_data;
1834 if (require_type (dtp, BT_INTEGER, type, f))
1835 return;
1836 write_i (dtp, f, p, kind);
1837 break;
1838
1839 case FMT_B:
1840 if (n == 0)
1841 goto need_data;
1842 if (!(compile_options.allow_std & GFC_STD_GNU)
1843 && require_numeric_type (dtp, type, f))
1844 return;
1845 if (!(compile_options.allow_std & GFC_STD_F2008)
1846 && require_type (dtp, BT_INTEGER, type, f))
1847 return;
1848 write_b (dtp, f, p, kind);
1849 break;
1850
1851 case FMT_O:
1852 if (n == 0)
1853 goto need_data;
1854 if (!(compile_options.allow_std & GFC_STD_GNU)
1855 && require_numeric_type (dtp, type, f))
1856 return;
1857 if (!(compile_options.allow_std & GFC_STD_F2008)
1858 && require_type (dtp, BT_INTEGER, type, f))
1859 return;
1860 write_o (dtp, f, p, kind);
1861 break;
1862
1863 case FMT_Z:
1864 if (n == 0)
1865 goto need_data;
1866 if (!(compile_options.allow_std & GFC_STD_GNU)
1867 && require_numeric_type (dtp, type, f))
1868 return;
1869 if (!(compile_options.allow_std & GFC_STD_F2008)
1870 && require_type (dtp, BT_INTEGER, type, f))
1871 return;
1872 write_z (dtp, f, p, kind);
1873 break;
1874
1875 case FMT_A:
1876 if (n == 0)
1877 goto need_data;
1878
1879 /* It is possible to have FMT_A with something not BT_CHARACTER such
1880 as when writing out hollerith strings, so check both type
1881 and kind before calling wide character routines. */
1882 if (type == BT_CHARACTER && kind == 4)
1883 write_a_char4 (dtp, f, p, size);
1884 else
1885 write_a (dtp, f, p, size);
1886 break;
1887
1888 case FMT_L:
1889 if (n == 0)
1890 goto need_data;
1891 write_l (dtp, f, p, kind);
1892 break;
1893
1894 case FMT_D:
1895 if (n == 0)
1896 goto need_data;
1897 if (require_type (dtp, BT_REAL, type, f))
1898 return;
1899 write_d (dtp, f, p, kind);
1900 break;
1901
1902 case FMT_DT:
1903 if (n == 0)
1904 goto need_data;
1905 int unit = dtp->u.p.current_unit->unit_number;
1906 char dt[] = "DT";
1907 char tmp_iomsg[IOMSG_LEN] = "";
1908 char *child_iomsg;
1909 gfc_charlen_type child_iomsg_len;
1910 int noiostat;
1911 int *child_iostat = NULL;
1912 char *iotype;
1913 gfc_charlen_type iotype_len = f->u.udf.string_len;
1914
1915 /* Build the iotype string. */
1916 if (iotype_len == 0)
1917 {
1918 iotype_len = 2;
1919 iotype = dt;
1920 }
1921 else
1922 iotype = get_dt_format (f->u.udf.string, &iotype_len);
1923
1924 /* Set iostat, intent(out). */
1925 noiostat = 0;
1926 child_iostat = (dtp->common.flags & IOPARM_HAS_IOSTAT) ?
1927 dtp->common.iostat : &noiostat;
1928
1929 /* Set iomsg, intent(inout). */
1930 if (dtp->common.flags & IOPARM_HAS_IOMSG)
1931 {
1932 child_iomsg = dtp->common.iomsg;
1933 child_iomsg_len = dtp->common.iomsg_len;
1934 }
1935 else
1936 {
1937 child_iomsg = tmp_iomsg;
1938 child_iomsg_len = IOMSG_LEN;
1939 }
1940
1941 /* Call the user defined formatted WRITE procedure. */
1942 dtp->u.p.current_unit->child_dtio++;
1943 dtp->u.p.fdtio_ptr (p, &unit, iotype, f->u.udf.vlist,
1944 child_iostat, child_iomsg,
1945 iotype_len, child_iomsg_len);
1946 dtp->u.p.current_unit->child_dtio--;
1947
1948 if (f->u.udf.string_len != 0)
1949 free (iotype);
1950 /* Note: vlist is freed in free_format_data. */
1951 break;
1952
1953 case FMT_E:
1954 if (n == 0)
1955 goto need_data;
1956 if (require_type (dtp, BT_REAL, type, f))
1957 return;
1958 write_e (dtp, f, p, kind);
1959 break;
1960
1961 case FMT_EN:
1962 if (n == 0)
1963 goto need_data;
1964 if (require_type (dtp, BT_REAL, type, f))
1965 return;
1966 write_en (dtp, f, p, kind);
1967 break;
1968
1969 case FMT_ES:
1970 if (n == 0)
1971 goto need_data;
1972 if (require_type (dtp, BT_REAL, type, f))
1973 return;
1974 write_es (dtp, f, p, kind);
1975 break;
1976
1977 case FMT_F:
1978 if (n == 0)
1979 goto need_data;
1980 if (require_type (dtp, BT_REAL, type, f))
1981 return;
1982 write_f (dtp, f, p, kind);
1983 break;
1984
1985 case FMT_G:
1986 if (n == 0)
1987 goto need_data;
1988 switch (type)
1989 {
1990 case BT_INTEGER:
1991 write_i (dtp, f, p, kind);
1992 break;
1993 case BT_LOGICAL:
1994 write_l (dtp, f, p, kind);
1995 break;
1996 case BT_CHARACTER:
1997 if (kind == 4)
1998 write_a_char4 (dtp, f, p, size);
1999 else
2000 write_a (dtp, f, p, size);
2001 break;
2002 case BT_REAL:
2003 if (f->u.real.w == 0)
2004 write_real_g0 (dtp, p, kind, f->u.real.d);
2005 else
2006 write_d (dtp, f, p, kind);
2007 break;
2008 default:
2009 internal_error (&dtp->common,
2010 "formatted_transfer(): Bad type");
2011 }
2012 break;
2013
2014 case FMT_STRING:
2015 consume_data_flag = 0;
2016 write_constant_string (dtp, f);
2017 break;
2018
2019 /* Format codes that don't transfer data. */
2020 case FMT_X:
2021 case FMT_TR:
2022 consume_data_flag = 0;
2023
2024 dtp->u.p.skips += f->u.n;
2025 pos = bytes_used + dtp->u.p.skips - 1;
2026 dtp->u.p.pending_spaces = pos - dtp->u.p.max_pos + 1;
2027 /* Writes occur just before the switch on f->format, above, so
2028 that trailing blanks are suppressed, unless we are doing a
2029 non-advancing write in which case we want to output the blanks
2030 now. */
2031 if (dtp->u.p.advance_status == ADVANCE_NO)
2032 {
2033 write_x (dtp, dtp->u.p.skips, dtp->u.p.pending_spaces);
2034 dtp->u.p.skips = dtp->u.p.pending_spaces = 0;
2035 }
2036 break;
2037
2038 case FMT_TL:
2039 case FMT_T:
2040 consume_data_flag = 0;
2041
2042 if (f->format == FMT_TL)
2043 {
2044
2045 /* Handle the special case when no bytes have been used yet.
2046 Cannot go below zero. */
2047 if (bytes_used == 0)
2048 {
2049 dtp->u.p.pending_spaces -= f->u.n;
2050 dtp->u.p.skips -= f->u.n;
2051 dtp->u.p.skips = dtp->u.p.skips < 0 ? 0 : dtp->u.p.skips;
2052 }
2053
2054 pos = bytes_used - f->u.n;
2055 }
2056 else /* FMT_T */
2057 pos = f->u.n - dtp->u.p.pending_spaces - 1;
2058
2059 /* Standard 10.6.1.1: excessive left tabbing is reset to the
2060 left tab limit. We do not check if the position has gone
2061 beyond the end of record because a subsequent tab could
2062 bring us back again. */
2063 pos = pos < 0 ? 0 : pos;
2064
2065 dtp->u.p.skips = dtp->u.p.skips + pos - bytes_used;
2066 dtp->u.p.pending_spaces = dtp->u.p.pending_spaces
2067 + pos - dtp->u.p.max_pos;
2068 dtp->u.p.pending_spaces = dtp->u.p.pending_spaces < 0
2069 ? 0 : dtp->u.p.pending_spaces;
2070 break;
2071
2072 case FMT_S:
2073 consume_data_flag = 0;
2074 dtp->u.p.sign_status = SIGN_S;
2075 break;
2076
2077 case FMT_SS:
2078 consume_data_flag = 0;
2079 dtp->u.p.sign_status = SIGN_SS;
2080 break;
2081
2082 case FMT_SP:
2083 consume_data_flag = 0;
2084 dtp->u.p.sign_status = SIGN_SP;
2085 break;
2086
2087 case FMT_BN:
2088 consume_data_flag = 0 ;
2089 dtp->u.p.blank_status = BLANK_NULL;
2090 break;
2091
2092 case FMT_BZ:
2093 consume_data_flag = 0;
2094 dtp->u.p.blank_status = BLANK_ZERO;
2095 break;
2096
2097 case FMT_DC:
2098 consume_data_flag = 0;
2099 dtp->u.p.current_unit->decimal_status = DECIMAL_COMMA;
2100 break;
2101
2102 case FMT_DP:
2103 consume_data_flag = 0;
2104 dtp->u.p.current_unit->decimal_status = DECIMAL_POINT;
2105 break;
2106
2107 case FMT_RC:
2108 consume_data_flag = 0;
2109 dtp->u.p.current_unit->round_status = ROUND_COMPATIBLE;
2110 break;
2111
2112 case FMT_RD:
2113 consume_data_flag = 0;
2114 dtp->u.p.current_unit->round_status = ROUND_DOWN;
2115 break;
2116
2117 case FMT_RN:
2118 consume_data_flag = 0;
2119 dtp->u.p.current_unit->round_status = ROUND_NEAREST;
2120 break;
2121
2122 case FMT_RP:
2123 consume_data_flag = 0;
2124 dtp->u.p.current_unit->round_status = ROUND_PROCDEFINED;
2125 break;
2126
2127 case FMT_RU:
2128 consume_data_flag = 0;
2129 dtp->u.p.current_unit->round_status = ROUND_UP;
2130 break;
2131
2132 case FMT_RZ:
2133 consume_data_flag = 0;
2134 dtp->u.p.current_unit->round_status = ROUND_ZERO;
2135 break;
2136
2137 case FMT_P:
2138 consume_data_flag = 0;
2139 dtp->u.p.scale_factor = f->u.k;
2140 break;
2141
2142 case FMT_DOLLAR:
2143 consume_data_flag = 0;
2144 dtp->u.p.seen_dollar = 1;
2145 break;
2146
2147 case FMT_SLASH:
2148 consume_data_flag = 0;
2149 dtp->u.p.skips = dtp->u.p.pending_spaces = 0;
2150 next_record (dtp, 0);
2151 break;
2152
2153 case FMT_COLON:
2154 /* A colon descriptor causes us to exit this loop (in
2155 particular preventing another / descriptor from being
2156 processed) unless there is another data item to be
2157 transferred. */
2158 consume_data_flag = 0;
2159 if (n == 0)
2160 return;
2161 break;
2162
2163 default:
2164 internal_error (&dtp->common, "Bad format node");
2165 }
2166
2167 /* Adjust the item count and data pointer. */
2168
2169 if ((consume_data_flag > 0) && (n > 0))
2170 {
2171 n--;
2172 p = ((char *) p) + size;
2173 }
2174
2175 pos = (int)(dtp->u.p.current_unit->recl - dtp->u.p.current_unit->bytes_left);
2176 dtp->u.p.max_pos = (dtp->u.p.max_pos > pos) ? dtp->u.p.max_pos : pos;
2177 }
2178
2179 return;
2180
2181 /* Come here when we need a data descriptor but don't have one. We
2182 push the current format node back onto the input, then return and
2183 let the user program call us back with the data. */
2184 need_data:
2185 unget_format (dtp, f);
2186 }
2187
2188 /* This function is first called from data_init_transfer to initiate the loop
2189 over each item in the format, transferring data as required. Subsequent
2190 calls to this function occur for each data item foound in the READ/WRITE
2191 statement. The item_count is incremented for each call. Since the first
2192 call is from data_transfer_init, the item_count is always one greater than
2193 the actual count number of the item being transferred. */
2194
2195 static void
2196 formatted_transfer (st_parameter_dt *dtp, bt type, void *p, int kind,
2197 size_t size, size_t nelems)
2198 {
2199 size_t elem;
2200 char *tmp;
2201
2202 tmp = (char *) p;
2203 size_t stride = type == BT_CHARACTER ?
2204 size * GFC_SIZE_OF_CHAR_KIND(kind) : size;
2205 if (dtp->u.p.mode == READING)
2206 {
2207 /* Big loop over all the elements. */
2208 for (elem = 0; elem < nelems; elem++)
2209 {
2210 dtp->u.p.item_count++;
2211 formatted_transfer_scalar_read (dtp, type, tmp + stride*elem, kind, size);
2212 }
2213 }
2214 else
2215 {
2216 /* Big loop over all the elements. */
2217 for (elem = 0; elem < nelems; elem++)
2218 {
2219 dtp->u.p.item_count++;
2220 formatted_transfer_scalar_write (dtp, type, tmp + stride*elem, kind, size);
2221 }
2222 }
2223 }
2224
2225
2226 /* Data transfer entry points. The type of the data entity is
2227 implicit in the subroutine call. This prevents us from having to
2228 share a common enum with the compiler. */
2229
2230 void
2231 transfer_integer (st_parameter_dt *dtp, void *p, int kind)
2232 {
2233 if ((dtp->common.flags & IOPARM_LIBRETURN_MASK) != IOPARM_LIBRETURN_OK)
2234 return;
2235 dtp->u.p.transfer (dtp, BT_INTEGER, p, kind, kind, 1);
2236 }
2237
2238 void
2239 transfer_integer_write (st_parameter_dt *dtp, void *p, int kind)
2240 {
2241 transfer_integer (dtp, p, kind);
2242 }
2243
2244 void
2245 transfer_real (st_parameter_dt *dtp, void *p, int kind)
2246 {
2247 size_t size;
2248 if ((dtp->common.flags & IOPARM_LIBRETURN_MASK) != IOPARM_LIBRETURN_OK)
2249 return;
2250 size = size_from_real_kind (kind);
2251 dtp->u.p.transfer (dtp, BT_REAL, p, kind, size, 1);
2252 }
2253
2254 void
2255 transfer_real_write (st_parameter_dt *dtp, void *p, int kind)
2256 {
2257 transfer_real (dtp, p, kind);
2258 }
2259
2260 void
2261 transfer_logical (st_parameter_dt *dtp, void *p, int kind)
2262 {
2263 if ((dtp->common.flags & IOPARM_LIBRETURN_MASK) != IOPARM_LIBRETURN_OK)
2264 return;
2265 dtp->u.p.transfer (dtp, BT_LOGICAL, p, kind, kind, 1);
2266 }
2267
2268 void
2269 transfer_logical_write (st_parameter_dt *dtp, void *p, int kind)
2270 {
2271 transfer_logical (dtp, p, kind);
2272 }
2273
2274 void
2275 transfer_character (st_parameter_dt *dtp, void *p, int len)
2276 {
2277 static char *empty_string[0];
2278
2279 if ((dtp->common.flags & IOPARM_LIBRETURN_MASK) != IOPARM_LIBRETURN_OK)
2280 return;
2281
2282 /* Strings of zero length can have p == NULL, which confuses the
2283 transfer routines into thinking we need more data elements. To avoid
2284 this, we give them a nice pointer. */
2285 if (len == 0 && p == NULL)
2286 p = empty_string;
2287
2288 /* Set kind here to 1. */
2289 dtp->u.p.transfer (dtp, BT_CHARACTER, p, 1, len, 1);
2290 }
2291
2292 void
2293 transfer_character_write (st_parameter_dt *dtp, void *p, int len)
2294 {
2295 transfer_character (dtp, p, len);
2296 }
2297
2298 void
2299 transfer_character_wide (st_parameter_dt *dtp, void *p, int len, int kind)
2300 {
2301 static char *empty_string[0];
2302
2303 if ((dtp->common.flags & IOPARM_LIBRETURN_MASK) != IOPARM_LIBRETURN_OK)
2304 return;
2305
2306 /* Strings of zero length can have p == NULL, which confuses the
2307 transfer routines into thinking we need more data elements. To avoid
2308 this, we give them a nice pointer. */
2309 if (len == 0 && p == NULL)
2310 p = empty_string;
2311
2312 /* Here we pass the actual kind value. */
2313 dtp->u.p.transfer (dtp, BT_CHARACTER, p, kind, len, 1);
2314 }
2315
2316 void
2317 transfer_character_wide_write (st_parameter_dt *dtp, void *p, int len, int kind)
2318 {
2319 transfer_character_wide (dtp, p, len, kind);
2320 }
2321
2322 void
2323 transfer_complex (st_parameter_dt *dtp, void *p, int kind)
2324 {
2325 size_t size;
2326 if ((dtp->common.flags & IOPARM_LIBRETURN_MASK) != IOPARM_LIBRETURN_OK)
2327 return;
2328 size = size_from_complex_kind (kind);
2329 dtp->u.p.transfer (dtp, BT_COMPLEX, p, kind, size, 1);
2330 }
2331
2332 void
2333 transfer_complex_write (st_parameter_dt *dtp, void *p, int kind)
2334 {
2335 transfer_complex (dtp, p, kind);
2336 }
2337
2338 void
2339 transfer_array (st_parameter_dt *dtp, gfc_array_char *desc, int kind,
2340 gfc_charlen_type charlen)
2341 {
2342 index_type count[GFC_MAX_DIMENSIONS];
2343 index_type extent[GFC_MAX_DIMENSIONS];
2344 index_type stride[GFC_MAX_DIMENSIONS];
2345 index_type stride0, rank, size, n;
2346 size_t tsize;
2347 char *data;
2348 bt iotype;
2349
2350 if ((dtp->common.flags & IOPARM_LIBRETURN_MASK) != IOPARM_LIBRETURN_OK)
2351 return;
2352
2353 iotype = (bt) GFC_DESCRIPTOR_TYPE (desc);
2354 size = iotype == BT_CHARACTER ? charlen : GFC_DESCRIPTOR_SIZE (desc);
2355
2356 rank = GFC_DESCRIPTOR_RANK (desc);
2357 for (n = 0; n < rank; n++)
2358 {
2359 count[n] = 0;
2360 stride[n] = GFC_DESCRIPTOR_STRIDE_BYTES(desc,n);
2361 extent[n] = GFC_DESCRIPTOR_EXTENT(desc,n);
2362
2363 /* If the extent of even one dimension is zero, then the entire
2364 array section contains zero elements, so we return after writing
2365 a zero array record. */
2366 if (extent[n] <= 0)
2367 {
2368 data = NULL;
2369 tsize = 0;
2370 dtp->u.p.transfer (dtp, iotype, data, kind, size, tsize);
2371 return;
2372 }
2373 }
2374
2375 stride0 = stride[0];
2376
2377 /* If the innermost dimension has a stride of 1, we can do the transfer
2378 in contiguous chunks. */
2379 if (stride0 == size)
2380 tsize = extent[0];
2381 else
2382 tsize = 1;
2383
2384 data = GFC_DESCRIPTOR_DATA (desc);
2385
2386 while (data)
2387 {
2388 dtp->u.p.transfer (dtp, iotype, data, kind, size, tsize);
2389 data += stride0 * tsize;
2390 count[0] += tsize;
2391 n = 0;
2392 while (count[n] == extent[n])
2393 {
2394 count[n] = 0;
2395 data -= stride[n] * extent[n];
2396 n++;
2397 if (n == rank)
2398 {
2399 data = NULL;
2400 break;
2401 }
2402 else
2403 {
2404 count[n]++;
2405 data += stride[n];
2406 }
2407 }
2408 }
2409 }
2410
2411 void
2412 transfer_array_write (st_parameter_dt *dtp, gfc_array_char *desc, int kind,
2413 gfc_charlen_type charlen)
2414 {
2415 transfer_array (dtp, desc, kind, charlen);
2416 }
2417
2418
2419 /* User defined input/output iomsg. */
2420
2421 #define IOMSG_LEN 256
2422
2423 void
2424 transfer_derived (st_parameter_dt *parent, void *dtio_source, void *dtio_proc)
2425 {
2426 if (parent->u.p.current_unit)
2427 {
2428 if (parent->u.p.current_unit->flags.form == FORM_UNFORMATTED)
2429 parent->u.p.ufdtio_ptr = (unformatted_dtio) dtio_proc;
2430 else
2431 parent->u.p.fdtio_ptr = (formatted_dtio) dtio_proc;
2432 }
2433 parent->u.p.transfer (parent, BT_CLASS, dtio_source, 0, 0, 1);
2434 }
2435
2436
2437 /* Preposition a sequential unformatted file while reading. */
2438
2439 static void
2440 us_read (st_parameter_dt *dtp, int continued)
2441 {
2442 ssize_t n, nr;
2443 GFC_INTEGER_4 i4;
2444 GFC_INTEGER_8 i8;
2445 gfc_offset i;
2446
2447 if (compile_options.record_marker == 0)
2448 n = sizeof (GFC_INTEGER_4);
2449 else
2450 n = compile_options.record_marker;
2451
2452 nr = sread (dtp->u.p.current_unit->s, &i, n);
2453 if (unlikely (nr < 0))
2454 {
2455 generate_error (&dtp->common, LIBERROR_BAD_US, NULL);
2456 return;
2457 }
2458 else if (nr == 0)
2459 {
2460 hit_eof (dtp);
2461 return; /* end of file */
2462 }
2463 else if (unlikely (n != nr))
2464 {
2465 generate_error (&dtp->common, LIBERROR_BAD_US, NULL);
2466 return;
2467 }
2468
2469 /* Only GFC_CONVERT_NATIVE and GFC_CONVERT_SWAP are valid here. */
2470 if (likely (dtp->u.p.current_unit->flags.convert == GFC_CONVERT_NATIVE))
2471 {
2472 switch (nr)
2473 {
2474 case sizeof(GFC_INTEGER_4):
2475 memcpy (&i4, &i, sizeof (i4));
2476 i = i4;
2477 break;
2478
2479 case sizeof(GFC_INTEGER_8):
2480 memcpy (&i8, &i, sizeof (i8));
2481 i = i8;
2482 break;
2483
2484 default:
2485 runtime_error ("Illegal value for record marker");
2486 break;
2487 }
2488 }
2489 else
2490 {
2491 uint32_t u32;
2492 uint64_t u64;
2493 switch (nr)
2494 {
2495 case sizeof(GFC_INTEGER_4):
2496 memcpy (&u32, &i, sizeof (u32));
2497 u32 = __builtin_bswap32 (u32);
2498 memcpy (&i4, &u32, sizeof (i4));
2499 i = i4;
2500 break;
2501
2502 case sizeof(GFC_INTEGER_8):
2503 memcpy (&u64, &i, sizeof (u64));
2504 u64 = __builtin_bswap64 (u64);
2505 memcpy (&i8, &u64, sizeof (i8));
2506 i = i8;
2507 break;
2508
2509 default:
2510 runtime_error ("Illegal value for record marker");
2511 break;
2512 }
2513 }
2514
2515 if (i >= 0)
2516 {
2517 dtp->u.p.current_unit->bytes_left_subrecord = i;
2518 dtp->u.p.current_unit->continued = 0;
2519 }
2520 else
2521 {
2522 dtp->u.p.current_unit->bytes_left_subrecord = -i;
2523 dtp->u.p.current_unit->continued = 1;
2524 }
2525
2526 if (! continued)
2527 dtp->u.p.current_unit->bytes_left = dtp->u.p.current_unit->recl;
2528 }
2529
2530
2531 /* Preposition a sequential unformatted file while writing. This
2532 amount to writing a bogus length that will be filled in later. */
2533
2534 static void
2535 us_write (st_parameter_dt *dtp, int continued)
2536 {
2537 ssize_t nbytes;
2538 gfc_offset dummy;
2539
2540 dummy = 0;
2541
2542 if (compile_options.record_marker == 0)
2543 nbytes = sizeof (GFC_INTEGER_4);
2544 else
2545 nbytes = compile_options.record_marker ;
2546
2547 if (swrite (dtp->u.p.current_unit->s, &dummy, nbytes) != nbytes)
2548 generate_error (&dtp->common, LIBERROR_OS, NULL);
2549
2550 /* For sequential unformatted, if RECL= was not specified in the OPEN
2551 we write until we have more bytes than can fit in the subrecord
2552 markers, then we write a new subrecord. */
2553
2554 dtp->u.p.current_unit->bytes_left_subrecord =
2555 dtp->u.p.current_unit->recl_subrecord;
2556 dtp->u.p.current_unit->continued = continued;
2557 }
2558
2559
2560 /* Position to the next record prior to transfer. We are assumed to
2561 be before the next record. We also calculate the bytes in the next
2562 record. */
2563
2564 static void
2565 pre_position (st_parameter_dt *dtp)
2566 {
2567 if (dtp->u.p.current_unit->current_record)
2568 return; /* Already positioned. */
2569
2570 switch (current_mode (dtp))
2571 {
2572 case FORMATTED_STREAM:
2573 case UNFORMATTED_STREAM:
2574 /* There are no records with stream I/O. If the position was specified
2575 data_transfer_init has already positioned the file. If no position
2576 was specified, we continue from where we last left off. I.e.
2577 there is nothing to do here. */
2578 break;
2579
2580 case UNFORMATTED_SEQUENTIAL:
2581 if (dtp->u.p.mode == READING)
2582 us_read (dtp, 0);
2583 else
2584 us_write (dtp, 0);
2585
2586 break;
2587
2588 case FORMATTED_SEQUENTIAL:
2589 case FORMATTED_DIRECT:
2590 case UNFORMATTED_DIRECT:
2591 dtp->u.p.current_unit->bytes_left = dtp->u.p.current_unit->recl;
2592 break;
2593 }
2594
2595 dtp->u.p.current_unit->current_record = 1;
2596 }
2597
2598
2599 /* Initialize things for a data transfer. This code is common for
2600 both reading and writing. */
2601
2602 static void
2603 data_transfer_init (st_parameter_dt *dtp, int read_flag)
2604 {
2605 unit_flags u_flags; /* Used for creating a unit if needed. */
2606 GFC_INTEGER_4 cf = dtp->common.flags;
2607 namelist_info *ionml;
2608
2609 ionml = ((cf & IOPARM_DT_IONML_SET) != 0) ? dtp->u.p.ionml : NULL;
2610
2611 memset (&dtp->u.p, 0, sizeof (dtp->u.p));
2612
2613 dtp->u.p.ionml = ionml;
2614 dtp->u.p.mode = read_flag ? READING : WRITING;
2615
2616 dtp->u.p.cc.len = 0;
2617
2618 if ((dtp->common.flags & IOPARM_LIBRETURN_MASK) != IOPARM_LIBRETURN_OK)
2619 return;
2620
2621 dtp->u.p.current_unit = get_unit (dtp, 1);
2622
2623 if (dtp->u.p.current_unit == NULL)
2624 {
2625 /* This means we tried to access an external unit < 0 without
2626 having opened it first with NEWUNIT=. */
2627 generate_error (&dtp->common, LIBERROR_BAD_OPTION,
2628 "Unit number is negative and unit was not already "
2629 "opened with OPEN(NEWUNIT=...)");
2630 return;
2631 }
2632 else if (dtp->u.p.current_unit->s == NULL)
2633 { /* Open the unit with some default flags. */
2634 st_parameter_open opp;
2635 unit_convert conv;
2636
2637 memset (&u_flags, '\0', sizeof (u_flags));
2638 u_flags.access = ACCESS_SEQUENTIAL;
2639 u_flags.action = ACTION_READWRITE;
2640
2641 /* Is it unformatted? */
2642 if (!(cf & (IOPARM_DT_HAS_FORMAT | IOPARM_DT_LIST_FORMAT
2643 | IOPARM_DT_IONML_SET)))
2644 u_flags.form = FORM_UNFORMATTED;
2645 else
2646 u_flags.form = FORM_UNSPECIFIED;
2647
2648 u_flags.delim = DELIM_UNSPECIFIED;
2649 u_flags.blank = BLANK_UNSPECIFIED;
2650 u_flags.pad = PAD_UNSPECIFIED;
2651 u_flags.decimal = DECIMAL_UNSPECIFIED;
2652 u_flags.encoding = ENCODING_UNSPECIFIED;
2653 u_flags.async = ASYNC_UNSPECIFIED;
2654 u_flags.round = ROUND_UNSPECIFIED;
2655 u_flags.sign = SIGN_UNSPECIFIED;
2656 u_flags.share = SHARE_UNSPECIFIED;
2657 u_flags.cc = CC_UNSPECIFIED;
2658 u_flags.readonly = 0;
2659
2660 u_flags.status = STATUS_UNKNOWN;
2661
2662 conv = get_unformatted_convert (dtp->common.unit);
2663
2664 if (conv == GFC_CONVERT_NONE)
2665 conv = compile_options.convert;
2666
2667 /* We use big_endian, which is 0 on little-endian machines
2668 and 1 on big-endian machines. */
2669 switch (conv)
2670 {
2671 case GFC_CONVERT_NATIVE:
2672 case GFC_CONVERT_SWAP:
2673 break;
2674
2675 case GFC_CONVERT_BIG:
2676 conv = big_endian ? GFC_CONVERT_NATIVE : GFC_CONVERT_SWAP;
2677 break;
2678
2679 case GFC_CONVERT_LITTLE:
2680 conv = big_endian ? GFC_CONVERT_SWAP : GFC_CONVERT_NATIVE;
2681 break;
2682
2683 default:
2684 internal_error (&opp.common, "Illegal value for CONVERT");
2685 break;
2686 }
2687
2688 u_flags.convert = conv;
2689
2690 opp.common = dtp->common;
2691 opp.common.flags &= IOPARM_COMMON_MASK;
2692 dtp->u.p.current_unit = new_unit (&opp, dtp->u.p.current_unit, &u_flags);
2693 dtp->common.flags &= ~IOPARM_COMMON_MASK;
2694 dtp->common.flags |= (opp.common.flags & IOPARM_COMMON_MASK);
2695 if (dtp->u.p.current_unit == NULL)
2696 return;
2697 }
2698
2699 if (dtp->u.p.current_unit->child_dtio == 0)
2700 {
2701 if ((cf & IOPARM_DT_HAS_SIZE) != 0)
2702 {
2703 dtp->u.p.current_unit->has_size = true;
2704 /* Initialize the count. */
2705 dtp->u.p.current_unit->size_used = 0;
2706 }
2707 else
2708 dtp->u.p.current_unit->has_size = false;
2709 }
2710
2711 /* Check the action. */
2712
2713 if (read_flag && dtp->u.p.current_unit->flags.action == ACTION_WRITE)
2714 {
2715 generate_error (&dtp->common, LIBERROR_BAD_ACTION,
2716 "Cannot read from file opened for WRITE");
2717 return;
2718 }
2719
2720 if (!read_flag && dtp->u.p.current_unit->flags.action == ACTION_READ)
2721 {
2722 generate_error (&dtp->common, LIBERROR_BAD_ACTION,
2723 "Cannot write to file opened for READ");
2724 return;
2725 }
2726
2727 dtp->u.p.first_item = 1;
2728
2729 /* Check the format. */
2730
2731 if ((cf & IOPARM_DT_HAS_FORMAT) != 0)
2732 parse_format (dtp);
2733
2734 if (dtp->u.p.current_unit->flags.form == FORM_UNFORMATTED
2735 && (cf & (IOPARM_DT_HAS_FORMAT | IOPARM_DT_LIST_FORMAT))
2736 != 0)
2737 {
2738 generate_error (&dtp->common, LIBERROR_OPTION_CONFLICT,
2739 "Format present for UNFORMATTED data transfer");
2740 return;
2741 }
2742
2743 if ((cf & IOPARM_DT_HAS_NAMELIST_NAME) != 0 && dtp->u.p.ionml != NULL)
2744 {
2745 if ((cf & IOPARM_DT_HAS_FORMAT) != 0)
2746 {
2747 generate_error (&dtp->common, LIBERROR_OPTION_CONFLICT,
2748 "A format cannot be specified with a namelist");
2749 return;
2750 }
2751 }
2752 else if (dtp->u.p.current_unit->flags.form == FORM_FORMATTED &&
2753 !(cf & (IOPARM_DT_HAS_FORMAT | IOPARM_DT_LIST_FORMAT)))
2754 {
2755 generate_error (&dtp->common, LIBERROR_OPTION_CONFLICT,
2756 "Missing format for FORMATTED data transfer");
2757 return;
2758 }
2759
2760 if (is_internal_unit (dtp)
2761 && dtp->u.p.current_unit->flags.form == FORM_UNFORMATTED)
2762 {
2763 generate_error (&dtp->common, LIBERROR_OPTION_CONFLICT,
2764 "Internal file cannot be accessed by UNFORMATTED "
2765 "data transfer");
2766 return;
2767 }
2768
2769 /* Check the record or position number. */
2770
2771 if (dtp->u.p.current_unit->flags.access == ACCESS_DIRECT
2772 && (cf & IOPARM_DT_HAS_REC) == 0)
2773 {
2774 generate_error (&dtp->common, LIBERROR_MISSING_OPTION,
2775 "Direct access data transfer requires record number");
2776 return;
2777 }
2778
2779 if (dtp->u.p.current_unit->flags.access == ACCESS_SEQUENTIAL)
2780 {
2781 if ((cf & IOPARM_DT_HAS_REC) != 0)
2782 {
2783 generate_error (&dtp->common, LIBERROR_OPTION_CONFLICT,
2784 "Record number not allowed for sequential access "
2785 "data transfer");
2786 return;
2787 }
2788
2789 if (compile_options.warn_std &&
2790 dtp->u.p.current_unit->endfile == AFTER_ENDFILE)
2791 {
2792 generate_error (&dtp->common, LIBERROR_OPTION_CONFLICT,
2793 "Sequential READ or WRITE not allowed after "
2794 "EOF marker, possibly use REWIND or BACKSPACE");
2795 return;
2796 }
2797 }
2798 /* Process the ADVANCE option. */
2799
2800 dtp->u.p.advance_status
2801 = !(cf & IOPARM_DT_HAS_ADVANCE) ? ADVANCE_UNSPECIFIED :
2802 find_option (&dtp->common, dtp->advance, dtp->advance_len, advance_opt,
2803 "Bad ADVANCE parameter in data transfer statement");
2804
2805 if (dtp->u.p.advance_status != ADVANCE_UNSPECIFIED)
2806 {
2807 if (dtp->u.p.current_unit->flags.access == ACCESS_DIRECT)
2808 {
2809 generate_error (&dtp->common, LIBERROR_OPTION_CONFLICT,
2810 "ADVANCE specification conflicts with sequential "
2811 "access");
2812 return;
2813 }
2814
2815 if (is_internal_unit (dtp))
2816 {
2817 generate_error (&dtp->common, LIBERROR_OPTION_CONFLICT,
2818 "ADVANCE specification conflicts with internal file");
2819 return;
2820 }
2821
2822 if ((cf & (IOPARM_DT_HAS_FORMAT | IOPARM_DT_LIST_FORMAT))
2823 != IOPARM_DT_HAS_FORMAT)
2824 {
2825 generate_error (&dtp->common, LIBERROR_OPTION_CONFLICT,
2826 "ADVANCE specification requires an explicit format");
2827 return;
2828 }
2829 }
2830
2831 if (read_flag)
2832 {
2833 dtp->u.p.current_unit->previous_nonadvancing_write = 0;
2834
2835 if ((cf & IOPARM_EOR) != 0 && dtp->u.p.advance_status != ADVANCE_NO)
2836 {
2837 generate_error (&dtp->common, LIBERROR_MISSING_OPTION,
2838 "EOR specification requires an ADVANCE specification "
2839 "of NO");
2840 return;
2841 }
2842
2843 if ((cf & IOPARM_DT_HAS_SIZE) != 0
2844 && dtp->u.p.advance_status != ADVANCE_NO)
2845 {
2846 generate_error (&dtp->common, LIBERROR_MISSING_OPTION,
2847 "SIZE specification requires an ADVANCE "
2848 "specification of NO");
2849 return;
2850 }
2851 }
2852 else
2853 { /* Write constraints. */
2854 if ((cf & IOPARM_END) != 0)
2855 {
2856 generate_error (&dtp->common, LIBERROR_OPTION_CONFLICT,
2857 "END specification cannot appear in a write "
2858 "statement");
2859 return;
2860 }
2861
2862 if ((cf & IOPARM_EOR) != 0)
2863 {
2864 generate_error (&dtp->common, LIBERROR_OPTION_CONFLICT,
2865 "EOR specification cannot appear in a write "
2866 "statement");
2867 return;
2868 }
2869
2870 if ((cf & IOPARM_DT_HAS_SIZE) != 0)
2871 {
2872 generate_error (&dtp->common, LIBERROR_OPTION_CONFLICT,
2873 "SIZE specification cannot appear in a write "
2874 "statement");
2875 return;
2876 }
2877 }
2878
2879 if (dtp->u.p.advance_status == ADVANCE_UNSPECIFIED)
2880 dtp->u.p.advance_status = ADVANCE_YES;
2881
2882 /* Check the decimal mode. */
2883 dtp->u.p.current_unit->decimal_status
2884 = !(cf & IOPARM_DT_HAS_DECIMAL) ? DECIMAL_UNSPECIFIED :
2885 find_option (&dtp->common, dtp->decimal, dtp->decimal_len,
2886 decimal_opt, "Bad DECIMAL parameter in data transfer "
2887 "statement");
2888
2889 if (dtp->u.p.current_unit->decimal_status == DECIMAL_UNSPECIFIED)
2890 dtp->u.p.current_unit->decimal_status = dtp->u.p.current_unit->flags.decimal;
2891
2892 /* Check the round mode. */
2893 dtp->u.p.current_unit->round_status
2894 = !(cf & IOPARM_DT_HAS_ROUND) ? ROUND_UNSPECIFIED :
2895 find_option (&dtp->common, dtp->round, dtp->round_len,
2896 round_opt, "Bad ROUND parameter in data transfer "
2897 "statement");
2898
2899 if (dtp->u.p.current_unit->round_status == ROUND_UNSPECIFIED)
2900 dtp->u.p.current_unit->round_status = dtp->u.p.current_unit->flags.round;
2901
2902 /* Check the sign mode. */
2903 dtp->u.p.sign_status
2904 = !(cf & IOPARM_DT_HAS_SIGN) ? SIGN_UNSPECIFIED :
2905 find_option (&dtp->common, dtp->sign, dtp->sign_len, sign_opt,
2906 "Bad SIGN parameter in data transfer statement");
2907
2908 if (dtp->u.p.sign_status == SIGN_UNSPECIFIED)
2909 dtp->u.p.sign_status = dtp->u.p.current_unit->flags.sign;
2910
2911 /* Check the blank mode. */
2912 dtp->u.p.blank_status
2913 = !(cf & IOPARM_DT_HAS_BLANK) ? BLANK_UNSPECIFIED :
2914 find_option (&dtp->common, dtp->blank, dtp->blank_len,
2915 blank_opt,
2916 "Bad BLANK parameter in data transfer statement");
2917
2918 if (dtp->u.p.blank_status == BLANK_UNSPECIFIED)
2919 dtp->u.p.blank_status = dtp->u.p.current_unit->flags.blank;
2920
2921 /* Check the delim mode. */
2922 dtp->u.p.current_unit->delim_status
2923 = !(cf & IOPARM_DT_HAS_DELIM) ? DELIM_UNSPECIFIED :
2924 find_option (&dtp->common, dtp->delim, dtp->delim_len,
2925 delim_opt, "Bad DELIM parameter in data transfer statement");
2926
2927 if (dtp->u.p.current_unit->delim_status == DELIM_UNSPECIFIED)
2928 {
2929 if (ionml && dtp->u.p.current_unit->flags.delim == DELIM_UNSPECIFIED)
2930 dtp->u.p.current_unit->delim_status = DELIM_QUOTE;
2931 else
2932 dtp->u.p.current_unit->delim_status = dtp->u.p.current_unit->flags.delim;
2933 }
2934
2935 /* Check the pad mode. */
2936 dtp->u.p.current_unit->pad_status
2937 = !(cf & IOPARM_DT_HAS_PAD) ? PAD_UNSPECIFIED :
2938 find_option (&dtp->common, dtp->pad, dtp->pad_len, pad_opt,
2939 "Bad PAD parameter in data transfer statement");
2940
2941 if (dtp->u.p.current_unit->pad_status == PAD_UNSPECIFIED)
2942 dtp->u.p.current_unit->pad_status = dtp->u.p.current_unit->flags.pad;
2943
2944 /* Check to see if we might be reading what we wrote before */
2945
2946 if (dtp->u.p.mode != dtp->u.p.current_unit->mode
2947 && !is_internal_unit (dtp))
2948 {
2949 int pos = fbuf_reset (dtp->u.p.current_unit);
2950 if (pos != 0)
2951 sseek (dtp->u.p.current_unit->s, pos, SEEK_CUR);
2952 sflush(dtp->u.p.current_unit->s);
2953 }
2954
2955 /* Check the POS= specifier: that it is in range and that it is used with a
2956 unit that has been connected for STREAM access. F2003 9.5.1.10. */
2957
2958 if (((cf & IOPARM_DT_HAS_POS) != 0))
2959 {
2960 if (is_stream_io (dtp))
2961 {
2962
2963 if (dtp->pos <= 0)
2964 {
2965 generate_error (&dtp->common, LIBERROR_BAD_OPTION,
2966 "POS=specifier must be positive");
2967 return;
2968 }
2969
2970 if (dtp->pos >= dtp->u.p.current_unit->maxrec)
2971 {
2972 generate_error (&dtp->common, LIBERROR_BAD_OPTION,
2973 "POS=specifier too large");
2974 return;
2975 }
2976
2977 dtp->rec = dtp->pos;
2978
2979 if (dtp->u.p.mode == READING)
2980 {
2981 /* Reset the endfile flag; if we hit EOF during reading
2982 we'll set the flag and generate an error at that point
2983 rather than worrying about it here. */
2984 dtp->u.p.current_unit->endfile = NO_ENDFILE;
2985 }
2986
2987 if (dtp->pos != dtp->u.p.current_unit->strm_pos)
2988 {
2989 fbuf_flush (dtp->u.p.current_unit, dtp->u.p.mode);
2990 if (sseek (dtp->u.p.current_unit->s, dtp->pos - 1, SEEK_SET) < 0)
2991 {
2992 generate_error (&dtp->common, LIBERROR_OS, NULL);
2993 return;
2994 }
2995 dtp->u.p.current_unit->strm_pos = dtp->pos;
2996 }
2997 }
2998 else
2999 {
3000 generate_error (&dtp->common, LIBERROR_BAD_OPTION,
3001 "POS=specifier not allowed, "
3002 "Try OPEN with ACCESS='stream'");
3003 return;
3004 }
3005 }
3006
3007
3008 /* Sanity checks on the record number. */
3009 if ((cf & IOPARM_DT_HAS_REC) != 0)
3010 {
3011 if (dtp->rec <= 0)
3012 {
3013 generate_error (&dtp->common, LIBERROR_BAD_OPTION,
3014 "Record number must be positive");
3015 return;
3016 }
3017
3018 if (dtp->rec >= dtp->u.p.current_unit->maxrec)
3019 {
3020 generate_error (&dtp->common, LIBERROR_BAD_OPTION,
3021 "Record number too large");
3022 return;
3023 }
3024
3025 /* Make sure format buffer is reset. */
3026 if (dtp->u.p.current_unit->flags.form == FORM_FORMATTED)
3027 fbuf_reset (dtp->u.p.current_unit);
3028
3029
3030 /* Check whether the record exists to be read. Only
3031 a partial record needs to exist. */
3032
3033 if (dtp->u.p.mode == READING && (dtp->rec - 1)
3034 * dtp->u.p.current_unit->recl >= ssize (dtp->u.p.current_unit->s))
3035 {
3036 generate_error (&dtp->common, LIBERROR_BAD_OPTION,
3037 "Non-existing record number");
3038 return;
3039 }
3040
3041 /* Position the file. */
3042 if (sseek (dtp->u.p.current_unit->s, (gfc_offset) (dtp->rec - 1)
3043 * dtp->u.p.current_unit->recl, SEEK_SET) < 0)
3044 {
3045 generate_error (&dtp->common, LIBERROR_OS, NULL);
3046 return;
3047 }
3048
3049 if (dtp->u.p.current_unit->flags.access == ACCESS_STREAM)
3050 {
3051 generate_error (&dtp->common, LIBERROR_OPTION_CONFLICT,
3052 "Record number not allowed for stream access "
3053 "data transfer");
3054 return;
3055 }
3056 }
3057
3058 /* Bugware for badly written mixed C-Fortran I/O. */
3059 if (!is_internal_unit (dtp))
3060 flush_if_preconnected(dtp->u.p.current_unit->s);
3061
3062 dtp->u.p.current_unit->mode = dtp->u.p.mode;
3063
3064 /* Set the maximum position reached from the previous I/O operation. This
3065 could be greater than zero from a previous non-advancing write. */
3066 dtp->u.p.max_pos = dtp->u.p.current_unit->saved_pos;
3067
3068 pre_position (dtp);
3069
3070
3071 /* Set up the subroutine that will handle the transfers. */
3072
3073 if (read_flag)
3074 {
3075 if (dtp->u.p.current_unit->flags.form == FORM_UNFORMATTED)
3076 dtp->u.p.transfer = unformatted_read;
3077 else
3078 {
3079 if ((cf & IOPARM_DT_LIST_FORMAT) != 0)
3080 {
3081 if (dtp->u.p.current_unit->child_dtio == 0)
3082 dtp->u.p.current_unit->last_char = EOF - 1;
3083 dtp->u.p.transfer = list_formatted_read;
3084 }
3085 else
3086 dtp->u.p.transfer = formatted_transfer;
3087 }
3088 }
3089 else
3090 {
3091 if (dtp->u.p.current_unit->flags.form == FORM_UNFORMATTED)
3092 dtp->u.p.transfer = unformatted_write;
3093 else
3094 {
3095 if ((cf & IOPARM_DT_LIST_FORMAT) != 0)
3096 dtp->u.p.transfer = list_formatted_write;
3097 else
3098 dtp->u.p.transfer = formatted_transfer;
3099 }
3100 }
3101
3102 /* Make sure that we don't do a read after a nonadvancing write. */
3103
3104 if (read_flag)
3105 {
3106 if (dtp->u.p.current_unit->read_bad && !is_stream_io (dtp))
3107 {
3108 generate_error (&dtp->common, LIBERROR_BAD_OPTION,
3109 "Cannot READ after a nonadvancing WRITE");
3110 return;
3111 }
3112 }
3113 else
3114 {
3115 if (dtp->u.p.advance_status == ADVANCE_YES && !dtp->u.p.seen_dollar)
3116 dtp->u.p.current_unit->read_bad = 1;
3117 }
3118
3119 if (dtp->u.p.current_unit->flags.form == FORM_FORMATTED)
3120 {
3121 #ifdef HAVE_USELOCALE
3122 dtp->u.p.old_locale = uselocale (c_locale);
3123 #else
3124 __gthread_mutex_lock (&old_locale_lock);
3125 if (!old_locale_ctr++)
3126 {
3127 old_locale = setlocale (LC_NUMERIC, NULL);
3128 setlocale (LC_NUMERIC, "C");
3129 }
3130 __gthread_mutex_unlock (&old_locale_lock);
3131 #endif
3132 /* Start the data transfer if we are doing a formatted transfer. */
3133 if ((cf & (IOPARM_DT_LIST_FORMAT | IOPARM_DT_HAS_NAMELIST_NAME)) == 0
3134 && dtp->u.p.ionml == NULL)
3135 formatted_transfer (dtp, 0, NULL, 0, 0, 1);
3136 }
3137 }
3138
3139
3140 /* Initialize an array_loop_spec given the array descriptor. The function
3141 returns the index of the last element of the array, and also returns
3142 starting record, where the first I/O goes to (necessary in case of
3143 negative strides). */
3144
3145 gfc_offset
3146 init_loop_spec (gfc_array_char *desc, array_loop_spec *ls,
3147 gfc_offset *start_record)
3148 {
3149 int rank = GFC_DESCRIPTOR_RANK(desc);
3150 int i;
3151 gfc_offset index;
3152 int empty;
3153
3154 empty = 0;
3155 index = 1;
3156 *start_record = 0;
3157
3158 for (i=0; i<rank; i++)
3159 {
3160 ls[i].idx = GFC_DESCRIPTOR_LBOUND(desc,i);
3161 ls[i].start = GFC_DESCRIPTOR_LBOUND(desc,i);
3162 ls[i].end = GFC_DESCRIPTOR_UBOUND(desc,i);
3163 ls[i].step = GFC_DESCRIPTOR_STRIDE(desc,i);
3164 empty = empty || (GFC_DESCRIPTOR_UBOUND(desc,i)
3165 < GFC_DESCRIPTOR_LBOUND(desc,i));
3166
3167 if (GFC_DESCRIPTOR_STRIDE(desc,i) > 0)
3168 {
3169 index += (GFC_DESCRIPTOR_EXTENT(desc,i) - 1)
3170 * GFC_DESCRIPTOR_STRIDE(desc,i);
3171 }
3172 else
3173 {
3174 index -= (GFC_DESCRIPTOR_EXTENT(desc,i) - 1)
3175 * GFC_DESCRIPTOR_STRIDE(desc,i);
3176 *start_record -= (GFC_DESCRIPTOR_EXTENT(desc,i) - 1)
3177 * GFC_DESCRIPTOR_STRIDE(desc,i);
3178 }
3179 }
3180
3181 if (empty)
3182 return 0;
3183 else
3184 return index;
3185 }
3186
3187 /* Determine the index to the next record in an internal unit array by
3188 by incrementing through the array_loop_spec. */
3189
3190 gfc_offset
3191 next_array_record (st_parameter_dt *dtp, array_loop_spec *ls, int *finished)
3192 {
3193 int i, carry;
3194 gfc_offset index;
3195
3196 carry = 1;
3197 index = 0;
3198
3199 for (i = 0; i < dtp->u.p.current_unit->rank; i++)
3200 {
3201 if (carry)
3202 {
3203 ls[i].idx++;
3204 if (ls[i].idx > ls[i].end)
3205 {
3206 ls[i].idx = ls[i].start;
3207 carry = 1;
3208 }
3209 else
3210 carry = 0;
3211 }
3212 index = index + (ls[i].idx - ls[i].start) * ls[i].step;
3213 }
3214
3215 *finished = carry;
3216
3217 return index;
3218 }
3219
3220
3221
3222 /* Skip to the end of the current record, taking care of an optional
3223 record marker of size bytes. If the file is not seekable, we
3224 read chunks of size MAX_READ until we get to the right
3225 position. */
3226
3227 static void
3228 skip_record (st_parameter_dt *dtp, ssize_t bytes)
3229 {
3230 ssize_t rlength, readb;
3231 #define MAX_READ 4096
3232 char p[MAX_READ];
3233
3234 dtp->u.p.current_unit->bytes_left_subrecord += bytes;
3235 if (dtp->u.p.current_unit->bytes_left_subrecord == 0)
3236 return;
3237
3238 /* Direct access files do not generate END conditions,
3239 only I/O errors. */
3240 if (sseek (dtp->u.p.current_unit->s,
3241 dtp->u.p.current_unit->bytes_left_subrecord, SEEK_CUR) < 0)
3242 {
3243 /* Seeking failed, fall back to seeking by reading data. */
3244 while (dtp->u.p.current_unit->bytes_left_subrecord > 0)
3245 {
3246 rlength =
3247 (MAX_READ < dtp->u.p.current_unit->bytes_left_subrecord) ?
3248 MAX_READ : dtp->u.p.current_unit->bytes_left_subrecord;
3249
3250 readb = sread (dtp->u.p.current_unit->s, p, rlength);
3251 if (readb < 0)
3252 {
3253 generate_error (&dtp->common, LIBERROR_OS, NULL);
3254 return;
3255 }
3256
3257 dtp->u.p.current_unit->bytes_left_subrecord -= readb;
3258 }
3259 return;
3260 }
3261 dtp->u.p.current_unit->bytes_left_subrecord = 0;
3262 }
3263
3264
3265 /* Advance to the next record reading unformatted files, taking
3266 care of subrecords. If complete_record is nonzero, we loop
3267 until all subrecords are cleared. */
3268
3269 static void
3270 next_record_r_unf (st_parameter_dt *dtp, int complete_record)
3271 {
3272 size_t bytes;
3273
3274 bytes = compile_options.record_marker == 0 ?
3275 sizeof (GFC_INTEGER_4) : compile_options.record_marker;
3276
3277 while(1)
3278 {
3279
3280 /* Skip over tail */
3281
3282 skip_record (dtp, bytes);
3283
3284 if ( ! (complete_record && dtp->u.p.current_unit->continued))
3285 return;
3286
3287 us_read (dtp, 1);
3288 }
3289 }
3290
3291
3292 static gfc_offset
3293 min_off (gfc_offset a, gfc_offset b)
3294 {
3295 return (a < b ? a : b);
3296 }
3297
3298
3299 /* Space to the next record for read mode. */
3300
3301 static void
3302 next_record_r (st_parameter_dt *dtp, int done)
3303 {
3304 gfc_offset record;
3305 int bytes_left;
3306 char p;
3307 int cc;
3308
3309 switch (current_mode (dtp))
3310 {
3311 /* No records in unformatted STREAM I/O. */
3312 case UNFORMATTED_STREAM:
3313 return;
3314
3315 case UNFORMATTED_SEQUENTIAL:
3316 next_record_r_unf (dtp, 1);
3317 dtp->u.p.current_unit->bytes_left = dtp->u.p.current_unit->recl;
3318 break;
3319
3320 case FORMATTED_DIRECT:
3321 case UNFORMATTED_DIRECT:
3322 skip_record (dtp, dtp->u.p.current_unit->bytes_left);
3323 break;
3324
3325 case FORMATTED_STREAM:
3326 case FORMATTED_SEQUENTIAL:
3327 /* read_sf has already terminated input because of an '\n', or
3328 we have hit EOF. */
3329 if (dtp->u.p.sf_seen_eor)
3330 {
3331 dtp->u.p.sf_seen_eor = 0;
3332 break;
3333 }
3334
3335 if (is_internal_unit (dtp))
3336 {
3337 if (is_array_io (dtp))
3338 {
3339 int finished;
3340
3341 record = next_array_record (dtp, dtp->u.p.current_unit->ls,
3342 &finished);
3343 if (!done && finished)
3344 hit_eof (dtp);
3345
3346 /* Now seek to this record. */
3347 record = record * dtp->u.p.current_unit->recl;
3348 if (sseek (dtp->u.p.current_unit->s, record, SEEK_SET) < 0)
3349 {
3350 generate_error (&dtp->common, LIBERROR_INTERNAL_UNIT, NULL);
3351 break;
3352 }
3353 dtp->u.p.current_unit->bytes_left = dtp->u.p.current_unit->recl;
3354 }
3355 else
3356 {
3357 bytes_left = (int) dtp->u.p.current_unit->bytes_left;
3358 bytes_left = min_off (bytes_left,
3359 ssize (dtp->u.p.current_unit->s)
3360 - stell (dtp->u.p.current_unit->s));
3361 if (sseek (dtp->u.p.current_unit->s,
3362 bytes_left, SEEK_CUR) < 0)
3363 {
3364 generate_error (&dtp->common, LIBERROR_INTERNAL_UNIT, NULL);
3365 break;
3366 }
3367 dtp->u.p.current_unit->bytes_left
3368 = dtp->u.p.current_unit->recl;
3369 }
3370 break;
3371 }
3372 else if (dtp->u.p.current_unit->flags.cc != CC_NONE)
3373 {
3374 do
3375 {
3376 errno = 0;
3377 cc = fbuf_getc (dtp->u.p.current_unit);
3378 if (cc == EOF)
3379 {
3380 if (errno != 0)
3381 generate_error (&dtp->common, LIBERROR_OS, NULL);
3382 else
3383 {
3384 if (is_stream_io (dtp)
3385 || dtp->u.p.current_unit->pad_status == PAD_NO
3386 || dtp->u.p.current_unit->bytes_left
3387 == dtp->u.p.current_unit->recl)
3388 hit_eof (dtp);
3389 }
3390 break;
3391 }
3392
3393 if (is_stream_io (dtp))
3394 dtp->u.p.current_unit->strm_pos++;
3395
3396 p = (char) cc;
3397 }
3398 while (p != '\n');
3399 }
3400 break;
3401 }
3402 }
3403
3404
3405 /* Small utility function to write a record marker, taking care of
3406 byte swapping and of choosing the correct size. */
3407
3408 static int
3409 write_us_marker (st_parameter_dt *dtp, const gfc_offset buf)
3410 {
3411 size_t len;
3412 GFC_INTEGER_4 buf4;
3413 GFC_INTEGER_8 buf8;
3414
3415 if (compile_options.record_marker == 0)
3416 len = sizeof (GFC_INTEGER_4);
3417 else
3418 len = compile_options.record_marker;
3419
3420 /* Only GFC_CONVERT_NATIVE and GFC_CONVERT_SWAP are valid here. */
3421 if (likely (dtp->u.p.current_unit->flags.convert == GFC_CONVERT_NATIVE))
3422 {
3423 switch (len)
3424 {
3425 case sizeof (GFC_INTEGER_4):
3426 buf4 = buf;
3427 return swrite (dtp->u.p.current_unit->s, &buf4, len);
3428 break;
3429
3430 case sizeof (GFC_INTEGER_8):
3431 buf8 = buf;
3432 return swrite (dtp->u.p.current_unit->s, &buf8, len);
3433 break;
3434
3435 default:
3436 runtime_error ("Illegal value for record marker");
3437 break;
3438 }
3439 }
3440 else
3441 {
3442 uint32_t u32;
3443 uint64_t u64;
3444 switch (len)
3445 {
3446 case sizeof (GFC_INTEGER_4):
3447 buf4 = buf;
3448 memcpy (&u32, &buf4, sizeof (u32));
3449 u32 = __builtin_bswap32 (u32);
3450 return swrite (dtp->u.p.current_unit->s, &u32, len);
3451 break;
3452
3453 case sizeof (GFC_INTEGER_8):
3454 buf8 = buf;
3455 memcpy (&u64, &buf8, sizeof (u64));
3456 u64 = __builtin_bswap64 (u64);
3457 return swrite (dtp->u.p.current_unit->s, &u64, len);
3458 break;
3459
3460 default:
3461 runtime_error ("Illegal value for record marker");
3462 break;
3463 }
3464 }
3465
3466 }
3467
3468 /* Position to the next (sub)record in write mode for
3469 unformatted sequential files. */
3470
3471 static void
3472 next_record_w_unf (st_parameter_dt *dtp, int next_subrecord)
3473 {
3474 gfc_offset m, m_write, record_marker;
3475
3476 /* Bytes written. */
3477 m = dtp->u.p.current_unit->recl_subrecord
3478 - dtp->u.p.current_unit->bytes_left_subrecord;
3479
3480 if (compile_options.record_marker == 0)
3481 record_marker = sizeof (GFC_INTEGER_4);
3482 else
3483 record_marker = compile_options.record_marker;
3484
3485 /* Seek to the head and overwrite the bogus length with the real
3486 length. */
3487
3488 if (unlikely (sseek (dtp->u.p.current_unit->s, - m - record_marker,
3489 SEEK_CUR) < 0))
3490 goto io_error;
3491
3492 if (next_subrecord)
3493 m_write = -m;
3494 else
3495 m_write = m;
3496
3497 if (unlikely (write_us_marker (dtp, m_write) < 0))
3498 goto io_error;
3499
3500 /* Seek past the end of the current record. */
3501
3502 if (unlikely (sseek (dtp->u.p.current_unit->s, m, SEEK_CUR) < 0))
3503 goto io_error;
3504
3505 /* Write the length tail. If we finish a record containing
3506 subrecords, we write out the negative length. */
3507
3508 if (dtp->u.p.current_unit->continued)
3509 m_write = -m;
3510 else
3511 m_write = m;
3512
3513 if (unlikely (write_us_marker (dtp, m_write) < 0))
3514 goto io_error;
3515
3516 return;
3517
3518 io_error:
3519 generate_error (&dtp->common, LIBERROR_OS, NULL);
3520 return;
3521
3522 }
3523
3524
3525 /* Utility function like memset() but operating on streams. Return
3526 value is same as for POSIX write(). */
3527
3528 static ssize_t
3529 sset (stream * s, int c, ssize_t nbyte)
3530 {
3531 #define WRITE_CHUNK 256
3532 char p[WRITE_CHUNK];
3533 ssize_t bytes_left, trans;
3534
3535 if (nbyte < WRITE_CHUNK)
3536 memset (p, c, nbyte);
3537 else
3538 memset (p, c, WRITE_CHUNK);
3539
3540 bytes_left = nbyte;
3541 while (bytes_left > 0)
3542 {
3543 trans = (bytes_left < WRITE_CHUNK) ? bytes_left : WRITE_CHUNK;
3544 trans = swrite (s, p, trans);
3545 if (trans <= 0)
3546 return trans;
3547 bytes_left -= trans;
3548 }
3549
3550 return nbyte - bytes_left;
3551 }
3552
3553
3554 /* Finish up a record according to the legacy carriagecontrol type, based
3555 on the first character in the record. */
3556
3557 static void
3558 next_record_cc (st_parameter_dt *dtp)
3559 {
3560 /* Only valid with CARRIAGECONTROL=FORTRAN. */
3561 if (dtp->u.p.current_unit->flags.cc != CC_FORTRAN)
3562 return;
3563
3564 fbuf_seek (dtp->u.p.current_unit, 0, SEEK_END);
3565 if (dtp->u.p.cc.len > 0)
3566 {
3567 char * p = fbuf_alloc (dtp->u.p.current_unit, dtp->u.p.cc.len);
3568 if (!p)
3569 generate_error (&dtp->common, LIBERROR_OS, NULL);
3570
3571 /* Output CR for the first character with default CC setting. */
3572 *(p++) = dtp->u.p.cc.u.end;
3573 if (dtp->u.p.cc.len > 1)
3574 *p = dtp->u.p.cc.u.end;
3575 }
3576 }
3577
3578 /* Position to the next record in write mode. */
3579
3580 static void
3581 next_record_w (st_parameter_dt *dtp, int done)
3582 {
3583 gfc_offset m, record, max_pos;
3584 int length;
3585
3586 /* Zero counters for X- and T-editing. */
3587 max_pos = dtp->u.p.max_pos;
3588 dtp->u.p.max_pos = dtp->u.p.skips = dtp->u.p.pending_spaces = 0;
3589
3590 switch (current_mode (dtp))
3591 {
3592 /* No records in unformatted STREAM I/O. */
3593 case UNFORMATTED_STREAM:
3594 return;
3595
3596 case FORMATTED_DIRECT:
3597 if (dtp->u.p.current_unit->bytes_left == 0)
3598 break;
3599
3600 fbuf_seek (dtp->u.p.current_unit, 0, SEEK_END);
3601 fbuf_flush (dtp->u.p.current_unit, WRITING);
3602 if (sset (dtp->u.p.current_unit->s, ' ',
3603 dtp->u.p.current_unit->bytes_left)
3604 != dtp->u.p.current_unit->bytes_left)
3605 goto io_error;
3606
3607 break;
3608
3609 case UNFORMATTED_DIRECT:
3610 if (dtp->u.p.current_unit->bytes_left > 0)
3611 {
3612 length = (int) dtp->u.p.current_unit->bytes_left;
3613 if (sset (dtp->u.p.current_unit->s, 0, length) != length)
3614 goto io_error;
3615 }
3616 break;
3617
3618 case UNFORMATTED_SEQUENTIAL:
3619 next_record_w_unf (dtp, 0);
3620 dtp->u.p.current_unit->bytes_left = dtp->u.p.current_unit->recl;
3621 break;
3622
3623 case FORMATTED_STREAM:
3624 case FORMATTED_SEQUENTIAL:
3625
3626 if (is_internal_unit (dtp))
3627 {
3628 char *p;
3629 if (is_array_io (dtp))
3630 {
3631 int finished;
3632
3633 length = (int) dtp->u.p.current_unit->bytes_left;
3634
3635 /* If the farthest position reached is greater than current
3636 position, adjust the position and set length to pad out
3637 whats left. Otherwise just pad whats left.
3638 (for character array unit) */
3639 m = dtp->u.p.current_unit->recl
3640 - dtp->u.p.current_unit->bytes_left;
3641 if (max_pos > m)
3642 {
3643 length = (int) (max_pos - m);
3644 if (sseek (dtp->u.p.current_unit->s,
3645 length, SEEK_CUR) < 0)
3646 {
3647 generate_error (&dtp->common, LIBERROR_INTERNAL_UNIT, NULL);
3648 return;
3649 }
3650 length = (int) (dtp->u.p.current_unit->recl - max_pos);
3651 }
3652
3653 p = write_block (dtp, length);
3654 if (p == NULL)
3655 return;
3656
3657 if (unlikely (is_char4_unit (dtp)))
3658 {
3659 gfc_char4_t *p4 = (gfc_char4_t *) p;
3660 memset4 (p4, ' ', length);
3661 }
3662 else
3663 memset (p, ' ', length);
3664
3665 /* Now that the current record has been padded out,
3666 determine where the next record in the array is. */
3667 record = next_array_record (dtp, dtp->u.p.current_unit->ls,
3668 &finished);
3669 if (finished)
3670 dtp->u.p.current_unit->endfile = AT_ENDFILE;
3671
3672 /* Now seek to this record */
3673 record = record * dtp->u.p.current_unit->recl;
3674
3675 if (sseek (dtp->u.p.current_unit->s, record, SEEK_SET) < 0)
3676 {
3677 generate_error (&dtp->common, LIBERROR_INTERNAL_UNIT, NULL);
3678 return;
3679 }
3680
3681 dtp->u.p.current_unit->bytes_left = dtp->u.p.current_unit->recl;
3682 }
3683 else
3684 {
3685 length = 1;
3686
3687 /* If this is the last call to next_record move to the farthest
3688 position reached and set length to pad out the remainder
3689 of the record. (for character scaler unit) */
3690 if (done)
3691 {
3692 m = dtp->u.p.current_unit->recl
3693 - dtp->u.p.current_unit->bytes_left;
3694 if (max_pos > m)
3695 {
3696 length = (int) (max_pos - m);
3697 if (sseek (dtp->u.p.current_unit->s,
3698 length, SEEK_CUR) < 0)
3699 {
3700 generate_error (&dtp->common, LIBERROR_INTERNAL_UNIT, NULL);
3701 return;
3702 }
3703 length = (int) (dtp->u.p.current_unit->recl - max_pos);
3704 }
3705 else
3706 length = (int) dtp->u.p.current_unit->bytes_left;
3707 }
3708 if (length > 0)
3709 {
3710 p = write_block (dtp, length);
3711 if (p == NULL)
3712 return;
3713
3714 if (unlikely (is_char4_unit (dtp)))
3715 {
3716 gfc_char4_t *p4 = (gfc_char4_t *) p;
3717 memset4 (p4, (gfc_char4_t) ' ', length);
3718 }
3719 else
3720 memset (p, ' ', length);
3721 }
3722 }
3723 }
3724 /* Handle legacy CARRIAGECONTROL line endings. */
3725 else if (dtp->u.p.current_unit->flags.cc == CC_FORTRAN)
3726 next_record_cc (dtp);
3727 else
3728 {
3729 /* Skip newlines for CC=CC_NONE. */
3730 const int len = (dtp->u.p.current_unit->flags.cc == CC_NONE)
3731 ? 0
3732 #ifdef HAVE_CRLF
3733 : 2;
3734 #else
3735 : 1;
3736 #endif
3737 fbuf_seek (dtp->u.p.current_unit, 0, SEEK_END);
3738 if (dtp->u.p.current_unit->flags.cc != CC_NONE)
3739 {
3740 char * p = fbuf_alloc (dtp->u.p.current_unit, len);
3741 if (!p)
3742 goto io_error;
3743 #ifdef HAVE_CRLF
3744 *(p++) = '\r';
3745 #endif
3746 *p = '\n';
3747 }
3748 if (is_stream_io (dtp))
3749 {
3750 dtp->u.p.current_unit->strm_pos += len;
3751 if (dtp->u.p.current_unit->strm_pos
3752 < ssize (dtp->u.p.current_unit->s))
3753 unit_truncate (dtp->u.p.current_unit,
3754 dtp->u.p.current_unit->strm_pos - 1,
3755 &dtp->common);
3756 }
3757 }
3758
3759 break;
3760
3761 io_error:
3762 generate_error (&dtp->common, LIBERROR_OS, NULL);
3763 break;
3764 }
3765 }
3766
3767 /* Position to the next record, which means moving to the end of the
3768 current record. This can happen under several different
3769 conditions. If the done flag is not set, we get ready to process
3770 the next record. */
3771
3772 void
3773 next_record (st_parameter_dt *dtp, int done)
3774 {
3775 gfc_offset fp; /* File position. */
3776
3777 dtp->u.p.current_unit->read_bad = 0;
3778
3779 if (dtp->u.p.mode == READING)
3780 next_record_r (dtp, done);
3781 else
3782 next_record_w (dtp, done);
3783
3784 fbuf_flush (dtp->u.p.current_unit, dtp->u.p.mode);
3785
3786 if (!is_stream_io (dtp))
3787 {
3788 /* Since we have changed the position, set it to unspecified so
3789 that INQUIRE(POSITION=) knows it needs to look into it. */
3790 if (done)
3791 dtp->u.p.current_unit->flags.position = POSITION_UNSPECIFIED;
3792
3793 dtp->u.p.current_unit->current_record = 0;
3794 if (dtp->u.p.current_unit->flags.access == ACCESS_DIRECT)
3795 {
3796 fp = stell (dtp->u.p.current_unit->s);
3797 /* Calculate next record, rounding up partial records. */
3798 dtp->u.p.current_unit->last_record =
3799 (fp + dtp->u.p.current_unit->recl) /
3800 dtp->u.p.current_unit->recl - 1;
3801 }
3802 else
3803 dtp->u.p.current_unit->last_record++;
3804 }
3805
3806 if (!done)
3807 pre_position (dtp);
3808
3809 smarkeor (dtp->u.p.current_unit->s);
3810 }
3811
3812
3813 /* Finalize the current data transfer. For a nonadvancing transfer,
3814 this means advancing to the next record. For internal units close the
3815 stream associated with the unit. */
3816
3817 static void
3818 finalize_transfer (st_parameter_dt *dtp)
3819 {
3820 GFC_INTEGER_4 cf = dtp->common.flags;
3821
3822 if ((dtp->u.p.ionml != NULL)
3823 && (cf & IOPARM_DT_HAS_NAMELIST_NAME) != 0)
3824 {
3825 if ((cf & IOPARM_DT_NAMELIST_READ_MODE) != 0)
3826 namelist_read (dtp);
3827 else
3828 namelist_write (dtp);
3829 }
3830
3831 if (dtp->u.p.current_unit && (dtp->u.p.current_unit->child_dtio > 0))
3832 {
3833 if (cf & IOPARM_DT_HAS_FORMAT)
3834 {
3835 free (dtp->u.p.fmt);
3836 free (dtp->format);
3837 }
3838 return;
3839 }
3840
3841 if ((dtp->common.flags & IOPARM_DT_HAS_SIZE) != 0)
3842 *dtp->size = dtp->u.p.current_unit->size_used;
3843
3844 if (dtp->u.p.eor_condition)
3845 {
3846 generate_error (&dtp->common, LIBERROR_EOR, NULL);
3847 goto done;
3848 }
3849
3850 if ((dtp->common.flags & IOPARM_LIBRETURN_MASK) != IOPARM_LIBRETURN_OK)
3851 {
3852 if (dtp->u.p.current_unit && current_mode (dtp) == UNFORMATTED_SEQUENTIAL)
3853 dtp->u.p.current_unit->current_record = 0;
3854 goto done;
3855 }
3856
3857 dtp->u.p.transfer = NULL;
3858 if (dtp->u.p.current_unit == NULL)
3859 goto done;
3860
3861 if ((cf & IOPARM_DT_LIST_FORMAT) != 0 && dtp->u.p.mode == READING)
3862 {
3863 finish_list_read (dtp);
3864 goto done;
3865 }
3866
3867 if (dtp->u.p.mode == WRITING)
3868 dtp->u.p.current_unit->previous_nonadvancing_write
3869 = dtp->u.p.advance_status == ADVANCE_NO;
3870
3871 if (is_stream_io (dtp))
3872 {
3873 if (dtp->u.p.current_unit->flags.form == FORM_FORMATTED
3874 && dtp->u.p.advance_status != ADVANCE_NO)
3875 next_record (dtp, 1);
3876
3877 goto done;
3878 }
3879
3880 dtp->u.p.current_unit->current_record = 0;
3881
3882 if (!is_internal_unit (dtp) && dtp->u.p.seen_dollar)
3883 {
3884 fbuf_flush (dtp->u.p.current_unit, dtp->u.p.mode);
3885 dtp->u.p.seen_dollar = 0;
3886 goto done;
3887 }
3888
3889 /* For non-advancing I/O, save the current maximum position for use in the
3890 next I/O operation if needed. */
3891 if (dtp->u.p.advance_status == ADVANCE_NO)
3892 {
3893 if (dtp->u.p.skips > 0)
3894 {
3895 int tmp;
3896 write_x (dtp, dtp->u.p.skips, dtp->u.p.pending_spaces);
3897 tmp = (int)(dtp->u.p.current_unit->recl
3898 - dtp->u.p.current_unit->bytes_left);
3899 dtp->u.p.max_pos =
3900 dtp->u.p.max_pos > tmp ? dtp->u.p.max_pos : tmp;
3901 dtp->u.p.skips = 0;
3902 }
3903 int bytes_written = (int) (dtp->u.p.current_unit->recl
3904 - dtp->u.p.current_unit->bytes_left);
3905 dtp->u.p.current_unit->saved_pos =
3906 dtp->u.p.max_pos > 0 ? dtp->u.p.max_pos - bytes_written : 0;
3907 fbuf_flush (dtp->u.p.current_unit, dtp->u.p.mode);
3908 goto done;
3909 }
3910 else if (dtp->u.p.current_unit->flags.form == FORM_FORMATTED
3911 && dtp->u.p.mode == WRITING && !is_internal_unit (dtp))
3912 fbuf_seek (dtp->u.p.current_unit, 0, SEEK_END);
3913
3914 dtp->u.p.current_unit->saved_pos = 0;
3915
3916 next_record (dtp, 1);
3917
3918 done:
3919 #ifdef HAVE_USELOCALE
3920 if (dtp->u.p.old_locale != (locale_t) 0)
3921 {
3922 uselocale (dtp->u.p.old_locale);
3923 dtp->u.p.old_locale = (locale_t) 0;
3924 }
3925 #else
3926 __gthread_mutex_lock (&old_locale_lock);
3927 if (!--old_locale_ctr)
3928 {
3929 setlocale (LC_NUMERIC, old_locale);
3930 old_locale = NULL;
3931 }
3932 __gthread_mutex_unlock (&old_locale_lock);
3933 #endif
3934 }
3935
3936 /* Transfer function for IOLENGTH. It doesn't actually do any
3937 data transfer, it just updates the length counter. */
3938
3939 static void
3940 iolength_transfer (st_parameter_dt *dtp, bt type __attribute__((unused)),
3941 void *dest __attribute__ ((unused)),
3942 int kind __attribute__((unused)),
3943 size_t size, size_t nelems)
3944 {
3945 if ((dtp->common.flags & IOPARM_DT_HAS_IOLENGTH) != 0)
3946 *dtp->iolength += (GFC_IO_INT) (size * nelems);
3947 }
3948
3949
3950 /* Initialize the IOLENGTH data transfer. This function is in essence
3951 a very much simplified version of data_transfer_init(), because it
3952 doesn't have to deal with units at all. */
3953
3954 static void
3955 iolength_transfer_init (st_parameter_dt *dtp)
3956 {
3957 if ((dtp->common.flags & IOPARM_DT_HAS_IOLENGTH) != 0)
3958 *dtp->iolength = 0;
3959
3960 memset (&dtp->u.p, 0, sizeof (dtp->u.p));
3961
3962 /* Set up the subroutine that will handle the transfers. */
3963
3964 dtp->u.p.transfer = iolength_transfer;
3965 }
3966
3967
3968 /* Library entry point for the IOLENGTH form of the INQUIRE
3969 statement. The IOLENGTH form requires no I/O to be performed, but
3970 it must still be a runtime library call so that we can determine
3971 the iolength for dynamic arrays and such. */
3972
3973 extern void st_iolength (st_parameter_dt *);
3974 export_proto(st_iolength);
3975
3976 void
3977 st_iolength (st_parameter_dt *dtp)
3978 {
3979 library_start (&dtp->common);
3980 iolength_transfer_init (dtp);
3981 }
3982
3983 extern void st_iolength_done (st_parameter_dt *);
3984 export_proto(st_iolength_done);
3985
3986 void
3987 st_iolength_done (st_parameter_dt *dtp __attribute__((unused)))
3988 {
3989 free_ionml (dtp);
3990 library_end ();
3991 }
3992
3993
3994 /* The READ statement. */
3995
3996 extern void st_read (st_parameter_dt *);
3997 export_proto(st_read);
3998
3999 void
4000 st_read (st_parameter_dt *dtp)
4001 {
4002 library_start (&dtp->common);
4003
4004 data_transfer_init (dtp, 1);
4005 }
4006
4007 extern void st_read_done (st_parameter_dt *);
4008 export_proto(st_read_done);
4009
4010 void
4011 st_read_done (st_parameter_dt *dtp)
4012 {
4013 finalize_transfer (dtp);
4014
4015 free_ionml (dtp);
4016
4017 /* If this is a parent READ statement we do not need to retain the
4018 internal unit structure for child use. Free it and stash the unit
4019 number for reuse. */
4020 if (dtp->u.p.current_unit != NULL
4021 && dtp->u.p.current_unit->child_dtio == 0)
4022 {
4023 if (is_internal_unit (dtp) &&
4024 (dtp->common.flags & IOPARM_DT_HAS_UDTIO) == 0)
4025 {
4026 free (dtp->u.p.current_unit->filename);
4027 dtp->u.p.current_unit->filename = NULL;
4028 free (dtp->u.p.current_unit->s);
4029 dtp->u.p.current_unit->s = NULL;
4030 if (dtp->u.p.current_unit->ls)
4031 free (dtp->u.p.current_unit->ls);
4032 dtp->u.p.current_unit->ls = NULL;
4033 stash_internal_unit (dtp);
4034 }
4035 if (is_internal_unit (dtp) || dtp->u.p.format_not_saved)
4036 {
4037 free_format_data (dtp->u.p.fmt);
4038 free_format (dtp);
4039 }
4040 unlock_unit (dtp->u.p.current_unit);
4041 }
4042
4043 library_end ();
4044 }
4045
4046 extern void st_write (st_parameter_dt *);
4047 export_proto(st_write);
4048
4049 void
4050 st_write (st_parameter_dt *dtp)
4051 {
4052 library_start (&dtp->common);
4053 data_transfer_init (dtp, 0);
4054 }
4055
4056 extern void st_write_done (st_parameter_dt *);
4057 export_proto(st_write_done);
4058
4059 void
4060 st_write_done (st_parameter_dt *dtp)
4061 {
4062 finalize_transfer (dtp);
4063
4064 if (dtp->u.p.current_unit != NULL
4065 && dtp->u.p.current_unit->child_dtio == 0)
4066 {
4067 /* Deal with endfile conditions associated with sequential files. */
4068 if (dtp->u.p.current_unit->flags.access == ACCESS_SEQUENTIAL)
4069 switch (dtp->u.p.current_unit->endfile)
4070 {
4071 case AT_ENDFILE: /* Remain at the endfile record. */
4072 break;
4073
4074 case AFTER_ENDFILE:
4075 dtp->u.p.current_unit->endfile = AT_ENDFILE; /* Just at it now. */
4076 break;
4077
4078 case NO_ENDFILE:
4079 /* Get rid of whatever is after this record. */
4080 if (!is_internal_unit (dtp))
4081 unit_truncate (dtp->u.p.current_unit,
4082 stell (dtp->u.p.current_unit->s),
4083 &dtp->common);
4084 dtp->u.p.current_unit->endfile = AT_ENDFILE;
4085 break;
4086 }
4087
4088 free_ionml (dtp);
4089
4090 /* If this is a parent WRITE statement we do not need to retain the
4091 internal unit structure for child use. Free it and stash the
4092 unit number for reuse. */
4093 if (is_internal_unit (dtp) &&
4094 (dtp->common.flags & IOPARM_DT_HAS_UDTIO) == 0)
4095 {
4096 free (dtp->u.p.current_unit->filename);
4097 dtp->u.p.current_unit->filename = NULL;
4098 free (dtp->u.p.current_unit->s);
4099 dtp->u.p.current_unit->s = NULL;
4100 if (dtp->u.p.current_unit->ls)
4101 free (dtp->u.p.current_unit->ls);
4102 dtp->u.p.current_unit->ls = NULL;
4103 stash_internal_unit (dtp);
4104 }
4105 if (is_internal_unit (dtp) || dtp->u.p.format_not_saved)
4106 {
4107 free_format_data (dtp->u.p.fmt);
4108 free_format (dtp);
4109 }
4110 unlock_unit (dtp->u.p.current_unit);
4111 }
4112 library_end ();
4113 }
4114
4115
4116 /* F2003: This is a stub for the runtime portion of the WAIT statement. */
4117 void
4118 st_wait (st_parameter_wait *wtp __attribute__((unused)))
4119 {
4120 }
4121
4122
4123 /* Receives the scalar information for namelist objects and stores it
4124 in a linked list of namelist_info types. */
4125
4126 static void
4127 set_nml_var (st_parameter_dt *dtp, void * var_addr, char * var_name,
4128 GFC_INTEGER_4 len, gfc_charlen_type string_length,
4129 GFC_INTEGER_4 dtype, void *dtio_sub, void *vtable)
4130 {
4131 namelist_info *t1 = NULL;
4132 namelist_info *nml;
4133 size_t var_name_len = strlen (var_name);
4134
4135 nml = (namelist_info*) xmalloc (sizeof (namelist_info));
4136
4137 nml->mem_pos = var_addr;
4138 nml->dtio_sub = dtio_sub;
4139 nml->vtable = vtable;
4140
4141 nml->var_name = (char*) xmalloc (var_name_len + 1);
4142 memcpy (nml->var_name, var_name, var_name_len);
4143 nml->var_name[var_name_len] = '\0';
4144
4145 nml->len = (int) len;
4146 nml->string_length = (index_type) string_length;
4147
4148 nml->var_rank = (int) (dtype & GFC_DTYPE_RANK_MASK);
4149 nml->size = (index_type) (dtype >> GFC_DTYPE_SIZE_SHIFT);
4150 nml->type = (bt) ((dtype & GFC_DTYPE_TYPE_MASK) >> GFC_DTYPE_TYPE_SHIFT);
4151
4152 if (nml->var_rank > 0)
4153 {
4154 nml->dim = (descriptor_dimension*)
4155 xmallocarray (nml->var_rank, sizeof (descriptor_dimension));
4156 nml->ls = (array_loop_spec*)
4157 xmallocarray (nml->var_rank, sizeof (array_loop_spec));
4158 }
4159 else
4160 {
4161 nml->dim = NULL;
4162 nml->ls = NULL;
4163 }
4164
4165 nml->next = NULL;
4166
4167 if ((dtp->common.flags & IOPARM_DT_IONML_SET) == 0)
4168 {
4169 dtp->common.flags |= IOPARM_DT_IONML_SET;
4170 dtp->u.p.ionml = nml;
4171 }
4172 else
4173 {
4174 for (t1 = dtp->u.p.ionml; t1->next; t1 = t1->next);
4175 t1->next = nml;
4176 }
4177 }
4178
4179 extern void st_set_nml_var (st_parameter_dt *dtp, void *, char *,
4180 GFC_INTEGER_4, gfc_charlen_type, GFC_INTEGER_4);
4181 export_proto(st_set_nml_var);
4182
4183 void
4184 st_set_nml_var (st_parameter_dt *dtp, void * var_addr, char * var_name,
4185 GFC_INTEGER_4 len, gfc_charlen_type string_length,
4186 GFC_INTEGER_4 dtype)
4187 {
4188 set_nml_var (dtp, var_addr, var_name, len, string_length,
4189 dtype, NULL, NULL);
4190 }
4191
4192
4193 /* Essentially the same as previous but carrying the dtio procedure
4194 and the vtable as additional arguments. */
4195 extern void st_set_nml_dtio_var (st_parameter_dt *dtp, void *, char *,
4196 GFC_INTEGER_4, gfc_charlen_type, GFC_INTEGER_4,
4197 void *, void *);
4198 export_proto(st_set_nml_dtio_var);
4199
4200
4201 void
4202 st_set_nml_dtio_var (st_parameter_dt *dtp, void * var_addr, char * var_name,
4203 GFC_INTEGER_4 len, gfc_charlen_type string_length,
4204 GFC_INTEGER_4 dtype, void *dtio_sub, void *vtable)
4205 {
4206 set_nml_var (dtp, var_addr, var_name, len, string_length,
4207 dtype, dtio_sub, vtable);
4208 }
4209
4210 /* Store the dimensional information for the namelist object. */
4211 extern void st_set_nml_var_dim (st_parameter_dt *, GFC_INTEGER_4,
4212 index_type, index_type,
4213 index_type);
4214 export_proto(st_set_nml_var_dim);
4215
4216 void
4217 st_set_nml_var_dim (st_parameter_dt *dtp, GFC_INTEGER_4 n_dim,
4218 index_type stride, index_type lbound,
4219 index_type ubound)
4220 {
4221 namelist_info * nml;
4222 int n;
4223
4224 n = (int)n_dim;
4225
4226 for (nml = dtp->u.p.ionml; nml->next; nml = nml->next);
4227
4228 GFC_DIMENSION_SET(nml->dim[n],lbound,ubound,stride);
4229 }
4230
4231
4232 /* Once upon a time, a poor innocent Fortran program was reading a
4233 file, when suddenly it hit the end-of-file (EOF). Unfortunately
4234 the OS doesn't tell whether we're at the EOF or whether we already
4235 went past it. Luckily our hero, libgfortran, keeps track of this.
4236 Call this function when you detect an EOF condition. See Section
4237 9.10.2 in F2003. */
4238
4239 void
4240 hit_eof (st_parameter_dt * dtp)
4241 {
4242 dtp->u.p.current_unit->flags.position = POSITION_APPEND;
4243
4244 if (dtp->u.p.current_unit->flags.access == ACCESS_SEQUENTIAL)
4245 switch (dtp->u.p.current_unit->endfile)
4246 {
4247 case NO_ENDFILE:
4248 case AT_ENDFILE:
4249 generate_error (&dtp->common, LIBERROR_END, NULL);
4250 if (!is_internal_unit (dtp) && !dtp->u.p.namelist_mode)
4251 {
4252 dtp->u.p.current_unit->endfile = AFTER_ENDFILE;
4253 dtp->u.p.current_unit->current_record = 0;
4254 }
4255 else
4256 dtp->u.p.current_unit->endfile = AT_ENDFILE;
4257 break;
4258
4259 case AFTER_ENDFILE:
4260 generate_error (&dtp->common, LIBERROR_ENDFILE, NULL);
4261 dtp->u.p.current_unit->current_record = 0;
4262 break;
4263 }
4264 else
4265 {
4266 /* Non-sequential files don't have an ENDFILE record, so we
4267 can't be at AFTER_ENDFILE. */
4268 dtp->u.p.current_unit->endfile = AT_ENDFILE;
4269 generate_error (&dtp->common, LIBERROR_END, NULL);
4270 dtp->u.p.current_unit->current_record = 0;
4271 }
4272 }