OSDN Git Service

f71e96f75de9f0456419bc027b83f4d981d882fd
[pf3gnuchains/gcc-fork.git] / libgfortran / io / transfer.c
1 /* Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
2    Free Software Foundation, Inc.
3    Contributed by Andy Vaught
4    Namelist transfer functions contributed by Paul Thomas
5    F2003 I/O support contributed by Jerry DeLisle
6
7 This file is part of the GNU Fortran runtime library (libgfortran).
8
9 Libgfortran is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3, or (at your option)
12 any later version.
13
14 Libgfortran is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 GNU General Public License for more details.
18
19 Under Section 7 of GPL version 3, you are granted additional
20 permissions described in the GCC Runtime Library Exception, version
21 3.1, as published by the Free Software Foundation.
22
23 You should have received a copy of the GNU General Public License and
24 a copy of the GCC Runtime Library Exception along with this program;
25 see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
26 <http://www.gnu.org/licenses/>.  */
27
28
29 /* transfer.c -- Top level handling of data transfer statements.  */
30
31 #include "io.h"
32 #include "fbuf.h"
33 #include "format.h"
34 #include "unix.h"
35 #include <string.h>
36 #include <assert.h>
37 #include <stdlib.h>
38 #include <errno.h>
39
40
41 /* Calling conventions:  Data transfer statements are unlike other
42    library calls in that they extend over several calls.
43
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.
48
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
51    statement. For READ (and for backwards compatibily: for WRITE), one has
52
53       transfer_integer
54       transfer_logical
55       transfer_character
56       transfer_character_wide
57       transfer_real
58       transfer_complex
59       transfer_real128
60       transfer_complex128
61    
62     and for WRITE
63
64       transfer_integer_write
65       transfer_logical_write
66       transfer_character_write
67       transfer_character_wide_write
68       transfer_real_write
69       transfer_complex_write
70       transfer_real128_write
71       transfer_complex128_write
72
73     These subroutines do not return status. The *128 functions
74     are in the file transfer128.c.
75
76     The last call is a call to st_[read|write]_done().  While
77     something can easily go wrong with the initial st_read() or
78     st_write(), an error inhibits any data from actually being
79     transferred.  */
80
81 extern void transfer_integer (st_parameter_dt *, void *, int);
82 export_proto(transfer_integer);
83
84 extern void transfer_integer_write (st_parameter_dt *, void *, int);
85 export_proto(transfer_integer_write);
86
87 extern void transfer_real (st_parameter_dt *, void *, int);
88 export_proto(transfer_real);
89
90 extern void transfer_real_write (st_parameter_dt *, void *, int);
91 export_proto(transfer_real_write);
92
93 extern void transfer_logical (st_parameter_dt *, void *, int);
94 export_proto(transfer_logical);
95
96 extern void transfer_logical_write (st_parameter_dt *, void *, int);
97 export_proto(transfer_logical_write);
98
99 extern void transfer_character (st_parameter_dt *, void *, int);
100 export_proto(transfer_character);
101
102 extern void transfer_character_write (st_parameter_dt *, void *, int);
103 export_proto(transfer_character_write);
104
105 extern void transfer_character_wide (st_parameter_dt *, void *, int, int);
106 export_proto(transfer_character_wide);
107
108 extern void transfer_character_wide_write (st_parameter_dt *,
109                                            void *, int, int);
110 export_proto(transfer_character_wide_write);
111
112 extern void transfer_complex (st_parameter_dt *, void *, int);
113 export_proto(transfer_complex);
114
115 extern void transfer_complex_write (st_parameter_dt *, void *, int);
116 export_proto(transfer_complex_write);
117
118 extern void transfer_array (st_parameter_dt *, gfc_array_char *, int,
119                             gfc_charlen_type);
120 export_proto(transfer_array);
121
122 extern void transfer_array_write (st_parameter_dt *, gfc_array_char *, int,
123                             gfc_charlen_type);
124 export_proto(transfer_array_write);
125
126 static void us_read (st_parameter_dt *, int);
127 static void us_write (st_parameter_dt *, int);
128 static void next_record_r_unf (st_parameter_dt *, int);
129 static void next_record_w_unf (st_parameter_dt *, int);
130
131 static const st_option advance_opt[] = {
132   {"yes", ADVANCE_YES},
133   {"no", ADVANCE_NO},
134   {NULL, 0}
135 };
136
137
138 static const st_option decimal_opt[] = {
139   {"point", DECIMAL_POINT},
140   {"comma", DECIMAL_COMMA},
141   {NULL, 0}
142 };
143
144 static const st_option round_opt[] = {
145   {"up", ROUND_UP},
146   {"down", ROUND_DOWN},
147   {"zero", ROUND_ZERO},
148   {"nearest", ROUND_NEAREST},
149   {"compatible", ROUND_COMPATIBLE},
150   {"processor_defined", ROUND_PROCDEFINED},
151   {NULL, 0}
152 };
153
154
155 static const st_option sign_opt[] = {
156   {"plus", SIGN_SP},
157   {"suppress", SIGN_SS},
158   {"processor_defined", SIGN_S},
159   {NULL, 0}
160 };
161
162 static const st_option blank_opt[] = {
163   {"null", BLANK_NULL},
164   {"zero", BLANK_ZERO},
165   {NULL, 0}
166 };
167
168 static const st_option delim_opt[] = {
169   {"apostrophe", DELIM_APOSTROPHE},
170   {"quote", DELIM_QUOTE},
171   {"none", DELIM_NONE},
172   {NULL, 0}
173 };
174
175 static const st_option pad_opt[] = {
176   {"yes", PAD_YES},
177   {"no", PAD_NO},
178   {NULL, 0}
179 };
180
181 typedef enum
182 { FORMATTED_SEQUENTIAL, UNFORMATTED_SEQUENTIAL,
183   FORMATTED_DIRECT, UNFORMATTED_DIRECT, FORMATTED_STREAM, UNFORMATTED_STREAM
184 }
185 file_mode;
186
187
188 static file_mode
189 current_mode (st_parameter_dt *dtp)
190 {
191   file_mode m;
192
193   m = FORM_UNSPECIFIED;
194
195   if (dtp->u.p.current_unit->flags.access == ACCESS_DIRECT)
196     {
197       m = dtp->u.p.current_unit->flags.form == FORM_FORMATTED ?
198         FORMATTED_DIRECT : UNFORMATTED_DIRECT;
199     }
200   else if (dtp->u.p.current_unit->flags.access == ACCESS_SEQUENTIAL)
201     {
202       m = dtp->u.p.current_unit->flags.form == FORM_FORMATTED ?
203         FORMATTED_SEQUENTIAL : UNFORMATTED_SEQUENTIAL;
204     }
205   else if (dtp->u.p.current_unit->flags.access == ACCESS_STREAM)
206     {
207       m = dtp->u.p.current_unit->flags.form == FORM_FORMATTED ?
208         FORMATTED_STREAM : UNFORMATTED_STREAM;
209     }
210
211   return m;
212 }
213
214
215 /* Mid level data transfer statements.  */
216
217 /* Read sequential file - internal unit  */
218
219 static char *
220 read_sf_internal (st_parameter_dt *dtp, int * length)
221 {
222   static char *empty_string[0];
223   char *base;
224   int lorig;
225
226   /* Zero size array gives internal unit len of 0.  Nothing to read. */
227   if (dtp->internal_unit_len == 0
228       && dtp->u.p.current_unit->pad_status == PAD_NO)
229     hit_eof (dtp);
230
231   /* If we have seen an eor previously, return a length of 0.  The
232      caller is responsible for correctly padding the input field.  */
233   if (dtp->u.p.sf_seen_eor)
234     {
235       *length = 0;
236       /* Just return something that isn't a NULL pointer, otherwise the
237          caller thinks an error occured.  */
238       return (char*) empty_string;
239     }
240
241   lorig = *length;
242   if (is_char4_unit(dtp))
243     {
244       int i;
245       gfc_char4_t *p = (gfc_char4_t *) mem_alloc_r4 (dtp->u.p.current_unit->s,
246                         length);
247       base = fbuf_alloc (dtp->u.p.current_unit, lorig);
248       for (i = 0; i < *length; i++, p++)
249         base[i] = *p > 255 ? '?' : (unsigned char) *p;
250     }
251   else
252     base = mem_alloc_r (dtp->u.p.current_unit->s, length);
253
254   if (unlikely (lorig > *length))
255     {
256       hit_eof (dtp);
257       return NULL;
258     }
259
260   dtp->u.p.current_unit->bytes_left -= *length;
261
262   if ((dtp->common.flags & IOPARM_DT_HAS_SIZE) != 0)
263     dtp->u.p.size_used += (GFC_IO_INT) *length;
264
265   return base;
266
267 }
268
269 /* When reading sequential formatted records we have a problem.  We
270    don't know how long the line is until we read the trailing newline,
271    and we don't want to read too much.  If we read too much, we might
272    have to do a physical seek backwards depending on how much data is
273    present, and devices like terminals aren't seekable and would cause
274    an I/O error.
275
276    Given this, the solution is to read a byte at a time, stopping if
277    we hit the newline.  For small allocations, we use a static buffer.
278    For larger allocations, we are forced to allocate memory on the
279    heap.  Hopefully this won't happen very often.  */
280
281 /* Read sequential file - external unit */
282
283 static char *
284 read_sf (st_parameter_dt *dtp, int * length)
285 {
286   static char *empty_string[0];
287   int q, q2;
288   int n, lorig, seen_comma;
289
290   /* If we have seen an eor previously, return a length of 0.  The
291      caller is responsible for correctly padding the input field.  */
292   if (dtp->u.p.sf_seen_eor)
293     {
294       *length = 0;
295       /* Just return something that isn't a NULL pointer, otherwise the
296          caller thinks an error occured.  */
297       return (char*) empty_string;
298     }
299
300   n = seen_comma = 0;
301
302   /* Read data into format buffer and scan through it.  */
303   lorig = *length;
304
305   while (n < *length)
306     {
307       q = fbuf_getc (dtp->u.p.current_unit);
308       if (q == EOF)
309         break;
310       else if (q == '\n' || q == '\r')
311         {
312           /* Unexpected end of line. Set the position.  */
313           dtp->u.p.sf_seen_eor = 1;
314
315           /* If we see an EOR during non-advancing I/O, we need to skip
316              the rest of the I/O statement.  Set the corresponding flag.  */
317           if (dtp->u.p.advance_status == ADVANCE_NO || dtp->u.p.seen_dollar)
318             dtp->u.p.eor_condition = 1;
319             
320           /* If we encounter a CR, it might be a CRLF.  */
321           if (q == '\r') /* Probably a CRLF */
322             {
323               /* See if there is an LF.  */
324               q2 = fbuf_getc (dtp->u.p.current_unit);
325               if (q2 == '\n')
326                 dtp->u.p.sf_seen_eor = 2;
327               else if (q2 != EOF) /* Oops, seek back.  */
328                 fbuf_seek (dtp->u.p.current_unit, -1, SEEK_CUR);
329             }
330
331           /* Without padding, terminate the I/O statement without assigning
332              the value.  With padding, the value still needs to be assigned,
333              so we can just continue with a short read.  */
334           if (dtp->u.p.current_unit->pad_status == PAD_NO)
335             {
336               generate_error (&dtp->common, LIBERROR_EOR, NULL);
337               return NULL;
338             }
339
340           *length = n;
341           goto done;
342         }
343       /*  Short circuit the read if a comma is found during numeric input.
344           The flag is set to zero during character reads so that commas in
345           strings are not ignored  */
346       else if (q == ',')
347         if (dtp->u.p.sf_read_comma == 1)
348           {
349             seen_comma = 1;
350             notify_std (&dtp->common, GFC_STD_GNU,
351                         "Comma in formatted numeric read.");
352             break;
353           }
354       n++;
355     }
356
357   *length = n;
358
359   /* A short read implies we hit EOF, unless we hit EOR, a comma, or
360      some other stuff. Set the relevant flags.  */
361   if (lorig > *length && !dtp->u.p.sf_seen_eor && !seen_comma)
362     {
363       if (n > 0)
364         {
365           if (dtp->u.p.advance_status == ADVANCE_NO)
366             {
367               if (dtp->u.p.current_unit->pad_status == PAD_NO)
368                 {
369                   hit_eof (dtp);
370                   return NULL;
371                 }
372               else
373                 dtp->u.p.eor_condition = 1;
374             }
375           else
376             dtp->u.p.at_eof = 1;
377         }
378       else if (dtp->u.p.advance_status == ADVANCE_NO
379                || dtp->u.p.current_unit->pad_status == PAD_NO
380                || dtp->u.p.current_unit->bytes_left
381                     == dtp->u.p.current_unit->recl)
382         {
383           hit_eof (dtp);
384           return NULL;
385         }
386     }
387
388  done:
389
390   dtp->u.p.current_unit->bytes_left -= n;
391
392   if ((dtp->common.flags & IOPARM_DT_HAS_SIZE) != 0)
393     dtp->u.p.size_used += (GFC_IO_INT) n;
394
395   /* We can't call fbuf_getptr before the loop doing fbuf_getc, because
396      fbuf_getc might reallocate the buffer.  So return current pointer
397      minus all the advances, which is n plus up to two characters
398      of newline or comma.  */
399   return fbuf_getptr (dtp->u.p.current_unit)
400          - n - dtp->u.p.sf_seen_eor - seen_comma;
401 }
402
403
404 /* Function for reading the next couple of bytes from the current
405    file, advancing the current position. We return FAILURE on end of record or
406    end of file. This function is only for formatted I/O, unformatted uses
407    read_block_direct.
408
409    If the read is short, then it is because the current record does not
410    have enough data to satisfy the read request and the file was
411    opened with PAD=YES.  The caller must assume tailing spaces for
412    short reads.  */
413
414 void *
415 read_block_form (st_parameter_dt *dtp, int * nbytes)
416 {
417   char *source;
418   int norig;
419
420   if (!is_stream_io (dtp))
421     {
422       if (dtp->u.p.current_unit->bytes_left < (gfc_offset) *nbytes)
423         {
424           /* For preconnected units with default record length, set bytes left
425            to unit record length and proceed, otherwise error.  */
426           if (dtp->u.p.current_unit->unit_number == options.stdin_unit
427               && dtp->u.p.current_unit->recl == DEFAULT_RECL)
428             dtp->u.p.current_unit->bytes_left = dtp->u.p.current_unit->recl;
429           else
430             {
431               if (unlikely (dtp->u.p.current_unit->pad_status == PAD_NO)
432                   && !is_internal_unit (dtp))
433                 {
434                   /* Not enough data left.  */
435                   generate_error (&dtp->common, LIBERROR_EOR, NULL);
436                   return NULL;
437                 }
438             }
439
440           if (unlikely (dtp->u.p.current_unit->bytes_left == 0
441               && !is_internal_unit(dtp)))
442             {
443               hit_eof (dtp);
444               return NULL;
445             }
446
447           *nbytes = dtp->u.p.current_unit->bytes_left;
448         }
449     }
450
451   if (dtp->u.p.current_unit->flags.form == FORM_FORMATTED &&
452       (dtp->u.p.current_unit->flags.access == ACCESS_SEQUENTIAL ||
453        dtp->u.p.current_unit->flags.access == ACCESS_STREAM))
454     {
455       if (is_internal_unit (dtp))
456         source = read_sf_internal (dtp, nbytes);
457       else
458         source = read_sf (dtp, nbytes);
459
460       dtp->u.p.current_unit->strm_pos +=
461         (gfc_offset) (*nbytes + dtp->u.p.sf_seen_eor);
462       return source;
463     }
464
465   /* If we reach here, we can assume it's direct access.  */
466
467   dtp->u.p.current_unit->bytes_left -= (gfc_offset) *nbytes;
468
469   norig = *nbytes;
470   source = fbuf_read (dtp->u.p.current_unit, nbytes);
471   fbuf_seek (dtp->u.p.current_unit, *nbytes, SEEK_CUR);
472
473   if ((dtp->common.flags & IOPARM_DT_HAS_SIZE) != 0)
474     dtp->u.p.size_used += (GFC_IO_INT) *nbytes;
475
476   if (norig != *nbytes)
477     {
478       /* Short read, this shouldn't happen.  */
479       if (!dtp->u.p.current_unit->pad_status == PAD_YES)
480         {
481           generate_error (&dtp->common, LIBERROR_EOR, NULL);
482           source = NULL;
483         }
484     }
485
486   dtp->u.p.current_unit->strm_pos += (gfc_offset) *nbytes;
487
488   return source;
489 }
490
491
492 /* Read a block from a character(kind=4) internal unit, to be transferred into
493    a character(kind=4) variable.  Note: Portions of this code borrowed from
494    read_sf_internal.  */
495 void *
496 read_block_form4 (st_parameter_dt *dtp, int * nbytes)
497 {
498   static gfc_char4_t *empty_string[0];
499   gfc_char4_t *source;
500   int lorig;
501
502   if (dtp->u.p.current_unit->bytes_left < (gfc_offset) *nbytes)
503     *nbytes = dtp->u.p.current_unit->bytes_left;
504
505   /* Zero size array gives internal unit len of 0.  Nothing to read. */
506   if (dtp->internal_unit_len == 0
507       && dtp->u.p.current_unit->pad_status == PAD_NO)
508     hit_eof (dtp);
509
510   /* If we have seen an eor previously, return a length of 0.  The
511      caller is responsible for correctly padding the input field.  */
512   if (dtp->u.p.sf_seen_eor)
513     {
514       *nbytes = 0;
515       /* Just return something that isn't a NULL pointer, otherwise the
516          caller thinks an error occured.  */
517       return empty_string;
518     }
519
520   lorig = *nbytes;
521   source = (gfc_char4_t *) mem_alloc_r4 (dtp->u.p.current_unit->s, nbytes);
522
523   if (unlikely (lorig > *nbytes))
524     {
525       hit_eof (dtp);
526       return NULL;
527     }
528
529   dtp->u.p.current_unit->bytes_left -= *nbytes;
530
531   if ((dtp->common.flags & IOPARM_DT_HAS_SIZE) != 0)
532     dtp->u.p.size_used += (GFC_IO_INT) *nbytes;
533
534   return source;
535 }
536
537
538 /* Reads a block directly into application data space.  This is for
539    unformatted files.  */
540
541 static void
542 read_block_direct (st_parameter_dt *dtp, void *buf, size_t nbytes)
543 {
544   ssize_t to_read_record;
545   ssize_t have_read_record;
546   ssize_t to_read_subrecord;
547   ssize_t have_read_subrecord;
548   int short_record;
549
550   if (is_stream_io (dtp))
551     {
552       have_read_record = sread (dtp->u.p.current_unit->s, buf, 
553                                 nbytes);
554       if (unlikely (have_read_record < 0))
555         {
556           generate_error (&dtp->common, LIBERROR_OS, NULL);
557           return;
558         }
559
560       dtp->u.p.current_unit->strm_pos += (gfc_offset) have_read_record; 
561
562       if (unlikely ((ssize_t) nbytes != have_read_record))
563         {
564           /* Short read,  e.g. if we hit EOF.  For stream files,
565            we have to set the end-of-file condition.  */
566           hit_eof (dtp);
567         }
568       return;
569     }
570
571   if (dtp->u.p.current_unit->flags.access == ACCESS_DIRECT)
572     {
573       if (dtp->u.p.current_unit->bytes_left < (gfc_offset) nbytes)
574         {
575           short_record = 1;
576           to_read_record = dtp->u.p.current_unit->bytes_left;
577           nbytes = to_read_record;
578         }
579       else
580         {
581           short_record = 0;
582           to_read_record = nbytes;
583         }
584
585       dtp->u.p.current_unit->bytes_left -= to_read_record;
586
587       to_read_record = sread (dtp->u.p.current_unit->s, buf, to_read_record);
588       if (unlikely (to_read_record < 0))
589         {
590           generate_error (&dtp->common, LIBERROR_OS, NULL);
591           return;
592         }
593
594       if (to_read_record != (ssize_t) nbytes)  
595         {
596           /* Short read, e.g. if we hit EOF.  Apparently, we read
597            more than was written to the last record.  */
598           return;
599         }
600
601       if (unlikely (short_record))
602         {
603           generate_error (&dtp->common, LIBERROR_SHORT_RECORD, NULL);
604         }
605       return;
606     }
607
608   /* Unformatted sequential.  We loop over the subrecords, reading
609      until the request has been fulfilled or the record has run out
610      of continuation subrecords.  */
611
612   /* Check whether we exceed the total record length.  */
613
614   if (dtp->u.p.current_unit->flags.has_recl
615       && ((gfc_offset) nbytes > dtp->u.p.current_unit->bytes_left))
616     {
617       to_read_record = dtp->u.p.current_unit->bytes_left;
618       short_record = 1;
619     }
620   else
621     {
622       to_read_record = nbytes;
623       short_record = 0;
624     }
625   have_read_record = 0;
626
627   while(1)
628     {
629       if (dtp->u.p.current_unit->bytes_left_subrecord
630           < (gfc_offset) to_read_record)
631         {
632           to_read_subrecord = dtp->u.p.current_unit->bytes_left_subrecord;
633           to_read_record -= to_read_subrecord;
634         }
635       else
636         {
637           to_read_subrecord = to_read_record;
638           to_read_record = 0;
639         }
640
641       dtp->u.p.current_unit->bytes_left_subrecord -= to_read_subrecord;
642
643       have_read_subrecord = sread (dtp->u.p.current_unit->s, 
644                                    buf + have_read_record, to_read_subrecord);
645       if (unlikely (have_read_subrecord) < 0)
646         {
647           generate_error (&dtp->common, LIBERROR_OS, NULL);
648           return;
649         }
650
651       have_read_record += have_read_subrecord;
652
653       if (unlikely (to_read_subrecord != have_read_subrecord))
654         {
655           /* Short read, e.g. if we hit EOF.  This means the record
656              structure has been corrupted, or the trailing record
657              marker would still be present.  */
658
659           generate_error (&dtp->common, LIBERROR_CORRUPT_FILE, NULL);
660           return;
661         }
662
663       if (to_read_record > 0)
664         {
665           if (likely (dtp->u.p.current_unit->continued))
666             {
667               next_record_r_unf (dtp, 0);
668               us_read (dtp, 1);
669             }
670           else
671             {
672               /* Let's make sure the file position is correctly pre-positioned
673                  for the next read statement.  */
674
675               dtp->u.p.current_unit->current_record = 0;
676               next_record_r_unf (dtp, 0);
677               generate_error (&dtp->common, LIBERROR_SHORT_RECORD, NULL);
678               return;
679             }
680         }
681       else
682         {
683           /* Normal exit, the read request has been fulfilled.  */
684           break;
685         }
686     }
687
688   dtp->u.p.current_unit->bytes_left -= have_read_record;
689   if (unlikely (short_record))
690     {
691       generate_error (&dtp->common, LIBERROR_SHORT_RECORD, NULL);
692       return;
693     }
694   return;
695 }
696
697
698 /* Function for writing a block of bytes to the current file at the
699    current position, advancing the file pointer. We are given a length
700    and return a pointer to a buffer that the caller must (completely)
701    fill in.  Returns NULL on error.  */
702
703 void *
704 write_block (st_parameter_dt *dtp, int length)
705 {
706   char *dest;
707
708   if (!is_stream_io (dtp))
709     {
710       if (dtp->u.p.current_unit->bytes_left < (gfc_offset) length)
711         {
712           /* For preconnected units with default record length, set bytes left
713              to unit record length and proceed, otherwise error.  */
714           if (likely ((dtp->u.p.current_unit->unit_number
715                        == options.stdout_unit
716                        || dtp->u.p.current_unit->unit_number
717                        == options.stderr_unit)
718                       && dtp->u.p.current_unit->recl == DEFAULT_RECL))
719             dtp->u.p.current_unit->bytes_left = dtp->u.p.current_unit->recl;
720           else
721             {
722               generate_error (&dtp->common, LIBERROR_EOR, NULL);
723               return NULL;
724             }
725         }
726
727       dtp->u.p.current_unit->bytes_left -= (gfc_offset) length;
728     }
729
730   if (is_internal_unit (dtp))
731     {
732       if (dtp->common.unit) /* char4 internel unit.  */
733         {
734           gfc_char4_t *dest4;
735           dest4 = mem_alloc_w4 (dtp->u.p.current_unit->s, &length);
736           if (dest4 == NULL)
737           {
738             generate_error (&dtp->common, LIBERROR_END, NULL);
739             return NULL;
740           }
741           return dest4;
742         }
743       else
744         dest = mem_alloc_w (dtp->u.p.current_unit->s, &length);
745
746       if (dest == NULL)
747         {
748           generate_error (&dtp->common, LIBERROR_END, NULL);
749           return NULL;
750         }
751
752       if (unlikely (dtp->u.p.current_unit->endfile == AT_ENDFILE))
753         generate_error (&dtp->common, LIBERROR_END, NULL);
754     }
755   else
756     {
757       dest = fbuf_alloc (dtp->u.p.current_unit, length);
758       if (dest == NULL)
759         {
760           generate_error (&dtp->common, LIBERROR_OS, NULL);
761           return NULL;
762         }
763     }
764     
765   if ((dtp->common.flags & IOPARM_DT_HAS_SIZE) != 0)
766     dtp->u.p.size_used += (GFC_IO_INT) length;
767
768   dtp->u.p.current_unit->strm_pos += (gfc_offset) length;
769
770   return dest;
771 }
772
773
774 /* High level interface to swrite(), taking care of errors.  This is only
775    called for unformatted files.  There are three cases to consider:
776    Stream I/O, unformatted direct, unformatted sequential.  */
777
778 static try
779 write_buf (st_parameter_dt *dtp, void *buf, size_t nbytes)
780 {
781
782   ssize_t have_written;
783   ssize_t to_write_subrecord;
784   int short_record;
785
786   /* Stream I/O.  */
787
788   if (is_stream_io (dtp))
789     {
790       have_written = swrite (dtp->u.p.current_unit->s, buf, nbytes);
791       if (unlikely (have_written < 0))
792         {
793           generate_error (&dtp->common, LIBERROR_OS, NULL);
794           return FAILURE;
795         }
796
797       dtp->u.p.current_unit->strm_pos += (gfc_offset) have_written; 
798
799       return SUCCESS;
800     }
801
802   /* Unformatted direct access.  */
803
804   if (dtp->u.p.current_unit->flags.access == ACCESS_DIRECT)
805     {
806       if (unlikely (dtp->u.p.current_unit->bytes_left < (gfc_offset) nbytes))
807         {
808           generate_error (&dtp->common, LIBERROR_DIRECT_EOR, NULL);
809           return FAILURE;
810         }
811
812       if (buf == NULL && nbytes == 0)
813         return SUCCESS;
814
815       have_written = swrite (dtp->u.p.current_unit->s, buf, nbytes); 
816       if (unlikely (have_written < 0))
817         {
818           generate_error (&dtp->common, LIBERROR_OS, NULL);
819           return FAILURE;
820         }
821
822       dtp->u.p.current_unit->strm_pos += (gfc_offset) have_written;
823       dtp->u.p.current_unit->bytes_left -= (gfc_offset) have_written;
824
825       return SUCCESS;
826     }
827
828   /* Unformatted sequential.  */
829
830   have_written = 0;
831
832   if (dtp->u.p.current_unit->flags.has_recl
833       && (gfc_offset) nbytes > dtp->u.p.current_unit->bytes_left)
834     {
835       nbytes = dtp->u.p.current_unit->bytes_left;
836       short_record = 1;
837     }
838   else
839     {
840       short_record = 0;
841     }
842
843   while (1)
844     {
845
846       to_write_subrecord =
847         (size_t) dtp->u.p.current_unit->bytes_left_subrecord < nbytes ?
848         (size_t) dtp->u.p.current_unit->bytes_left_subrecord : nbytes;
849
850       dtp->u.p.current_unit->bytes_left_subrecord -=
851         (gfc_offset) to_write_subrecord;
852
853       to_write_subrecord = swrite (dtp->u.p.current_unit->s, 
854                                    buf + have_written, to_write_subrecord);
855       if (unlikely (to_write_subrecord < 0))
856         {
857           generate_error (&dtp->common, LIBERROR_OS, NULL);
858           return FAILURE;
859         }
860
861       dtp->u.p.current_unit->strm_pos += (gfc_offset) to_write_subrecord; 
862       nbytes -= to_write_subrecord;
863       have_written += to_write_subrecord;
864
865       if (nbytes == 0)
866         break;
867
868       next_record_w_unf (dtp, 1);
869       us_write (dtp, 1);
870     }
871   dtp->u.p.current_unit->bytes_left -= have_written;
872   if (unlikely (short_record))
873     {
874       generate_error (&dtp->common, LIBERROR_SHORT_RECORD, NULL);
875       return FAILURE;
876     }
877   return SUCCESS;
878 }
879
880
881 /* Master function for unformatted reads.  */
882
883 static void
884 unformatted_read (st_parameter_dt *dtp, bt type,
885                   void *dest, int kind, size_t size, size_t nelems)
886 {
887   if (likely (dtp->u.p.current_unit->flags.convert == GFC_CONVERT_NATIVE)
888       || kind == 1)
889     {
890       if (type == BT_CHARACTER)
891         size *= GFC_SIZE_OF_CHAR_KIND(kind);
892       read_block_direct (dtp, dest, size * nelems);
893     }
894   else
895     {
896       char buffer[16];
897       char *p;
898       size_t i;
899
900       p = dest;
901
902       /* Handle wide chracters.  */
903       if (type == BT_CHARACTER && kind != 1)
904         {
905           nelems *= size;
906           size = kind;
907         }
908
909       /* Break up complex into its constituent reals.  */
910       if (type == BT_COMPLEX)
911         {
912           nelems *= 2;
913           size /= 2;
914         }
915       
916       /* By now, all complex variables have been split into their
917          constituent reals.  */
918       
919       for (i = 0; i < nelems; i++)
920         {
921           read_block_direct (dtp, buffer, size);
922           reverse_memcpy (p, buffer, size);
923           p += size;
924         }
925     }
926 }
927
928
929 /* Master function for unformatted writes.  NOTE: For kind=10 the size is 16
930    bytes on 64 bit machines.  The unused bytes are not initialized and never
931    used, which can show an error with memory checking analyzers like
932    valgrind.  */
933
934 static void
935 unformatted_write (st_parameter_dt *dtp, bt type,
936                    void *source, int kind, size_t size, size_t nelems)
937 {
938   if (likely (dtp->u.p.current_unit->flags.convert == GFC_CONVERT_NATIVE) 
939       || kind == 1)
940     {
941       size_t stride = type == BT_CHARACTER ?
942                   size * GFC_SIZE_OF_CHAR_KIND(kind) : size;
943
944       write_buf (dtp, source, stride * nelems);
945     }
946   else
947     {
948       char buffer[16];
949       char *p;
950       size_t i;
951
952       p = source;
953
954       /* Handle wide chracters.  */
955       if (type == BT_CHARACTER && kind != 1)
956         {
957           nelems *= size;
958           size = kind;
959         }
960   
961       /* Break up complex into its constituent reals.  */
962       if (type == BT_COMPLEX)
963         {
964           nelems *= 2;
965           size /= 2;
966         }      
967
968       /* By now, all complex variables have been split into their
969          constituent reals.  */
970
971       for (i = 0; i < nelems; i++)
972         {
973           reverse_memcpy(buffer, p, size);
974           p += size;
975           write_buf (dtp, buffer, size);
976         }
977     }
978 }
979
980
981 /* Return a pointer to the name of a type.  */
982
983 const char *
984 type_name (bt type)
985 {
986   const char *p;
987
988   switch (type)
989     {
990     case BT_INTEGER:
991       p = "INTEGER";
992       break;
993     case BT_LOGICAL:
994       p = "LOGICAL";
995       break;
996     case BT_CHARACTER:
997       p = "CHARACTER";
998       break;
999     case BT_REAL:
1000       p = "REAL";
1001       break;
1002     case BT_COMPLEX:
1003       p = "COMPLEX";
1004       break;
1005     default:
1006       internal_error (NULL, "type_name(): Bad type");
1007     }
1008
1009   return p;
1010 }
1011
1012
1013 /* Write a constant string to the output.
1014    This is complicated because the string can have doubled delimiters
1015    in it.  The length in the format node is the true length.  */
1016
1017 static void
1018 write_constant_string (st_parameter_dt *dtp, const fnode *f)
1019 {
1020   char c, delimiter, *p, *q;
1021   int length; 
1022
1023   length = f->u.string.length;
1024   if (length == 0)
1025     return;
1026
1027   p = write_block (dtp, length);
1028   if (p == NULL)
1029     return;
1030     
1031   q = f->u.string.p;
1032   delimiter = q[-1];
1033
1034   for (; length > 0; length--)
1035     {
1036       c = *p++ = *q++;
1037       if (c == delimiter && c != 'H' && c != 'h')
1038         q++;                    /* Skip the doubled delimiter.  */
1039     }
1040 }
1041
1042
1043 /* Given actual and expected types in a formatted data transfer, make
1044    sure they agree.  If not, an error message is generated.  Returns
1045    nonzero if something went wrong.  */
1046
1047 static int
1048 require_type (st_parameter_dt *dtp, bt expected, bt actual, const fnode *f)
1049 {
1050 #define BUFLEN 100
1051   char buffer[BUFLEN];
1052
1053   if (actual == expected)
1054     return 0;
1055
1056   /* Adjust item_count before emitting error message.  */
1057   snprintf (buffer, BUFLEN, 
1058             "Expected %s for item %d in formatted transfer, got %s",
1059            type_name (expected), dtp->u.p.item_count - 1, type_name (actual));
1060
1061   format_error (dtp, f, buffer);
1062   return 1;
1063 }
1064
1065
1066 static int
1067 require_numeric_type (st_parameter_dt *dtp, bt actual, const fnode *f)
1068 {
1069 #define BUFLEN 100
1070   char buffer[BUFLEN];
1071
1072   if (actual == BT_INTEGER || actual == BT_REAL || actual == BT_COMPLEX)
1073     return 0;
1074
1075   /* Adjust item_count before emitting error message.  */
1076   snprintf (buffer, BUFLEN, 
1077             "Expected numeric type for item %d in formatted transfer, got %s",
1078             dtp->u.p.item_count - 1, type_name (actual));
1079
1080   format_error (dtp, f, buffer);
1081   return 1;
1082 }
1083
1084
1085 /* This function is in the main loop for a formatted data transfer
1086    statement.  It would be natural to implement this as a coroutine
1087    with the user program, but C makes that awkward.  We loop,
1088    processing format elements.  When we actually have to transfer
1089    data instead of just setting flags, we return control to the user
1090    program which calls a function that supplies the address and type
1091    of the next element, then comes back here to process it.  */
1092
1093 static void
1094 formatted_transfer_scalar_read (st_parameter_dt *dtp, bt type, void *p, int kind,
1095                                 size_t size)
1096 {
1097   int pos, bytes_used;
1098   const fnode *f;
1099   format_token t;
1100   int n;
1101   int consume_data_flag;
1102
1103   /* Change a complex data item into a pair of reals.  */
1104
1105   n = (p == NULL) ? 0 : ((type != BT_COMPLEX) ? 1 : 2);
1106   if (type == BT_COMPLEX)
1107     {
1108       type = BT_REAL;
1109       size /= 2;
1110     }
1111
1112   /* If there's an EOR condition, we simulate finalizing the transfer
1113      by doing nothing.  */
1114   if (dtp->u.p.eor_condition)
1115     return;
1116
1117   /* Set this flag so that commas in reads cause the read to complete before
1118      the entire field has been read.  The next read field will start right after
1119      the comma in the stream.  (Set to 0 for character reads).  */
1120   dtp->u.p.sf_read_comma =
1121     dtp->u.p.current_unit->decimal_status == DECIMAL_COMMA ? 0 : 1;
1122
1123   for (;;)
1124     {
1125       /* If reversion has occurred and there is another real data item,
1126          then we have to move to the next record.  */
1127       if (dtp->u.p.reversion_flag && n > 0)
1128         {
1129           dtp->u.p.reversion_flag = 0;
1130           next_record (dtp, 0);
1131         }
1132
1133       consume_data_flag = 1;
1134       if ((dtp->common.flags & IOPARM_LIBRETURN_MASK) != IOPARM_LIBRETURN_OK)
1135         break;
1136
1137       f = next_format (dtp);
1138       if (f == NULL)
1139         {
1140           /* No data descriptors left.  */
1141           if (unlikely (n > 0))
1142             generate_error (&dtp->common, LIBERROR_FORMAT,
1143                 "Insufficient data descriptors in format after reversion");
1144           return;
1145         }
1146
1147       t = f->format;
1148
1149       bytes_used = (int)(dtp->u.p.current_unit->recl
1150                    - dtp->u.p.current_unit->bytes_left);
1151
1152       if (is_stream_io(dtp))
1153         bytes_used = 0;
1154
1155       switch (t)
1156         {
1157         case FMT_I:
1158           if (n == 0)
1159             goto need_read_data;
1160           if (require_type (dtp, BT_INTEGER, type, f))
1161             return;
1162           read_decimal (dtp, f, p, kind);
1163           break;
1164
1165         case FMT_B:
1166           if (n == 0)
1167             goto need_read_data;
1168           if (!(compile_options.allow_std & GFC_STD_GNU)
1169               && require_numeric_type (dtp, type, f))
1170             return;
1171           if (!(compile_options.allow_std & GFC_STD_F2008)
1172               && require_type (dtp, BT_INTEGER, type, f))
1173             return;
1174           read_radix (dtp, f, p, kind, 2);
1175           break;
1176
1177         case FMT_O:
1178           if (n == 0)
1179             goto need_read_data; 
1180           if (!(compile_options.allow_std & GFC_STD_GNU)
1181               && require_numeric_type (dtp, type, f))
1182             return;
1183           if (!(compile_options.allow_std & GFC_STD_F2008)
1184               && require_type (dtp, BT_INTEGER, type, f))
1185             return;
1186           read_radix (dtp, f, p, kind, 8);
1187           break;
1188
1189         case FMT_Z:
1190           if (n == 0)
1191             goto need_read_data;
1192           if (!(compile_options.allow_std & GFC_STD_GNU)
1193               && require_numeric_type (dtp, type, f))
1194             return;
1195           if (!(compile_options.allow_std & GFC_STD_F2008)
1196               && require_type (dtp, BT_INTEGER, type, f))
1197             return;
1198           read_radix (dtp, f, p, kind, 16);
1199           break;
1200
1201         case FMT_A:
1202           if (n == 0)
1203             goto need_read_data;
1204
1205           /* It is possible to have FMT_A with something not BT_CHARACTER such
1206              as when writing out hollerith strings, so check both type
1207              and kind before calling wide character routines.  */
1208           if (type == BT_CHARACTER && kind == 4)
1209             read_a_char4 (dtp, f, p, size);
1210           else
1211             read_a (dtp, f, p, size);
1212           break;
1213
1214         case FMT_L:
1215           if (n == 0)
1216             goto need_read_data;
1217           read_l (dtp, f, p, kind);
1218           break;
1219
1220         case FMT_D:
1221           if (n == 0)
1222             goto need_read_data;
1223           if (require_type (dtp, BT_REAL, type, f))
1224             return;
1225           read_f (dtp, f, p, kind);
1226           break;
1227
1228         case FMT_E:
1229           if (n == 0)
1230             goto need_read_data;
1231           if (require_type (dtp, BT_REAL, type, f))
1232             return;
1233           read_f (dtp, f, p, kind);
1234           break;
1235
1236         case FMT_EN:
1237           if (n == 0)
1238             goto need_read_data;
1239           if (require_type (dtp, BT_REAL, type, f))
1240             return;
1241           read_f (dtp, f, p, kind);
1242           break;
1243
1244         case FMT_ES:
1245           if (n == 0)
1246             goto need_read_data;
1247           if (require_type (dtp, BT_REAL, type, f))
1248             return;
1249           read_f (dtp, f, p, kind);
1250           break;
1251
1252         case FMT_F:
1253           if (n == 0)
1254             goto need_read_data;
1255           if (require_type (dtp, BT_REAL, type, f))
1256             return;
1257           read_f (dtp, f, p, kind);
1258           break;
1259
1260         case FMT_G:
1261           if (n == 0)
1262             goto need_read_data;
1263           switch (type)
1264             {
1265               case BT_INTEGER:
1266                 read_decimal (dtp, f, p, kind);
1267                 break;
1268               case BT_LOGICAL:
1269                 read_l (dtp, f, p, kind);
1270                 break;
1271               case BT_CHARACTER:
1272                 if (kind == 4)
1273                   read_a_char4 (dtp, f, p, size);
1274                 else
1275                   read_a (dtp, f, p, size);
1276                 break;
1277               case BT_REAL:
1278                 read_f (dtp, f, p, kind);
1279                 break;
1280               default:
1281                 internal_error (&dtp->common, "formatted_transfer(): Bad type");
1282             }
1283           break;
1284
1285         case FMT_STRING:
1286           consume_data_flag = 0;
1287           format_error (dtp, f, "Constant string in input format");
1288           return;
1289
1290         /* Format codes that don't transfer data.  */
1291         case FMT_X:
1292         case FMT_TR:
1293           consume_data_flag = 0;
1294           dtp->u.p.skips += f->u.n;
1295           pos = bytes_used + dtp->u.p.skips - 1;
1296           dtp->u.p.pending_spaces = pos - dtp->u.p.max_pos + 1;
1297           read_x (dtp, f->u.n);
1298           break;
1299
1300         case FMT_TL:
1301         case FMT_T:
1302           consume_data_flag = 0;
1303
1304           if (f->format == FMT_TL)
1305             {
1306               /* Handle the special case when no bytes have been used yet.
1307                  Cannot go below zero. */
1308               if (bytes_used == 0)
1309                 {
1310                   dtp->u.p.pending_spaces -= f->u.n;
1311                   dtp->u.p.skips -= f->u.n;
1312                   dtp->u.p.skips = dtp->u.p.skips < 0 ? 0 : dtp->u.p.skips;
1313                 }
1314
1315               pos = bytes_used - f->u.n;
1316             }
1317           else /* FMT_T */
1318             pos = f->u.n - 1;
1319
1320           /* Standard 10.6.1.1: excessive left tabbing is reset to the
1321              left tab limit.  We do not check if the position has gone
1322              beyond the end of record because a subsequent tab could
1323              bring us back again.  */
1324           pos = pos < 0 ? 0 : pos;
1325
1326           dtp->u.p.skips = dtp->u.p.skips + pos - bytes_used;
1327           dtp->u.p.pending_spaces = dtp->u.p.pending_spaces
1328                                     + pos - dtp->u.p.max_pos;
1329           dtp->u.p.pending_spaces = dtp->u.p.pending_spaces < 0
1330                                     ? 0 : dtp->u.p.pending_spaces;
1331           if (dtp->u.p.skips == 0)
1332             break;
1333
1334           /* Adjust everything for end-of-record condition */
1335           if (dtp->u.p.sf_seen_eor && !is_internal_unit (dtp))
1336             {
1337               dtp->u.p.current_unit->bytes_left -= dtp->u.p.sf_seen_eor;
1338               dtp->u.p.skips -= dtp->u.p.sf_seen_eor;
1339               bytes_used = pos;
1340               dtp->u.p.sf_seen_eor = 0;
1341             }
1342           if (dtp->u.p.skips < 0)
1343             {
1344               if (is_internal_unit (dtp))  
1345                 sseek (dtp->u.p.current_unit->s, dtp->u.p.skips, SEEK_CUR);
1346               else
1347                 fbuf_seek (dtp->u.p.current_unit, dtp->u.p.skips, SEEK_CUR);
1348               dtp->u.p.current_unit->bytes_left -= (gfc_offset) dtp->u.p.skips;
1349               dtp->u.p.skips = dtp->u.p.pending_spaces = 0;
1350             }
1351           else
1352             read_x (dtp, dtp->u.p.skips);
1353           break;
1354
1355         case FMT_S:
1356           consume_data_flag = 0;
1357           dtp->u.p.sign_status = SIGN_S;
1358           break;
1359
1360         case FMT_SS:
1361           consume_data_flag = 0;
1362           dtp->u.p.sign_status = SIGN_SS;
1363           break;
1364
1365         case FMT_SP:
1366           consume_data_flag = 0;
1367           dtp->u.p.sign_status = SIGN_SP;
1368           break;
1369
1370         case FMT_BN:
1371           consume_data_flag = 0 ;
1372           dtp->u.p.blank_status = BLANK_NULL;
1373           break;
1374
1375         case FMT_BZ:
1376           consume_data_flag = 0;
1377           dtp->u.p.blank_status = BLANK_ZERO;
1378           break;
1379
1380         case FMT_DC:
1381           consume_data_flag = 0;
1382           dtp->u.p.current_unit->decimal_status = DECIMAL_COMMA;
1383           break;
1384
1385         case FMT_DP:
1386           consume_data_flag = 0;
1387           dtp->u.p.current_unit->decimal_status = DECIMAL_POINT;
1388           break;
1389
1390         case FMT_RC:
1391           consume_data_flag = 0;
1392           dtp->u.p.current_unit->round_status = ROUND_COMPATIBLE;
1393           break;
1394
1395         case FMT_RD:
1396           consume_data_flag = 0;
1397           dtp->u.p.current_unit->round_status = ROUND_DOWN;
1398           break;
1399
1400         case FMT_RN:
1401           consume_data_flag = 0;
1402           dtp->u.p.current_unit->round_status = ROUND_NEAREST;
1403           break;
1404
1405         case FMT_RP:
1406           consume_data_flag = 0;
1407           dtp->u.p.current_unit->round_status = ROUND_PROCDEFINED;
1408           break;
1409
1410         case FMT_RU:
1411           consume_data_flag = 0;
1412           dtp->u.p.current_unit->round_status = ROUND_UP;
1413           break;
1414
1415         case FMT_RZ:
1416           consume_data_flag = 0;
1417           dtp->u.p.current_unit->round_status = ROUND_ZERO;
1418           break;
1419
1420         case FMT_P:
1421           consume_data_flag = 0;
1422           dtp->u.p.scale_factor = f->u.k;
1423           break;
1424
1425         case FMT_DOLLAR:
1426           consume_data_flag = 0;
1427           dtp->u.p.seen_dollar = 1;
1428           break;
1429
1430         case FMT_SLASH:
1431           consume_data_flag = 0;
1432           dtp->u.p.skips = dtp->u.p.pending_spaces = 0;
1433           next_record (dtp, 0);
1434           break;
1435
1436         case FMT_COLON:
1437           /* A colon descriptor causes us to exit this loop (in
1438              particular preventing another / descriptor from being
1439              processed) unless there is another data item to be
1440              transferred.  */
1441           consume_data_flag = 0;
1442           if (n == 0)
1443             return;
1444           break;
1445
1446         default:
1447           internal_error (&dtp->common, "Bad format node");
1448         }
1449
1450       /* Adjust the item count and data pointer.  */
1451
1452       if ((consume_data_flag > 0) && (n > 0))
1453         {
1454           n--;
1455           p = ((char *) p) + size;
1456         }
1457
1458       dtp->u.p.skips = 0;
1459
1460       pos = (int)(dtp->u.p.current_unit->recl - dtp->u.p.current_unit->bytes_left);
1461       dtp->u.p.max_pos = (dtp->u.p.max_pos > pos) ? dtp->u.p.max_pos : pos;
1462     }
1463
1464   return;
1465
1466   /* Come here when we need a data descriptor but don't have one.  We
1467      push the current format node back onto the input, then return and
1468      let the user program call us back with the data.  */
1469  need_read_data:
1470   unget_format (dtp, f);
1471 }
1472
1473
1474 static void
1475 formatted_transfer_scalar_write (st_parameter_dt *dtp, bt type, void *p, int kind,
1476                                  size_t size)
1477 {
1478   int pos, bytes_used;
1479   const fnode *f;
1480   format_token t;
1481   int n;
1482   int consume_data_flag;
1483
1484   /* Change a complex data item into a pair of reals.  */
1485
1486   n = (p == NULL) ? 0 : ((type != BT_COMPLEX) ? 1 : 2);
1487   if (type == BT_COMPLEX)
1488     {
1489       type = BT_REAL;
1490       size /= 2;
1491     }
1492
1493   /* If there's an EOR condition, we simulate finalizing the transfer
1494      by doing nothing.  */
1495   if (dtp->u.p.eor_condition)
1496     return;
1497
1498   /* Set this flag so that commas in reads cause the read to complete before
1499      the entire field has been read.  The next read field will start right after
1500      the comma in the stream.  (Set to 0 for character reads).  */
1501   dtp->u.p.sf_read_comma =
1502     dtp->u.p.current_unit->decimal_status == DECIMAL_COMMA ? 0 : 1;
1503
1504   for (;;)
1505     {
1506       /* If reversion has occurred and there is another real data item,
1507          then we have to move to the next record.  */
1508       if (dtp->u.p.reversion_flag && n > 0)
1509         {
1510           dtp->u.p.reversion_flag = 0;
1511           next_record (dtp, 0);
1512         }
1513
1514       consume_data_flag = 1;
1515       if ((dtp->common.flags & IOPARM_LIBRETURN_MASK) != IOPARM_LIBRETURN_OK)
1516         break;
1517
1518       f = next_format (dtp);
1519       if (f == NULL)
1520         {
1521           /* No data descriptors left.  */
1522           if (unlikely (n > 0))
1523             generate_error (&dtp->common, LIBERROR_FORMAT,
1524                 "Insufficient data descriptors in format after reversion");
1525           return;
1526         }
1527
1528       /* Now discharge T, TR and X movements to the right.  This is delayed
1529          until a data producing format to suppress trailing spaces.  */
1530          
1531       t = f->format;
1532       if (dtp->u.p.mode == WRITING && dtp->u.p.skips != 0
1533         && ((n>0 && (  t == FMT_I  || t == FMT_B  || t == FMT_O
1534                     || t == FMT_Z  || t == FMT_F  || t == FMT_E
1535                     || t == FMT_EN || t == FMT_ES || t == FMT_G
1536                     || t == FMT_L  || t == FMT_A  || t == FMT_D))
1537             || t == FMT_STRING))
1538         {
1539           if (dtp->u.p.skips > 0)
1540             {
1541               int tmp;
1542               write_x (dtp, dtp->u.p.skips, dtp->u.p.pending_spaces);
1543               tmp = (int)(dtp->u.p.current_unit->recl
1544                           - dtp->u.p.current_unit->bytes_left);
1545               dtp->u.p.max_pos = 
1546                 dtp->u.p.max_pos > tmp ? dtp->u.p.max_pos : tmp;
1547             }
1548           if (dtp->u.p.skips < 0)
1549             {
1550               if (is_internal_unit (dtp))  
1551                 sseek (dtp->u.p.current_unit->s, dtp->u.p.skips, SEEK_CUR);
1552               else
1553                 fbuf_seek (dtp->u.p.current_unit, dtp->u.p.skips, SEEK_CUR);
1554               dtp->u.p.current_unit->bytes_left -= (gfc_offset) dtp->u.p.skips;
1555             }
1556           dtp->u.p.skips = dtp->u.p.pending_spaces = 0;
1557         }
1558
1559       bytes_used = (int)(dtp->u.p.current_unit->recl
1560                    - dtp->u.p.current_unit->bytes_left);
1561
1562       if (is_stream_io(dtp))
1563         bytes_used = 0;
1564
1565       switch (t)
1566         {
1567         case FMT_I:
1568           if (n == 0)
1569             goto need_data;
1570           if (require_type (dtp, BT_INTEGER, type, f))
1571             return;
1572           write_i (dtp, f, p, kind);
1573           break;
1574
1575         case FMT_B:
1576           if (n == 0)
1577             goto need_data;
1578           if (!(compile_options.allow_std & GFC_STD_GNU)
1579               && require_numeric_type (dtp, type, f))
1580             return;
1581           if (!(compile_options.allow_std & GFC_STD_F2008)
1582               && require_type (dtp, BT_INTEGER, type, f))
1583             return;
1584           write_b (dtp, f, p, kind);
1585           break;
1586
1587         case FMT_O:
1588           if (n == 0)
1589             goto need_data; 
1590           if (!(compile_options.allow_std & GFC_STD_GNU)
1591               && require_numeric_type (dtp, type, f))
1592             return;
1593           if (!(compile_options.allow_std & GFC_STD_F2008)
1594               && require_type (dtp, BT_INTEGER, type, f))
1595             return;
1596           write_o (dtp, f, p, kind);
1597           break;
1598
1599         case FMT_Z:
1600           if (n == 0)
1601             goto need_data;
1602           if (!(compile_options.allow_std & GFC_STD_GNU)
1603               && require_numeric_type (dtp, type, f))
1604             return;
1605           if (!(compile_options.allow_std & GFC_STD_F2008)
1606               && require_type (dtp, BT_INTEGER, type, f))
1607             return;
1608           write_z (dtp, f, p, kind);
1609           break;
1610
1611         case FMT_A:
1612           if (n == 0)
1613             goto need_data;
1614
1615           /* It is possible to have FMT_A with something not BT_CHARACTER such
1616              as when writing out hollerith strings, so check both type
1617              and kind before calling wide character routines.  */
1618           if (type == BT_CHARACTER && kind == 4)
1619             write_a_char4 (dtp, f, p, size);
1620           else
1621             write_a (dtp, f, p, size);
1622           break;
1623
1624         case FMT_L:
1625           if (n == 0)
1626             goto need_data;
1627           write_l (dtp, f, p, kind);
1628           break;
1629
1630         case FMT_D:
1631           if (n == 0)
1632             goto need_data;
1633           if (require_type (dtp, BT_REAL, type, f))
1634             return;
1635           write_d (dtp, f, p, kind);
1636           break;
1637
1638         case FMT_E:
1639           if (n == 0)
1640             goto need_data;
1641           if (require_type (dtp, BT_REAL, type, f))
1642             return;
1643           write_e (dtp, f, p, kind);
1644           break;
1645
1646         case FMT_EN:
1647           if (n == 0)
1648             goto need_data;
1649           if (require_type (dtp, BT_REAL, type, f))
1650             return;
1651           write_en (dtp, f, p, kind);
1652           break;
1653
1654         case FMT_ES:
1655           if (n == 0)
1656             goto need_data;
1657           if (require_type (dtp, BT_REAL, type, f))
1658             return;
1659           write_es (dtp, f, p, kind);
1660           break;
1661
1662         case FMT_F:
1663           if (n == 0)
1664             goto need_data;
1665           if (require_type (dtp, BT_REAL, type, f))
1666             return;
1667           write_f (dtp, f, p, kind);
1668           break;
1669
1670         case FMT_G:
1671           if (n == 0)
1672             goto need_data;
1673           switch (type)
1674             {
1675               case BT_INTEGER:
1676                 write_i (dtp, f, p, kind);
1677                 break;
1678               case BT_LOGICAL:
1679                 write_l (dtp, f, p, kind);
1680                 break;
1681               case BT_CHARACTER:
1682                 if (kind == 4)
1683                   write_a_char4 (dtp, f, p, size);
1684                 else
1685                   write_a (dtp, f, p, size);
1686                 break;
1687               case BT_REAL:
1688                 if (f->u.real.w == 0)
1689                   write_real_g0 (dtp, p, kind, f->u.real.d);
1690                 else
1691                   write_d (dtp, f, p, kind);
1692                 break;
1693               default:
1694                 internal_error (&dtp->common,
1695                                 "formatted_transfer(): Bad type");
1696             }
1697           break;
1698
1699         case FMT_STRING:
1700           consume_data_flag = 0;
1701           write_constant_string (dtp, f);
1702           break;
1703
1704         /* Format codes that don't transfer data.  */
1705         case FMT_X:
1706         case FMT_TR:
1707           consume_data_flag = 0;
1708
1709           dtp->u.p.skips += f->u.n;
1710           pos = bytes_used + dtp->u.p.skips - 1;
1711           dtp->u.p.pending_spaces = pos - dtp->u.p.max_pos + 1;
1712           /* Writes occur just before the switch on f->format, above, so
1713              that trailing blanks are suppressed, unless we are doing a
1714              non-advancing write in which case we want to output the blanks
1715              now.  */
1716           if (dtp->u.p.advance_status == ADVANCE_NO)
1717             {
1718               write_x (dtp, dtp->u.p.skips, dtp->u.p.pending_spaces);
1719               dtp->u.p.skips = dtp->u.p.pending_spaces = 0;
1720             }
1721           break;
1722
1723         case FMT_TL:
1724         case FMT_T:
1725           consume_data_flag = 0;
1726
1727           if (f->format == FMT_TL)
1728             {
1729
1730               /* Handle the special case when no bytes have been used yet.
1731                  Cannot go below zero. */
1732               if (bytes_used == 0)
1733                 {
1734                   dtp->u.p.pending_spaces -= f->u.n;
1735                   dtp->u.p.skips -= f->u.n;
1736                   dtp->u.p.skips = dtp->u.p.skips < 0 ? 0 : dtp->u.p.skips;
1737                 }
1738
1739               pos = bytes_used - f->u.n;
1740             }
1741           else /* FMT_T */
1742             pos = f->u.n - dtp->u.p.pending_spaces - 1;
1743
1744           /* Standard 10.6.1.1: excessive left tabbing is reset to the
1745              left tab limit.  We do not check if the position has gone
1746              beyond the end of record because a subsequent tab could
1747              bring us back again.  */
1748           pos = pos < 0 ? 0 : pos;
1749
1750           dtp->u.p.skips = dtp->u.p.skips + pos - bytes_used;
1751           dtp->u.p.pending_spaces = dtp->u.p.pending_spaces
1752                                     + pos - dtp->u.p.max_pos;
1753           dtp->u.p.pending_spaces = dtp->u.p.pending_spaces < 0
1754                                     ? 0 : dtp->u.p.pending_spaces;
1755           break;
1756
1757         case FMT_S:
1758           consume_data_flag = 0;
1759           dtp->u.p.sign_status = SIGN_S;
1760           break;
1761
1762         case FMT_SS:
1763           consume_data_flag = 0;
1764           dtp->u.p.sign_status = SIGN_SS;
1765           break;
1766
1767         case FMT_SP:
1768           consume_data_flag = 0;
1769           dtp->u.p.sign_status = SIGN_SP;
1770           break;
1771
1772         case FMT_BN:
1773           consume_data_flag = 0 ;
1774           dtp->u.p.blank_status = BLANK_NULL;
1775           break;
1776
1777         case FMT_BZ:
1778           consume_data_flag = 0;
1779           dtp->u.p.blank_status = BLANK_ZERO;
1780           break;
1781
1782         case FMT_DC:
1783           consume_data_flag = 0;
1784           dtp->u.p.current_unit->decimal_status = DECIMAL_COMMA;
1785           break;
1786
1787         case FMT_DP:
1788           consume_data_flag = 0;
1789           dtp->u.p.current_unit->decimal_status = DECIMAL_POINT;
1790           break;
1791
1792         case FMT_RC:
1793           consume_data_flag = 0;
1794           dtp->u.p.current_unit->round_status = ROUND_COMPATIBLE;
1795           break;
1796
1797         case FMT_RD:
1798           consume_data_flag = 0;
1799           dtp->u.p.current_unit->round_status = ROUND_DOWN;
1800           break;
1801
1802         case FMT_RN:
1803           consume_data_flag = 0;
1804           dtp->u.p.current_unit->round_status = ROUND_NEAREST;
1805           break;
1806
1807         case FMT_RP:
1808           consume_data_flag = 0;
1809           dtp->u.p.current_unit->round_status = ROUND_PROCDEFINED;
1810           break;
1811
1812         case FMT_RU:
1813           consume_data_flag = 0;
1814           dtp->u.p.current_unit->round_status = ROUND_UP;
1815           break;
1816
1817         case FMT_RZ:
1818           consume_data_flag = 0;
1819           dtp->u.p.current_unit->round_status = ROUND_ZERO;
1820           break;
1821
1822         case FMT_P:
1823           consume_data_flag = 0;
1824           dtp->u.p.scale_factor = f->u.k;
1825           break;
1826
1827         case FMT_DOLLAR:
1828           consume_data_flag = 0;
1829           dtp->u.p.seen_dollar = 1;
1830           break;
1831
1832         case FMT_SLASH:
1833           consume_data_flag = 0;
1834           dtp->u.p.skips = dtp->u.p.pending_spaces = 0;
1835           next_record (dtp, 0);
1836           break;
1837
1838         case FMT_COLON:
1839           /* A colon descriptor causes us to exit this loop (in
1840              particular preventing another / descriptor from being
1841              processed) unless there is another data item to be
1842              transferred.  */
1843           consume_data_flag = 0;
1844           if (n == 0)
1845             return;
1846           break;
1847
1848         default:
1849           internal_error (&dtp->common, "Bad format node");
1850         }
1851
1852       /* Adjust the item count and data pointer.  */
1853
1854       if ((consume_data_flag > 0) && (n > 0))
1855         {
1856           n--;
1857           p = ((char *) p) + size;
1858         }
1859
1860       pos = (int)(dtp->u.p.current_unit->recl - dtp->u.p.current_unit->bytes_left);
1861       dtp->u.p.max_pos = (dtp->u.p.max_pos > pos) ? dtp->u.p.max_pos : pos;
1862     }
1863
1864   return;
1865
1866   /* Come here when we need a data descriptor but don't have one.  We
1867      push the current format node back onto the input, then return and
1868      let the user program call us back with the data.  */
1869  need_data:
1870   unget_format (dtp, f);
1871 }
1872
1873   /* This function is first called from data_init_transfer to initiate the loop
1874      over each item in the format, transferring data as required.  Subsequent
1875      calls to this function occur for each data item foound in the READ/WRITE
1876      statement.  The item_count is incremented for each call.  Since the first
1877      call is from data_transfer_init, the item_count is always one greater than
1878      the actual count number of the item being transferred.  */
1879
1880 static void
1881 formatted_transfer (st_parameter_dt *dtp, bt type, void *p, int kind,
1882                     size_t size, size_t nelems)
1883 {
1884   size_t elem;
1885   char *tmp;
1886
1887   tmp = (char *) p;
1888   size_t stride = type == BT_CHARACTER ?
1889                   size * GFC_SIZE_OF_CHAR_KIND(kind) : size;
1890   if (dtp->u.p.mode == READING)
1891     {
1892       /* Big loop over all the elements.  */
1893       for (elem = 0; elem < nelems; elem++)
1894         {
1895           dtp->u.p.item_count++;
1896           formatted_transfer_scalar_read (dtp, type, tmp + stride*elem, kind, size);
1897         }
1898     }
1899   else
1900     {
1901       /* Big loop over all the elements.  */
1902       for (elem = 0; elem < nelems; elem++)
1903         {
1904           dtp->u.p.item_count++;
1905           formatted_transfer_scalar_write (dtp, type, tmp + stride*elem, kind, size);
1906         }
1907     }
1908 }
1909
1910
1911 /* Data transfer entry points.  The type of the data entity is
1912    implicit in the subroutine call.  This prevents us from having to
1913    share a common enum with the compiler.  */
1914
1915 void
1916 transfer_integer (st_parameter_dt *dtp, void *p, int kind)
1917 {
1918   if ((dtp->common.flags & IOPARM_LIBRETURN_MASK) != IOPARM_LIBRETURN_OK)
1919     return;
1920   dtp->u.p.transfer (dtp, BT_INTEGER, p, kind, kind, 1);
1921 }
1922
1923 void
1924 transfer_integer_write (st_parameter_dt *dtp, void *p, int kind)
1925 {
1926   transfer_integer (dtp, p, kind);
1927 }
1928
1929 void
1930 transfer_real (st_parameter_dt *dtp, void *p, int kind)
1931 {
1932   size_t size;
1933   if ((dtp->common.flags & IOPARM_LIBRETURN_MASK) != IOPARM_LIBRETURN_OK)
1934     return;
1935   size = size_from_real_kind (kind);
1936   dtp->u.p.transfer (dtp, BT_REAL, p, kind, size, 1);
1937 }
1938
1939 void
1940 transfer_real_write (st_parameter_dt *dtp, void *p, int kind)
1941 {
1942   transfer_real (dtp, p, kind);
1943 }
1944
1945 void
1946 transfer_logical (st_parameter_dt *dtp, void *p, int kind)
1947 {
1948   if ((dtp->common.flags & IOPARM_LIBRETURN_MASK) != IOPARM_LIBRETURN_OK)
1949     return;
1950   dtp->u.p.transfer (dtp, BT_LOGICAL, p, kind, kind, 1);
1951 }
1952
1953 void
1954 transfer_logical_write (st_parameter_dt *dtp, void *p, int kind)
1955 {
1956   transfer_logical (dtp, p, kind);
1957 }
1958
1959 void
1960 transfer_character (st_parameter_dt *dtp, void *p, int len)
1961 {
1962   static char *empty_string[0];
1963
1964   if ((dtp->common.flags & IOPARM_LIBRETURN_MASK) != IOPARM_LIBRETURN_OK)
1965     return;
1966
1967   /* Strings of zero length can have p == NULL, which confuses the
1968      transfer routines into thinking we need more data elements.  To avoid
1969      this, we give them a nice pointer.  */
1970   if (len == 0 && p == NULL)
1971     p = empty_string;
1972
1973   /* Set kind here to 1.  */
1974   dtp->u.p.transfer (dtp, BT_CHARACTER, p, 1, len, 1);
1975 }
1976
1977 void
1978 transfer_character_write (st_parameter_dt *dtp, void *p, int len)
1979 {
1980   transfer_character (dtp, p, len);
1981 }
1982
1983 void
1984 transfer_character_wide (st_parameter_dt *dtp, void *p, int len, int kind)
1985 {
1986   static char *empty_string[0];
1987
1988   if ((dtp->common.flags & IOPARM_LIBRETURN_MASK) != IOPARM_LIBRETURN_OK)
1989     return;
1990
1991   /* Strings of zero length can have p == NULL, which confuses the
1992      transfer routines into thinking we need more data elements.  To avoid
1993      this, we give them a nice pointer.  */
1994   if (len == 0 && p == NULL)
1995     p = empty_string;
1996
1997   /* Here we pass the actual kind value.  */
1998   dtp->u.p.transfer (dtp, BT_CHARACTER, p, kind, len, 1);
1999 }
2000
2001 void
2002 transfer_character_wide_write (st_parameter_dt *dtp, void *p, int len, int kind)
2003 {
2004   transfer_character_wide (dtp, p, len, kind);
2005 }
2006
2007 void
2008 transfer_complex (st_parameter_dt *dtp, void *p, int kind)
2009 {
2010   size_t size;
2011   if ((dtp->common.flags & IOPARM_LIBRETURN_MASK) != IOPARM_LIBRETURN_OK)
2012     return;
2013   size = size_from_complex_kind (kind);
2014   dtp->u.p.transfer (dtp, BT_COMPLEX, p, kind, size, 1);
2015 }
2016
2017 void
2018 transfer_complex_write (st_parameter_dt *dtp, void *p, int kind)
2019 {
2020   transfer_complex (dtp, p, kind);
2021 }
2022
2023 void
2024 transfer_array (st_parameter_dt *dtp, gfc_array_char *desc, int kind,
2025                 gfc_charlen_type charlen)
2026 {
2027   index_type count[GFC_MAX_DIMENSIONS];
2028   index_type extent[GFC_MAX_DIMENSIONS];
2029   index_type stride[GFC_MAX_DIMENSIONS];
2030   index_type stride0, rank, size, n;
2031   size_t tsize;
2032   char *data;
2033   bt iotype;
2034
2035   if ((dtp->common.flags & IOPARM_LIBRETURN_MASK) != IOPARM_LIBRETURN_OK)
2036     return;
2037
2038   iotype = (bt) GFC_DESCRIPTOR_TYPE (desc);
2039   size = iotype == BT_CHARACTER ? charlen : GFC_DESCRIPTOR_SIZE (desc);
2040
2041   rank = GFC_DESCRIPTOR_RANK (desc);
2042   for (n = 0; n < rank; n++)
2043     {
2044       count[n] = 0;
2045       stride[n] = GFC_DESCRIPTOR_STRIDE_BYTES(desc,n);
2046       extent[n] = GFC_DESCRIPTOR_EXTENT(desc,n);
2047
2048       /* If the extent of even one dimension is zero, then the entire
2049          array section contains zero elements, so we return after writing
2050          a zero array record.  */
2051       if (extent[n] <= 0)
2052         {
2053           data = NULL;
2054           tsize = 0;
2055           dtp->u.p.transfer (dtp, iotype, data, kind, size, tsize);
2056           return;
2057         }
2058     }
2059
2060   stride0 = stride[0];
2061
2062   /* If the innermost dimension has a stride of 1, we can do the transfer
2063      in contiguous chunks.  */
2064   if (stride0 == size)
2065     tsize = extent[0];
2066   else
2067     tsize = 1;
2068
2069   data = GFC_DESCRIPTOR_DATA (desc);
2070
2071   while (data)
2072     {
2073       dtp->u.p.transfer (dtp, iotype, data, kind, size, tsize);
2074       data += stride0 * tsize;
2075       count[0] += tsize;
2076       n = 0;
2077       while (count[n] == extent[n])
2078         {
2079           count[n] = 0;
2080           data -= stride[n] * extent[n];
2081           n++;
2082           if (n == rank)
2083             {
2084               data = NULL;
2085               break;
2086             }
2087           else
2088             {
2089               count[n]++;
2090               data += stride[n];
2091             }
2092         }
2093     }
2094 }
2095
2096 void
2097 transfer_array_write (st_parameter_dt *dtp, gfc_array_char *desc, int kind,
2098                       gfc_charlen_type charlen)
2099 {
2100   transfer_array (dtp, desc, kind, charlen);
2101 }
2102
2103 /* Preposition a sequential unformatted file while reading.  */
2104
2105 static void
2106 us_read (st_parameter_dt *dtp, int continued)
2107 {
2108   ssize_t n, nr;
2109   GFC_INTEGER_4 i4;
2110   GFC_INTEGER_8 i8;
2111   gfc_offset i;
2112
2113   if (compile_options.record_marker == 0)
2114     n = sizeof (GFC_INTEGER_4);
2115   else
2116     n = compile_options.record_marker;
2117
2118   nr = sread (dtp->u.p.current_unit->s, &i, n);
2119   if (unlikely (nr < 0))
2120     {
2121       generate_error (&dtp->common, LIBERROR_BAD_US, NULL);
2122       return;
2123     }
2124   else if (nr == 0)
2125     {
2126       hit_eof (dtp);
2127       return;  /* end of file */
2128     }
2129   else if (unlikely (n != nr))
2130     {
2131       generate_error (&dtp->common, LIBERROR_BAD_US, NULL);
2132       return;
2133     }
2134
2135   /* Only GFC_CONVERT_NATIVE and GFC_CONVERT_SWAP are valid here.  */
2136   if (likely (dtp->u.p.current_unit->flags.convert == GFC_CONVERT_NATIVE))
2137     {
2138       switch (nr)
2139         {
2140         case sizeof(GFC_INTEGER_4):
2141           memcpy (&i4, &i, sizeof (i4));
2142           i = i4;
2143           break;
2144
2145         case sizeof(GFC_INTEGER_8):
2146           memcpy (&i8, &i, sizeof (i8));
2147           i = i8;
2148           break;
2149
2150         default:
2151           runtime_error ("Illegal value for record marker");
2152           break;
2153         }
2154     }
2155   else
2156       switch (nr)
2157         {
2158         case sizeof(GFC_INTEGER_4):
2159           reverse_memcpy (&i4, &i, sizeof (i4));
2160           i = i4;
2161           break;
2162
2163         case sizeof(GFC_INTEGER_8):
2164           reverse_memcpy (&i8, &i, sizeof (i8));
2165           i = i8;
2166           break;
2167
2168         default:
2169           runtime_error ("Illegal value for record marker");
2170           break;
2171         }
2172
2173   if (i >= 0)
2174     {
2175       dtp->u.p.current_unit->bytes_left_subrecord = i;
2176       dtp->u.p.current_unit->continued = 0;
2177     }
2178   else
2179     {
2180       dtp->u.p.current_unit->bytes_left_subrecord = -i;
2181       dtp->u.p.current_unit->continued = 1;
2182     }
2183
2184   if (! continued)
2185     dtp->u.p.current_unit->bytes_left = dtp->u.p.current_unit->recl;
2186 }
2187
2188
2189 /* Preposition a sequential unformatted file while writing.  This
2190    amount to writing a bogus length that will be filled in later.  */
2191
2192 static void
2193 us_write (st_parameter_dt *dtp, int continued)
2194 {
2195   ssize_t nbytes;
2196   gfc_offset dummy;
2197
2198   dummy = 0;
2199
2200   if (compile_options.record_marker == 0)
2201     nbytes = sizeof (GFC_INTEGER_4);
2202   else
2203     nbytes = compile_options.record_marker ;
2204
2205   if (swrite (dtp->u.p.current_unit->s, &dummy, nbytes) != nbytes)
2206     generate_error (&dtp->common, LIBERROR_OS, NULL);
2207
2208   /* For sequential unformatted, if RECL= was not specified in the OPEN
2209      we write until we have more bytes than can fit in the subrecord
2210      markers, then we write a new subrecord.  */
2211
2212   dtp->u.p.current_unit->bytes_left_subrecord =
2213     dtp->u.p.current_unit->recl_subrecord;
2214   dtp->u.p.current_unit->continued = continued;
2215 }
2216
2217
2218 /* Position to the next record prior to transfer.  We are assumed to
2219    be before the next record.  We also calculate the bytes in the next
2220    record.  */
2221
2222 static void
2223 pre_position (st_parameter_dt *dtp)
2224 {
2225   if (dtp->u.p.current_unit->current_record)
2226     return;                     /* Already positioned.  */
2227
2228   switch (current_mode (dtp))
2229     {
2230     case FORMATTED_STREAM:
2231     case UNFORMATTED_STREAM:
2232       /* There are no records with stream I/O.  If the position was specified
2233          data_transfer_init has already positioned the file. If no position
2234          was specified, we continue from where we last left off.  I.e.
2235          there is nothing to do here.  */
2236       break;
2237     
2238     case UNFORMATTED_SEQUENTIAL:
2239       if (dtp->u.p.mode == READING)
2240         us_read (dtp, 0);
2241       else
2242         us_write (dtp, 0);
2243
2244       break;
2245
2246     case FORMATTED_SEQUENTIAL:
2247     case FORMATTED_DIRECT:
2248     case UNFORMATTED_DIRECT:
2249       dtp->u.p.current_unit->bytes_left = dtp->u.p.current_unit->recl;
2250       break;
2251     }
2252
2253   dtp->u.p.current_unit->current_record = 1;
2254 }
2255
2256
2257 /* Initialize things for a data transfer.  This code is common for
2258    both reading and writing.  */
2259
2260 static void
2261 data_transfer_init (st_parameter_dt *dtp, int read_flag)
2262 {
2263   unit_flags u_flags;  /* Used for creating a unit if needed.  */
2264   GFC_INTEGER_4 cf = dtp->common.flags;
2265   namelist_info *ionml;
2266
2267   ionml = ((cf & IOPARM_DT_IONML_SET) != 0) ? dtp->u.p.ionml : NULL;
2268
2269   memset (&dtp->u.p, 0, sizeof (dtp->u.p));
2270
2271   dtp->u.p.ionml = ionml;
2272   dtp->u.p.mode = read_flag ? READING : WRITING;
2273
2274   if ((dtp->common.flags & IOPARM_LIBRETURN_MASK) != IOPARM_LIBRETURN_OK)
2275     return;
2276
2277   if ((cf & IOPARM_DT_HAS_SIZE) != 0)
2278     dtp->u.p.size_used = 0;  /* Initialize the count.  */
2279
2280   dtp->u.p.current_unit = get_unit (dtp, 1);
2281   if (dtp->u.p.current_unit->s == NULL)
2282     {  /* Open the unit with some default flags.  */
2283        st_parameter_open opp;
2284        unit_convert conv;
2285
2286       if (dtp->common.unit < 0)
2287         {
2288           close_unit (dtp->u.p.current_unit);
2289           dtp->u.p.current_unit = NULL;
2290           generate_error (&dtp->common, LIBERROR_BAD_OPTION,
2291                           "Bad unit number in statement");
2292           return;
2293         }
2294       memset (&u_flags, '\0', sizeof (u_flags));
2295       u_flags.access = ACCESS_SEQUENTIAL;
2296       u_flags.action = ACTION_READWRITE;
2297
2298       /* Is it unformatted?  */
2299       if (!(cf & (IOPARM_DT_HAS_FORMAT | IOPARM_DT_LIST_FORMAT
2300                   | IOPARM_DT_IONML_SET)))
2301         u_flags.form = FORM_UNFORMATTED;
2302       else
2303         u_flags.form = FORM_UNSPECIFIED;
2304
2305       u_flags.delim = DELIM_UNSPECIFIED;
2306       u_flags.blank = BLANK_UNSPECIFIED;
2307       u_flags.pad = PAD_UNSPECIFIED;
2308       u_flags.decimal = DECIMAL_UNSPECIFIED;
2309       u_flags.encoding = ENCODING_UNSPECIFIED;
2310       u_flags.async = ASYNC_UNSPECIFIED;
2311       u_flags.round = ROUND_UNSPECIFIED;
2312       u_flags.sign = SIGN_UNSPECIFIED;
2313
2314       u_flags.status = STATUS_UNKNOWN;
2315
2316       conv = get_unformatted_convert (dtp->common.unit);
2317
2318       if (conv == GFC_CONVERT_NONE)
2319         conv = compile_options.convert;
2320
2321       /* We use big_endian, which is 0 on little-endian machines
2322          and 1 on big-endian machines.  */
2323       switch (conv)
2324         {
2325         case GFC_CONVERT_NATIVE:
2326         case GFC_CONVERT_SWAP:
2327           break;
2328          
2329         case GFC_CONVERT_BIG:
2330           conv = big_endian ? GFC_CONVERT_NATIVE : GFC_CONVERT_SWAP;
2331           break;
2332       
2333         case GFC_CONVERT_LITTLE:
2334           conv = big_endian ? GFC_CONVERT_SWAP : GFC_CONVERT_NATIVE;
2335           break;
2336          
2337         default:
2338           internal_error (&opp.common, "Illegal value for CONVERT");
2339           break;
2340         }
2341
2342       u_flags.convert = conv;
2343
2344       opp.common = dtp->common;
2345       opp.common.flags &= IOPARM_COMMON_MASK;
2346       dtp->u.p.current_unit = new_unit (&opp, dtp->u.p.current_unit, &u_flags);
2347       dtp->common.flags &= ~IOPARM_COMMON_MASK;
2348       dtp->common.flags |= (opp.common.flags & IOPARM_COMMON_MASK);
2349       if (dtp->u.p.current_unit == NULL)
2350         return;
2351     }
2352
2353   /* Check the action.  */
2354
2355   if (read_flag && dtp->u.p.current_unit->flags.action == ACTION_WRITE)
2356     {
2357       generate_error (&dtp->common, LIBERROR_BAD_ACTION,
2358                       "Cannot read from file opened for WRITE");
2359       return;
2360     }
2361
2362   if (!read_flag && dtp->u.p.current_unit->flags.action == ACTION_READ)
2363     {
2364       generate_error (&dtp->common, LIBERROR_BAD_ACTION,
2365                       "Cannot write to file opened for READ");
2366       return;
2367     }
2368
2369   dtp->u.p.first_item = 1;
2370
2371   /* Check the format.  */
2372
2373   if ((cf & IOPARM_DT_HAS_FORMAT) != 0)
2374     parse_format (dtp);
2375
2376   if (dtp->u.p.current_unit->flags.form == FORM_UNFORMATTED
2377       && (cf & (IOPARM_DT_HAS_FORMAT | IOPARM_DT_LIST_FORMAT))
2378          != 0)
2379     {
2380       generate_error (&dtp->common, LIBERROR_OPTION_CONFLICT,
2381                       "Format present for UNFORMATTED data transfer");
2382       return;
2383     }
2384
2385   if ((cf & IOPARM_DT_HAS_NAMELIST_NAME) != 0 && dtp->u.p.ionml != NULL)
2386      {
2387         if ((cf & IOPARM_DT_HAS_FORMAT) != 0)
2388            generate_error (&dtp->common, LIBERROR_OPTION_CONFLICT,
2389                     "A format cannot be specified with a namelist");
2390      }
2391   else if (dtp->u.p.current_unit->flags.form == FORM_FORMATTED &&
2392            !(cf & (IOPARM_DT_HAS_FORMAT | IOPARM_DT_LIST_FORMAT)))
2393     {
2394       generate_error (&dtp->common, LIBERROR_OPTION_CONFLICT,
2395                       "Missing format for FORMATTED data transfer");
2396     }
2397
2398   if (is_internal_unit (dtp)
2399       && dtp->u.p.current_unit->flags.form == FORM_UNFORMATTED)
2400     {
2401       generate_error (&dtp->common, LIBERROR_OPTION_CONFLICT,
2402                       "Internal file cannot be accessed by UNFORMATTED "
2403                       "data transfer");
2404       return;
2405     }
2406
2407   /* Check the record or position number.  */
2408
2409   if (dtp->u.p.current_unit->flags.access == ACCESS_DIRECT
2410       && (cf & IOPARM_DT_HAS_REC) == 0)
2411     {
2412       generate_error (&dtp->common, LIBERROR_MISSING_OPTION,
2413                       "Direct access data transfer requires record number");
2414       return;
2415     }
2416
2417   if (dtp->u.p.current_unit->flags.access == ACCESS_SEQUENTIAL)
2418     {
2419       if ((cf & IOPARM_DT_HAS_REC) != 0)
2420         {
2421           generate_error (&dtp->common, LIBERROR_OPTION_CONFLICT,
2422                         "Record number not allowed for sequential access "
2423                         "data transfer");
2424           return;
2425         }
2426
2427       if (dtp->u.p.current_unit->endfile == AFTER_ENDFILE)
2428         {
2429           generate_error (&dtp->common, LIBERROR_OPTION_CONFLICT,
2430                         "Sequential READ or WRITE not allowed after "
2431                         "EOF marker, possibly use REWIND or BACKSPACE");
2432           return;
2433         }
2434
2435     }
2436   /* Process the ADVANCE option.  */
2437
2438   dtp->u.p.advance_status
2439     = !(cf & IOPARM_DT_HAS_ADVANCE) ? ADVANCE_UNSPECIFIED :
2440       find_option (&dtp->common, dtp->advance, dtp->advance_len, advance_opt,
2441                    "Bad ADVANCE parameter in data transfer statement");
2442
2443   if (dtp->u.p.advance_status != ADVANCE_UNSPECIFIED)
2444     {
2445       if (dtp->u.p.current_unit->flags.access == ACCESS_DIRECT)
2446         {
2447           generate_error (&dtp->common, LIBERROR_OPTION_CONFLICT,
2448                           "ADVANCE specification conflicts with sequential "
2449                           "access");
2450           return;
2451         }
2452
2453       if (is_internal_unit (dtp))
2454         {
2455           generate_error (&dtp->common, LIBERROR_OPTION_CONFLICT,
2456                           "ADVANCE specification conflicts with internal file");
2457           return;
2458         }
2459
2460       if ((cf & (IOPARM_DT_HAS_FORMAT | IOPARM_DT_LIST_FORMAT))
2461           != IOPARM_DT_HAS_FORMAT)
2462         {
2463           generate_error (&dtp->common, LIBERROR_OPTION_CONFLICT,
2464                           "ADVANCE specification requires an explicit format");
2465           return;
2466         }
2467     }
2468
2469   if (read_flag)
2470     {
2471       dtp->u.p.current_unit->previous_nonadvancing_write = 0;
2472
2473       if ((cf & IOPARM_EOR) != 0 && dtp->u.p.advance_status != ADVANCE_NO)
2474         {
2475           generate_error (&dtp->common, LIBERROR_MISSING_OPTION,
2476                           "EOR specification requires an ADVANCE specification "
2477                           "of NO");
2478           return;
2479         }
2480
2481       if ((cf & IOPARM_DT_HAS_SIZE) != 0 
2482           && dtp->u.p.advance_status != ADVANCE_NO)
2483         {
2484           generate_error (&dtp->common, LIBERROR_MISSING_OPTION,
2485                           "SIZE specification requires an ADVANCE "
2486                           "specification of NO");
2487           return;
2488         }
2489     }
2490   else
2491     {                           /* Write constraints.  */
2492       if ((cf & IOPARM_END) != 0)
2493         {
2494           generate_error (&dtp->common, LIBERROR_OPTION_CONFLICT,
2495                           "END specification cannot appear in a write "
2496                           "statement");
2497           return;
2498         }
2499
2500       if ((cf & IOPARM_EOR) != 0)
2501         {
2502           generate_error (&dtp->common, LIBERROR_OPTION_CONFLICT,
2503                           "EOR specification cannot appear in a write "
2504                           "statement");
2505           return;
2506         }
2507
2508       if ((cf & IOPARM_DT_HAS_SIZE) != 0)
2509         {
2510           generate_error (&dtp->common, LIBERROR_OPTION_CONFLICT,
2511                           "SIZE specification cannot appear in a write "
2512                           "statement");
2513           return;
2514         }
2515     }
2516
2517   if (dtp->u.p.advance_status == ADVANCE_UNSPECIFIED)
2518     dtp->u.p.advance_status = ADVANCE_YES;
2519
2520   /* Check the decimal mode.  */
2521   dtp->u.p.current_unit->decimal_status
2522         = !(cf & IOPARM_DT_HAS_DECIMAL) ? DECIMAL_UNSPECIFIED :
2523           find_option (&dtp->common, dtp->decimal, dtp->decimal_len,
2524                         decimal_opt, "Bad DECIMAL parameter in data transfer "
2525                         "statement");
2526
2527   if (dtp->u.p.current_unit->decimal_status == DECIMAL_UNSPECIFIED)
2528         dtp->u.p.current_unit->decimal_status = dtp->u.p.current_unit->flags.decimal;
2529
2530   /* Check the round mode.  */
2531   dtp->u.p.current_unit->round_status
2532         = !(cf & IOPARM_DT_HAS_ROUND) ? ROUND_UNSPECIFIED :
2533           find_option (&dtp->common, dtp->round, dtp->round_len,
2534                         round_opt, "Bad ROUND parameter in data transfer "
2535                         "statement");
2536
2537   if (dtp->u.p.current_unit->round_status == ROUND_UNSPECIFIED)
2538         dtp->u.p.current_unit->round_status = dtp->u.p.current_unit->flags.round;
2539
2540   /* Check the sign mode. */
2541   dtp->u.p.sign_status
2542         = !(cf & IOPARM_DT_HAS_SIGN) ? SIGN_UNSPECIFIED :
2543           find_option (&dtp->common, dtp->sign, dtp->sign_len, sign_opt,
2544                         "Bad SIGN parameter in data transfer statement");
2545   
2546   if (dtp->u.p.sign_status == SIGN_UNSPECIFIED)
2547         dtp->u.p.sign_status = dtp->u.p.current_unit->flags.sign;
2548
2549   /* Check the blank mode.  */
2550   dtp->u.p.blank_status
2551         = !(cf & IOPARM_DT_HAS_BLANK) ? BLANK_UNSPECIFIED :
2552           find_option (&dtp->common, dtp->blank, dtp->blank_len,
2553                         blank_opt,
2554                         "Bad BLANK parameter in data transfer statement");
2555   
2556   if (dtp->u.p.blank_status == BLANK_UNSPECIFIED)
2557         dtp->u.p.blank_status = dtp->u.p.current_unit->flags.blank;
2558
2559   /* Check the delim mode.  */
2560   dtp->u.p.current_unit->delim_status
2561         = !(cf & IOPARM_DT_HAS_DELIM) ? DELIM_UNSPECIFIED :
2562           find_option (&dtp->common, dtp->delim, dtp->delim_len,
2563           delim_opt, "Bad DELIM parameter in data transfer statement");
2564   
2565   if (dtp->u.p.current_unit->delim_status == DELIM_UNSPECIFIED)
2566     dtp->u.p.current_unit->delim_status = dtp->u.p.current_unit->flags.delim;
2567
2568   /* Check the pad mode.  */
2569   dtp->u.p.current_unit->pad_status
2570         = !(cf & IOPARM_DT_HAS_PAD) ? PAD_UNSPECIFIED :
2571           find_option (&dtp->common, dtp->pad, dtp->pad_len, pad_opt,
2572                         "Bad PAD parameter in data transfer statement");
2573   
2574   if (dtp->u.p.current_unit->pad_status == PAD_UNSPECIFIED)
2575         dtp->u.p.current_unit->pad_status = dtp->u.p.current_unit->flags.pad;
2576
2577   /* Check to see if we might be reading what we wrote before  */
2578
2579   if (dtp->u.p.mode != dtp->u.p.current_unit->mode
2580       && !is_internal_unit (dtp))
2581     {
2582       int pos = fbuf_reset (dtp->u.p.current_unit);
2583       if (pos != 0)
2584         sseek (dtp->u.p.current_unit->s, pos, SEEK_CUR);
2585       sflush(dtp->u.p.current_unit->s);
2586     }
2587
2588   /* Check the POS= specifier: that it is in range and that it is used with a
2589      unit that has been connected for STREAM access. F2003 9.5.1.10.  */
2590   
2591   if (((cf & IOPARM_DT_HAS_POS) != 0))
2592     {
2593       if (is_stream_io (dtp))
2594         {
2595           
2596           if (dtp->pos <= 0)
2597             {
2598               generate_error (&dtp->common, LIBERROR_BAD_OPTION,
2599                               "POS=specifier must be positive");
2600               return;
2601             }
2602           
2603           if (dtp->pos >= dtp->u.p.current_unit->maxrec)
2604             {
2605               generate_error (&dtp->common, LIBERROR_BAD_OPTION,
2606                               "POS=specifier too large");
2607               return;
2608             }
2609           
2610           dtp->rec = dtp->pos;
2611           
2612           if (dtp->u.p.mode == READING)
2613             {
2614               /* Reset the endfile flag; if we hit EOF during reading
2615                  we'll set the flag and generate an error at that point
2616                  rather than worrying about it here.  */
2617               dtp->u.p.current_unit->endfile = NO_ENDFILE;
2618             }
2619          
2620           if (dtp->pos != dtp->u.p.current_unit->strm_pos)
2621             {
2622               fbuf_flush (dtp->u.p.current_unit, dtp->u.p.mode);
2623               if (sseek (dtp->u.p.current_unit->s, dtp->pos - 1, SEEK_SET) < 0)
2624                 {
2625                   generate_error (&dtp->common, LIBERROR_OS, NULL);
2626                   return;
2627                 }
2628               dtp->u.p.current_unit->strm_pos = dtp->pos;
2629             }
2630         }
2631       else
2632         {
2633           generate_error (&dtp->common, LIBERROR_BAD_OPTION,
2634                           "POS=specifier not allowed, "
2635                           "Try OPEN with ACCESS='stream'");
2636           return;
2637         }
2638     }
2639   
2640
2641   /* Sanity checks on the record number.  */
2642   if ((cf & IOPARM_DT_HAS_REC) != 0)
2643     {
2644       if (dtp->rec <= 0)
2645         {
2646           generate_error (&dtp->common, LIBERROR_BAD_OPTION,
2647                           "Record number must be positive");
2648           return;
2649         }
2650
2651       if (dtp->rec >= dtp->u.p.current_unit->maxrec)
2652         {
2653           generate_error (&dtp->common, LIBERROR_BAD_OPTION,
2654                           "Record number too large");
2655           return;
2656         }
2657
2658       /* Make sure format buffer is reset.  */
2659       if (dtp->u.p.current_unit->flags.form == FORM_FORMATTED)
2660         fbuf_reset (dtp->u.p.current_unit);
2661
2662
2663       /* Check whether the record exists to be read.  Only
2664          a partial record needs to exist.  */
2665
2666       if (dtp->u.p.mode == READING && (dtp->rec - 1)
2667           * dtp->u.p.current_unit->recl >= ssize (dtp->u.p.current_unit->s))
2668         {
2669           generate_error (&dtp->common, LIBERROR_BAD_OPTION,
2670                           "Non-existing record number");
2671           return;
2672         }
2673
2674       /* Position the file.  */
2675       if (sseek (dtp->u.p.current_unit->s, (gfc_offset) (dtp->rec - 1)
2676                  * dtp->u.p.current_unit->recl, SEEK_SET) < 0)
2677         {
2678           generate_error (&dtp->common, LIBERROR_OS, NULL);
2679           return;
2680         }
2681
2682       /* TODO: This is required to maintain compatibility between
2683          4.3 and 4.4 runtime. Remove when ABI changes from 4.3 */
2684
2685       if (is_stream_io (dtp))
2686         dtp->u.p.current_unit->strm_pos = dtp->rec;
2687
2688       /* TODO: Un-comment this code when ABI changes from 4.3.
2689       if (dtp->u.p.current_unit->flags.access == ACCESS_STREAM)
2690        {
2691          generate_error (&dtp->common, LIBERROR_OPTION_CONFLICT,
2692                      "Record number not allowed for stream access "
2693                      "data transfer");
2694          return;
2695        }  */
2696     }
2697
2698   /* Bugware for badly written mixed C-Fortran I/O.  */
2699   if (!is_internal_unit (dtp))
2700     flush_if_preconnected(dtp->u.p.current_unit->s);
2701
2702   dtp->u.p.current_unit->mode = dtp->u.p.mode;
2703
2704   /* Set the maximum position reached from the previous I/O operation.  This
2705      could be greater than zero from a previous non-advancing write.  */
2706   dtp->u.p.max_pos = dtp->u.p.current_unit->saved_pos;
2707
2708   pre_position (dtp);
2709   
2710
2711   /* Set up the subroutine that will handle the transfers.  */
2712
2713   if (read_flag)
2714     {
2715       if (dtp->u.p.current_unit->flags.form == FORM_UNFORMATTED)
2716         dtp->u.p.transfer = unformatted_read;
2717       else
2718         {
2719           if ((cf & IOPARM_DT_LIST_FORMAT) != 0)
2720             {
2721                 dtp->u.p.last_char = EOF - 1;
2722                 dtp->u.p.transfer = list_formatted_read;
2723             }
2724           else
2725             dtp->u.p.transfer = formatted_transfer;
2726         }
2727     }
2728   else
2729     {
2730       if (dtp->u.p.current_unit->flags.form == FORM_UNFORMATTED)
2731         dtp->u.p.transfer = unformatted_write;
2732       else
2733         {
2734           if ((cf & IOPARM_DT_LIST_FORMAT) != 0)
2735             dtp->u.p.transfer = list_formatted_write;
2736           else
2737             dtp->u.p.transfer = formatted_transfer;
2738         }
2739     }
2740
2741   /* Make sure that we don't do a read after a nonadvancing write.  */
2742
2743   if (read_flag)
2744     {
2745       if (dtp->u.p.current_unit->read_bad && !is_stream_io (dtp))
2746         {
2747           generate_error (&dtp->common, LIBERROR_BAD_OPTION,
2748                           "Cannot READ after a nonadvancing WRITE");
2749           return;
2750         }
2751     }
2752   else
2753     {
2754       if (dtp->u.p.advance_status == ADVANCE_YES && !dtp->u.p.seen_dollar)
2755         dtp->u.p.current_unit->read_bad = 1;
2756     }
2757
2758   /* Start the data transfer if we are doing a formatted transfer.  */
2759   if (dtp->u.p.current_unit->flags.form == FORM_FORMATTED
2760       && ((cf & (IOPARM_DT_LIST_FORMAT | IOPARM_DT_HAS_NAMELIST_NAME)) == 0)
2761       && dtp->u.p.ionml == NULL)
2762     formatted_transfer (dtp, 0, NULL, 0, 0, 1);
2763 }
2764
2765 /* Initialize an array_loop_spec given the array descriptor.  The function
2766    returns the index of the last element of the array, and also returns
2767    starting record, where the first I/O goes to (necessary in case of
2768    negative strides).  */
2769    
2770 gfc_offset
2771 init_loop_spec (gfc_array_char *desc, array_loop_spec *ls,
2772                 gfc_offset *start_record)
2773 {
2774   int rank = GFC_DESCRIPTOR_RANK(desc);
2775   int i;
2776   gfc_offset index; 
2777   int empty;
2778
2779   empty = 0;
2780   index = 1;
2781   *start_record = 0;
2782
2783   for (i=0; i<rank; i++)
2784     {
2785       ls[i].idx = GFC_DESCRIPTOR_LBOUND(desc,i);
2786       ls[i].start = GFC_DESCRIPTOR_LBOUND(desc,i);
2787       ls[i].end = GFC_DESCRIPTOR_UBOUND(desc,i);
2788       ls[i].step = GFC_DESCRIPTOR_STRIDE(desc,i);
2789       empty = empty || (GFC_DESCRIPTOR_UBOUND(desc,i) 
2790                         < GFC_DESCRIPTOR_LBOUND(desc,i));
2791
2792       if (GFC_DESCRIPTOR_STRIDE(desc,i) > 0)
2793         {
2794           index += (GFC_DESCRIPTOR_EXTENT(desc,i) - 1)
2795             * GFC_DESCRIPTOR_STRIDE(desc,i);
2796         }
2797       else
2798         {
2799           index -= (GFC_DESCRIPTOR_EXTENT(desc,i) - 1)
2800             * GFC_DESCRIPTOR_STRIDE(desc,i);
2801           *start_record -= (GFC_DESCRIPTOR_EXTENT(desc,i) - 1)
2802             * GFC_DESCRIPTOR_STRIDE(desc,i);
2803         }
2804     }
2805
2806   if (empty)
2807     return 0;
2808   else
2809     return index;
2810 }
2811
2812 /* Determine the index to the next record in an internal unit array by
2813    by incrementing through the array_loop_spec.  */
2814    
2815 gfc_offset
2816 next_array_record (st_parameter_dt *dtp, array_loop_spec *ls, int *finished)
2817 {
2818   int i, carry;
2819   gfc_offset index;
2820   
2821   carry = 1;
2822   index = 0;
2823
2824   for (i = 0; i < dtp->u.p.current_unit->rank; i++)
2825     {
2826       if (carry)
2827         {
2828           ls[i].idx++;
2829           if (ls[i].idx > ls[i].end)
2830             {
2831               ls[i].idx = ls[i].start;
2832               carry = 1;
2833             }
2834           else
2835             carry = 0;
2836         }
2837       index = index + (ls[i].idx - ls[i].start) * ls[i].step;
2838     }
2839
2840   *finished = carry;
2841
2842   return index;
2843 }
2844
2845
2846
2847 /* Skip to the end of the current record, taking care of an optional
2848    record marker of size bytes.  If the file is not seekable, we
2849    read chunks of size MAX_READ until we get to the right
2850    position.  */
2851
2852 static void
2853 skip_record (st_parameter_dt *dtp, ssize_t bytes)
2854 {
2855   ssize_t rlength, readb;
2856   static const ssize_t MAX_READ = 4096;
2857   char p[MAX_READ];
2858
2859   dtp->u.p.current_unit->bytes_left_subrecord += bytes;
2860   if (dtp->u.p.current_unit->bytes_left_subrecord == 0)
2861     return;
2862
2863   /* Direct access files do not generate END conditions,
2864      only I/O errors.  */
2865   if (sseek (dtp->u.p.current_unit->s, 
2866              dtp->u.p.current_unit->bytes_left_subrecord, SEEK_CUR) < 0)
2867     {
2868       /* Seeking failed, fall back to seeking by reading data.  */
2869       while (dtp->u.p.current_unit->bytes_left_subrecord > 0)
2870         {
2871           rlength = 
2872             (MAX_READ < dtp->u.p.current_unit->bytes_left_subrecord) ?
2873             MAX_READ : dtp->u.p.current_unit->bytes_left_subrecord;
2874
2875           readb = sread (dtp->u.p.current_unit->s, p, rlength);
2876           if (readb < 0)
2877             {
2878               generate_error (&dtp->common, LIBERROR_OS, NULL);
2879               return;
2880             }
2881
2882           dtp->u.p.current_unit->bytes_left_subrecord -= readb;
2883         }
2884       return;
2885     }
2886   dtp->u.p.current_unit->bytes_left_subrecord = 0;
2887 }
2888
2889
2890 /* Advance to the next record reading unformatted files, taking
2891    care of subrecords.  If complete_record is nonzero, we loop
2892    until all subrecords are cleared.  */
2893
2894 static void
2895 next_record_r_unf (st_parameter_dt *dtp, int complete_record)
2896 {
2897   size_t bytes;
2898
2899   bytes =  compile_options.record_marker == 0 ?
2900     sizeof (GFC_INTEGER_4) : compile_options.record_marker;
2901
2902   while(1)
2903     {
2904
2905       /* Skip over tail */
2906
2907       skip_record (dtp, bytes);
2908
2909       if ( ! (complete_record && dtp->u.p.current_unit->continued))
2910         return;
2911
2912       us_read (dtp, 1);
2913     }
2914 }
2915
2916
2917 static gfc_offset
2918 min_off (gfc_offset a, gfc_offset b)
2919 {
2920   return (a < b ? a : b);
2921 }
2922
2923
2924 /* Space to the next record for read mode.  */
2925
2926 static void
2927 next_record_r (st_parameter_dt *dtp, int done)
2928 {
2929   gfc_offset record;
2930   int bytes_left;
2931   char p;
2932   int cc;
2933
2934   switch (current_mode (dtp))
2935     {
2936     /* No records in unformatted STREAM I/O.  */
2937     case UNFORMATTED_STREAM:
2938       return;
2939     
2940     case UNFORMATTED_SEQUENTIAL:
2941       next_record_r_unf (dtp, 1);
2942       dtp->u.p.current_unit->bytes_left = dtp->u.p.current_unit->recl;
2943       break;
2944
2945     case FORMATTED_DIRECT:
2946     case UNFORMATTED_DIRECT:
2947       skip_record (dtp, dtp->u.p.current_unit->bytes_left);
2948       break;
2949
2950     case FORMATTED_STREAM:
2951     case FORMATTED_SEQUENTIAL:
2952       /* read_sf has already terminated input because of an '\n', or
2953          we have hit EOF.  */
2954       if (dtp->u.p.sf_seen_eor)
2955         {
2956           dtp->u.p.sf_seen_eor = 0;
2957           break;
2958         }
2959
2960       if (is_internal_unit (dtp))
2961         {
2962           if (is_array_io (dtp))
2963             {
2964               int finished;
2965
2966               record = next_array_record (dtp, dtp->u.p.current_unit->ls,
2967                                           &finished);
2968               if (!done && finished)
2969                 hit_eof (dtp);
2970
2971               /* Now seek to this record.  */
2972               record = record * dtp->u.p.current_unit->recl;
2973               if (sseek (dtp->u.p.current_unit->s, record, SEEK_SET) < 0)
2974                 {
2975                   generate_error (&dtp->common, LIBERROR_INTERNAL_UNIT, NULL);
2976                   break;
2977                 }
2978               dtp->u.p.current_unit->bytes_left = dtp->u.p.current_unit->recl;
2979             }
2980           else  
2981             {
2982               bytes_left = (int) dtp->u.p.current_unit->bytes_left;
2983               bytes_left = min_off (bytes_left, 
2984                       ssize (dtp->u.p.current_unit->s)
2985                       - stell (dtp->u.p.current_unit->s));
2986               if (sseek (dtp->u.p.current_unit->s, 
2987                          bytes_left, SEEK_CUR) < 0)
2988                 {
2989                   generate_error (&dtp->common, LIBERROR_INTERNAL_UNIT, NULL);
2990                   break;
2991                 }
2992               dtp->u.p.current_unit->bytes_left
2993                 = dtp->u.p.current_unit->recl;
2994             } 
2995           break;
2996         }
2997       else 
2998         {
2999           do
3000             {
3001               errno = 0;
3002               cc = fbuf_getc (dtp->u.p.current_unit);
3003               if (cc == EOF) 
3004                 {
3005                   if (errno != 0)
3006                     generate_error (&dtp->common, LIBERROR_OS, NULL);
3007                   else
3008                     {
3009                       if (is_stream_io (dtp)
3010                           || dtp->u.p.current_unit->pad_status == PAD_NO
3011                           || dtp->u.p.current_unit->bytes_left
3012                              == dtp->u.p.current_unit->recl)
3013                         hit_eof (dtp);
3014                     }
3015                   break;
3016                 }
3017               
3018               if (is_stream_io (dtp))
3019                 dtp->u.p.current_unit->strm_pos++;
3020               
3021               p = (char) cc;
3022             }
3023           while (p != '\n');
3024         }
3025       break;
3026     }
3027 }
3028
3029
3030 /* Small utility function to write a record marker, taking care of
3031    byte swapping and of choosing the correct size.  */
3032
3033 static int
3034 write_us_marker (st_parameter_dt *dtp, const gfc_offset buf)
3035 {
3036   size_t len;
3037   GFC_INTEGER_4 buf4;
3038   GFC_INTEGER_8 buf8;
3039   char p[sizeof (GFC_INTEGER_8)];
3040
3041   if (compile_options.record_marker == 0)
3042     len = sizeof (GFC_INTEGER_4);
3043   else
3044     len = compile_options.record_marker;
3045
3046   /* Only GFC_CONVERT_NATIVE and GFC_CONVERT_SWAP are valid here.  */
3047   if (likely (dtp->u.p.current_unit->flags.convert == GFC_CONVERT_NATIVE))
3048     {
3049       switch (len)
3050         {
3051         case sizeof (GFC_INTEGER_4):
3052           buf4 = buf;
3053           return swrite (dtp->u.p.current_unit->s, &buf4, len);
3054           break;
3055
3056         case sizeof (GFC_INTEGER_8):
3057           buf8 = buf;
3058           return swrite (dtp->u.p.current_unit->s, &buf8, len);
3059           break;
3060
3061         default:
3062           runtime_error ("Illegal value for record marker");
3063           break;
3064         }
3065     }
3066   else
3067     {
3068       switch (len)
3069         {
3070         case sizeof (GFC_INTEGER_4):
3071           buf4 = buf;
3072           reverse_memcpy (p, &buf4, sizeof (GFC_INTEGER_4));
3073           return swrite (dtp->u.p.current_unit->s, p, len);
3074           break;
3075
3076         case sizeof (GFC_INTEGER_8):
3077           buf8 = buf;
3078           reverse_memcpy (p, &buf8, sizeof (GFC_INTEGER_8));
3079           return swrite (dtp->u.p.current_unit->s, p, len);
3080           break;
3081
3082         default:
3083           runtime_error ("Illegal value for record marker");
3084           break;
3085         }
3086     }
3087
3088 }
3089
3090 /* Position to the next (sub)record in write mode for
3091    unformatted sequential files.  */
3092
3093 static void
3094 next_record_w_unf (st_parameter_dt *dtp, int next_subrecord)
3095 {
3096   gfc_offset m, m_write, record_marker;
3097
3098   /* Bytes written.  */
3099   m = dtp->u.p.current_unit->recl_subrecord
3100     - dtp->u.p.current_unit->bytes_left_subrecord;
3101
3102   /* Write the length tail.  If we finish a record containing
3103      subrecords, we write out the negative length.  */
3104
3105   if (dtp->u.p.current_unit->continued)
3106     m_write = -m;
3107   else
3108     m_write = m;
3109
3110   if (unlikely (write_us_marker (dtp, m_write) < 0))
3111     goto io_error;
3112
3113   if (compile_options.record_marker == 0)
3114     record_marker = sizeof (GFC_INTEGER_4);
3115   else
3116     record_marker = compile_options.record_marker;
3117
3118   /* Seek to the head and overwrite the bogus length with the real
3119      length.  */
3120
3121   if (unlikely (sseek (dtp->u.p.current_unit->s, - m - 2 * record_marker, 
3122                        SEEK_CUR) < 0))
3123     goto io_error;
3124
3125   if (next_subrecord)
3126     m_write = -m;
3127   else
3128     m_write = m;
3129
3130   if (unlikely (write_us_marker (dtp, m_write) < 0))
3131     goto io_error;
3132
3133   /* Seek past the end of the current record.  */
3134
3135   if (unlikely (sseek (dtp->u.p.current_unit->s, m + record_marker, 
3136                        SEEK_CUR) < 0))
3137     goto io_error;
3138
3139   return;
3140
3141  io_error:
3142   generate_error (&dtp->common, LIBERROR_OS, NULL);
3143   return;
3144
3145 }
3146
3147
3148 /* Utility function like memset() but operating on streams. Return
3149    value is same as for POSIX write().  */
3150
3151 static ssize_t
3152 sset (stream * s, int c, ssize_t nbyte)
3153 {
3154   static const int WRITE_CHUNK = 256;
3155   char p[WRITE_CHUNK];
3156   ssize_t bytes_left, trans;
3157
3158   if (nbyte < WRITE_CHUNK)
3159     memset (p, c, nbyte);
3160   else
3161     memset (p, c, WRITE_CHUNK);
3162
3163   bytes_left = nbyte;
3164   while (bytes_left > 0)
3165     {
3166       trans = (bytes_left < WRITE_CHUNK) ? bytes_left : WRITE_CHUNK;
3167       trans = swrite (s, p, trans);
3168       if (trans <= 0)
3169         return trans;
3170       bytes_left -= trans;
3171     }
3172                
3173   return nbyte - bytes_left;
3174 }
3175
3176
3177 /* Position to the next record in write mode.  */
3178
3179 static void
3180 next_record_w (st_parameter_dt *dtp, int done)
3181 {
3182   gfc_offset m, record, max_pos;
3183   int length;
3184
3185   /* Zero counters for X- and T-editing.  */
3186   max_pos = dtp->u.p.max_pos;
3187   dtp->u.p.max_pos = dtp->u.p.skips = dtp->u.p.pending_spaces = 0;
3188
3189   switch (current_mode (dtp))
3190     {
3191     /* No records in unformatted STREAM I/O.  */
3192     case UNFORMATTED_STREAM:
3193       return;
3194
3195     case FORMATTED_DIRECT:
3196       if (dtp->u.p.current_unit->bytes_left == 0)
3197         break;
3198
3199       fbuf_seek (dtp->u.p.current_unit, 0, SEEK_END);
3200       fbuf_flush (dtp->u.p.current_unit, WRITING);
3201       if (sset (dtp->u.p.current_unit->s, ' ', 
3202                 dtp->u.p.current_unit->bytes_left) 
3203           != dtp->u.p.current_unit->bytes_left)
3204         goto io_error;
3205
3206       break;
3207
3208     case UNFORMATTED_DIRECT:
3209       if (dtp->u.p.current_unit->bytes_left > 0)
3210         {
3211           length = (int) dtp->u.p.current_unit->bytes_left;
3212           if (sset (dtp->u.p.current_unit->s, 0, length) != length)
3213             goto io_error;
3214         }
3215       break;
3216
3217     case UNFORMATTED_SEQUENTIAL:
3218       next_record_w_unf (dtp, 0);
3219       dtp->u.p.current_unit->bytes_left = dtp->u.p.current_unit->recl;
3220       break;
3221
3222     case FORMATTED_STREAM:
3223     case FORMATTED_SEQUENTIAL:
3224
3225       if (is_internal_unit (dtp))
3226         {
3227           char *p;
3228           if (is_array_io (dtp))
3229             {
3230               int finished;
3231
3232               length = (int) dtp->u.p.current_unit->bytes_left;
3233               
3234               /* If the farthest position reached is greater than current
3235               position, adjust the position and set length to pad out
3236               whats left.  Otherwise just pad whats left.
3237               (for character array unit) */
3238               m = dtp->u.p.current_unit->recl
3239                         - dtp->u.p.current_unit->bytes_left;
3240               if (max_pos > m)
3241                 {
3242                   length = (int) (max_pos - m);
3243                   if (sseek (dtp->u.p.current_unit->s, 
3244                              length, SEEK_CUR) < 0)
3245                     {
3246                       generate_error (&dtp->common, LIBERROR_INTERNAL_UNIT, NULL);
3247                       return;
3248                     }
3249                   length = (int) (dtp->u.p.current_unit->recl - max_pos);
3250                 }
3251
3252               p = write_block (dtp, length);
3253               if (p == NULL)
3254                 return;
3255
3256               if (unlikely (is_char4_unit (dtp)))
3257                 {
3258                   gfc_char4_t *p4 = (gfc_char4_t *) p;
3259                   memset4 (p4, ' ', length);
3260                 }
3261               else
3262                 memset (p, ' ', length);
3263
3264               /* Now that the current record has been padded out,
3265                  determine where the next record in the array is. */
3266               record = next_array_record (dtp, dtp->u.p.current_unit->ls,
3267                                           &finished);
3268               if (finished)
3269                 dtp->u.p.current_unit->endfile = AT_ENDFILE;
3270               
3271               /* Now seek to this record */
3272               record = record * dtp->u.p.current_unit->recl;
3273
3274               if (sseek (dtp->u.p.current_unit->s, record, SEEK_SET) < 0)
3275                 {
3276                   generate_error (&dtp->common, LIBERROR_INTERNAL_UNIT, NULL);
3277                   return;
3278                 }
3279
3280               dtp->u.p.current_unit->bytes_left = dtp->u.p.current_unit->recl;
3281             }
3282           else
3283             {
3284               length = 1;
3285
3286               /* If this is the last call to next_record move to the farthest
3287                  position reached and set length to pad out the remainder
3288                  of the record. (for character scaler unit) */
3289               if (done)
3290                 {
3291                   m = dtp->u.p.current_unit->recl
3292                         - dtp->u.p.current_unit->bytes_left;
3293                   if (max_pos > m)
3294                     {
3295                       length = (int) (max_pos - m);
3296                       if (sseek (dtp->u.p.current_unit->s, 
3297                                  length, SEEK_CUR) < 0)
3298                         {
3299                           generate_error (&dtp->common, LIBERROR_INTERNAL_UNIT, NULL);
3300                           return;
3301                         }
3302                       length = (int) (dtp->u.p.current_unit->recl - max_pos);
3303                     }
3304                   else
3305                     length = (int) dtp->u.p.current_unit->bytes_left;
3306                 }
3307               if (length > 0)
3308                 {
3309                   p = write_block (dtp, length);
3310                   if (p == NULL)
3311                     return;
3312
3313                   if (unlikely (is_char4_unit (dtp)))
3314                     {
3315                       gfc_char4_t *p4 = (gfc_char4_t *) p;
3316                       memset4 (p4, (gfc_char4_t) ' ', length);
3317                     }
3318                   else
3319                     memset (p, ' ', length);
3320                 }
3321             }
3322         }
3323       else
3324         {
3325 #ifdef HAVE_CRLF
3326           const int len = 2;
3327 #else
3328           const int len = 1;
3329 #endif
3330           fbuf_seek (dtp->u.p.current_unit, 0, SEEK_END);
3331           char * p = fbuf_alloc (dtp->u.p.current_unit, len);
3332           if (!p)
3333             goto io_error;
3334 #ifdef HAVE_CRLF
3335           *(p++) = '\r';
3336 #endif
3337           *p = '\n';
3338           if (is_stream_io (dtp))
3339             {
3340               dtp->u.p.current_unit->strm_pos += len;
3341               if (dtp->u.p.current_unit->strm_pos
3342                   < ssize (dtp->u.p.current_unit->s))
3343                 unit_truncate (dtp->u.p.current_unit,
3344                                dtp->u.p.current_unit->strm_pos - 1,
3345                                &dtp->common);
3346             }
3347         }
3348
3349       break;
3350
3351     io_error:
3352       generate_error (&dtp->common, LIBERROR_OS, NULL);
3353       break;
3354     }
3355 }
3356
3357 /* Position to the next record, which means moving to the end of the
3358    current record.  This can happen under several different
3359    conditions.  If the done flag is not set, we get ready to process
3360    the next record.  */
3361
3362 void
3363 next_record (st_parameter_dt *dtp, int done)
3364 {
3365   gfc_offset fp; /* File position.  */
3366
3367   dtp->u.p.current_unit->read_bad = 0;
3368
3369   if (dtp->u.p.mode == READING)
3370     next_record_r (dtp, done);
3371   else
3372     next_record_w (dtp, done);
3373
3374   if (!is_stream_io (dtp))
3375     {
3376       /* Since we have changed the position, set it to unspecified so
3377          that INQUIRE(POSITION=) knows it needs to look into it.  */
3378       if (done)
3379         dtp->u.p.current_unit->flags.position = POSITION_UNSPECIFIED;
3380
3381       dtp->u.p.current_unit->current_record = 0;
3382       if (dtp->u.p.current_unit->flags.access == ACCESS_DIRECT)
3383         {
3384           fp = stell (dtp->u.p.current_unit->s);
3385           /* Calculate next record, rounding up partial records.  */
3386           dtp->u.p.current_unit->last_record =
3387             (fp + dtp->u.p.current_unit->recl - 1) /
3388               dtp->u.p.current_unit->recl;
3389         }
3390       else
3391         dtp->u.p.current_unit->last_record++;
3392     }
3393
3394   if (!done)
3395     pre_position (dtp);
3396
3397   fbuf_flush (dtp->u.p.current_unit, dtp->u.p.mode);
3398 }
3399
3400
3401 /* Finalize the current data transfer.  For a nonadvancing transfer,
3402    this means advancing to the next record.  For internal units close the
3403    stream associated with the unit.  */
3404
3405 static void
3406 finalize_transfer (st_parameter_dt *dtp)
3407 {
3408   GFC_INTEGER_4 cf = dtp->common.flags;
3409
3410   if ((dtp->common.flags & IOPARM_DT_HAS_SIZE) != 0)
3411     *dtp->size = dtp->u.p.size_used;
3412
3413   if (dtp->u.p.eor_condition)
3414     {
3415       generate_error (&dtp->common, LIBERROR_EOR, NULL);
3416       return;
3417     }
3418
3419   if ((dtp->common.flags & IOPARM_LIBRETURN_MASK) != IOPARM_LIBRETURN_OK)
3420     {
3421       if (dtp->u.p.current_unit && current_mode (dtp) == UNFORMATTED_SEQUENTIAL)
3422         dtp->u.p.current_unit->current_record = 0;
3423       return;
3424     }
3425
3426   if ((dtp->u.p.ionml != NULL)
3427       && (cf & IOPARM_DT_HAS_NAMELIST_NAME) != 0)
3428     {
3429        if ((cf & IOPARM_DT_NAMELIST_READ_MODE) != 0)
3430          namelist_read (dtp);
3431        else
3432          namelist_write (dtp);
3433     }
3434
3435   dtp->u.p.transfer = NULL;
3436   if (dtp->u.p.current_unit == NULL)
3437     return;
3438
3439   if ((cf & IOPARM_DT_LIST_FORMAT) != 0 && dtp->u.p.mode == READING)
3440     {
3441       finish_list_read (dtp);
3442       return;
3443     }
3444
3445   if (dtp->u.p.mode == WRITING)
3446     dtp->u.p.current_unit->previous_nonadvancing_write
3447       = dtp->u.p.advance_status == ADVANCE_NO;
3448
3449   if (is_stream_io (dtp))
3450     {
3451       if (dtp->u.p.current_unit->flags.form == FORM_FORMATTED
3452           && dtp->u.p.advance_status != ADVANCE_NO)
3453         next_record (dtp, 1);
3454
3455       return;
3456     }
3457
3458   dtp->u.p.current_unit->current_record = 0;
3459
3460   if (!is_internal_unit (dtp) && dtp->u.p.seen_dollar)
3461     {
3462       fbuf_flush (dtp->u.p.current_unit, dtp->u.p.mode);
3463       dtp->u.p.seen_dollar = 0;
3464       return;
3465     }
3466
3467   /* For non-advancing I/O, save the current maximum position for use in the
3468      next I/O operation if needed.  */
3469   if (dtp->u.p.advance_status == ADVANCE_NO)
3470     {
3471       int bytes_written = (int) (dtp->u.p.current_unit->recl
3472         - dtp->u.p.current_unit->bytes_left);
3473       dtp->u.p.current_unit->saved_pos =
3474         dtp->u.p.max_pos > 0 ? dtp->u.p.max_pos - bytes_written : 0;
3475       fbuf_flush (dtp->u.p.current_unit, dtp->u.p.mode);
3476       return;
3477     }
3478   else if (dtp->u.p.current_unit->flags.form == FORM_FORMATTED 
3479            && dtp->u.p.mode == WRITING && !is_internal_unit (dtp))
3480       fbuf_seek (dtp->u.p.current_unit, 0, SEEK_END);    
3481
3482   dtp->u.p.current_unit->saved_pos = 0;
3483
3484   next_record (dtp, 1);
3485 }
3486
3487 /* Transfer function for IOLENGTH. It doesn't actually do any
3488    data transfer, it just updates the length counter.  */
3489
3490 static void
3491 iolength_transfer (st_parameter_dt *dtp, bt type __attribute__((unused)), 
3492                    void *dest __attribute__ ((unused)),
3493                    int kind __attribute__((unused)), 
3494                    size_t size, size_t nelems)
3495 {
3496   if ((dtp->common.flags & IOPARM_DT_HAS_IOLENGTH) != 0)
3497     *dtp->iolength += (GFC_IO_INT) (size * nelems);
3498 }
3499
3500
3501 /* Initialize the IOLENGTH data transfer. This function is in essence
3502    a very much simplified version of data_transfer_init(), because it
3503    doesn't have to deal with units at all.  */
3504
3505 static void
3506 iolength_transfer_init (st_parameter_dt *dtp)
3507 {
3508   if ((dtp->common.flags & IOPARM_DT_HAS_IOLENGTH) != 0)
3509     *dtp->iolength = 0;
3510
3511   memset (&dtp->u.p, 0, sizeof (dtp->u.p));
3512
3513   /* Set up the subroutine that will handle the transfers.  */
3514
3515   dtp->u.p.transfer = iolength_transfer;
3516 }
3517
3518
3519 /* Library entry point for the IOLENGTH form of the INQUIRE
3520    statement. The IOLENGTH form requires no I/O to be performed, but
3521    it must still be a runtime library call so that we can determine
3522    the iolength for dynamic arrays and such.  */
3523
3524 extern void st_iolength (st_parameter_dt *);
3525 export_proto(st_iolength);
3526
3527 void
3528 st_iolength (st_parameter_dt *dtp)
3529 {
3530   library_start (&dtp->common);
3531   iolength_transfer_init (dtp);
3532 }
3533
3534 extern void st_iolength_done (st_parameter_dt *);
3535 export_proto(st_iolength_done);
3536
3537 void
3538 st_iolength_done (st_parameter_dt *dtp __attribute__((unused)))
3539 {
3540   free_ionml (dtp);
3541   library_end ();
3542 }
3543
3544
3545 /* The READ statement.  */
3546
3547 extern void st_read (st_parameter_dt *);
3548 export_proto(st_read);
3549
3550 void
3551 st_read (st_parameter_dt *dtp)
3552 {
3553   library_start (&dtp->common);
3554
3555   data_transfer_init (dtp, 1);
3556 }
3557
3558 extern void st_read_done (st_parameter_dt *);
3559 export_proto(st_read_done);
3560
3561 void
3562 st_read_done (st_parameter_dt *dtp)
3563 {
3564   finalize_transfer (dtp);
3565   if (is_internal_unit (dtp) || dtp->u.p.format_not_saved)
3566     free_format_data (dtp->u.p.fmt);
3567   free_ionml (dtp);
3568   if (dtp->u.p.current_unit != NULL)
3569     unlock_unit (dtp->u.p.current_unit);
3570
3571   free_internal_unit (dtp);
3572   
3573   library_end ();
3574 }
3575
3576 extern void st_write (st_parameter_dt *);
3577 export_proto(st_write);
3578
3579 void
3580 st_write (st_parameter_dt *dtp)
3581 {
3582   library_start (&dtp->common);
3583   data_transfer_init (dtp, 0);
3584 }
3585
3586 extern void st_write_done (st_parameter_dt *);
3587 export_proto(st_write_done);
3588
3589 void
3590 st_write_done (st_parameter_dt *dtp)
3591 {
3592   finalize_transfer (dtp);
3593
3594   /* Deal with endfile conditions associated with sequential files.  */
3595
3596   if (dtp->u.p.current_unit != NULL 
3597       && dtp->u.p.current_unit->flags.access == ACCESS_SEQUENTIAL)
3598     switch (dtp->u.p.current_unit->endfile)
3599       {
3600       case AT_ENDFILE:          /* Remain at the endfile record.  */
3601         break;
3602
3603       case AFTER_ENDFILE:
3604         dtp->u.p.current_unit->endfile = AT_ENDFILE;    /* Just at it now.  */
3605         break;
3606
3607       case NO_ENDFILE:
3608         /* Get rid of whatever is after this record.  */
3609         if (!is_internal_unit (dtp))
3610           unit_truncate (dtp->u.p.current_unit, 
3611                          stell (dtp->u.p.current_unit->s),
3612                          &dtp->common);
3613         dtp->u.p.current_unit->endfile = AT_ENDFILE;
3614         break;
3615       }
3616
3617   if (is_internal_unit (dtp) || dtp->u.p.format_not_saved)
3618     free_format_data (dtp->u.p.fmt);
3619   free_ionml (dtp);
3620   if (dtp->u.p.current_unit != NULL)
3621     unlock_unit (dtp->u.p.current_unit);
3622   
3623   free_internal_unit (dtp);
3624
3625   library_end ();
3626 }
3627
3628
3629 /* F2003: This is a stub for the runtime portion of the WAIT statement.  */
3630 void
3631 st_wait (st_parameter_wait *wtp __attribute__((unused)))
3632 {
3633 }
3634
3635
3636 /* Receives the scalar information for namelist objects and stores it
3637    in a linked list of namelist_info types.  */
3638
3639 extern void st_set_nml_var (st_parameter_dt *dtp, void *, char *,
3640                             GFC_INTEGER_4, gfc_charlen_type, GFC_INTEGER_4);
3641 export_proto(st_set_nml_var);
3642
3643
3644 void
3645 st_set_nml_var (st_parameter_dt *dtp, void * var_addr, char * var_name,
3646                 GFC_INTEGER_4 len, gfc_charlen_type string_length,
3647                 GFC_INTEGER_4 dtype)
3648 {
3649   namelist_info *t1 = NULL;
3650   namelist_info *nml;
3651   size_t var_name_len = strlen (var_name);
3652
3653   nml = (namelist_info*) get_mem (sizeof (namelist_info));
3654
3655   nml->mem_pos = var_addr;
3656
3657   nml->var_name = (char*) get_mem (var_name_len + 1);
3658   memcpy (nml->var_name, var_name, var_name_len);
3659   nml->var_name[var_name_len] = '\0';
3660
3661   nml->len = (int) len;
3662   nml->string_length = (index_type) string_length;
3663
3664   nml->var_rank = (int) (dtype & GFC_DTYPE_RANK_MASK);
3665   nml->size = (index_type) (dtype >> GFC_DTYPE_SIZE_SHIFT);
3666   nml->type = (bt) ((dtype & GFC_DTYPE_TYPE_MASK) >> GFC_DTYPE_TYPE_SHIFT);
3667
3668   if (nml->var_rank > 0)
3669     {
3670       nml->dim = (descriptor_dimension*)
3671                    get_mem (nml->var_rank * sizeof (descriptor_dimension));
3672       nml->ls = (array_loop_spec*)
3673                   get_mem (nml->var_rank * sizeof (array_loop_spec));
3674     }
3675   else
3676     {
3677       nml->dim = NULL;
3678       nml->ls = NULL;
3679     }
3680
3681   nml->next = NULL;
3682
3683   if ((dtp->common.flags & IOPARM_DT_IONML_SET) == 0)
3684     {
3685       dtp->common.flags |= IOPARM_DT_IONML_SET;
3686       dtp->u.p.ionml = nml;
3687     }
3688   else
3689     {
3690       for (t1 = dtp->u.p.ionml; t1->next; t1 = t1->next);
3691       t1->next = nml;
3692     }
3693 }
3694
3695 /* Store the dimensional information for the namelist object.  */
3696 extern void st_set_nml_var_dim (st_parameter_dt *, GFC_INTEGER_4,
3697                                 index_type, index_type,
3698                                 index_type);
3699 export_proto(st_set_nml_var_dim);
3700
3701 void
3702 st_set_nml_var_dim (st_parameter_dt *dtp, GFC_INTEGER_4 n_dim,
3703                     index_type stride, index_type lbound,
3704                     index_type ubound)
3705 {
3706   namelist_info * nml;
3707   int n;
3708
3709   n = (int)n_dim;
3710
3711   for (nml = dtp->u.p.ionml; nml->next; nml = nml->next);
3712
3713   GFC_DIMENSION_SET(nml->dim[n],lbound,ubound,stride);
3714 }
3715
3716 /* Reverse memcpy - used for byte swapping.  */
3717
3718 void reverse_memcpy (void *dest, const void *src, size_t n)
3719 {
3720   char *d, *s;
3721   size_t i;
3722
3723   d = (char *) dest;
3724   s = (char *) src + n - 1;
3725
3726   /* Write with ascending order - this is likely faster
3727      on modern architectures because of write combining.  */
3728   for (i=0; i<n; i++)
3729       *(d++) = *(s--);
3730 }
3731
3732
3733 /* Once upon a time, a poor innocent Fortran program was reading a
3734    file, when suddenly it hit the end-of-file (EOF).  Unfortunately
3735    the OS doesn't tell whether we're at the EOF or whether we already
3736    went past it.  Luckily our hero, libgfortran, keeps track of this.
3737    Call this function when you detect an EOF condition.  See Section
3738    9.10.2 in F2003.  */
3739
3740 void
3741 hit_eof (st_parameter_dt * dtp)
3742 {
3743   dtp->u.p.current_unit->flags.position = POSITION_APPEND;
3744
3745   if (dtp->u.p.current_unit->flags.access == ACCESS_SEQUENTIAL)
3746     switch (dtp->u.p.current_unit->endfile)
3747       {
3748       case NO_ENDFILE:
3749       case AT_ENDFILE:
3750         generate_error (&dtp->common, LIBERROR_END, NULL);
3751         if (!is_internal_unit (dtp))
3752           {
3753             dtp->u.p.current_unit->endfile = AFTER_ENDFILE;
3754             dtp->u.p.current_unit->current_record = 0;
3755           }
3756         else
3757           dtp->u.p.current_unit->endfile = AT_ENDFILE;
3758         break;
3759         
3760       case AFTER_ENDFILE:
3761         generate_error (&dtp->common, LIBERROR_ENDFILE, NULL);
3762         dtp->u.p.current_unit->current_record = 0;
3763         break;
3764       }
3765   else
3766     {
3767       /* Non-sequential files don't have an ENDFILE record, so we
3768          can't be at AFTER_ENDFILE.  */
3769       dtp->u.p.current_unit->endfile = AT_ENDFILE;
3770       generate_error (&dtp->common, LIBERROR_END, NULL);
3771       dtp->u.p.current_unit->current_record = 0;
3772     }
3773 }