1 /* Copyright (C) 2002, 2003, 2004, 2005 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, 59 Temple Place - Suite 330,
29 Boston, MA 02111-1307, 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 (void *, int);
67 export_proto(transfer_integer);
69 extern void transfer_real (void *, int);
70 export_proto(transfer_real);
72 extern void transfer_logical (void *, int);
73 export_proto(transfer_logical);
75 extern void transfer_character (void *, int);
76 export_proto(transfer_character);
78 extern void transfer_complex (void *, int);
79 export_proto(transfer_complex);
81 gfc_unit *current_unit = NULL;
82 static int sf_seen_eor = 0;
83 static int eor_condition = 0;
85 char scratch[SCRATCH_SIZE];
86 static char *line_buffer = NULL;
88 static unit_advance advance_status;
90 static st_option advance_opt[] = {
97 static void (*transfer) (bt, void *, int);
101 { FORMATTED_SEQUENTIAL, UNFORMATTED_SEQUENTIAL,
102 FORMATTED_DIRECT, UNFORMATTED_DIRECT
112 if (current_unit->flags.access == ACCESS_DIRECT)
114 m = current_unit->flags.form == FORM_FORMATTED ?
115 FORMATTED_DIRECT : UNFORMATTED_DIRECT;
119 m = current_unit->flags.form == FORM_FORMATTED ?
120 FORMATTED_SEQUENTIAL : UNFORMATTED_SEQUENTIAL;
127 /* Mid level data transfer statements. These subroutines do reading
128 and writing in the style of salloc_r()/salloc_w() within the
131 /* When reading sequential formatted records we have a problem. We
132 don't know how long the line is until we read the trailing newline,
133 and we don't want to read too much. If we read too much, we might
134 have to do a physical seek backwards depending on how much data is
135 present, and devices like terminals aren't seekable and would cause
138 Given this, the solution is to read a byte at a time, stopping if
139 we hit the newline. For small locations, we use a static buffer.
140 For larger allocations, we are forced to allocate memory on the
141 heap. Hopefully this won't happen very often. */
144 read_sf (int *length)
146 static char data[SCRATCH_SIZE];
150 if (*length > SCRATCH_SIZE)
151 p = base = line_buffer = get_mem (*length);
155 /* If we have seen an eor previously, return a length of 0. The
156 caller is responsible for correctly padding the input field. */
168 if (is_internal_unit())
170 /* readlen may be modified inside salloc_r if
171 is_internal_unit() is true. */
175 q = salloc_r (current_unit->s, &readlen);
179 /* If we have a line without a terminating \n, drop through to
181 if (readlen < 1 && n == 0)
183 generate_error (ERROR_END, NULL);
187 if (readlen < 1 || *q == '\n' || *q == '\r')
189 /* Unexpected end of line. */
191 /* If we see an EOR during non-advancing I/O, we need to skip
192 the rest of the I/O statement. Set the corresponding flag. */
193 if (advance_status == ADVANCE_NO || g.seen_dollar)
196 /* Without padding, terminate the I/O statement without assigning
197 the value. With padding, the value still needs to be assigned,
198 so we can just continue with a short read. */
199 if (current_unit->flags.pad == PAD_NO)
201 generate_error (ERROR_EOR, NULL);
205 current_unit->bytes_left = 0;
216 current_unit->bytes_left -= *length;
218 if (ioparm.size != NULL)
219 *ioparm.size += *length;
225 /* Function for reading the next couple of bytes from the current
226 file, advancing the current position. We return a pointer to a
227 buffer containing the bytes. We return NULL on end of record or
230 If the read is short, then it is because the current record does not
231 have enough data to satisfy the read request and the file was
232 opened with PAD=YES. The caller must assume tailing spaces for
236 read_block (int *length)
241 if (current_unit->flags.form == FORM_FORMATTED &&
242 current_unit->flags.access == ACCESS_SEQUENTIAL)
243 return read_sf (length); /* Special case. */
245 if (current_unit->bytes_left < *length)
247 if (current_unit->flags.pad == PAD_NO)
249 generate_error (ERROR_EOR, NULL); /* Not enough data left. */
253 *length = current_unit->bytes_left;
256 current_unit->bytes_left -= *length;
259 source = salloc_r (current_unit->s, &nread);
261 if (ioparm.size != NULL)
262 *ioparm.size += nread;
264 if (nread != *length)
265 { /* Short read, this shouldn't happen. */
266 if (current_unit->flags.pad == PAD_YES)
270 generate_error (ERROR_EOR, NULL);
279 /* Function for writing a block of bytes to the current file at the
280 current position, advancing the file pointer. We are given a length
281 and return a pointer to a buffer that the caller must (completely)
282 fill in. Returns NULL on error. */
285 write_block (int length)
289 if (!is_internal_unit() && current_unit->bytes_left < length)
291 generate_error (ERROR_EOR, NULL);
295 current_unit->bytes_left -= length;
296 dest = salloc_w (current_unit->s, &length);
298 if (ioparm.size != NULL)
299 *ioparm.size += length;
305 /* Master function for unformatted reads. */
308 unformatted_read (bt type, void *dest, int length)
313 /* Transfer functions get passed the kind of the entity, so we have
314 to fix this for COMPLEX data which are twice the size of their
316 if (type == BT_COMPLEX)
320 source = read_block (&w);
324 memcpy (dest, source, w);
326 memset (((char *) dest) + w, ' ', length - w);
330 /* Master function for unformatted writes. */
333 unformatted_write (bt type, void *source, int length)
337 /* Correction for kind vs. length as in unformatted_read. */
338 if (type == BT_COMPLEX)
341 dest = write_block (length);
343 memcpy (dest, source, length);
347 /* Return a pointer to the name of a type. */
372 internal_error ("type_name(): Bad type");
379 /* Write a constant string to the output.
380 This is complicated because the string can have doubled delimiters
381 in it. The length in the format node is the true length. */
384 write_constant_string (fnode * f)
386 char c, delimiter, *p, *q;
389 length = f->u.string.length;
393 p = write_block (length);
400 for (; length > 0; length--)
403 if (c == delimiter && c != 'H' && c != 'h')
404 q++; /* Skip the doubled delimiter. */
409 /* Given actual and expected types in a formatted data transfer, make
410 sure they agree. If not, an error message is generated. Returns
411 nonzero if something went wrong. */
414 require_type (bt expected, bt actual, fnode * f)
418 if (actual == expected)
421 st_sprintf (buffer, "Expected %s for item %d in formatted transfer, got %s",
422 type_name (expected), g.item_count, type_name (actual));
424 format_error (f, buffer);
429 /* This subroutine is the main loop for a formatted data transfer
430 statement. It would be natural to implement this as a coroutine
431 with the user program, but C makes that awkward. We loop,
432 processesing format elements. When we actually have to transfer
433 data instead of just setting flags, we return control to the user
434 program which calls a subroutine that supplies the address and type
435 of the next element, then comes back here to process it. */
438 formatted_transfer (bt type, void *p, int len)
443 int consume_data_flag;
445 /* Change a complex data item into a pair of reals. */
447 n = (p == NULL) ? 0 : ((type != BT_COMPLEX) ? 1 : 2);
448 if (type == BT_COMPLEX)
451 /* If there's an EOR condition, we simulate finalizing the transfer
458 /* If reversion has occurred and there is another real data item,
459 then we have to move to the next record. */
460 if (g.reversion_flag && n > 0)
462 g.reversion_flag = 0;
466 consume_data_flag = 1 ;
467 if (ioparm.library_return != LIBRARY_OK)
472 return; /* No data descriptors left (already raised). */
479 if (require_type (BT_INTEGER, type, f))
482 if (g.mode == READING)
483 read_decimal (f, p, len);
492 if (require_type (BT_INTEGER, type, f))
495 if (g.mode == READING)
496 read_radix (f, p, len, 2);
506 if (g.mode == READING)
507 read_radix (f, p, len, 8);
517 if (g.mode == READING)
518 read_radix (f, p, len, 16);
527 if (require_type (BT_CHARACTER, type, f))
530 if (g.mode == READING)
541 if (g.mode == READING)
551 if (require_type (BT_REAL, type, f))
554 if (g.mode == READING)
564 if (require_type (BT_REAL, type, f))
567 if (g.mode == READING)
576 if (require_type (BT_REAL, type, f))
579 if (g.mode == READING)
582 write_en (f, p, len);
589 if (require_type (BT_REAL, type, f))
592 if (g.mode == READING)
595 write_es (f, p, len);
602 if (require_type (BT_REAL, type, f))
605 if (g.mode == READING)
615 if (g.mode == READING)
619 read_decimal (f, p, len);
650 internal_error ("formatted_transfer(): Bad type");
656 consume_data_flag = 0 ;
657 if (g.mode == READING)
659 format_error (f, "Constant string in input format");
662 write_constant_string (f);
665 /* Format codes that don't transfer data. */
668 consume_data_flag = 0 ;
669 if (g.mode == READING)
678 if (f->format == FMT_TL)
679 pos = current_unit->recl - current_unit->bytes_left - f->u.n;
682 consume_data_flag = 0;
686 if (pos < 0 || pos >= current_unit->recl )
688 generate_error (ERROR_EOR, "T or TL edit position error");
691 m = pos - (current_unit->recl - current_unit->bytes_left);
699 if (g.mode == READING)
706 move_pos_offset (current_unit->s,m);
707 current_unit->bytes_left -= m;
713 consume_data_flag = 0 ;
714 g.sign_status = SIGN_S;
718 consume_data_flag = 0 ;
719 g.sign_status = SIGN_SS;
723 consume_data_flag = 0 ;
724 g.sign_status = SIGN_SP;
728 consume_data_flag = 0 ;
729 g.blank_status = BLANK_NULL;
733 consume_data_flag = 0 ;
734 g.blank_status = BLANK_ZERO;
738 consume_data_flag = 0 ;
739 g.scale_factor = f->u.k;
743 consume_data_flag = 0 ;
748 consume_data_flag = 0 ;
753 /* A colon descriptor causes us to exit this loop (in
754 particular preventing another / descriptor from being
755 processed) unless there is another data item to be
757 consume_data_flag = 0 ;
763 internal_error ("Bad format node");
766 /* Free a buffer that we had to allocate during a sequential
767 formatted read of a block that was larger than the static
770 if (line_buffer != NULL)
772 free_mem (line_buffer);
776 /* Adjust the item count and data pointer. */
778 if ((consume_data_flag > 0) && (n > 0))
781 p = ((char *) p) + len;
787 /* Come here when we need a data descriptor but don't have one. We
788 push the current format node back onto the input, then return and
789 let the user program call us back with the data. */
795 /* Data transfer entry points. The type of the data entity is
796 implicit in the subroutine call. This prevents us from having to
797 share a common enum with the compiler. */
800 transfer_integer (void *p, int kind)
803 if (ioparm.library_return != LIBRARY_OK)
805 transfer (BT_INTEGER, p, kind);
810 transfer_real (void *p, int kind)
813 if (ioparm.library_return != LIBRARY_OK)
815 transfer (BT_REAL, p, kind);
820 transfer_logical (void *p, int kind)
823 if (ioparm.library_return != LIBRARY_OK)
825 transfer (BT_LOGICAL, p, kind);
830 transfer_character (void *p, int len)
833 if (ioparm.library_return != LIBRARY_OK)
835 transfer (BT_CHARACTER, p, len);
840 transfer_complex (void *p, int kind)
843 if (ioparm.library_return != LIBRARY_OK)
845 transfer (BT_COMPLEX, p, kind);
849 /* Preposition a sequential unformatted file while reading. */
858 n = sizeof (gfc_offset);
859 p = salloc_r (current_unit->s, &n);
862 return; /* end of file */
864 if (p == NULL || n != sizeof (gfc_offset))
866 generate_error (ERROR_BAD_US, NULL);
870 memcpy (&i, p, sizeof (gfc_offset));
871 current_unit->bytes_left = i;
875 /* Preposition a sequential unformatted file while writing. This
876 amount to writing a bogus length that will be filled in later. */
884 length = sizeof (gfc_offset);
885 p = salloc_w (current_unit->s, &length);
889 generate_error (ERROR_OS, NULL);
893 memset (p, '\0', sizeof (gfc_offset)); /* Bogus value for now. */
894 if (sfree (current_unit->s) == FAILURE)
895 generate_error (ERROR_OS, NULL);
897 /* For sequential unformatted, we write until we have more bytes than
898 can fit in the record markers. If disk space runs out first, it will
899 error on the write. */
900 current_unit->recl = g.max_offset;
902 current_unit->bytes_left = current_unit->recl;
906 /* Position to the next record prior to transfer. We are assumed to
907 be before the next record. We also calculate the bytes in the next
913 if (current_unit->current_record)
914 return; /* Already positioned. */
916 switch (current_mode ())
918 case UNFORMATTED_SEQUENTIAL:
919 if (g.mode == READING)
926 case FORMATTED_SEQUENTIAL:
927 case FORMATTED_DIRECT:
928 case UNFORMATTED_DIRECT:
929 current_unit->bytes_left = current_unit->recl;
933 current_unit->current_record = 1;
937 /* Initialize things for a data transfer. This code is common for
938 both reading and writing. */
941 data_transfer_init (int read_flag)
943 unit_flags u_flags; /* Used for creating a unit if needed. */
945 g.mode = read_flag ? READING : WRITING;
947 if (ioparm.size != NULL)
948 *ioparm.size = 0; /* Initialize the count. */
950 current_unit = get_unit (read_flag);
951 if (current_unit == NULL)
952 { /* Open the unit with some default flags. */
955 generate_error (ERROR_BAD_OPTION, "Bad unit number in OPEN statement");
959 memset (&u_flags, '\0', sizeof (u_flags));
960 u_flags.access = ACCESS_SEQUENTIAL;
961 u_flags.action = ACTION_READWRITE;
962 /* Is it unformatted? */
963 if (ioparm.format == NULL && !ioparm.list_format)
964 u_flags.form = FORM_UNFORMATTED;
966 u_flags.form = FORM_UNSPECIFIED;
967 u_flags.delim = DELIM_UNSPECIFIED;
968 u_flags.blank = BLANK_UNSPECIFIED;
969 u_flags.pad = PAD_UNSPECIFIED;
970 u_flags.status = STATUS_UNKNOWN;
972 current_unit = get_unit (read_flag);
975 if (current_unit == NULL)
978 if (is_internal_unit())
980 current_unit->recl = file_length(current_unit->s);
982 empty_internal_buffer (current_unit->s);
985 /* Check the action. */
987 if (read_flag && current_unit->flags.action == ACTION_WRITE)
988 generate_error (ERROR_BAD_ACTION,
989 "Cannot read from file opened for WRITE");
991 if (!read_flag && current_unit->flags.action == ACTION_READ)
992 generate_error (ERROR_BAD_ACTION, "Cannot write to file opened for READ");
994 if (ioparm.library_return != LIBRARY_OK)
997 /* Check the format. */
1002 if (ioparm.library_return != LIBRARY_OK)
1005 if (current_unit->flags.form == FORM_UNFORMATTED
1006 && (ioparm.format != NULL || ioparm.list_format))
1007 generate_error (ERROR_OPTION_CONFLICT,
1008 "Format present for UNFORMATTED data transfer");
1010 if (ioparm.namelist_name != NULL && ionml != NULL)
1012 if(ioparm.format != NULL)
1013 generate_error (ERROR_OPTION_CONFLICT,
1014 "A format cannot be specified with a namelist");
1016 else if (current_unit->flags.form == FORM_FORMATTED &&
1017 ioparm.format == NULL && !ioparm.list_format)
1018 generate_error (ERROR_OPTION_CONFLICT,
1019 "Missing format for FORMATTED data transfer");
1022 if (is_internal_unit () && current_unit->flags.form == FORM_UNFORMATTED)
1023 generate_error (ERROR_OPTION_CONFLICT,
1024 "Internal file cannot be accessed by UNFORMATTED data transfer");
1026 /* Check the record number. */
1028 if (current_unit->flags.access == ACCESS_DIRECT && ioparm.rec == 0)
1030 generate_error (ERROR_MISSING_OPTION,
1031 "Direct access data transfer requires record number");
1035 if (current_unit->flags.access == ACCESS_SEQUENTIAL && ioparm.rec != 0)
1037 generate_error (ERROR_OPTION_CONFLICT,
1038 "Record number not allowed for sequential access data transfer");
1042 /* Process the ADVANCE option. */
1044 advance_status = (ioparm.advance == NULL) ? ADVANCE_UNSPECIFIED :
1045 find_option (ioparm.advance, ioparm.advance_len, advance_opt,
1046 "Bad ADVANCE parameter in data transfer statement");
1048 if (advance_status != ADVANCE_UNSPECIFIED)
1050 if (current_unit->flags.access == ACCESS_DIRECT)
1051 generate_error (ERROR_OPTION_CONFLICT,
1052 "ADVANCE specification conflicts with sequential access");
1054 if (is_internal_unit ())
1055 generate_error (ERROR_OPTION_CONFLICT,
1056 "ADVANCE specification conflicts with internal file");
1058 if (ioparm.format == NULL || ioparm.list_format)
1059 generate_error (ERROR_OPTION_CONFLICT,
1060 "ADVANCE specification requires an explicit format");
1065 if (ioparm.eor != 0 && advance_status != ADVANCE_NO)
1066 generate_error (ERROR_MISSING_OPTION,
1067 "EOR specification requires an ADVANCE specification of NO");
1069 if (ioparm.size != NULL && advance_status != ADVANCE_NO)
1070 generate_error (ERROR_MISSING_OPTION,
1071 "SIZE specification requires an ADVANCE specification of NO");
1075 { /* Write constraints. */
1076 if (ioparm.end != 0)
1077 generate_error (ERROR_OPTION_CONFLICT,
1078 "END specification cannot appear in a write statement");
1080 if (ioparm.eor != 0)
1081 generate_error (ERROR_OPTION_CONFLICT,
1082 "EOR specification cannot appear in a write statement");
1084 if (ioparm.size != 0)
1085 generate_error (ERROR_OPTION_CONFLICT,
1086 "SIZE specification cannot appear in a write statement");
1089 if (advance_status == ADVANCE_UNSPECIFIED)
1090 advance_status = ADVANCE_YES;
1091 if (ioparm.library_return != LIBRARY_OK)
1094 /* Sanity checks on the record number. */
1098 if (ioparm.rec <= 0)
1100 generate_error (ERROR_BAD_OPTION, "Record number must be positive");
1104 if (ioparm.rec >= current_unit->maxrec)
1106 generate_error (ERROR_BAD_OPTION, "Record number too large");
1110 /* Check to see if we might be reading what we wrote before */
1112 if (g.mode == READING && current_unit->mode == WRITING)
1113 flush(current_unit->s);
1115 /* Position the file. */
1116 if (sseek (current_unit->s,
1117 (ioparm.rec - 1) * current_unit->recl) == FAILURE)
1118 generate_error (ERROR_OS, NULL);
1121 /* Overwriting an existing sequential file ?
1122 it is always safe to truncate the file on the first write */
1123 if (g.mode == WRITING
1124 && current_unit->flags.access == ACCESS_SEQUENTIAL
1125 && current_unit->current_record == 0)
1126 struncate(current_unit->s);
1128 current_unit->mode = g.mode;
1130 /* Set the initial value of flags. */
1132 g.blank_status = current_unit->flags.blank;
1133 g.sign_status = SIGN_S;
1143 /* Set up the subroutine that will handle the transfers. */
1147 if (current_unit->flags.form == FORM_UNFORMATTED)
1148 transfer = unformatted_read;
1151 if (ioparm.list_format)
1153 transfer = list_formatted_read;
1157 transfer = formatted_transfer;
1162 if (current_unit->flags.form == FORM_UNFORMATTED)
1163 transfer = unformatted_write;
1166 if (ioparm.list_format)
1167 transfer = list_formatted_write;
1169 transfer = formatted_transfer;
1173 /* Make sure that we don't do a read after a nonadvancing write. */
1177 if (current_unit->read_bad)
1179 generate_error (ERROR_BAD_OPTION,
1180 "Cannot READ after a nonadvancing WRITE");
1186 if (advance_status == ADVANCE_YES && !g.seen_dollar)
1187 current_unit->read_bad = 1;
1190 /* Start the data transfer if we are doing a formatted transfer. */
1191 if (current_unit->flags.form == FORM_FORMATTED && !ioparm.list_format
1192 && ioparm.namelist_name == NULL && ionml == NULL)
1193 formatted_transfer (0, NULL, 0);
1197 /* Space to the next record for read mode. If the file is not
1198 seekable, we read MAX_READ chunks until we get to the right
1201 #define MAX_READ 4096
1204 next_record_r (void)
1206 int rlength, length;
1210 switch (current_mode ())
1212 case UNFORMATTED_SEQUENTIAL:
1213 current_unit->bytes_left += sizeof (gfc_offset); /* Skip over tail */
1215 /* Fall through... */
1217 case FORMATTED_DIRECT:
1218 case UNFORMATTED_DIRECT:
1219 if (current_unit->bytes_left == 0)
1222 if (is_seekable (current_unit->s))
1224 new = file_position (current_unit->s) + current_unit->bytes_left;
1226 /* Direct access files do not generate END conditions,
1228 if (sseek (current_unit->s, new) == FAILURE)
1229 generate_error (ERROR_OS, NULL);
1233 { /* Seek by reading data. */
1234 while (current_unit->bytes_left > 0)
1236 rlength = length = (MAX_READ > current_unit->bytes_left) ?
1237 MAX_READ : current_unit->bytes_left;
1239 p = salloc_r (current_unit->s, &rlength);
1242 generate_error (ERROR_OS, NULL);
1246 current_unit->bytes_left -= length;
1251 case FORMATTED_SEQUENTIAL:
1253 /* sf_read has already terminated input because of an '\n' */
1262 p = salloc_r (current_unit->s, &length);
1264 /* In case of internal file, there may not be any '\n'. */
1265 if (is_internal_unit() && p == NULL)
1272 generate_error (ERROR_OS, NULL);
1278 current_unit->endfile = AT_ENDFILE;
1287 if (current_unit->flags.access == ACCESS_SEQUENTIAL)
1288 test_endfile (current_unit);
1292 /* Position to the next record in write mode. */
1295 next_record_w (void)
1301 switch (current_mode ())
1303 case FORMATTED_DIRECT:
1304 if (current_unit->bytes_left == 0)
1307 length = current_unit->bytes_left;
1308 p = salloc_w (current_unit->s, &length);
1313 memset (p, ' ', current_unit->bytes_left);
1314 if (sfree (current_unit->s) == FAILURE)
1318 case UNFORMATTED_DIRECT:
1319 if (sfree (current_unit->s) == FAILURE)
1323 case UNFORMATTED_SEQUENTIAL:
1324 m = current_unit->recl - current_unit->bytes_left; /* Bytes written. */
1325 c = file_position (current_unit->s);
1327 length = sizeof (gfc_offset);
1329 /* Write the length tail. */
1331 p = salloc_w (current_unit->s, &length);
1335 memcpy (p, &m, sizeof (gfc_offset));
1336 if (sfree (current_unit->s) == FAILURE)
1339 /* Seek to the head and overwrite the bogus length with the real
1342 p = salloc_w_at (current_unit->s, &length, c - m - length);
1344 generate_error (ERROR_OS, NULL);
1346 memcpy (p, &m, sizeof (gfc_offset));
1347 if (sfree (current_unit->s) == FAILURE)
1350 /* Seek past the end of the current record. */
1352 if (sseek (current_unit->s, c + sizeof (gfc_offset)) == FAILURE)
1357 case FORMATTED_SEQUENTIAL:
1359 p = salloc_w (current_unit->s, &length);
1361 if (!is_internal_unit())
1364 *p = '\n'; /* No CR for internal writes. */
1369 if (sfree (current_unit->s) == FAILURE)
1375 generate_error (ERROR_OS, NULL);
1381 /* Position to the next record, which means moving to the end of the
1382 current record. This can happen under several different
1383 conditions. If the done flag is not set, we get ready to process
1387 next_record (int done)
1389 gfc_offset fp; /* File position. */
1391 current_unit->read_bad = 0;
1393 if (g.mode == READING)
1398 /* keep position up to date for INQUIRE */
1399 current_unit->flags.position = POSITION_ASIS;
1401 current_unit->current_record = 0;
1402 if (current_unit->flags.access == ACCESS_DIRECT)
1404 fp = file_position (current_unit->s);
1405 /* Calculate next record, rounding up partial records. */
1406 current_unit->last_record = (fp + current_unit->recl - 1)
1407 / current_unit->recl;
1410 current_unit->last_record++;
1417 /* Finalize the current data transfer. For a nonadvancing transfer,
1418 this means advancing to the next record. For internal units close the
1419 steam associated with the unit. */
1422 finalize_transfer (void)
1427 generate_error (ERROR_EOR, NULL);
1431 if (ioparm.library_return != LIBRARY_OK)
1434 if ((ionml != NULL) && (ioparm.namelist_name != NULL))
1436 if (ioparm.namelist_read_mode)
1443 if (current_unit == NULL)
1446 if (setjmp (g.eof_jump))
1448 generate_error (ERROR_END, NULL);
1452 if (ioparm.list_format && g.mode == READING)
1453 finish_list_read ();
1458 if (advance_status == ADVANCE_NO || g.seen_dollar)
1460 /* Most systems buffer lines, so force the partial record
1461 to be written out. */
1462 flush (current_unit->s);
1468 current_unit->current_record = 0;
1471 sfree (current_unit->s);
1473 if (is_internal_unit ())
1474 sclose (current_unit->s);
1478 /* Transfer function for IOLENGTH. It doesn't actually do any
1479 data transfer, it just updates the length counter. */
1482 iolength_transfer (bt type __attribute__ ((unused)),
1483 void *dest __attribute__ ((unused)),
1486 if (ioparm.iolength != NULL)
1487 *ioparm.iolength += len;
1491 /* Initialize the IOLENGTH data transfer. This function is in essence
1492 a very much simplified version of data_transfer_init(), because it
1493 doesn't have to deal with units at all. */
1496 iolength_transfer_init (void)
1498 if (ioparm.iolength != NULL)
1499 *ioparm.iolength = 0;
1503 /* Set up the subroutine that will handle the transfers. */
1505 transfer = iolength_transfer;
1509 /* Library entry point for the IOLENGTH form of the INQUIRE
1510 statement. The IOLENGTH form requires no I/O to be performed, but
1511 it must still be a runtime library call so that we can determine
1512 the iolength for dynamic arrays and such. */
1514 extern void st_iolength (void);
1515 export_proto(st_iolength);
1521 iolength_transfer_init ();
1524 extern void st_iolength_done (void);
1525 export_proto(st_iolength_done);
1528 st_iolength_done (void)
1534 /* The READ statement. */
1536 extern void st_read (void);
1537 export_proto(st_read);
1544 data_transfer_init (1);
1546 /* Handle complications dealing with the endfile record. It is
1547 significant that this is the only place where ERROR_END is
1548 generated. Reading an end of file elsewhere is either end of
1549 record or an I/O error. */
1551 if (current_unit->flags.access == ACCESS_SEQUENTIAL)
1552 switch (current_unit->endfile)
1558 if (!is_internal_unit())
1560 generate_error (ERROR_END, NULL);
1561 current_unit->endfile = AFTER_ENDFILE;
1566 generate_error (ERROR_ENDFILE, NULL);
1571 extern void st_read_done (void);
1572 export_proto(st_read_done);
1577 finalize_transfer ();
1581 extern void st_write (void);
1582 export_proto(st_write);
1588 data_transfer_init (0);
1591 extern void st_write_done (void);
1592 export_proto(st_write_done);
1595 st_write_done (void)
1597 finalize_transfer ();
1599 /* Deal with endfile conditions associated with sequential files. */
1601 if (current_unit != NULL && current_unit->flags.access == ACCESS_SEQUENTIAL)
1602 switch (current_unit->endfile)
1604 case AT_ENDFILE: /* Remain at the endfile record. */
1608 current_unit->endfile = AT_ENDFILE; /* Just at it now. */
1612 if (current_unit->current_record > current_unit->last_record)
1614 /* Get rid of whatever is after this record. */
1615 if (struncate (current_unit->s) == FAILURE)
1616 generate_error (ERROR_OS, NULL);
1619 current_unit->endfile = AT_ENDFILE;
1626 /* Receives the scalar information for namelist objects and stores it
1627 in a linked list of namelist_info types. */
1629 extern void st_set_nml_var (void * ,char * ,
1630 GFC_INTEGER_4 ,gfc_charlen_type ,GFC_INTEGER_4);
1631 export_proto(st_set_nml_var);
1635 st_set_nml_var (void * var_addr, char * var_name, GFC_INTEGER_4 len,
1636 gfc_charlen_type string_length, GFC_INTEGER_4 dtype)
1638 namelist_info *t1 = NULL;
1641 nml = (namelist_info*) get_mem (sizeof (namelist_info));
1643 nml->mem_pos = var_addr;
1645 nml->var_name = (char*) get_mem (strlen (var_name) + 1);
1646 strcpy (nml->var_name, var_name);
1648 nml->len = (int) len;
1649 nml->string_length = (index_type) string_length;
1651 nml->var_rank = (int) (dtype & GFC_DTYPE_RANK_MASK);
1652 nml->size = (index_type) (dtype >> GFC_DTYPE_SIZE_SHIFT);
1653 nml->type = (bt) ((dtype & GFC_DTYPE_TYPE_MASK) >> GFC_DTYPE_TYPE_SHIFT);
1655 if (nml->var_rank > 0)
1657 nml->dim = (descriptor_dimension*)
1658 get_mem (nml->var_rank * sizeof (descriptor_dimension));
1659 nml->ls = (nml_loop_spec*)
1660 get_mem (nml->var_rank * sizeof (nml_loop_spec));
1674 for (t1 = ionml; t1->next; t1 = t1->next);
1680 /* Store the dimensional information for the namelist object. */
1681 extern void st_set_nml_var_dim (GFC_INTEGER_4, GFC_INTEGER_4,
1682 GFC_INTEGER_4 ,GFC_INTEGER_4);
1683 export_proto(st_set_nml_var_dim);
1686 st_set_nml_var_dim (GFC_INTEGER_4 n_dim, GFC_INTEGER_4 stride,
1687 GFC_INTEGER_4 lbound, GFC_INTEGER_4 ubound)
1689 namelist_info * nml;
1694 for (nml = ionml; nml->next; nml = nml->next);
1696 nml->dim[n].stride = (ssize_t)stride;
1697 nml->dim[n].lbound = (ssize_t)lbound;
1698 nml->dim[n].ubound = (ssize_t)ubound;