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