1 /* Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
2 Contributed by Andy Vaught
4 This file is part of the GNU Fortran 95 runtime library (libgfortran).
6 Libgfortran is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
11 In addition to the permissions in the GNU General Public License, the
12 Free Software Foundation gives you unlimited permission to link the
13 compiled version of this file into combinations with other programs,
14 and to distribute those combinations without any restriction coming
15 from the use of this file. (The General Public License restrictions
16 do apply in other respects; for example, they cover modification of
17 the file, and distribution when not linked into a combine
20 Libgfortran is distributed in the hope that it will be useful,
21 but WITHOUT ANY WARRANTY; without even the implied warranty of
22 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 GNU General Public License for more details.
25 You should have received a copy of the GNU General Public License
26 along with Libgfortran; see the file COPYING. If not, write to
27 the Free Software Foundation, 59 Temple Place - Suite 330,
28 Boston, MA 02111-1307, USA. */
31 /* transfer.c -- Top level handling of data transfer statements. */
36 #include "libgfortran.h"
40 /* Calling conventions: Data transfer statements are unlike other
41 library calls in that they extend over several calls.
43 The first call is always a call to st_read() or st_write(). These
44 subroutines return no status unless a namelist read or write is
45 being done, in which case there is the usual status. No further
46 calls are necessary in this case.
48 For other sorts of data transfer, there are zero or more data
49 transfer statement that depend on the format of the data transfer
58 These subroutines do not return status.
60 The last call is a call to st_[read|write]_done(). While
61 something can easily go wrong with the initial st_read() or
62 st_write(), an error inhibits any data from actually being
65 extern void transfer_integer (void *, int);
66 export_proto(transfer_integer);
68 extern void transfer_real (void *, int);
69 export_proto(transfer_real);
71 extern void transfer_logical (void *, int);
72 export_proto(transfer_logical);
74 extern void transfer_character (void *, int);
75 export_proto(transfer_character);
77 extern void transfer_complex (void *, int);
78 export_proto(transfer_complex);
80 gfc_unit *current_unit = NULL;
81 static int sf_seen_eor = 0;
83 char scratch[SCRATCH_SIZE] = { };
84 static char *line_buffer = NULL;
86 static unit_advance advance_status;
88 static st_option advance_opt[] = {
95 static void (*transfer) (bt, void *, int);
99 { FORMATTED_SEQUENTIAL, UNFORMATTED_SEQUENTIAL,
100 FORMATTED_DIRECT, UNFORMATTED_DIRECT
110 if (current_unit->flags.access == ACCESS_DIRECT)
112 m = current_unit->flags.form == FORM_FORMATTED ?
113 FORMATTED_DIRECT : UNFORMATTED_DIRECT;
117 m = current_unit->flags.form == FORM_FORMATTED ?
118 FORMATTED_SEQUENTIAL : UNFORMATTED_SEQUENTIAL;
125 /* Mid level data transfer statements. These subroutines do reading
126 and writing in the style of salloc_r()/salloc_w() within the
129 /* When reading sequential formatted records we have a problem. We
130 don't know how long the line is until we read the trailing newline,
131 and we don't want to read too much. If we read too much, we might
132 have to do a physical seek backwards depending on how much data is
133 present, and devices like terminals aren't seekable and would cause
136 Given this, the solution is to read a byte at a time, stopping if
137 we hit the newline. For small locations, we use a static buffer.
138 For larger allocations, we are forced to allocate memory on the
139 heap. Hopefully this won't happen very often. */
142 read_sf (int *length)
144 static char data[SCRATCH_SIZE];
148 if (*length > SCRATCH_SIZE)
149 p = base = line_buffer = get_mem (*length);
153 memset(base,'\0',*length);
155 current_unit->bytes_left = options.default_recl;
161 if (is_internal_unit())
163 /* readlen may be modified inside salloc_r if
164 is_internal_unit() is true. */
168 q = salloc_r (current_unit->s, &readlen);
172 /* If we have a line without a terminating \n, drop through to
174 if (readlen < 1 && n == 0)
176 generate_error (ERROR_END, NULL);
180 if (readlen < 1 || *q == '\n' || *q == '\r')
182 /* ??? What is this for? */
183 if (current_unit->unit_number == options.stdin_unit)
188 /* Unexpected end of line. */
189 if (current_unit->flags.pad == PAD_NO)
191 generate_error (ERROR_EOR, NULL);
195 current_unit->bytes_left = 0;
211 /* Function for reading the next couple of bytes from the current
212 file, advancing the current position. We return a pointer to a
213 buffer containing the bytes. We return NULL on end of record or
216 If the read is short, then it is because the current record does not
217 have enough data to satisfy the read request and the file was
218 opened with PAD=YES. The caller must assume tailing spaces for
222 read_block (int *length)
227 if (current_unit->flags.form == FORM_FORMATTED &&
228 current_unit->flags.access == ACCESS_SEQUENTIAL)
229 return read_sf (length); /* Special case. */
231 if (current_unit->bytes_left < *length)
233 if (current_unit->flags.pad == PAD_NO)
235 generate_error (ERROR_EOR, NULL); /* Not enough data left. */
239 *length = current_unit->bytes_left;
242 current_unit->bytes_left -= *length;
245 source = salloc_r (current_unit->s, &nread);
247 if (ioparm.size != NULL)
248 *ioparm.size += nread;
250 if (nread != *length)
251 { /* Short read, this shouldn't happen. */
252 if (current_unit->flags.pad == PAD_YES)
256 generate_error (ERROR_EOR, NULL);
265 /* Function for writing a block of bytes to the current file at the
266 current position, advancing the file pointer. We are given a length
267 and return a pointer to a buffer that the caller must (completely)
268 fill in. Returns NULL on error. */
271 write_block (int length)
275 if (!is_internal_unit() && current_unit->bytes_left < length)
277 generate_error (ERROR_EOR, NULL);
281 current_unit->bytes_left -= length;
282 dest = salloc_w (current_unit->s, &length);
284 if (ioparm.size != NULL)
285 *ioparm.size += length;
291 /* Master function for unformatted reads. */
294 unformatted_read (bt type, void *dest, int length)
299 /* Transfer functions get passed the kind of the entity, so we have
300 to fix this for COMPLEX data which are twice the size of their
302 if (type == BT_COMPLEX)
306 source = read_block (&w);
310 memcpy (dest, source, w);
312 memset (((char *) dest) + w, ' ', length - w);
316 /* Master function for unformatted writes. */
319 unformatted_write (bt type, void *source, int length)
323 /* Correction for kind vs. length as in unformatted_read. */
324 if (type == BT_COMPLEX)
327 dest = write_block (length);
329 memcpy (dest, source, length);
333 /* Return a pointer to the name of a type. */
358 internal_error ("type_name(): Bad type");
365 /* Write a constant string to the output.
366 This is complicated because the string can have doubled delimiters
367 in it. The length in the format node is the true length. */
370 write_constant_string (fnode * f)
372 char c, delimiter, *p, *q;
375 length = f->u.string.length;
379 p = write_block (length);
386 for (; length > 0; length--)
389 if (c == delimiter && c != 'H' && c != 'h')
390 q++; /* Skip the doubled delimiter. */
395 /* Given actual and expected types in a formatted data transfer, make
396 sure they agree. If not, an error message is generated. Returns
397 nonzero if something went wrong. */
400 require_type (bt expected, bt actual, fnode * f)
404 if (actual == expected)
407 st_sprintf (buffer, "Expected %s for item %d in formatted transfer, got %s",
408 type_name (expected), g.item_count, type_name (actual));
410 format_error (f, buffer);
415 /* This subroutine is the main loop for a formatted data transfer
416 statement. It would be natural to implement this as a coroutine
417 with the user program, but C makes that awkward. We loop,
418 processesing format elements. When we actually have to transfer
419 data instead of just setting flags, we return control to the user
420 program which calls a subroutine that supplies the address and type
421 of the next element, then comes back here to process it. */
424 formatted_transfer (bt type, void *p, int len)
429 int consume_data_flag;
431 /* Change a complex data item into a pair of reals. */
433 n = (p == NULL) ? 0 : ((type != BT_COMPLEX) ? 1 : 2);
434 if (type == BT_COMPLEX)
439 /* If reversion has occurred and there is another real data item,
440 then we have to move to the next record. */
441 if (g.reversion_flag && n > 0)
443 g.reversion_flag = 0;
447 consume_data_flag = 1 ;
448 if (ioparm.library_return != LIBRARY_OK)
453 return; /* No data descriptors left (already raised). */
460 if (require_type (BT_INTEGER, type, f))
463 if (g.mode == READING)
464 read_decimal (f, p, len);
473 if (require_type (BT_INTEGER, type, f))
476 if (g.mode == READING)
477 read_radix (f, p, len, 2);
487 if (g.mode == READING)
488 read_radix (f, p, len, 8);
498 if (g.mode == READING)
499 read_radix (f, p, len, 16);
508 if (require_type (BT_CHARACTER, type, f))
511 if (g.mode == READING)
522 if (g.mode == READING)
532 if (require_type (BT_REAL, type, f))
535 if (g.mode == READING)
545 if (require_type (BT_REAL, type, f))
548 if (g.mode == READING)
557 if (require_type (BT_REAL, type, f))
560 if (g.mode == READING)
563 write_en (f, p, len);
570 if (require_type (BT_REAL, type, f))
573 if (g.mode == READING)
576 write_es (f, p, len);
583 if (require_type (BT_REAL, type, f))
586 if (g.mode == READING)
596 if (g.mode == READING)
600 read_decimal (f, p, len);
631 internal_error ("formatted_transfer(): Bad type");
637 consume_data_flag = 0 ;
638 if (g.mode == READING)
640 format_error (f, "Constant string in input format");
643 write_constant_string (f);
646 /* Format codes that don't transfer data. */
649 consume_data_flag = 0 ;
650 if (g.mode == READING)
659 if (f->format==FMT_TL)
662 pos= current_unit->recl - current_unit->bytes_left - pos;
666 consume_data_flag = 0 ;
670 if (pos < 0 || pos >= current_unit->recl )
672 generate_error (ERROR_EOR, "T Or TL edit position error");
675 m = pos - (current_unit->recl - current_unit->bytes_left);
683 if (g.mode == READING)
690 move_pos_offset (current_unit->s,m);
696 consume_data_flag = 0 ;
697 g.sign_status = SIGN_S;
701 consume_data_flag = 0 ;
702 g.sign_status = SIGN_SS;
706 consume_data_flag = 0 ;
707 g.sign_status = SIGN_SP;
711 consume_data_flag = 0 ;
712 g.blank_status = BLANK_NULL;
716 consume_data_flag = 0 ;
717 g.blank_status = BLANK_ZERO;
721 consume_data_flag = 0 ;
722 g.scale_factor = f->u.k;
726 consume_data_flag = 0 ;
731 consume_data_flag = 0 ;
732 for (i = 0; i < f->repeat; i++)
738 /* A colon descriptor causes us to exit this loop (in
739 particular preventing another / descriptor from being
740 processed) unless there is another data item to be
742 consume_data_flag = 0 ;
748 internal_error ("Bad format node");
751 /* Free a buffer that we had to allocate during a sequential
752 formatted read of a block that was larger than the static
755 if (line_buffer != NULL)
757 free_mem (line_buffer);
761 /* Adjust the item count and data pointer. */
763 if ((consume_data_flag > 0) && (n > 0))
766 p = ((char *) p) + len;
772 /* Come here when we need a data descriptor but don't have one. We
773 push the current format node back onto the input, then return and
774 let the user program call us back with the data. */
780 /* Data transfer entry points. The type of the data entity is
781 implicit in the subroutine call. This prevents us from having to
782 share a common enum with the compiler. */
785 transfer_integer (void *p, int kind)
788 if (ioparm.library_return != LIBRARY_OK)
790 transfer (BT_INTEGER, p, kind);
795 transfer_real (void *p, int kind)
798 if (ioparm.library_return != LIBRARY_OK)
800 transfer (BT_REAL, p, kind);
805 transfer_logical (void *p, int kind)
808 if (ioparm.library_return != LIBRARY_OK)
810 transfer (BT_LOGICAL, p, kind);
815 transfer_character (void *p, int len)
818 if (ioparm.library_return != LIBRARY_OK)
820 transfer (BT_CHARACTER, p, len);
825 transfer_complex (void *p, int kind)
828 if (ioparm.library_return != LIBRARY_OK)
830 transfer (BT_COMPLEX, p, kind);
834 /* Preposition a sequential unformatted file while reading. */
843 n = sizeof (gfc_offset);
844 p = salloc_r (current_unit->s, &n);
847 return; /* end of file */
849 if (p == NULL || n != sizeof (gfc_offset))
851 generate_error (ERROR_BAD_US, NULL);
855 memcpy (&i, p, sizeof (gfc_offset));
856 current_unit->bytes_left = i;
860 /* Preposition a sequential unformatted file while writing. This
861 amount to writing a bogus length that will be filled in later. */
869 length = sizeof (gfc_offset);
870 p = salloc_w (current_unit->s, &length);
874 generate_error (ERROR_OS, NULL);
878 memset (p, '\0', sizeof (gfc_offset)); /* Bogus value for now. */
879 if (sfree (current_unit->s) == FAILURE)
880 generate_error (ERROR_OS, NULL);
882 /* For sequential unformatted, we write until we have more bytes than
883 can fit in the record markers. If disk space runs out first, it will
884 error on the write. */
885 current_unit->recl = g.max_offset;
887 current_unit->bytes_left = current_unit->recl;
891 /* Position to the next record prior to transfer. We are assumed to
892 be before the next record. We also calculate the bytes in the next
898 if (current_unit->current_record)
899 return; /* Already positioned. */
901 switch (current_mode ())
903 case UNFORMATTED_SEQUENTIAL:
904 if (g.mode == READING)
911 case FORMATTED_SEQUENTIAL:
912 case FORMATTED_DIRECT:
913 case UNFORMATTED_DIRECT:
914 current_unit->bytes_left = current_unit->recl;
918 current_unit->current_record = 1;
922 /* Initialize things for a data transfer. This code is common for
923 both reading and writing. */
926 data_transfer_init (int read_flag)
928 unit_flags u_flags; /* Used for creating a unit if needed. */
930 g.mode = read_flag ? READING : WRITING;
932 if (ioparm.size != NULL)
933 *ioparm.size = 0; /* Initialize the count. */
935 current_unit = get_unit (read_flag);
936 if (current_unit == NULL)
937 { /* Open the unit with some default flags. */
940 generate_error (ERROR_BAD_OPTION, "Bad unit number in OPEN statement");
944 memset (&u_flags, '\0', sizeof (u_flags));
945 u_flags.access = ACCESS_SEQUENTIAL;
946 u_flags.action = ACTION_READWRITE;
947 /* Is it unformatted? */
948 if (ioparm.format == NULL && !ioparm.list_format)
949 u_flags.form = FORM_UNFORMATTED;
951 u_flags.form = FORM_UNSPECIFIED;
952 u_flags.delim = DELIM_UNSPECIFIED;
953 u_flags.blank = BLANK_UNSPECIFIED;
954 u_flags.pad = PAD_UNSPECIFIED;
955 u_flags.status = STATUS_UNKNOWN;
957 current_unit = get_unit (read_flag);
960 if (current_unit == NULL)
963 if (is_internal_unit())
965 current_unit->recl = file_length(current_unit->s);
967 empty_internal_buffer (current_unit->s);
970 /* Check the action. */
972 if (read_flag && current_unit->flags.action == ACTION_WRITE)
973 generate_error (ERROR_BAD_ACTION,
974 "Cannot read from file opened for WRITE");
976 if (!read_flag && current_unit->flags.action == ACTION_READ)
977 generate_error (ERROR_BAD_ACTION, "Cannot write to file opened for READ");
979 if (ioparm.library_return != LIBRARY_OK)
982 /* Check the format. */
987 if (ioparm.library_return != LIBRARY_OK)
990 if (current_unit->flags.form == FORM_UNFORMATTED
991 && (ioparm.format != NULL || ioparm.list_format))
992 generate_error (ERROR_OPTION_CONFLICT,
993 "Format present for UNFORMATTED data transfer");
995 if (ioparm.namelist_name != NULL && ionml != NULL)
997 if(ioparm.format != NULL)
998 generate_error (ERROR_OPTION_CONFLICT,
999 "A format cannot be specified with a namelist");
1001 else if (current_unit->flags.form == FORM_FORMATTED &&
1002 ioparm.format == NULL && !ioparm.list_format)
1003 generate_error (ERROR_OPTION_CONFLICT,
1004 "Missing format for FORMATTED data transfer");
1007 if (is_internal_unit () && current_unit->flags.form == FORM_UNFORMATTED)
1008 generate_error (ERROR_OPTION_CONFLICT,
1009 "Internal file cannot be accessed by UNFORMATTED data transfer");
1011 /* Check the record number. */
1013 if (current_unit->flags.access == ACCESS_DIRECT && ioparm.rec == 0)
1015 generate_error (ERROR_MISSING_OPTION,
1016 "Direct access data transfer requires record number");
1020 if (current_unit->flags.access == ACCESS_SEQUENTIAL && ioparm.rec != 0)
1022 generate_error (ERROR_OPTION_CONFLICT,
1023 "Record number not allowed for sequential access data transfer");
1027 /* Process the ADVANCE option. */
1029 advance_status = (ioparm.advance == NULL) ? ADVANCE_UNSPECIFIED :
1030 find_option (ioparm.advance, ioparm.advance_len, advance_opt,
1031 "Bad ADVANCE parameter in data transfer statement");
1033 if (advance_status != ADVANCE_UNSPECIFIED)
1035 if (current_unit->flags.access == ACCESS_DIRECT)
1036 generate_error (ERROR_OPTION_CONFLICT,
1037 "ADVANCE specification conflicts with sequential access");
1039 if (is_internal_unit ())
1040 generate_error (ERROR_OPTION_CONFLICT,
1041 "ADVANCE specification conflicts with internal file");
1043 if (ioparm.format == NULL || ioparm.list_format)
1044 generate_error (ERROR_OPTION_CONFLICT,
1045 "ADVANCE specification requires an explicit format");
1050 if (ioparm.eor != 0 && advance_status != ADVANCE_NO)
1051 generate_error (ERROR_MISSING_OPTION,
1052 "EOR specification requires an ADVANCE specification of NO");
1054 if (ioparm.size != NULL && advance_status != ADVANCE_NO)
1055 generate_error (ERROR_MISSING_OPTION,
1056 "SIZE specification requires an ADVANCE specification of NO");
1060 { /* Write constraints. */
1061 if (ioparm.end != 0)
1062 generate_error (ERROR_OPTION_CONFLICT,
1063 "END specification cannot appear in a write statement");
1065 if (ioparm.eor != 0)
1066 generate_error (ERROR_OPTION_CONFLICT,
1067 "EOR specification cannot appear in a write statement");
1069 if (ioparm.size != 0)
1070 generate_error (ERROR_OPTION_CONFLICT,
1071 "SIZE specification cannot appear in a write statement");
1074 if (advance_status == ADVANCE_UNSPECIFIED)
1075 advance_status = ADVANCE_YES;
1076 if (ioparm.library_return != LIBRARY_OK)
1079 /* Sanity checks on the record number. */
1083 if (ioparm.rec <= 0)
1085 generate_error (ERROR_BAD_OPTION, "Record number must be positive");
1089 if (ioparm.rec >= current_unit->maxrec)
1091 generate_error (ERROR_BAD_OPTION, "Record number too large");
1095 /* Check to see if we might be reading what we wrote before */
1097 if (g.mode == READING && current_unit->mode == WRITING)
1098 flush(current_unit->s);
1100 /* Position the file. */
1101 if (sseek (current_unit->s,
1102 (ioparm.rec - 1) * current_unit->recl) == FAILURE)
1103 generate_error (ERROR_OS, NULL);
1106 /* Overwriting an existing sequential file ?
1107 it is always safe to truncate the file on the first write */
1108 if (g.mode == WRITING
1109 && current_unit->flags.access == ACCESS_SEQUENTIAL
1110 && current_unit->current_record == 0)
1111 struncate(current_unit->s);
1113 current_unit->mode = g.mode;
1115 /* Set the initial value of flags. */
1117 g.blank_status = current_unit->flags.blank;
1118 g.sign_status = SIGN_S;
1127 /* Set up the subroutine that will handle the transfers. */
1131 if (current_unit->flags.form == FORM_UNFORMATTED)
1132 transfer = unformatted_read;
1135 if (ioparm.list_format)
1137 transfer = list_formatted_read;
1141 transfer = formatted_transfer;
1146 if (current_unit->flags.form == FORM_UNFORMATTED)
1147 transfer = unformatted_write;
1150 if (ioparm.list_format)
1151 transfer = list_formatted_write;
1153 transfer = formatted_transfer;
1157 /* Make sure that we don't do a read after a nonadvancing write. */
1161 if (current_unit->read_bad)
1163 generate_error (ERROR_BAD_OPTION,
1164 "Cannot READ after a nonadvancing WRITE");
1170 if (advance_status == ADVANCE_YES)
1171 current_unit->read_bad = 1;
1174 /* Start the data transfer if we are doing a formatted transfer. */
1175 if (current_unit->flags.form == FORM_FORMATTED && !ioparm.list_format
1176 && ioparm.namelist_name == NULL && ionml == NULL)
1177 formatted_transfer (0, NULL, 0);
1181 /* Space to the next record for read mode. If the file is not
1182 seekable, we read MAX_READ chunks until we get to the right
1185 #define MAX_READ 4096
1188 next_record_r (int done)
1190 int rlength, length;
1194 switch (current_mode ())
1196 case UNFORMATTED_SEQUENTIAL:
1197 current_unit->bytes_left += sizeof (gfc_offset); /* Skip over tail */
1199 /* Fall through... */
1201 case FORMATTED_DIRECT:
1202 case UNFORMATTED_DIRECT:
1203 if (current_unit->bytes_left == 0)
1206 if (is_seekable (current_unit->s))
1208 new = file_position (current_unit->s) + current_unit->bytes_left;
1210 /* Direct access files do not generate END conditions,
1212 if (sseek (current_unit->s, new) == FAILURE)
1213 generate_error (ERROR_OS, NULL);
1217 { /* Seek by reading data. */
1218 while (current_unit->bytes_left > 0)
1220 rlength = length = (MAX_READ > current_unit->bytes_left) ?
1221 MAX_READ : current_unit->bytes_left;
1223 p = salloc_r (current_unit->s, &rlength);
1226 generate_error (ERROR_OS, NULL);
1230 current_unit->bytes_left -= length;
1235 case FORMATTED_SEQUENTIAL:
1237 /* sf_read has already terminated input because of an '\n' */
1243 p = salloc_r (current_unit->s, &length);
1245 /* In case of internal file, there may not be any '\n'. */
1246 if (is_internal_unit() && p == NULL)
1253 generate_error (ERROR_OS, NULL);
1259 current_unit->endfile = AT_ENDFILE;
1268 if (current_unit->flags.access == ACCESS_SEQUENTIAL)
1269 test_endfile (current_unit);
1273 /* Position to the next record in write mode. */
1276 next_record_w (int done)
1282 switch (current_mode ())
1284 case FORMATTED_DIRECT:
1285 if (current_unit->bytes_left == 0)
1288 length = current_unit->bytes_left;
1289 p = salloc_w (current_unit->s, &length);
1294 memset (p, ' ', current_unit->bytes_left);
1295 if (sfree (current_unit->s) == FAILURE)
1299 case UNFORMATTED_DIRECT:
1300 if (sfree (current_unit->s) == FAILURE)
1304 case UNFORMATTED_SEQUENTIAL:
1305 m = current_unit->recl - current_unit->bytes_left; /* Bytes written. */
1306 c = file_position (current_unit->s);
1308 length = sizeof (gfc_offset);
1310 /* Write the length tail. */
1312 p = salloc_w (current_unit->s, &length);
1316 memcpy (p, &m, sizeof (gfc_offset));
1317 if (sfree (current_unit->s) == FAILURE)
1320 /* Seek to the head and overwrite the bogus length with the real
1323 p = salloc_w_at (current_unit->s, &length, c - m - length);
1325 generate_error (ERROR_OS, NULL);
1327 memcpy (p, &m, sizeof (gfc_offset));
1328 if (sfree (current_unit->s) == FAILURE)
1331 /* Seek past the end of the current record. */
1333 if (sseek (current_unit->s, c + sizeof (gfc_offset)) == FAILURE)
1338 case FORMATTED_SEQUENTIAL:
1340 p = salloc_w (current_unit->s, &length);
1342 if (!is_internal_unit())
1345 *p = '\n'; /* No CR for internal writes. */
1350 if (sfree (current_unit->s) == FAILURE)
1356 generate_error (ERROR_OS, NULL);
1362 /* Position to the next record, which means moving to the end of the
1363 current record. This can happen under several different
1364 conditions. If the done flag is not set, we get ready to process
1368 next_record (int done)
1370 gfc_offset fp; /* File position. */
1372 current_unit->read_bad = 0;
1374 if (g.mode == READING)
1375 next_record_r (done);
1377 next_record_w (done);
1379 /* keep position up to date for INQUIRE */
1380 current_unit->flags.position = POSITION_ASIS;
1382 current_unit->current_record = 0;
1383 if (current_unit->flags.access == ACCESS_DIRECT)
1385 fp = file_position (current_unit->s);
1386 /* Calculate next record, rounding up partial records. */
1387 current_unit->last_record = (fp + current_unit->recl - 1)
1388 / current_unit->recl;
1391 current_unit->last_record++;
1398 /* Finalize the current data transfer. For a nonadvancing transfer,
1399 this means advancing to the next record. For internal units close the
1400 steam associated with the unit. */
1403 finalize_transfer (void)
1405 if (ioparm.library_return != LIBRARY_OK)
1408 if ((ionml != NULL) && (ioparm.namelist_name != NULL))
1410 if (ioparm.namelist_read_mode)
1417 if (current_unit == NULL)
1420 if (setjmp (g.eof_jump))
1422 generate_error (ERROR_END, NULL);
1426 if (ioparm.list_format && g.mode == READING)
1427 finish_list_read ();
1432 if (advance_status == ADVANCE_NO)
1434 /* Most systems buffer lines, so force the partial record
1435 to be written out. */
1436 flush (current_unit->s);
1441 current_unit->current_record = 0;
1444 sfree (current_unit->s);
1446 if (is_internal_unit ())
1447 sclose (current_unit->s);
1451 /* Transfer function for IOLENGTH. It doesn't actually do any
1452 data transfer, it just updates the length counter. */
1455 iolength_transfer (bt type, void *dest, int len)
1457 if (ioparm.iolength != NULL)
1458 *ioparm.iolength += len;
1462 /* Initialize the IOLENGTH data transfer. This function is in essence
1463 a very much simplified version of data_transfer_init(), because it
1464 doesn't have to deal with units at all. */
1467 iolength_transfer_init (void)
1469 if (ioparm.iolength != NULL)
1470 *ioparm.iolength = 0;
1474 /* Set up the subroutine that will handle the transfers. */
1476 transfer = iolength_transfer;
1480 /* Library entry point for the IOLENGTH form of the INQUIRE
1481 statement. The IOLENGTH form requires no I/O to be performed, but
1482 it must still be a runtime library call so that we can determine
1483 the iolength for dynamic arrays and such. */
1485 extern void st_iolength (void);
1486 export_proto(st_iolength);
1492 iolength_transfer_init ();
1495 extern void st_iolength_done (void);
1496 export_proto(st_iolength_done);
1499 st_iolength_done (void)
1505 /* The READ statement. */
1507 extern void st_read (void);
1508 export_proto(st_read);
1515 data_transfer_init (1);
1517 /* Handle complications dealing with the endfile record. It is
1518 significant that this is the only place where ERROR_END is
1519 generated. Reading an end of file elsewhere is either end of
1520 record or an I/O error. */
1522 if (current_unit->flags.access == ACCESS_SEQUENTIAL)
1523 switch (current_unit->endfile)
1529 if (!is_internal_unit())
1531 generate_error (ERROR_END, NULL);
1532 current_unit->endfile = AFTER_ENDFILE;
1537 generate_error (ERROR_ENDFILE, NULL);
1542 extern void st_read_done (void);
1543 export_proto(st_read_done);
1548 finalize_transfer ();
1552 extern void st_write (void);
1553 export_proto(st_write);
1559 data_transfer_init (0);
1562 extern void st_write_done (void);
1563 export_proto(st_write_done);
1566 st_write_done (void)
1568 finalize_transfer ();
1570 /* Deal with endfile conditions associated with sequential files. */
1572 if (current_unit != NULL && current_unit->flags.access == ACCESS_SEQUENTIAL)
1573 switch (current_unit->endfile)
1575 case AT_ENDFILE: /* Remain at the endfile record. */
1579 current_unit->endfile = AT_ENDFILE; /* Just at it now. */
1583 if (current_unit->current_record > current_unit->last_record)
1585 /* Get rid of whatever is after this record. */
1586 if (struncate (current_unit->s) == FAILURE)
1587 generate_error (ERROR_OS, NULL);
1590 current_unit->endfile = AT_ENDFILE;
1599 st_set_nml_var (void * var_addr, char * var_name, int var_name_len,
1600 int kind, bt type, int string_length)
1602 namelist_info *t1 = NULL, *t2 = NULL;
1603 namelist_info *nml = (namelist_info *) get_mem (sizeof (namelist_info));
1604 nml->mem_pos = var_addr;
1607 assert (var_name_len > 0);
1608 nml->var_name = (char*) get_mem (var_name_len+1);
1609 strncpy (nml->var_name, var_name, var_name_len);
1610 nml->var_name[var_name_len] = 0;
1614 assert (var_name_len == 0);
1615 nml->var_name = NULL;
1620 nml->string_length = string_length;
1638 extern void st_set_nml_var_int (void *, char *, int, int);
1639 export_proto(st_set_nml_var_int);
1641 extern void st_set_nml_var_float (void *, char *, int, int);
1642 export_proto(st_set_nml_var_float);
1644 extern void st_set_nml_var_char (void *, char *, int, int, gfc_charlen_type);
1645 export_proto(st_set_nml_var_char);
1647 extern void st_set_nml_var_complex (void *, char *, int, int);
1648 export_proto(st_set_nml_var_complex);
1650 extern void st_set_nml_var_log (void *, char *, int, int);
1651 export_proto(st_set_nml_var_log);
1654 st_set_nml_var_int (void * var_addr, char * var_name, int var_name_len,
1657 st_set_nml_var (var_addr, var_name, var_name_len, kind, BT_INTEGER, 0);
1661 st_set_nml_var_float (void * var_addr, char * var_name, int var_name_len,
1664 st_set_nml_var (var_addr, var_name, var_name_len, kind, BT_REAL, 0);
1668 st_set_nml_var_char (void * var_addr, char * var_name, int var_name_len,
1669 int kind, gfc_charlen_type string_length)
1671 st_set_nml_var (var_addr, var_name, var_name_len, kind, BT_CHARACTER,
1676 st_set_nml_var_complex (void * var_addr, char * var_name, int var_name_len,
1679 st_set_nml_var (var_addr, var_name, var_name_len, kind, BT_COMPLEX, 0);
1683 st_set_nml_var_log (void * var_addr, char * var_name, int var_name_len,
1686 st_set_nml_var (var_addr, var_name, var_name_len, kind, BT_LOGICAL, 0);