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