1 /* Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
2 Contributed by Andy Vaught
3 Namelist transfer functions contributed by Paul Thomas
5 This file is part of the GNU Fortran 95 runtime library (libgfortran).
7 Libgfortran is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
12 In addition to the permissions in the GNU General Public License, the
13 Free Software Foundation gives you unlimited permission to link the
14 compiled version of this file into combinations with other programs,
15 and to distribute those combinations without any restriction coming
16 from the use of this file. (The General Public License restrictions
17 do apply in other respects; for example, they cover modification of
18 the file, and distribution when not linked into a combine
21 Libgfortran is distributed in the hope that it will be useful,
22 but WITHOUT ANY WARRANTY; without even the implied warranty of
23 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
24 GNU General Public License for more details.
26 You should have received a copy of the GNU General Public License
27 along with Libgfortran; see the file COPYING. If not, write to
28 the Free Software Foundation, 51 Franklin Street, Fifth Floor,
29 Boston, MA 02110-1301, USA. */
32 /* transfer.c -- Top level handling of data transfer statements. */
37 #include "libgfortran.h"
41 /* Calling conventions: Data transfer statements are unlike other
42 library calls in that they extend over several calls.
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.
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
59 These subroutines do not return status.
61 The last call is a call to st_[read|write]_done(). While
62 something can easily go wrong with the initial st_read() or
63 st_write(), an error inhibits any data from actually being
66 extern void transfer_integer (st_parameter_dt *, void *, int);
67 export_proto(transfer_integer);
69 extern void transfer_real (st_parameter_dt *, void *, int);
70 export_proto(transfer_real);
72 extern void transfer_logical (st_parameter_dt *, void *, int);
73 export_proto(transfer_logical);
75 extern void transfer_character (st_parameter_dt *, void *, int);
76 export_proto(transfer_character);
78 extern void transfer_complex (st_parameter_dt *, void *, int);
79 export_proto(transfer_complex);
81 extern void transfer_array (st_parameter_dt *, gfc_array_char *, int,
83 export_proto(transfer_array);
85 static const st_option advance_opt[] = {
93 { FORMATTED_SEQUENTIAL, UNFORMATTED_SEQUENTIAL,
94 FORMATTED_DIRECT, UNFORMATTED_DIRECT
100 current_mode (st_parameter_dt *dtp)
104 if (dtp->u.p.current_unit->flags.access == ACCESS_DIRECT)
106 m = dtp->u.p.current_unit->flags.form == FORM_FORMATTED ?
107 FORMATTED_DIRECT : UNFORMATTED_DIRECT;
111 m = dtp->u.p.current_unit->flags.form == FORM_FORMATTED ?
112 FORMATTED_SEQUENTIAL : UNFORMATTED_SEQUENTIAL;
119 /* Mid level data transfer statements. These subroutines do reading
120 and writing in the style of salloc_r()/salloc_w() within the
123 /* When reading sequential formatted records we have a problem. We
124 don't know how long the line is until we read the trailing newline,
125 and we don't want to read too much. If we read too much, we might
126 have to do a physical seek backwards depending on how much data is
127 present, and devices like terminals aren't seekable and would cause
130 Given this, the solution is to read a byte at a time, stopping if
131 we hit the newline. For small locations, we use a static buffer.
132 For larger allocations, we are forced to allocate memory on the
133 heap. Hopefully this won't happen very often. */
136 read_sf (st_parameter_dt *dtp, int *length)
139 int n, readlen, crlf;
142 if (*length > SCRATCH_SIZE)
143 dtp->u.p.line_buffer = get_mem (*length);
144 p = base = dtp->u.p.line_buffer;
146 /* If we have seen an eor previously, return a length of 0. The
147 caller is responsible for correctly padding the input field. */
148 if (dtp->u.p.sf_seen_eor)
159 if (is_internal_unit (dtp))
161 /* readlen may be modified inside salloc_r if
162 is_internal_unit (dtp) is true. */
166 q = salloc_r (dtp->u.p.current_unit->s, &readlen);
170 /* If we have a line without a terminating \n, drop through to
172 if (readlen < 1 && n == 0)
174 generate_error (&dtp->common, ERROR_END, NULL);
178 if (readlen < 1 || *q == '\n' || *q == '\r')
180 /* Unexpected end of line. */
182 /* If we see an EOR during non-advancing I/O, we need to skip
183 the rest of the I/O statement. Set the corresponding flag. */
184 if (dtp->u.p.advance_status == ADVANCE_NO || dtp->u.p.seen_dollar)
185 dtp->u.p.eor_condition = 1;
188 /* If we encounter a CR, it might be a CRLF. */
189 if (*q == '\r') /* Probably a CRLF */
192 pos = stream_offset (dtp->u.p.current_unit->s);
193 q = salloc_r (dtp->u.p.current_unit->s, &readlen);
194 if (*q != '\n' && readlen == 1) /* Not a CRLF after all. */
195 sseek (dtp->u.p.current_unit->s, pos);
200 /* Without padding, terminate the I/O statement without assigning
201 the value. With padding, the value still needs to be assigned,
202 so we can just continue with a short read. */
203 if (dtp->u.p.current_unit->flags.pad == PAD_NO)
205 generate_error (&dtp->common, ERROR_EOR, NULL);
210 dtp->u.p.sf_seen_eor = (crlf ? 2 : 1);
213 /* Short circuit the read if a comma is found during numeric input.
214 The flag is set to zero during character reads so that commas in
215 strings are not ignored */
217 if (dtp->u.p.sf_read_comma == 1)
219 notify_std (GFC_STD_GNU, "Comma in formatted numeric read.");
226 dtp->u.p.sf_seen_eor = 0;
229 dtp->u.p.current_unit->bytes_left -= *length;
231 if ((dtp->common.flags & IOPARM_DT_HAS_SIZE) != 0)
232 *dtp->size += *length;
238 /* Function for reading the next couple of bytes from the current
239 file, advancing the current position. We return a pointer to a
240 buffer containing the bytes. We return NULL on end of record or
243 If the read is short, then it is because the current record does not
244 have enough data to satisfy the read request and the file was
245 opened with PAD=YES. The caller must assume tailing spaces for
249 read_block (st_parameter_dt *dtp, int *length)
254 if (dtp->u.p.current_unit->bytes_left < *length)
256 if (dtp->u.p.current_unit->flags.pad == PAD_NO)
258 generate_error (&dtp->common, ERROR_EOR, NULL);
259 /* Not enough data left. */
263 *length = dtp->u.p.current_unit->bytes_left;
266 if (dtp->u.p.current_unit->flags.form == FORM_FORMATTED &&
267 dtp->u.p.current_unit->flags.access == ACCESS_SEQUENTIAL)
268 return read_sf (dtp, length); /* Special case. */
270 dtp->u.p.current_unit->bytes_left -= *length;
273 source = salloc_r (dtp->u.p.current_unit->s, &nread);
275 if ((dtp->common.flags & IOPARM_DT_HAS_SIZE) != 0)
278 if (nread != *length)
279 { /* Short read, this shouldn't happen. */
280 if (dtp->u.p.current_unit->flags.pad == PAD_YES)
284 generate_error (&dtp->common, ERROR_EOR, NULL);
293 /* Reads a block directly into application data space. */
296 read_block_direct (st_parameter_dt *dtp, void *buf, size_t *nbytes)
302 if (dtp->u.p.current_unit->bytes_left < *nbytes)
304 if (dtp->u.p.current_unit->flags.pad == PAD_NO)
306 /* Not enough data left. */
307 generate_error (&dtp->common, ERROR_EOR, NULL);
311 *nbytes = dtp->u.p.current_unit->bytes_left;
314 if (dtp->u.p.current_unit->flags.form == FORM_FORMATTED &&
315 dtp->u.p.current_unit->flags.access == ACCESS_SEQUENTIAL)
317 length = (int *) nbytes;
318 data = read_sf (dtp, length); /* Special case. */
319 memcpy (buf, data, (size_t) *length);
323 dtp->u.p.current_unit->bytes_left -= *nbytes;
326 if (sread (dtp->u.p.current_unit->s, buf, &nread) != 0)
328 generate_error (&dtp->common, ERROR_OS, NULL);
332 if ((dtp->common.flags & IOPARM_DT_HAS_SIZE) != 0)
333 *dtp->size += (GFC_INTEGER_4) nread;
335 if (nread != *nbytes)
336 { /* Short read, e.g. if we hit EOF. */
337 if (dtp->u.p.current_unit->flags.pad == PAD_YES)
339 memset (((char *) buf) + nread, ' ', *nbytes - nread);
343 generate_error (&dtp->common, ERROR_EOR, NULL);
348 /* Function for writing a block of bytes to the current file at the
349 current position, advancing the file pointer. We are given a length
350 and return a pointer to a buffer that the caller must (completely)
351 fill in. Returns NULL on error. */
354 write_block (st_parameter_dt *dtp, int length)
358 if (dtp->u.p.current_unit->bytes_left < length)
360 generate_error (&dtp->common, ERROR_EOR, NULL);
364 dtp->u.p.current_unit->bytes_left -= (gfc_offset) length;
365 dest = salloc_w (dtp->u.p.current_unit->s, &length);
369 generate_error (&dtp->common, ERROR_END, NULL);
373 if ((dtp->common.flags & IOPARM_DT_HAS_SIZE) != 0)
374 *dtp->size += length;
380 /* Writes a block directly without necessarily allocating space in a
384 write_block_direct (st_parameter_dt *dtp, void *buf, size_t *nbytes)
386 if (dtp->u.p.current_unit->bytes_left < *nbytes)
387 generate_error (&dtp->common, ERROR_EOR, NULL);
389 dtp->u.p.current_unit->bytes_left -= (gfc_offset) *nbytes;
391 if (swrite (dtp->u.p.current_unit->s, buf, nbytes) != 0)
392 generate_error (&dtp->common, ERROR_OS, NULL);
394 if ((dtp->common.flags & IOPARM_DT_HAS_SIZE) != 0)
395 *dtp->size += (GFC_INTEGER_4) *nbytes;
399 /* Master function for unformatted reads. */
402 unformatted_read (st_parameter_dt *dtp, bt type,
403 void *dest, int kind,
404 size_t size, size_t nelems)
406 /* Currently, character implies size=1. */
407 if (dtp->u.p.current_unit->flags.convert == CONVERT_NATIVE
408 || size == 1 || type == BT_CHARACTER)
411 read_block_direct (dtp, dest, &size);
419 /* Break up complex into its constituent reals. */
420 if (type == BT_COMPLEX)
427 /* By now, all complex variables have been split into their
428 constituent reals. For types with padding, we only need to
429 read kind bytes. We don't care about the contents
433 for (i=0; i<nelems; i++)
435 read_block_direct (dtp, buffer, &sz);
436 reverse_memcpy (p, buffer, sz);
443 /* Master function for unformatted writes. */
446 unformatted_write (st_parameter_dt *dtp, bt type,
447 void *source, int kind,
448 size_t size, size_t nelems)
450 if (dtp->u.p.current_unit->flags.convert == CONVERT_NATIVE ||
451 size == 1 || type == BT_CHARACTER)
455 write_block_direct (dtp, source, &size);
463 /* Break up complex into its constituent reals. */
464 if (type == BT_COMPLEX)
472 /* By now, all complex variables have been split into their
473 constituent reals. For types with padding, we only need to
474 read kind bytes. We don't care about the contents
478 for (i=0; i<nelems; i++)
480 reverse_memcpy(buffer, p, size);
482 write_block_direct (dtp, buffer, &sz);
488 /* Return a pointer to the name of a type. */
513 internal_error (NULL, "type_name(): Bad type");
520 /* Write a constant string to the output.
521 This is complicated because the string can have doubled delimiters
522 in it. The length in the format node is the true length. */
525 write_constant_string (st_parameter_dt *dtp, const fnode *f)
527 char c, delimiter, *p, *q;
530 length = f->u.string.length;
534 p = write_block (dtp, length);
541 for (; length > 0; length--)
544 if (c == delimiter && c != 'H' && c != 'h')
545 q++; /* Skip the doubled delimiter. */
550 /* Given actual and expected types in a formatted data transfer, make
551 sure they agree. If not, an error message is generated. Returns
552 nonzero if something went wrong. */
555 require_type (st_parameter_dt *dtp, bt expected, bt actual, const fnode *f)
559 if (actual == expected)
562 st_sprintf (buffer, "Expected %s for item %d in formatted transfer, got %s",
563 type_name (expected), dtp->u.p.item_count, type_name (actual));
565 format_error (dtp, f, buffer);
570 /* This subroutine is the main loop for a formatted data transfer
571 statement. It would be natural to implement this as a coroutine
572 with the user program, but C makes that awkward. We loop,
573 processesing format elements. When we actually have to transfer
574 data instead of just setting flags, we return control to the user
575 program which calls a subroutine that supplies the address and type
576 of the next element, then comes back here to process it. */
579 formatted_transfer_scalar (st_parameter_dt *dtp, bt type, void *p, int len,
582 char scratch[SCRATCH_SIZE];
587 int consume_data_flag;
589 /* Change a complex data item into a pair of reals. */
591 n = (p == NULL) ? 0 : ((type != BT_COMPLEX) ? 1 : 2);
592 if (type == BT_COMPLEX)
598 /* If there's an EOR condition, we simulate finalizing the transfer
600 if (dtp->u.p.eor_condition)
603 /* Set this flag so that commas in reads cause the read to complete before
604 the entire field has been read. The next read field will start right after
605 the comma in the stream. (Set to 0 for character reads). */
606 dtp->u.p.sf_read_comma = 1;
608 dtp->u.p.line_buffer = scratch;
611 /* If reversion has occurred and there is another real data item,
612 then we have to move to the next record. */
613 if (dtp->u.p.reversion_flag && n > 0)
615 dtp->u.p.reversion_flag = 0;
616 next_record (dtp, 0);
619 consume_data_flag = 1 ;
620 if ((dtp->common.flags & IOPARM_LIBRETURN_MASK) != IOPARM_LIBRETURN_OK)
623 f = next_format (dtp);
625 return; /* No data descriptors left (already raised). */
627 /* Now discharge T, TR and X movements to the right. This is delayed
628 until a data producing format to suppress trailing spaces. */
631 if (dtp->u.p.mode == WRITING && dtp->u.p.skips != 0
632 && ((n>0 && ( t == FMT_I || t == FMT_B || t == FMT_O
633 || t == FMT_Z || t == FMT_F || t == FMT_E
634 || t == FMT_EN || t == FMT_ES || t == FMT_G
635 || t == FMT_L || t == FMT_A || t == FMT_D))
638 if (dtp->u.p.skips > 0)
640 write_x (dtp, dtp->u.p.skips, dtp->u.p.pending_spaces);
641 dtp->u.p.max_pos = (int)(dtp->u.p.current_unit->recl
642 - dtp->u.p.current_unit->bytes_left);
644 if (dtp->u.p.skips < 0)
646 move_pos_offset (dtp->u.p.current_unit->s, dtp->u.p.skips);
647 dtp->u.p.current_unit->bytes_left -= (gfc_offset) dtp->u.p.skips;
649 dtp->u.p.skips = dtp->u.p.pending_spaces = 0;
652 bytes_used = (int)(dtp->u.p.current_unit->recl - dtp->u.p.current_unit->bytes_left);
659 if (require_type (dtp, BT_INTEGER, type, f))
662 if (dtp->u.p.mode == READING)
663 read_decimal (dtp, f, p, len);
665 write_i (dtp, f, p, len);
672 if (require_type (dtp, BT_INTEGER, type, f))
675 if (dtp->u.p.mode == READING)
676 read_radix (dtp, f, p, len, 2);
678 write_b (dtp, f, p, len);
686 if (dtp->u.p.mode == READING)
687 read_radix (dtp, f, p, len, 8);
689 write_o (dtp, f, p, len);
697 if (dtp->u.p.mode == READING)
698 read_radix (dtp, f, p, len, 16);
700 write_z (dtp, f, p, len);
708 if (dtp->u.p.mode == READING)
709 read_a (dtp, f, p, len);
711 write_a (dtp, f, p, len);
719 if (dtp->u.p.mode == READING)
720 read_l (dtp, f, p, len);
722 write_l (dtp, f, p, len);
729 if (require_type (dtp, BT_REAL, type, f))
732 if (dtp->u.p.mode == READING)
733 read_f (dtp, f, p, len);
735 write_d (dtp, f, p, len);
742 if (require_type (dtp, BT_REAL, type, f))
745 if (dtp->u.p.mode == READING)
746 read_f (dtp, f, p, len);
748 write_e (dtp, f, p, len);
754 if (require_type (dtp, BT_REAL, type, f))
757 if (dtp->u.p.mode == READING)
758 read_f (dtp, f, p, len);
760 write_en (dtp, f, p, len);
767 if (require_type (dtp, BT_REAL, type, f))
770 if (dtp->u.p.mode == READING)
771 read_f (dtp, f, p, len);
773 write_es (dtp, f, p, len);
780 if (require_type (dtp, BT_REAL, type, f))
783 if (dtp->u.p.mode == READING)
784 read_f (dtp, f, p, len);
786 write_f (dtp, f, p, len);
793 if (dtp->u.p.mode == READING)
797 read_decimal (dtp, f, p, len);
800 read_l (dtp, f, p, len);
803 read_a (dtp, f, p, len);
806 read_f (dtp, f, p, len);
815 write_i (dtp, f, p, len);
818 write_l (dtp, f, p, len);
821 write_a (dtp, f, p, len);
824 write_d (dtp, f, p, len);
828 internal_error (&dtp->common,
829 "formatted_transfer(): Bad type");
835 consume_data_flag = 0 ;
836 if (dtp->u.p.mode == READING)
838 format_error (dtp, f, "Constant string in input format");
841 write_constant_string (dtp, f);
844 /* Format codes that don't transfer data. */
847 consume_data_flag = 0 ;
849 pos = bytes_used + f->u.n + dtp->u.p.skips;
850 dtp->u.p.skips = f->u.n + dtp->u.p.skips;
851 dtp->u.p.pending_spaces = pos - dtp->u.p.max_pos;
853 /* Writes occur just before the switch on f->format, above, so
854 that trailing blanks are suppressed, unless we are doing a
855 non-advancing write in which case we want to output the blanks
857 if (dtp->u.p.mode == WRITING
858 && dtp->u.p.advance_status == ADVANCE_NO)
860 write_x (dtp, dtp->u.p.skips, dtp->u.p.pending_spaces);
861 dtp->u.p.skips = dtp->u.p.pending_spaces = 0;
863 if (dtp->u.p.mode == READING)
864 read_x (dtp, f->u.n);
870 if (f->format == FMT_TL)
873 /* Handle the special case when no bytes have been used yet.
874 Cannot go below zero. */
877 dtp->u.p.pending_spaces -= f->u.n;
878 dtp->u.p.pending_spaces = dtp->u.p.pending_spaces < 0 ? 0
879 : dtp->u.p.pending_spaces;
880 dtp->u.p.skips -= f->u.n;
881 dtp->u.p.skips = dtp->u.p.skips < 0 ? 0 : dtp->u.p.skips;
884 pos = bytes_used - f->u.n;
888 consume_data_flag = 0;
892 /* Standard 10.6.1.1: excessive left tabbing is reset to the
893 left tab limit. We do not check if the position has gone
894 beyond the end of record because a subsequent tab could
895 bring us back again. */
896 pos = pos < 0 ? 0 : pos;
898 dtp->u.p.skips = dtp->u.p.skips + pos - bytes_used;
899 dtp->u.p.pending_spaces = dtp->u.p.pending_spaces
900 + pos - dtp->u.p.max_pos;
902 if (dtp->u.p.skips == 0)
905 /* Writes occur just before the switch on f->format, above, so that
906 trailing blanks are suppressed. */
907 if (dtp->u.p.mode == READING)
909 /* Adjust everything for end-of-record condition */
910 if (dtp->u.p.sf_seen_eor && !is_internal_unit (dtp))
912 if (dtp->u.p.sf_seen_eor == 2)
914 /* The EOR was a CRLF (two bytes wide). */
915 dtp->u.p.current_unit->bytes_left -= 2;
920 /* The EOR marker was only one byte wide. */
921 dtp->u.p.current_unit->bytes_left--;
925 dtp->u.p.sf_seen_eor = 0;
927 if (dtp->u.p.skips < 0)
929 move_pos_offset (dtp->u.p.current_unit->s, dtp->u.p.skips);
930 dtp->u.p.current_unit->bytes_left
931 -= (gfc_offset) dtp->u.p.skips;
932 dtp->u.p.skips = dtp->u.p.pending_spaces = 0;
935 read_x (dtp, dtp->u.p.skips);
941 consume_data_flag = 0 ;
942 dtp->u.p.sign_status = SIGN_S;
946 consume_data_flag = 0 ;
947 dtp->u.p.sign_status = SIGN_SS;
951 consume_data_flag = 0 ;
952 dtp->u.p.sign_status = SIGN_SP;
956 consume_data_flag = 0 ;
957 dtp->u.p.blank_status = BLANK_NULL;
961 consume_data_flag = 0 ;
962 dtp->u.p.blank_status = BLANK_ZERO;
966 consume_data_flag = 0 ;
967 dtp->u.p.scale_factor = f->u.k;
971 consume_data_flag = 0 ;
972 dtp->u.p.seen_dollar = 1;
976 consume_data_flag = 0 ;
977 dtp->u.p.skips = dtp->u.p.pending_spaces = 0;
978 next_record (dtp, 0);
982 /* A colon descriptor causes us to exit this loop (in
983 particular preventing another / descriptor from being
984 processed) unless there is another data item to be
986 consume_data_flag = 0 ;
992 internal_error (&dtp->common, "Bad format node");
995 /* Free a buffer that we had to allocate during a sequential
996 formatted read of a block that was larger than the static
999 if (dtp->u.p.line_buffer != scratch)
1001 free_mem (dtp->u.p.line_buffer);
1002 dtp->u.p.line_buffer = scratch;
1005 /* Adjust the item count and data pointer. */
1007 if ((consume_data_flag > 0) && (n > 0))
1010 p = ((char *) p) + size;
1013 if (dtp->u.p.mode == READING)
1016 pos = (int)(dtp->u.p.current_unit->recl - dtp->u.p.current_unit->bytes_left);
1017 dtp->u.p.max_pos = (dtp->u.p.max_pos > pos) ? dtp->u.p.max_pos : pos;
1023 /* Come here when we need a data descriptor but don't have one. We
1024 push the current format node back onto the input, then return and
1025 let the user program call us back with the data. */
1027 unget_format (dtp, f);
1031 formatted_transfer (st_parameter_dt *dtp, bt type, void *p, int kind,
1032 size_t size, size_t nelems)
1039 /* Big loop over all the elements. */
1040 for (elem = 0; elem < nelems; elem++)
1042 dtp->u.p.item_count++;
1043 formatted_transfer_scalar (dtp, type, tmp + size*elem, kind, size);
1049 /* Data transfer entry points. The type of the data entity is
1050 implicit in the subroutine call. This prevents us from having to
1051 share a common enum with the compiler. */
1054 transfer_integer (st_parameter_dt *dtp, void *p, int kind)
1056 if ((dtp->common.flags & IOPARM_LIBRETURN_MASK) != IOPARM_LIBRETURN_OK)
1058 dtp->u.p.transfer (dtp, BT_INTEGER, p, kind, kind, 1);
1063 transfer_real (st_parameter_dt *dtp, void *p, int kind)
1066 if ((dtp->common.flags & IOPARM_LIBRETURN_MASK) != IOPARM_LIBRETURN_OK)
1068 size = size_from_real_kind (kind);
1069 dtp->u.p.transfer (dtp, BT_REAL, p, kind, size, 1);
1074 transfer_logical (st_parameter_dt *dtp, void *p, int kind)
1076 if ((dtp->common.flags & IOPARM_LIBRETURN_MASK) != IOPARM_LIBRETURN_OK)
1078 dtp->u.p.transfer (dtp, BT_LOGICAL, p, kind, kind, 1);
1083 transfer_character (st_parameter_dt *dtp, void *p, int len)
1085 if ((dtp->common.flags & IOPARM_LIBRETURN_MASK) != IOPARM_LIBRETURN_OK)
1087 /* Currently we support only 1 byte chars, and the library is a bit
1088 confused of character kind vs. length, so we kludge it by setting
1090 dtp->u.p.transfer (dtp, BT_CHARACTER, p, len, len, 1);
1095 transfer_complex (st_parameter_dt *dtp, void *p, int kind)
1098 if ((dtp->common.flags & IOPARM_LIBRETURN_MASK) != IOPARM_LIBRETURN_OK)
1100 size = size_from_complex_kind (kind);
1101 dtp->u.p.transfer (dtp, BT_COMPLEX, p, kind, size, 1);
1106 transfer_array (st_parameter_dt *dtp, gfc_array_char *desc, int kind,
1107 gfc_charlen_type charlen)
1109 index_type count[GFC_MAX_DIMENSIONS];
1110 index_type extent[GFC_MAX_DIMENSIONS];
1111 index_type stride[GFC_MAX_DIMENSIONS];
1112 index_type stride0, rank, size, type, n;
1117 if ((dtp->common.flags & IOPARM_LIBRETURN_MASK) != IOPARM_LIBRETURN_OK)
1120 type = GFC_DESCRIPTOR_TYPE (desc);
1121 size = GFC_DESCRIPTOR_SIZE (desc);
1123 /* FIXME: What a kludge: Array descriptors and the IO library use
1124 different enums for types. */
1127 case GFC_DTYPE_UNKNOWN:
1128 iotype = BT_NULL; /* Is this correct? */
1130 case GFC_DTYPE_INTEGER:
1131 iotype = BT_INTEGER;
1133 case GFC_DTYPE_LOGICAL:
1134 iotype = BT_LOGICAL;
1136 case GFC_DTYPE_REAL:
1139 case GFC_DTYPE_COMPLEX:
1140 iotype = BT_COMPLEX;
1142 case GFC_DTYPE_CHARACTER:
1143 iotype = BT_CHARACTER;
1144 /* FIXME: Currently dtype contains the charlen, which is
1145 clobbered if charlen > 2**24. That's why we use a separate
1146 argument for the charlen. However, if we want to support
1147 non-8-bit charsets we need to fix dtype to contain
1148 sizeof(chartype) and fix the code below. */
1152 case GFC_DTYPE_DERIVED:
1153 internal_error (&dtp->common,
1154 "Derived type I/O should have been handled via the frontend.");
1157 internal_error (&dtp->common, "transfer_array(): Bad type");
1160 if (desc->dim[0].stride == 0)
1161 desc->dim[0].stride = 1;
1163 rank = GFC_DESCRIPTOR_RANK (desc);
1164 for (n = 0; n < rank; n++)
1167 stride[n] = desc->dim[n].stride;
1168 extent[n] = desc->dim[n].ubound + 1 - desc->dim[n].lbound;
1170 /* If the extent of even one dimension is zero, then the entire
1171 array section contains zero elements, so we return. */
1176 stride0 = stride[0];
1178 /* If the innermost dimension has stride 1, we can do the transfer
1179 in contiguous chunks. */
1185 data = GFC_DESCRIPTOR_DATA (desc);
1189 dtp->u.p.transfer (dtp, iotype, data, kind, size, tsize);
1190 data += stride0 * size * tsize;
1193 while (count[n] == extent[n])
1196 data -= stride[n] * extent[n] * size;
1206 data += stride[n] * size;
1213 /* Preposition a sequential unformatted file while reading. */
1216 us_read (st_parameter_dt *dtp)
1222 if (dtp->u.p.current_unit->endfile == AT_ENDFILE)
1225 n = sizeof (gfc_offset);
1226 p = salloc_r (dtp->u.p.current_unit->s, &n);
1230 dtp->u.p.current_unit->endfile = AT_ENDFILE;
1231 return; /* end of file */
1234 if (p == NULL || n != sizeof (gfc_offset))
1236 generate_error (&dtp->common, ERROR_BAD_US, NULL);
1240 /* Only CONVERT_NATIVE and CONVERT_SWAP are valid here. */
1241 if (dtp->u.p.current_unit->flags.convert == CONVERT_NATIVE)
1242 memcpy (&i, p, sizeof (gfc_offset));
1244 reverse_memcpy (&i, p, sizeof (gfc_offset));
1246 dtp->u.p.current_unit->bytes_left = i;
1250 /* Preposition a sequential unformatted file while writing. This
1251 amount to writing a bogus length that will be filled in later. */
1254 us_write (st_parameter_dt *dtp)
1259 length = sizeof (gfc_offset);
1260 p = salloc_w (dtp->u.p.current_unit->s, &length);
1264 generate_error (&dtp->common, ERROR_OS, NULL);
1268 memset (p, '\0', sizeof (gfc_offset)); /* Bogus value for now. */
1269 if (sfree (dtp->u.p.current_unit->s) == FAILURE)
1270 generate_error (&dtp->common, ERROR_OS, NULL);
1272 /* For sequential unformatted, we write until we have more bytes than
1273 can fit in the record markers. If disk space runs out first, it will
1274 error on the write. */
1275 dtp->u.p.current_unit->recl = max_offset;
1277 dtp->u.p.current_unit->bytes_left = dtp->u.p.current_unit->recl;
1281 /* Position to the next record prior to transfer. We are assumed to
1282 be before the next record. We also calculate the bytes in the next
1286 pre_position (st_parameter_dt *dtp)
1288 if (dtp->u.p.current_unit->current_record)
1289 return; /* Already positioned. */
1291 switch (current_mode (dtp))
1293 case UNFORMATTED_SEQUENTIAL:
1294 if (dtp->u.p.mode == READING)
1301 case FORMATTED_SEQUENTIAL:
1302 case FORMATTED_DIRECT:
1303 case UNFORMATTED_DIRECT:
1304 dtp->u.p.current_unit->bytes_left = dtp->u.p.current_unit->recl;
1308 dtp->u.p.current_unit->current_record = 1;
1312 /* Initialize things for a data transfer. This code is common for
1313 both reading and writing. */
1316 data_transfer_init (st_parameter_dt *dtp, int read_flag)
1318 unit_flags u_flags; /* Used for creating a unit if needed. */
1319 GFC_INTEGER_4 cf = dtp->common.flags;
1320 namelist_info *ionml;
1322 ionml = ((cf & IOPARM_DT_IONML_SET) != 0) ? dtp->u.p.ionml : NULL;
1323 memset (&dtp->u.p, 0, sizeof (dtp->u.p));
1324 dtp->u.p.ionml = ionml;
1325 dtp->u.p.mode = read_flag ? READING : WRITING;
1327 if ((cf & IOPARM_DT_HAS_SIZE) != 0)
1328 *dtp->size = 0; /* Initialize the count. */
1330 dtp->u.p.current_unit = get_unit (dtp, 1);
1331 if (dtp->u.p.current_unit->s == NULL)
1332 { /* Open the unit with some default flags. */
1333 st_parameter_open opp;
1334 if (dtp->common.unit < 0)
1336 close_unit (dtp->u.p.current_unit);
1337 dtp->u.p.current_unit = NULL;
1338 generate_error (&dtp->common, ERROR_BAD_OPTION,
1339 "Bad unit number in OPEN statement");
1342 memset (&u_flags, '\0', sizeof (u_flags));
1343 u_flags.access = ACCESS_SEQUENTIAL;
1344 u_flags.action = ACTION_READWRITE;
1346 /* Is it unformatted? */
1347 if (!(cf & (IOPARM_DT_HAS_FORMAT | IOPARM_DT_LIST_FORMAT
1348 | IOPARM_DT_IONML_SET)))
1349 u_flags.form = FORM_UNFORMATTED;
1351 u_flags.form = FORM_UNSPECIFIED;
1353 u_flags.delim = DELIM_UNSPECIFIED;
1354 u_flags.blank = BLANK_UNSPECIFIED;
1355 u_flags.pad = PAD_UNSPECIFIED;
1356 u_flags.status = STATUS_UNKNOWN;
1357 opp.common = dtp->common;
1358 opp.common.flags &= IOPARM_COMMON_MASK;
1359 dtp->u.p.current_unit = new_unit (&opp, dtp->u.p.current_unit, &u_flags);
1360 dtp->common.flags &= ~IOPARM_COMMON_MASK;
1361 dtp->common.flags |= (opp.common.flags & IOPARM_COMMON_MASK);
1362 if (dtp->u.p.current_unit == NULL)
1366 /* Check the action. */
1368 if (read_flag && dtp->u.p.current_unit->flags.action == ACTION_WRITE)
1369 generate_error (&dtp->common, ERROR_BAD_ACTION,
1370 "Cannot read from file opened for WRITE");
1372 if (!read_flag && dtp->u.p.current_unit->flags.action == ACTION_READ)
1373 generate_error (&dtp->common, ERROR_BAD_ACTION,
1374 "Cannot write to file opened for READ");
1376 if ((dtp->common.flags & IOPARM_LIBRETURN_MASK) != IOPARM_LIBRETURN_OK)
1379 dtp->u.p.first_item = 1;
1381 /* Check the format. */
1383 if ((cf & IOPARM_DT_HAS_FORMAT) != 0)
1386 if ((dtp->common.flags & IOPARM_LIBRETURN_MASK) != IOPARM_LIBRETURN_OK)
1389 if (dtp->u.p.current_unit->flags.form == FORM_UNFORMATTED
1390 && (cf & (IOPARM_DT_HAS_FORMAT | IOPARM_DT_LIST_FORMAT))
1392 generate_error (&dtp->common, ERROR_OPTION_CONFLICT,
1393 "Format present for UNFORMATTED data transfer");
1395 if ((cf & IOPARM_DT_HAS_NAMELIST_NAME) != 0 && dtp->u.p.ionml != NULL)
1397 if ((cf & IOPARM_DT_HAS_FORMAT) != 0)
1398 generate_error (&dtp->common, ERROR_OPTION_CONFLICT,
1399 "A format cannot be specified with a namelist");
1401 else if (dtp->u.p.current_unit->flags.form == FORM_FORMATTED &&
1402 !(cf & (IOPARM_DT_HAS_FORMAT | IOPARM_DT_LIST_FORMAT)))
1403 generate_error (&dtp->common, ERROR_OPTION_CONFLICT,
1404 "Missing format for FORMATTED data transfer");
1407 if (is_internal_unit (dtp)
1408 && dtp->u.p.current_unit->flags.form == FORM_UNFORMATTED)
1409 generate_error (&dtp->common, ERROR_OPTION_CONFLICT,
1410 "Internal file cannot be accessed by UNFORMATTED data transfer");
1412 /* Check the record number. */
1414 if (dtp->u.p.current_unit->flags.access == ACCESS_DIRECT
1415 && (cf & IOPARM_DT_HAS_REC) == 0)
1417 generate_error (&dtp->common, ERROR_MISSING_OPTION,
1418 "Direct access data transfer requires record number");
1422 if (dtp->u.p.current_unit->flags.access == ACCESS_SEQUENTIAL
1423 && (cf & IOPARM_DT_HAS_REC) != 0)
1425 generate_error (&dtp->common, ERROR_OPTION_CONFLICT,
1426 "Record number not allowed for sequential access data transfer");
1430 /* Process the ADVANCE option. */
1432 dtp->u.p.advance_status
1433 = !(cf & IOPARM_DT_HAS_ADVANCE) ? ADVANCE_UNSPECIFIED :
1434 find_option (&dtp->common, dtp->advance, dtp->advance_len, advance_opt,
1435 "Bad ADVANCE parameter in data transfer statement");
1437 if (dtp->u.p.advance_status != ADVANCE_UNSPECIFIED)
1439 if (dtp->u.p.current_unit->flags.access == ACCESS_DIRECT)
1440 generate_error (&dtp->common, ERROR_OPTION_CONFLICT,
1441 "ADVANCE specification conflicts with sequential access");
1443 if (is_internal_unit (dtp))
1444 generate_error (&dtp->common, ERROR_OPTION_CONFLICT,
1445 "ADVANCE specification conflicts with internal file");
1447 if ((cf & (IOPARM_DT_HAS_FORMAT | IOPARM_DT_LIST_FORMAT))
1448 != IOPARM_DT_HAS_FORMAT)
1449 generate_error (&dtp->common, ERROR_OPTION_CONFLICT,
1450 "ADVANCE specification requires an explicit format");
1455 if ((cf & IOPARM_EOR) != 0 && dtp->u.p.advance_status != ADVANCE_NO)
1456 generate_error (&dtp->common, ERROR_MISSING_OPTION,
1457 "EOR specification requires an ADVANCE specification of NO");
1459 if ((cf & IOPARM_DT_HAS_SIZE) != 0 && dtp->u.p.advance_status != ADVANCE_NO)
1460 generate_error (&dtp->common, ERROR_MISSING_OPTION,
1461 "SIZE specification requires an ADVANCE specification of NO");
1465 { /* Write constraints. */
1466 if ((cf & IOPARM_END) != 0)
1467 generate_error (&dtp->common, ERROR_OPTION_CONFLICT,
1468 "END specification cannot appear in a write statement");
1470 if ((cf & IOPARM_EOR) != 0)
1471 generate_error (&dtp->common, ERROR_OPTION_CONFLICT,
1472 "EOR specification cannot appear in a write statement");
1474 if ((cf & IOPARM_DT_HAS_SIZE) != 0)
1475 generate_error (&dtp->common, ERROR_OPTION_CONFLICT,
1476 "SIZE specification cannot appear in a write statement");
1479 if (dtp->u.p.advance_status == ADVANCE_UNSPECIFIED)
1480 dtp->u.p.advance_status = ADVANCE_YES;
1481 if ((dtp->common.flags & IOPARM_LIBRETURN_MASK) != IOPARM_LIBRETURN_OK)
1484 /* Sanity checks on the record number. */
1486 if ((cf & IOPARM_DT_HAS_REC) != 0)
1490 generate_error (&dtp->common, ERROR_BAD_OPTION,
1491 "Record number must be positive");
1495 if (dtp->rec >= dtp->u.p.current_unit->maxrec)
1497 generate_error (&dtp->common, ERROR_BAD_OPTION,
1498 "Record number too large");
1502 /* Check to see if we might be reading what we wrote before */
1504 if (dtp->u.p.mode == READING && dtp->u.p.current_unit->mode == WRITING)
1505 flush(dtp->u.p.current_unit->s);
1507 /* Check whether the record exists to be read. Only
1508 a partial record needs to exist. */
1510 if (dtp->u.p.mode == READING && (dtp->rec -1)
1511 * dtp->u.p.current_unit->recl >= file_length (dtp->u.p.current_unit->s))
1513 generate_error (&dtp->common, ERROR_BAD_OPTION,
1514 "Non-existing record number");
1518 /* Position the file. */
1519 if (sseek (dtp->u.p.current_unit->s,
1520 (dtp->rec - 1) * dtp->u.p.current_unit->recl) == FAILURE)
1522 generate_error (&dtp->common, ERROR_OS, NULL);
1527 /* Overwriting an existing sequential file ?
1528 it is always safe to truncate the file on the first write */
1529 if (dtp->u.p.mode == WRITING
1530 && dtp->u.p.current_unit->flags.access == ACCESS_SEQUENTIAL
1531 && dtp->u.p.current_unit->last_record == 0 && !is_preconnected(dtp->u.p.current_unit->s))
1532 struncate(dtp->u.p.current_unit->s);
1534 /* Bugware for badly written mixed C-Fortran I/O. */
1535 flush_if_preconnected(dtp->u.p.current_unit->s);
1537 dtp->u.p.current_unit->mode = dtp->u.p.mode;
1539 /* Set the initial value of flags. */
1541 dtp->u.p.blank_status = dtp->u.p.current_unit->flags.blank;
1542 dtp->u.p.sign_status = SIGN_S;
1546 /* Set up the subroutine that will handle the transfers. */
1550 if (dtp->u.p.current_unit->flags.form == FORM_UNFORMATTED)
1551 dtp->u.p.transfer = unformatted_read;
1554 if ((cf & IOPARM_DT_LIST_FORMAT) != 0)
1555 dtp->u.p.transfer = list_formatted_read;
1557 dtp->u.p.transfer = formatted_transfer;
1562 if (dtp->u.p.current_unit->flags.form == FORM_UNFORMATTED)
1563 dtp->u.p.transfer = unformatted_write;
1566 if ((cf & IOPARM_DT_LIST_FORMAT) != 0)
1567 dtp->u.p.transfer = list_formatted_write;
1569 dtp->u.p.transfer = formatted_transfer;
1573 /* Make sure that we don't do a read after a nonadvancing write. */
1577 if (dtp->u.p.current_unit->read_bad)
1579 generate_error (&dtp->common, ERROR_BAD_OPTION,
1580 "Cannot READ after a nonadvancing WRITE");
1586 if (dtp->u.p.advance_status == ADVANCE_YES && !dtp->u.p.seen_dollar)
1587 dtp->u.p.current_unit->read_bad = 1;
1590 /* Start the data transfer if we are doing a formatted transfer. */
1591 if (dtp->u.p.current_unit->flags.form == FORM_FORMATTED
1592 && ((cf & (IOPARM_DT_LIST_FORMAT | IOPARM_DT_HAS_NAMELIST_NAME)) == 0)
1593 && dtp->u.p.ionml == NULL)
1594 formatted_transfer (dtp, 0, NULL, 0, 0, 1);
1597 /* Initialize an array_loop_spec given the array descriptor. The function
1598 returns the index of the last element of the array. */
1601 init_loop_spec (gfc_array_char *desc, array_loop_spec *ls)
1603 int rank = GFC_DESCRIPTOR_RANK(desc);
1608 for (i=0; i<rank; i++)
1611 ls[i].start = desc->dim[i].lbound;
1612 ls[i].end = desc->dim[i].ubound;
1613 ls[i].step = desc->dim[i].stride;
1615 index += (desc->dim[i].ubound - desc->dim[i].lbound)
1616 * desc->dim[i].stride;
1621 /* Determine the index to the next record in an internal unit array by
1622 by incrementing through the array_loop_spec. TODO: Implement handling
1623 negative strides. */
1626 next_array_record (st_parameter_dt *dtp, array_loop_spec *ls)
1634 for (i = 0; i < dtp->u.p.current_unit->rank; i++)
1639 if (ls[i].idx > ls[i].end)
1641 ls[i].idx = ls[i].start;
1647 index = index + (ls[i].idx - 1) * ls[i].step;
1652 /* Space to the next record for read mode. If the file is not
1653 seekable, we read MAX_READ chunks until we get to the right
1656 #define MAX_READ 4096
1659 next_record_r (st_parameter_dt *dtp)
1661 gfc_offset new, record;
1662 int bytes_left, rlength, length;
1665 switch (current_mode (dtp))
1667 case UNFORMATTED_SEQUENTIAL:
1669 /* Skip over tail */
1670 dtp->u.p.current_unit->bytes_left += sizeof (gfc_offset);
1672 /* Fall through... */
1674 case FORMATTED_DIRECT:
1675 case UNFORMATTED_DIRECT:
1676 if (dtp->u.p.current_unit->bytes_left == 0)
1679 if (is_seekable (dtp->u.p.current_unit->s))
1681 new = file_position (dtp->u.p.current_unit->s)
1682 + dtp->u.p.current_unit->bytes_left;
1684 /* Direct access files do not generate END conditions,
1686 if (sseek (dtp->u.p.current_unit->s, new) == FAILURE)
1687 generate_error (&dtp->common, ERROR_OS, NULL);
1691 { /* Seek by reading data. */
1692 while (dtp->u.p.current_unit->bytes_left > 0)
1694 rlength = length = (MAX_READ > dtp->u.p.current_unit->bytes_left) ?
1695 MAX_READ : dtp->u.p.current_unit->bytes_left;
1697 p = salloc_r (dtp->u.p.current_unit->s, &rlength);
1700 generate_error (&dtp->common, ERROR_OS, NULL);
1704 dtp->u.p.current_unit->bytes_left -= length;
1709 case FORMATTED_SEQUENTIAL:
1711 /* sf_read has already terminated input because of an '\n' */
1712 if (dtp->u.p.sf_seen_eor)
1714 dtp->u.p.sf_seen_eor = 0;
1718 if (is_internal_unit (dtp))
1720 if (is_array_io (dtp))
1722 record = next_array_record (dtp, dtp->u.p.current_unit->ls);
1724 /* Now seek to this record. */
1725 record = record * dtp->u.p.current_unit->recl;
1726 if (sseek (dtp->u.p.current_unit->s, record) == FAILURE)
1728 generate_error (&dtp->common, ERROR_INTERNAL_UNIT, NULL);
1731 dtp->u.p.current_unit->bytes_left = dtp->u.p.current_unit->recl;
1735 bytes_left = (int) dtp->u.p.current_unit->bytes_left;
1736 p = salloc_r (dtp->u.p.current_unit->s, &bytes_left);
1738 dtp->u.p.current_unit->bytes_left
1739 = dtp->u.p.current_unit->recl;
1745 p = salloc_r (dtp->u.p.current_unit->s, &length);
1749 generate_error (&dtp->common, ERROR_OS, NULL);
1755 dtp->u.p.current_unit->endfile = AT_ENDFILE;
1764 if (dtp->u.p.current_unit->flags.access == ACCESS_SEQUENTIAL)
1765 test_endfile (dtp->u.p.current_unit);
1769 /* Position to the next record in write mode. */
1772 next_record_w (st_parameter_dt *dtp, int done)
1774 gfc_offset c, m, record, max_pos;
1778 /* Zero counters for X- and T-editing. */
1779 max_pos = dtp->u.p.max_pos;
1780 dtp->u.p.max_pos = dtp->u.p.skips = dtp->u.p.pending_spaces = 0;
1782 switch (current_mode (dtp))
1784 case FORMATTED_DIRECT:
1785 if (dtp->u.p.current_unit->bytes_left == 0)
1788 length = dtp->u.p.current_unit->bytes_left;
1789 p = salloc_w (dtp->u.p.current_unit->s, &length);
1794 memset (p, ' ', dtp->u.p.current_unit->bytes_left);
1795 if (sfree (dtp->u.p.current_unit->s) == FAILURE)
1799 case UNFORMATTED_DIRECT:
1800 if (sfree (dtp->u.p.current_unit->s) == FAILURE)
1804 case UNFORMATTED_SEQUENTIAL:
1805 /* Bytes written. */
1806 m = dtp->u.p.current_unit->recl - dtp->u.p.current_unit->bytes_left;
1807 c = file_position (dtp->u.p.current_unit->s);
1809 length = sizeof (gfc_offset);
1811 /* Write the length tail. */
1813 p = salloc_w (dtp->u.p.current_unit->s, &length);
1817 /* Only CONVERT_NATIVE and CONVERT_SWAP are valid here. */
1818 if (dtp->u.p.current_unit->flags.convert == CONVERT_NATIVE)
1819 memcpy (p, &m, sizeof (gfc_offset));
1821 reverse_memcpy (p, &m, sizeof (gfc_offset));
1823 if (sfree (dtp->u.p.current_unit->s) == FAILURE)
1826 /* Seek to the head and overwrite the bogus length with the real
1829 p = salloc_w_at (dtp->u.p.current_unit->s, &length, c - m - length);
1831 generate_error (&dtp->common, ERROR_OS, NULL);
1833 /* Only CONVERT_NATIVE and CONVERT_SWAP are valid here. */
1834 if (dtp->u.p.current_unit->flags.convert == CONVERT_NATIVE)
1835 memcpy (p, &m, sizeof (gfc_offset));
1837 reverse_memcpy (p, &m, sizeof (gfc_offset));
1839 if (sfree (dtp->u.p.current_unit->s) == FAILURE)
1842 /* Seek past the end of the current record. */
1844 if (sseek (dtp->u.p.current_unit->s, c + sizeof (gfc_offset)) == FAILURE)
1849 case FORMATTED_SEQUENTIAL:
1851 if (dtp->u.p.current_unit->bytes_left == 0)
1854 if (is_internal_unit (dtp))
1856 if (is_array_io (dtp))
1858 length = (int) dtp->u.p.current_unit->bytes_left;
1860 /* If the farthest position reached is greater than current
1861 position, adjust the position and set length to pad out
1862 whats left. Otherwise just pad whats left.
1863 (for character array unit) */
1864 m = dtp->u.p.current_unit->recl
1865 - dtp->u.p.current_unit->bytes_left;
1868 length = (int) (max_pos - m);
1869 p = salloc_w (dtp->u.p.current_unit->s, &length);
1870 length = (int) (dtp->u.p.current_unit->recl - max_pos);
1873 p = salloc_w (dtp->u.p.current_unit->s, &length);
1876 generate_error (&dtp->common, ERROR_END, NULL);
1879 memset(p, ' ', length);
1881 /* Now that the current record has been padded out,
1882 determine where the next record in the array is. */
1883 record = next_array_record (dtp, dtp->u.p.current_unit->ls);
1885 /* Now seek to this record */
1886 record = record * dtp->u.p.current_unit->recl;
1888 if (sseek (dtp->u.p.current_unit->s, record) == FAILURE)
1890 generate_error (&dtp->common, ERROR_INTERNAL_UNIT, NULL);
1894 dtp->u.p.current_unit->bytes_left = dtp->u.p.current_unit->recl;
1900 /* If this is the last call to next_record move to the farthest
1901 position reached and set length to pad out the remainder
1902 of the record. (for character scaler unit) */
1905 m = dtp->u.p.current_unit->recl
1906 - dtp->u.p.current_unit->bytes_left;
1909 length = (int) (max_pos - m);
1910 p = salloc_w (dtp->u.p.current_unit->s, &length);
1911 length = (int) (dtp->u.p.current_unit->recl - max_pos);
1914 length = (int) dtp->u.p.current_unit->bytes_left;
1916 p = salloc_w (dtp->u.p.current_unit->s, &length);
1919 generate_error (&dtp->common, ERROR_END, NULL);
1922 memset (p, ' ', length);
1927 /* If this is the last call to next_record move to the farthest
1928 position reached in preparation for completing the record.
1932 m = dtp->u.p.current_unit->recl -
1933 dtp->u.p.current_unit->bytes_left;
1936 length = (int) (max_pos - m);
1937 p = salloc_w (dtp->u.p.current_unit->s, &length);
1945 p = salloc_w (dtp->u.p.current_unit->s, &length);
1947 { /* No new line for internal writes. */
1962 generate_error (&dtp->common, ERROR_OS, NULL);
1967 /* Position to the next record, which means moving to the end of the
1968 current record. This can happen under several different
1969 conditions. If the done flag is not set, we get ready to process
1973 next_record (st_parameter_dt *dtp, int done)
1975 gfc_offset fp; /* File position. */
1977 dtp->u.p.current_unit->read_bad = 0;
1979 if (dtp->u.p.mode == READING)
1980 next_record_r (dtp);
1982 next_record_w (dtp, done);
1984 /* keep position up to date for INQUIRE */
1985 dtp->u.p.current_unit->flags.position = POSITION_ASIS;
1987 dtp->u.p.current_unit->current_record = 0;
1988 if (dtp->u.p.current_unit->flags.access == ACCESS_DIRECT)
1990 fp = file_position (dtp->u.p.current_unit->s);
1991 /* Calculate next record, rounding up partial records. */
1992 dtp->u.p.current_unit->last_record = (fp + dtp->u.p.current_unit->recl - 1)
1993 / dtp->u.p.current_unit->recl;
1996 dtp->u.p.current_unit->last_record++;
2003 /* Finalize the current data transfer. For a nonadvancing transfer,
2004 this means advancing to the next record. For internal units close the
2005 stream associated with the unit. */
2008 finalize_transfer (st_parameter_dt *dtp)
2011 GFC_INTEGER_4 cf = dtp->common.flags;
2013 if (dtp->u.p.eor_condition)
2015 generate_error (&dtp->common, ERROR_EOR, NULL);
2019 if ((dtp->common.flags & IOPARM_LIBRETURN_MASK) != IOPARM_LIBRETURN_OK)
2022 if ((dtp->u.p.ionml != NULL)
2023 && (cf & IOPARM_DT_HAS_NAMELIST_NAME) != 0)
2025 if ((cf & IOPARM_DT_NAMELIST_READ_MODE) != 0)
2026 namelist_read (dtp);
2028 namelist_write (dtp);
2031 dtp->u.p.transfer = NULL;
2032 if (dtp->u.p.current_unit == NULL)
2035 dtp->u.p.eof_jump = &eof_jump;
2036 if (setjmp (eof_jump))
2038 generate_error (&dtp->common, ERROR_END, NULL);
2042 if ((cf & IOPARM_DT_LIST_FORMAT) != 0 && dtp->u.p.mode == READING)
2043 finish_list_read (dtp);
2046 dtp->u.p.current_unit->current_record = 0;
2047 if (dtp->u.p.advance_status == ADVANCE_NO || dtp->u.p.seen_dollar)
2049 /* Most systems buffer lines, so force the partial record
2050 to be written out. */
2051 flush (dtp->u.p.current_unit->s);
2052 dtp->u.p.seen_dollar = 0;
2056 next_record (dtp, 1);
2059 sfree (dtp->u.p.current_unit->s);
2061 if (is_internal_unit (dtp))
2063 if (is_array_io (dtp) && dtp->u.p.current_unit->ls != NULL)
2064 free_mem (dtp->u.p.current_unit->ls);
2065 sclose (dtp->u.p.current_unit->s);
2070 /* Transfer function for IOLENGTH. It doesn't actually do any
2071 data transfer, it just updates the length counter. */
2074 iolength_transfer (st_parameter_dt *dtp, bt type __attribute__((unused)),
2075 void *dest __attribute__ ((unused)),
2076 int kind __attribute__((unused)),
2077 size_t size, size_t nelems)
2079 if ((dtp->common.flags & IOPARM_DT_HAS_IOLENGTH) != 0)
2080 *dtp->iolength += (GFC_INTEGER_4) size * nelems;
2084 /* Initialize the IOLENGTH data transfer. This function is in essence
2085 a very much simplified version of data_transfer_init(), because it
2086 doesn't have to deal with units at all. */
2089 iolength_transfer_init (st_parameter_dt *dtp)
2091 if ((dtp->common.flags & IOPARM_DT_HAS_IOLENGTH) != 0)
2094 memset (&dtp->u.p, 0, sizeof (dtp->u.p));
2096 /* Set up the subroutine that will handle the transfers. */
2098 dtp->u.p.transfer = iolength_transfer;
2102 /* Library entry point for the IOLENGTH form of the INQUIRE
2103 statement. The IOLENGTH form requires no I/O to be performed, but
2104 it must still be a runtime library call so that we can determine
2105 the iolength for dynamic arrays and such. */
2107 extern void st_iolength (st_parameter_dt *);
2108 export_proto(st_iolength);
2111 st_iolength (st_parameter_dt *dtp)
2113 library_start (&dtp->common);
2114 iolength_transfer_init (dtp);
2117 extern void st_iolength_done (st_parameter_dt *);
2118 export_proto(st_iolength_done);
2121 st_iolength_done (st_parameter_dt *dtp __attribute__((unused)))
2124 if (dtp->u.p.scratch != NULL)
2125 free_mem (dtp->u.p.scratch);
2130 /* The READ statement. */
2132 extern void st_read (st_parameter_dt *);
2133 export_proto(st_read);
2136 st_read (st_parameter_dt *dtp)
2139 library_start (&dtp->common);
2141 data_transfer_init (dtp, 1);
2143 /* Handle complications dealing with the endfile record. It is
2144 significant that this is the only place where ERROR_END is
2145 generated. Reading an end of file elsewhere is either end of
2146 record or an I/O error. */
2148 if (dtp->u.p.current_unit->flags.access == ACCESS_SEQUENTIAL)
2149 switch (dtp->u.p.current_unit->endfile)
2155 if (!is_internal_unit (dtp))
2157 generate_error (&dtp->common, ERROR_END, NULL);
2158 dtp->u.p.current_unit->endfile = AFTER_ENDFILE;
2159 dtp->u.p.current_unit->current_record = 0;
2164 generate_error (&dtp->common, ERROR_ENDFILE, NULL);
2165 dtp->u.p.current_unit->current_record = 0;
2170 extern void st_read_done (st_parameter_dt *);
2171 export_proto(st_read_done);
2174 st_read_done (st_parameter_dt *dtp)
2176 finalize_transfer (dtp);
2177 free_format_data (dtp);
2179 if (dtp->u.p.scratch != NULL)
2180 free_mem (dtp->u.p.scratch);
2181 if (dtp->u.p.current_unit != NULL)
2182 unlock_unit (dtp->u.p.current_unit);
2186 extern void st_write (st_parameter_dt *);
2187 export_proto(st_write);
2190 st_write (st_parameter_dt *dtp)
2192 library_start (&dtp->common);
2193 data_transfer_init (dtp, 0);
2196 extern void st_write_done (st_parameter_dt *);
2197 export_proto(st_write_done);
2200 st_write_done (st_parameter_dt *dtp)
2202 finalize_transfer (dtp);
2204 /* Deal with endfile conditions associated with sequential files. */
2206 if (dtp->u.p.current_unit != NULL && dtp->u.p.current_unit->flags.access == ACCESS_SEQUENTIAL)
2207 switch (dtp->u.p.current_unit->endfile)
2209 case AT_ENDFILE: /* Remain at the endfile record. */
2213 dtp->u.p.current_unit->endfile = AT_ENDFILE; /* Just at it now. */
2217 if (dtp->u.p.current_unit->current_record > dtp->u.p.current_unit->last_record)
2219 /* Get rid of whatever is after this record. */
2220 if (struncate (dtp->u.p.current_unit->s) == FAILURE)
2221 generate_error (&dtp->common, ERROR_OS, NULL);
2224 dtp->u.p.current_unit->endfile = AT_ENDFILE;
2228 free_format_data (dtp);
2230 if (dtp->u.p.scratch != NULL)
2231 free_mem (dtp->u.p.scratch);
2232 if (dtp->u.p.current_unit != NULL)
2233 unlock_unit (dtp->u.p.current_unit);
2237 /* Receives the scalar information for namelist objects and stores it
2238 in a linked list of namelist_info types. */
2240 extern void st_set_nml_var (st_parameter_dt *dtp, void *, char *,
2241 GFC_INTEGER_4, gfc_charlen_type, GFC_INTEGER_4);
2242 export_proto(st_set_nml_var);
2246 st_set_nml_var (st_parameter_dt *dtp, void * var_addr, char * var_name,
2247 GFC_INTEGER_4 len, gfc_charlen_type string_length,
2248 GFC_INTEGER_4 dtype)
2250 namelist_info *t1 = NULL;
2253 nml = (namelist_info*) get_mem (sizeof (namelist_info));
2255 nml->mem_pos = var_addr;
2257 nml->var_name = (char*) get_mem (strlen (var_name) + 1);
2258 strcpy (nml->var_name, var_name);
2260 nml->len = (int) len;
2261 nml->string_length = (index_type) string_length;
2263 nml->var_rank = (int) (dtype & GFC_DTYPE_RANK_MASK);
2264 nml->size = (index_type) (dtype >> GFC_DTYPE_SIZE_SHIFT);
2265 nml->type = (bt) ((dtype & GFC_DTYPE_TYPE_MASK) >> GFC_DTYPE_TYPE_SHIFT);
2267 if (nml->var_rank > 0)
2269 nml->dim = (descriptor_dimension*)
2270 get_mem (nml->var_rank * sizeof (descriptor_dimension));
2271 nml->ls = (array_loop_spec*)
2272 get_mem (nml->var_rank * sizeof (array_loop_spec));
2282 if ((dtp->common.flags & IOPARM_DT_IONML_SET) == 0)
2284 dtp->common.flags |= IOPARM_DT_IONML_SET;
2285 dtp->u.p.ionml = nml;
2289 for (t1 = dtp->u.p.ionml; t1->next; t1 = t1->next);
2294 /* Store the dimensional information for the namelist object. */
2295 extern void st_set_nml_var_dim (st_parameter_dt *, GFC_INTEGER_4,
2296 GFC_INTEGER_4, GFC_INTEGER_4,
2298 export_proto(st_set_nml_var_dim);
2301 st_set_nml_var_dim (st_parameter_dt *dtp, GFC_INTEGER_4 n_dim,
2302 GFC_INTEGER_4 stride, GFC_INTEGER_4 lbound,
2303 GFC_INTEGER_4 ubound)
2305 namelist_info * nml;
2310 for (nml = dtp->u.p.ionml; nml->next; nml = nml->next);
2312 nml->dim[n].stride = (ssize_t)stride;
2313 nml->dim[n].lbound = (ssize_t)lbound;
2314 nml->dim[n].ubound = (ssize_t)ubound;
2317 /* Reverse memcpy - used for byte swapping. */
2319 void reverse_memcpy (void *dest, const void *src, size_t n)
2325 s = (char *) src + n - 1;
2327 /* Write with ascending order - this is likely faster
2328 on modern architectures because of write combining. */