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. */
163 current_unit->bytes_left = options.default_recl;
169 if (is_internal_unit())
171 /* readlen may be modified inside salloc_r if
172 is_internal_unit() is true. */
176 q = salloc_r (current_unit->s, &readlen);
180 /* If we have a line without a terminating \n, drop through to
182 if (readlen < 1 && n == 0)
184 generate_error (ERROR_END, NULL);
188 if (readlen < 1 || *q == '\n' || *q == '\r')
190 /* Unexpected end of line. */
192 /* If we see an EOR during non-advancing I/O, we need to skip
193 the rest of the I/O statement. Set the corresponding flag. */
194 if (advance_status == ADVANCE_NO || g.seen_dollar)
197 /* Without padding, terminate the I/O statement without assigning
198 the value. With padding, the value still needs to be assigned,
199 so we can just continue with a short read. */
200 if (current_unit->flags.pad == PAD_NO)
202 generate_error (ERROR_EOR, NULL);
206 current_unit->bytes_left = 0;
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)
681 pos= current_unit->recl - current_unit->bytes_left - pos;
685 consume_data_flag = 0 ;
689 if (pos < 0 || pos >= current_unit->recl )
691 generate_error (ERROR_EOR, "T Or TL edit position error");
694 m = pos - (current_unit->recl - current_unit->bytes_left);
702 if (g.mode == READING)
709 move_pos_offset (current_unit->s,m);
715 consume_data_flag = 0 ;
716 g.sign_status = SIGN_S;
720 consume_data_flag = 0 ;
721 g.sign_status = SIGN_SS;
725 consume_data_flag = 0 ;
726 g.sign_status = SIGN_SP;
730 consume_data_flag = 0 ;
731 g.blank_status = BLANK_NULL;
735 consume_data_flag = 0 ;
736 g.blank_status = BLANK_ZERO;
740 consume_data_flag = 0 ;
741 g.scale_factor = f->u.k;
745 consume_data_flag = 0 ;
750 consume_data_flag = 0 ;
751 for (i = 0; i < f->repeat; i++)
757 /* A colon descriptor causes us to exit this loop (in
758 particular preventing another / descriptor from being
759 processed) unless there is another data item to be
761 consume_data_flag = 0 ;
767 internal_error ("Bad format node");
770 /* Free a buffer that we had to allocate during a sequential
771 formatted read of a block that was larger than the static
774 if (line_buffer != NULL)
776 free_mem (line_buffer);
780 /* Adjust the item count and data pointer. */
782 if ((consume_data_flag > 0) && (n > 0))
785 p = ((char *) p) + len;
791 /* Come here when we need a data descriptor but don't have one. We
792 push the current format node back onto the input, then return and
793 let the user program call us back with the data. */
799 /* Data transfer entry points. The type of the data entity is
800 implicit in the subroutine call. This prevents us from having to
801 share a common enum with the compiler. */
804 transfer_integer (void *p, int kind)
807 if (ioparm.library_return != LIBRARY_OK)
809 transfer (BT_INTEGER, p, kind);
814 transfer_real (void *p, int kind)
817 if (ioparm.library_return != LIBRARY_OK)
819 transfer (BT_REAL, p, kind);
824 transfer_logical (void *p, int kind)
827 if (ioparm.library_return != LIBRARY_OK)
829 transfer (BT_LOGICAL, p, kind);
834 transfer_character (void *p, int len)
837 if (ioparm.library_return != LIBRARY_OK)
839 transfer (BT_CHARACTER, p, len);
844 transfer_complex (void *p, int kind)
847 if (ioparm.library_return != LIBRARY_OK)
849 transfer (BT_COMPLEX, p, kind);
853 /* Preposition a sequential unformatted file while reading. */
862 n = sizeof (gfc_offset);
863 p = salloc_r (current_unit->s, &n);
866 return; /* end of file */
868 if (p == NULL || n != sizeof (gfc_offset))
870 generate_error (ERROR_BAD_US, NULL);
874 memcpy (&i, p, sizeof (gfc_offset));
875 current_unit->bytes_left = i;
879 /* Preposition a sequential unformatted file while writing. This
880 amount to writing a bogus length that will be filled in later. */
888 length = sizeof (gfc_offset);
889 p = salloc_w (current_unit->s, &length);
893 generate_error (ERROR_OS, NULL);
897 memset (p, '\0', sizeof (gfc_offset)); /* Bogus value for now. */
898 if (sfree (current_unit->s) == FAILURE)
899 generate_error (ERROR_OS, NULL);
901 /* For sequential unformatted, we write until we have more bytes than
902 can fit in the record markers. If disk space runs out first, it will
903 error on the write. */
904 current_unit->recl = g.max_offset;
906 current_unit->bytes_left = current_unit->recl;
910 /* Position to the next record prior to transfer. We are assumed to
911 be before the next record. We also calculate the bytes in the next
917 if (current_unit->current_record)
918 return; /* Already positioned. */
920 switch (current_mode ())
922 case UNFORMATTED_SEQUENTIAL:
923 if (g.mode == READING)
930 case FORMATTED_SEQUENTIAL:
931 case FORMATTED_DIRECT:
932 case UNFORMATTED_DIRECT:
933 current_unit->bytes_left = current_unit->recl;
937 current_unit->current_record = 1;
941 /* Initialize things for a data transfer. This code is common for
942 both reading and writing. */
945 data_transfer_init (int read_flag)
947 unit_flags u_flags; /* Used for creating a unit if needed. */
949 g.mode = read_flag ? READING : WRITING;
951 if (ioparm.size != NULL)
952 *ioparm.size = 0; /* Initialize the count. */
954 current_unit = get_unit (read_flag);
955 if (current_unit == NULL)
956 { /* Open the unit with some default flags. */
959 generate_error (ERROR_BAD_OPTION, "Bad unit number in OPEN statement");
963 memset (&u_flags, '\0', sizeof (u_flags));
964 u_flags.access = ACCESS_SEQUENTIAL;
965 u_flags.action = ACTION_READWRITE;
966 /* Is it unformatted? */
967 if (ioparm.format == NULL && !ioparm.list_format)
968 u_flags.form = FORM_UNFORMATTED;
970 u_flags.form = FORM_UNSPECIFIED;
971 u_flags.delim = DELIM_UNSPECIFIED;
972 u_flags.blank = BLANK_UNSPECIFIED;
973 u_flags.pad = PAD_UNSPECIFIED;
974 u_flags.status = STATUS_UNKNOWN;
976 current_unit = get_unit (read_flag);
979 if (current_unit == NULL)
982 if (is_internal_unit())
984 current_unit->recl = file_length(current_unit->s);
986 empty_internal_buffer (current_unit->s);
989 /* Check the action. */
991 if (read_flag && current_unit->flags.action == ACTION_WRITE)
992 generate_error (ERROR_BAD_ACTION,
993 "Cannot read from file opened for WRITE");
995 if (!read_flag && current_unit->flags.action == ACTION_READ)
996 generate_error (ERROR_BAD_ACTION, "Cannot write to file opened for READ");
998 if (ioparm.library_return != LIBRARY_OK)
1001 /* Check the format. */
1006 if (ioparm.library_return != LIBRARY_OK)
1009 if (current_unit->flags.form == FORM_UNFORMATTED
1010 && (ioparm.format != NULL || ioparm.list_format))
1011 generate_error (ERROR_OPTION_CONFLICT,
1012 "Format present for UNFORMATTED data transfer");
1014 if (ioparm.namelist_name != NULL && ionml != NULL)
1016 if(ioparm.format != NULL)
1017 generate_error (ERROR_OPTION_CONFLICT,
1018 "A format cannot be specified with a namelist");
1020 else if (current_unit->flags.form == FORM_FORMATTED &&
1021 ioparm.format == NULL && !ioparm.list_format)
1022 generate_error (ERROR_OPTION_CONFLICT,
1023 "Missing format for FORMATTED data transfer");
1026 if (is_internal_unit () && current_unit->flags.form == FORM_UNFORMATTED)
1027 generate_error (ERROR_OPTION_CONFLICT,
1028 "Internal file cannot be accessed by UNFORMATTED data transfer");
1030 /* Check the record number. */
1032 if (current_unit->flags.access == ACCESS_DIRECT && ioparm.rec == 0)
1034 generate_error (ERROR_MISSING_OPTION,
1035 "Direct access data transfer requires record number");
1039 if (current_unit->flags.access == ACCESS_SEQUENTIAL && ioparm.rec != 0)
1041 generate_error (ERROR_OPTION_CONFLICT,
1042 "Record number not allowed for sequential access data transfer");
1046 /* Process the ADVANCE option. */
1048 advance_status = (ioparm.advance == NULL) ? ADVANCE_UNSPECIFIED :
1049 find_option (ioparm.advance, ioparm.advance_len, advance_opt,
1050 "Bad ADVANCE parameter in data transfer statement");
1052 if (advance_status != ADVANCE_UNSPECIFIED)
1054 if (current_unit->flags.access == ACCESS_DIRECT)
1055 generate_error (ERROR_OPTION_CONFLICT,
1056 "ADVANCE specification conflicts with sequential access");
1058 if (is_internal_unit ())
1059 generate_error (ERROR_OPTION_CONFLICT,
1060 "ADVANCE specification conflicts with internal file");
1062 if (ioparm.format == NULL || ioparm.list_format)
1063 generate_error (ERROR_OPTION_CONFLICT,
1064 "ADVANCE specification requires an explicit format");
1069 if (ioparm.eor != 0 && advance_status != ADVANCE_NO)
1070 generate_error (ERROR_MISSING_OPTION,
1071 "EOR specification requires an ADVANCE specification of NO");
1073 if (ioparm.size != NULL && advance_status != ADVANCE_NO)
1074 generate_error (ERROR_MISSING_OPTION,
1075 "SIZE specification requires an ADVANCE specification of NO");
1079 { /* Write constraints. */
1080 if (ioparm.end != 0)
1081 generate_error (ERROR_OPTION_CONFLICT,
1082 "END specification cannot appear in a write statement");
1084 if (ioparm.eor != 0)
1085 generate_error (ERROR_OPTION_CONFLICT,
1086 "EOR specification cannot appear in a write statement");
1088 if (ioparm.size != 0)
1089 generate_error (ERROR_OPTION_CONFLICT,
1090 "SIZE specification cannot appear in a write statement");
1093 if (advance_status == ADVANCE_UNSPECIFIED)
1094 advance_status = ADVANCE_YES;
1095 if (ioparm.library_return != LIBRARY_OK)
1098 /* Sanity checks on the record number. */
1102 if (ioparm.rec <= 0)
1104 generate_error (ERROR_BAD_OPTION, "Record number must be positive");
1108 if (ioparm.rec >= current_unit->maxrec)
1110 generate_error (ERROR_BAD_OPTION, "Record number too large");
1114 /* Check to see if we might be reading what we wrote before */
1116 if (g.mode == READING && current_unit->mode == WRITING)
1117 flush(current_unit->s);
1119 /* Position the file. */
1120 if (sseek (current_unit->s,
1121 (ioparm.rec - 1) * current_unit->recl) == FAILURE)
1122 generate_error (ERROR_OS, NULL);
1125 /* Overwriting an existing sequential file ?
1126 it is always safe to truncate the file on the first write */
1127 if (g.mode == WRITING
1128 && current_unit->flags.access == ACCESS_SEQUENTIAL
1129 && current_unit->current_record == 0)
1130 struncate(current_unit->s);
1132 current_unit->mode = g.mode;
1134 /* Set the initial value of flags. */
1136 g.blank_status = current_unit->flags.blank;
1137 g.sign_status = SIGN_S;
1147 /* Set up the subroutine that will handle the transfers. */
1151 if (current_unit->flags.form == FORM_UNFORMATTED)
1152 transfer = unformatted_read;
1155 if (ioparm.list_format)
1157 transfer = list_formatted_read;
1161 transfer = formatted_transfer;
1166 if (current_unit->flags.form == FORM_UNFORMATTED)
1167 transfer = unformatted_write;
1170 if (ioparm.list_format)
1171 transfer = list_formatted_write;
1173 transfer = formatted_transfer;
1177 /* Make sure that we don't do a read after a nonadvancing write. */
1181 if (current_unit->read_bad)
1183 generate_error (ERROR_BAD_OPTION,
1184 "Cannot READ after a nonadvancing WRITE");
1190 if (advance_status == ADVANCE_YES && !g.seen_dollar)
1191 current_unit->read_bad = 1;
1194 /* Start the data transfer if we are doing a formatted transfer. */
1195 if (current_unit->flags.form == FORM_FORMATTED && !ioparm.list_format
1196 && ioparm.namelist_name == NULL && ionml == NULL)
1197 formatted_transfer (0, NULL, 0);
1201 /* Space to the next record for read mode. If the file is not
1202 seekable, we read MAX_READ chunks until we get to the right
1205 #define MAX_READ 4096
1208 next_record_r (void)
1210 int rlength, length;
1214 switch (current_mode ())
1216 case UNFORMATTED_SEQUENTIAL:
1217 current_unit->bytes_left += sizeof (gfc_offset); /* Skip over tail */
1219 /* Fall through... */
1221 case FORMATTED_DIRECT:
1222 case UNFORMATTED_DIRECT:
1223 if (current_unit->bytes_left == 0)
1226 if (is_seekable (current_unit->s))
1228 new = file_position (current_unit->s) + current_unit->bytes_left;
1230 /* Direct access files do not generate END conditions,
1232 if (sseek (current_unit->s, new) == FAILURE)
1233 generate_error (ERROR_OS, NULL);
1237 { /* Seek by reading data. */
1238 while (current_unit->bytes_left > 0)
1240 rlength = length = (MAX_READ > current_unit->bytes_left) ?
1241 MAX_READ : current_unit->bytes_left;
1243 p = salloc_r (current_unit->s, &rlength);
1246 generate_error (ERROR_OS, NULL);
1250 current_unit->bytes_left -= length;
1255 case FORMATTED_SEQUENTIAL:
1257 /* sf_read has already terminated input because of an '\n' */
1266 p = salloc_r (current_unit->s, &length);
1268 /* In case of internal file, there may not be any '\n'. */
1269 if (is_internal_unit() && p == NULL)
1276 generate_error (ERROR_OS, NULL);
1282 current_unit->endfile = AT_ENDFILE;
1291 if (current_unit->flags.access == ACCESS_SEQUENTIAL)
1292 test_endfile (current_unit);
1296 /* Position to the next record in write mode. */
1299 next_record_w (void)
1305 switch (current_mode ())
1307 case FORMATTED_DIRECT:
1308 if (current_unit->bytes_left == 0)
1311 length = current_unit->bytes_left;
1312 p = salloc_w (current_unit->s, &length);
1317 memset (p, ' ', current_unit->bytes_left);
1318 if (sfree (current_unit->s) == FAILURE)
1322 case UNFORMATTED_DIRECT:
1323 if (sfree (current_unit->s) == FAILURE)
1327 case UNFORMATTED_SEQUENTIAL:
1328 m = current_unit->recl - current_unit->bytes_left; /* Bytes written. */
1329 c = file_position (current_unit->s);
1331 length = sizeof (gfc_offset);
1333 /* Write the length tail. */
1335 p = salloc_w (current_unit->s, &length);
1339 memcpy (p, &m, sizeof (gfc_offset));
1340 if (sfree (current_unit->s) == FAILURE)
1343 /* Seek to the head and overwrite the bogus length with the real
1346 p = salloc_w_at (current_unit->s, &length, c - m - length);
1348 generate_error (ERROR_OS, NULL);
1350 memcpy (p, &m, sizeof (gfc_offset));
1351 if (sfree (current_unit->s) == FAILURE)
1354 /* Seek past the end of the current record. */
1356 if (sseek (current_unit->s, c + sizeof (gfc_offset)) == FAILURE)
1361 case FORMATTED_SEQUENTIAL:
1363 p = salloc_w (current_unit->s, &length);
1365 if (!is_internal_unit())
1368 *p = '\n'; /* No CR for internal writes. */
1373 if (sfree (current_unit->s) == FAILURE)
1379 generate_error (ERROR_OS, NULL);
1385 /* Position to the next record, which means moving to the end of the
1386 current record. This can happen under several different
1387 conditions. If the done flag is not set, we get ready to process
1391 next_record (int done)
1393 gfc_offset fp; /* File position. */
1395 current_unit->read_bad = 0;
1397 if (g.mode == READING)
1402 /* keep position up to date for INQUIRE */
1403 current_unit->flags.position = POSITION_ASIS;
1405 current_unit->current_record = 0;
1406 if (current_unit->flags.access == ACCESS_DIRECT)
1408 fp = file_position (current_unit->s);
1409 /* Calculate next record, rounding up partial records. */
1410 current_unit->last_record = (fp + current_unit->recl - 1)
1411 / current_unit->recl;
1414 current_unit->last_record++;
1421 /* Finalize the current data transfer. For a nonadvancing transfer,
1422 this means advancing to the next record. For internal units close the
1423 steam associated with the unit. */
1426 finalize_transfer (void)
1431 generate_error (ERROR_EOR, NULL);
1435 if (ioparm.library_return != LIBRARY_OK)
1438 if ((ionml != NULL) && (ioparm.namelist_name != NULL))
1440 if (ioparm.namelist_read_mode)
1447 if (current_unit == NULL)
1450 if (setjmp (g.eof_jump))
1452 generate_error (ERROR_END, NULL);
1456 if (ioparm.list_format && g.mode == READING)
1457 finish_list_read ();
1462 if (advance_status == ADVANCE_NO || g.seen_dollar)
1464 /* Most systems buffer lines, so force the partial record
1465 to be written out. */
1466 flush (current_unit->s);
1472 current_unit->current_record = 0;
1475 sfree (current_unit->s);
1477 if (is_internal_unit ())
1478 sclose (current_unit->s);
1482 /* Transfer function for IOLENGTH. It doesn't actually do any
1483 data transfer, it just updates the length counter. */
1486 iolength_transfer (bt type __attribute__ ((unused)),
1487 void *dest __attribute__ ((unused)),
1490 if (ioparm.iolength != NULL)
1491 *ioparm.iolength += len;
1495 /* Initialize the IOLENGTH data transfer. This function is in essence
1496 a very much simplified version of data_transfer_init(), because it
1497 doesn't have to deal with units at all. */
1500 iolength_transfer_init (void)
1502 if (ioparm.iolength != NULL)
1503 *ioparm.iolength = 0;
1507 /* Set up the subroutine that will handle the transfers. */
1509 transfer = iolength_transfer;
1513 /* Library entry point for the IOLENGTH form of the INQUIRE
1514 statement. The IOLENGTH form requires no I/O to be performed, but
1515 it must still be a runtime library call so that we can determine
1516 the iolength for dynamic arrays and such. */
1518 extern void st_iolength (void);
1519 export_proto(st_iolength);
1525 iolength_transfer_init ();
1528 extern void st_iolength_done (void);
1529 export_proto(st_iolength_done);
1532 st_iolength_done (void)
1538 /* The READ statement. */
1540 extern void st_read (void);
1541 export_proto(st_read);
1548 data_transfer_init (1);
1550 /* Handle complications dealing with the endfile record. It is
1551 significant that this is the only place where ERROR_END is
1552 generated. Reading an end of file elsewhere is either end of
1553 record or an I/O error. */
1555 if (current_unit->flags.access == ACCESS_SEQUENTIAL)
1556 switch (current_unit->endfile)
1562 if (!is_internal_unit())
1564 generate_error (ERROR_END, NULL);
1565 current_unit->endfile = AFTER_ENDFILE;
1570 generate_error (ERROR_ENDFILE, NULL);
1575 extern void st_read_done (void);
1576 export_proto(st_read_done);
1581 finalize_transfer ();
1585 extern void st_write (void);
1586 export_proto(st_write);
1592 data_transfer_init (0);
1595 extern void st_write_done (void);
1596 export_proto(st_write_done);
1599 st_write_done (void)
1601 finalize_transfer ();
1603 /* Deal with endfile conditions associated with sequential files. */
1605 if (current_unit != NULL && current_unit->flags.access == ACCESS_SEQUENTIAL)
1606 switch (current_unit->endfile)
1608 case AT_ENDFILE: /* Remain at the endfile record. */
1612 current_unit->endfile = AT_ENDFILE; /* Just at it now. */
1616 if (current_unit->current_record > current_unit->last_record)
1618 /* Get rid of whatever is after this record. */
1619 if (struncate (current_unit->s) == FAILURE)
1620 generate_error (ERROR_OS, NULL);
1623 current_unit->endfile = AT_ENDFILE;
1630 /* Receives the scalar information for namelist objects and stores it
1631 in a linked list of namelist_info types. */
1633 extern void st_set_nml_var (void * ,char * ,
1634 GFC_INTEGER_4 ,gfc_charlen_type ,GFC_INTEGER_4);
1635 export_proto(st_set_nml_var);
1639 st_set_nml_var (void * var_addr, char * var_name, GFC_INTEGER_4 len,
1640 gfc_charlen_type string_length, GFC_INTEGER_4 dtype)
1642 namelist_info *t1 = NULL;
1645 nml = (namelist_info*) get_mem (sizeof (namelist_info));
1647 nml->mem_pos = var_addr;
1649 nml->var_name = (char*) get_mem (strlen (var_name) + 1);
1650 strcpy (nml->var_name, var_name);
1652 nml->len = (int) len;
1653 nml->string_length = (index_type) string_length;
1655 nml->var_rank = (int) (dtype & GFC_DTYPE_RANK_MASK);
1656 nml->size = (index_type) (dtype >> GFC_DTYPE_SIZE_SHIFT);
1657 nml->type = (bt) ((dtype & GFC_DTYPE_TYPE_MASK) >> GFC_DTYPE_TYPE_SHIFT);
1659 if (nml->var_rank > 0)
1661 nml->dim = (descriptor_dimension*)
1662 get_mem (nml->var_rank * sizeof (descriptor_dimension));
1663 nml->ls = (nml_loop_spec*)
1664 get_mem (nml->var_rank * sizeof (nml_loop_spec));
1678 for (t1 = ionml; t1->next; t1 = t1->next);
1684 /* Store the dimensional information for the namelist object. */
1685 extern void st_set_nml_var_dim (GFC_INTEGER_4, GFC_INTEGER_4,
1686 GFC_INTEGER_4 ,GFC_INTEGER_4);
1687 export_proto(st_set_nml_var_dim);
1690 st_set_nml_var_dim (GFC_INTEGER_4 n_dim, GFC_INTEGER_4 stride,
1691 GFC_INTEGER_4 lbound, GFC_INTEGER_4 ubound)
1693 namelist_info * nml;
1698 for (nml = ionml; nml->next; nml = nml->next);
1700 nml->dim[n].stride = (ssize_t)stride;
1701 nml->dim[n].lbound = (ssize_t)lbound;
1702 nml->dim[n].ubound = (ssize_t)ubound;