OSDN Git Service

2007-05-06 Jerry DeLisle <jvdelisle@gcc.gnu.org>
[pf3gnuchains/gcc-fork.git] / libgfortran / io / transfer.c
1 /* Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007
2    Free Software Foundation, Inc.
3    Contributed by Andy Vaught
4    Namelist transfer functions contributed by Paul Thomas
5
6 This file is part of the GNU Fortran 95 runtime library (libgfortran).
7
8 Libgfortran is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2, or (at your option)
11 any later version.
12
13 In addition to the permissions in the GNU General Public License, the
14 Free Software Foundation gives you unlimited permission to link the
15 compiled version of this file into combinations with other programs,
16 and to distribute those combinations without any restriction coming
17 from the use of this file.  (The General Public License restrictions
18 do apply in other respects; for example, they cover modification of
19 the file, and distribution when not linked into a combine
20 executable.)
21
22 Libgfortran is distributed in the hope that it will be useful,
23 but WITHOUT ANY WARRANTY; without even the implied warranty of
24 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
25 GNU General Public License for more details.
26
27 You should have received a copy of the GNU General Public License
28 along with Libgfortran; see the file COPYING.  If not, write to
29 the Free Software Foundation, 51 Franklin Street, Fifth Floor,
30 Boston, MA 02110-1301, USA.  */
31
32
33 /* transfer.c -- Top level handling of data transfer statements.  */
34
35 #include "config.h"
36 #include <string.h>
37 #include <assert.h>
38 #include "libgfortran.h"
39 #include "io.h"
40
41
42 /* Calling conventions:  Data transfer statements are unlike other
43    library calls in that they extend over several calls.
44
45    The first call is always a call to st_read() or st_write().  These
46    subroutines return no status unless a namelist read or write is
47    being done, in which case there is the usual status.  No further
48    calls are necessary in this case.
49
50    For other sorts of data transfer, there are zero or more data
51    transfer statement that depend on the format of the data transfer
52    statement.
53
54       transfer_integer
55       transfer_logical
56       transfer_character
57       transfer_real
58       transfer_complex
59
60     These subroutines do not return status.
61
62     The last call is a call to st_[read|write]_done().  While
63     something can easily go wrong with the initial st_read() or
64     st_write(), an error inhibits any data from actually being
65     transferred.  */
66
67 extern void transfer_integer (st_parameter_dt *, void *, int);
68 export_proto(transfer_integer);
69
70 extern void transfer_real (st_parameter_dt *, void *, int);
71 export_proto(transfer_real);
72
73 extern void transfer_logical (st_parameter_dt *, void *, int);
74 export_proto(transfer_logical);
75
76 extern void transfer_character (st_parameter_dt *, void *, int);
77 export_proto(transfer_character);
78
79 extern void transfer_complex (st_parameter_dt *, void *, int);
80 export_proto(transfer_complex);
81
82 extern void transfer_array (st_parameter_dt *, gfc_array_char *, int,
83                             gfc_charlen_type);
84 export_proto(transfer_array);
85
86 static void us_read (st_parameter_dt *, int);
87 static void us_write (st_parameter_dt *, int);
88 static void next_record_r_unf (st_parameter_dt *, int);
89 static void next_record_w_unf (st_parameter_dt *, int);
90
91 static const st_option advance_opt[] = {
92   {"yes", ADVANCE_YES},
93   {"no", ADVANCE_NO},
94   {NULL, 0}
95 };
96
97
98 typedef enum
99 { FORMATTED_SEQUENTIAL, UNFORMATTED_SEQUENTIAL,
100   FORMATTED_DIRECT, UNFORMATTED_DIRECT, FORMATTED_STREAM, UNFORMATTED_STREAM
101 }
102 file_mode;
103
104
105 static file_mode
106 current_mode (st_parameter_dt *dtp)
107 {
108   file_mode m;
109
110   m = FORM_UNSPECIFIED;
111
112   if (dtp->u.p.current_unit->flags.access == ACCESS_DIRECT)
113     {
114       m = dtp->u.p.current_unit->flags.form == FORM_FORMATTED ?
115         FORMATTED_DIRECT : UNFORMATTED_DIRECT;
116     }
117   else if (dtp->u.p.current_unit->flags.access == ACCESS_SEQUENTIAL)
118     {
119       m = dtp->u.p.current_unit->flags.form == FORM_FORMATTED ?
120         FORMATTED_SEQUENTIAL : UNFORMATTED_SEQUENTIAL;
121     }
122   else if (dtp->u.p.current_unit->flags.access == ACCESS_STREAM)
123     {
124       m = dtp->u.p.current_unit->flags.form == FORM_FORMATTED ?
125         FORMATTED_STREAM : UNFORMATTED_STREAM;
126     }
127
128   return m;
129 }
130
131
132 /* Mid level data transfer statements.  These subroutines do reading
133    and writing in the style of salloc_r()/salloc_w() within the
134    current record.  */
135
136 /* When reading sequential formatted records we have a problem.  We
137    don't know how long the line is until we read the trailing newline,
138    and we don't want to read too much.  If we read too much, we might
139    have to do a physical seek backwards depending on how much data is
140    present, and devices like terminals aren't seekable and would cause
141    an I/O error.
142
143    Given this, the solution is to read a byte at a time, stopping if
144    we hit the newline.  For small allocations, we use a static buffer.
145    For larger allocations, we are forced to allocate memory on the
146    heap.  Hopefully this won't happen very often.  */
147
148 char *
149 read_sf (st_parameter_dt *dtp, int *length, int no_error)
150 {
151   char *base, *p, *q;
152   int n, readlen, crlf;
153   gfc_offset pos;
154
155   if (*length > SCRATCH_SIZE)
156     dtp->u.p.line_buffer = get_mem (*length);
157   p = base = dtp->u.p.line_buffer;
158
159   /* If we have seen an eor previously, return a length of 0.  The
160      caller is responsible for correctly padding the input field.  */
161   if (dtp->u.p.sf_seen_eor)
162     {
163       *length = 0;
164       return base;
165     }
166
167   if (is_internal_unit (dtp))
168     {
169       readlen = *length;
170       q = salloc_r (dtp->u.p.current_unit->s, &readlen);
171       memcpy (p, q, readlen);
172       goto done;
173     }
174
175   readlen = 1;
176   n = 0;
177
178   do
179     {
180       q = salloc_r (dtp->u.p.current_unit->s, &readlen);
181       if (q == NULL)
182         break;
183
184       /* If we have a line without a terminating \n, drop through to
185          EOR below.  */
186       if (readlen < 1 && n == 0)
187         {
188           if (no_error)
189             break;
190           generate_error (&dtp->common, ERROR_END, NULL);
191           return NULL;
192         }
193
194       if (readlen < 1 || *q == '\n' || *q == '\r')
195         {
196           /* Unexpected end of line.  */
197
198           /* If we see an EOR during non-advancing I/O, we need to skip
199              the rest of the I/O statement.  Set the corresponding flag.  */
200           if (dtp->u.p.advance_status == ADVANCE_NO || dtp->u.p.seen_dollar)
201             dtp->u.p.eor_condition = 1;
202
203           crlf = 0;
204           /* If we encounter a CR, it might be a CRLF.  */
205           if (*q == '\r') /* Probably a CRLF */
206             {
207               readlen = 1;
208               pos = stream_offset (dtp->u.p.current_unit->s);
209               q = salloc_r (dtp->u.p.current_unit->s, &readlen);
210               if (*q != '\n' && readlen == 1) /* Not a CRLF after all.  */
211                 sseek (dtp->u.p.current_unit->s, pos);
212               else
213                 crlf = 1;
214             }
215
216           /* Without padding, terminate the I/O statement without assigning
217              the value.  With padding, the value still needs to be assigned,
218              so we can just continue with a short read.  */
219           if (dtp->u.p.current_unit->flags.pad == PAD_NO)
220             {
221               if (no_error)
222                 break;
223               generate_error (&dtp->common, ERROR_EOR, NULL);
224               return NULL;
225             }
226
227           *length = n;
228           dtp->u.p.sf_seen_eor = (crlf ? 2 : 1);
229           break;
230         }
231       /*  Short circuit the read if a comma is found during numeric input.
232           The flag is set to zero during character reads so that commas in
233           strings are not ignored  */
234       if (*q == ',')
235         if (dtp->u.p.sf_read_comma == 1)
236           {
237             notify_std (&dtp->common, GFC_STD_GNU,
238                         "Comma in formatted numeric read.");
239             *length = n;
240             break;
241           }
242
243       n++;
244       *p++ = *q;
245       dtp->u.p.sf_seen_eor = 0;
246     }
247   while (n < *length);
248
249  done:
250   dtp->u.p.current_unit->bytes_left -= *length;
251
252   if ((dtp->common.flags & IOPARM_DT_HAS_SIZE) != 0)
253     dtp->u.p.size_used += (gfc_offset) *length;
254
255   return base;
256 }
257
258
259 /* Function for reading the next couple of bytes from the current
260    file, advancing the current position.  We return a pointer to a
261    buffer containing the bytes.  We return NULL on end of record or
262    end of file.
263
264    If the read is short, then it is because the current record does not
265    have enough data to satisfy the read request and the file was
266    opened with PAD=YES.  The caller must assume tailing spaces for
267    short reads.  */
268
269 void *
270 read_block (st_parameter_dt *dtp, int *length)
271 {
272   char *source;
273   int nread;
274
275   if (is_stream_io (dtp))
276     {
277       if (sseek (dtp->u.p.current_unit->s,
278                  dtp->u.p.current_unit->strm_pos - 1) == FAILURE)
279         {
280           generate_error (&dtp->common, ERROR_END, NULL);
281           return NULL;
282         }
283     }
284   else
285     {
286       if (dtp->u.p.current_unit->bytes_left < (gfc_offset) *length)
287         {
288           /* For preconnected units with default record length, set bytes left
289            to unit record length and proceed, otherwise error.  */
290           if (dtp->u.p.current_unit->unit_number == options.stdin_unit
291               && dtp->u.p.current_unit->recl == DEFAULT_RECL)
292           dtp->u.p.current_unit->bytes_left = dtp->u.p.current_unit->recl;
293           else
294             {
295               if (dtp->u.p.current_unit->flags.pad == PAD_NO)
296                 {
297                   /* Not enough data left.  */
298                   generate_error (&dtp->common, ERROR_EOR, NULL);
299                   return NULL;
300                 }
301             }
302
303           if (dtp->u.p.current_unit->bytes_left == 0)
304             {
305               dtp->u.p.current_unit->endfile = AT_ENDFILE;
306               generate_error (&dtp->common, ERROR_END, NULL);
307               return NULL;
308             }
309
310           *length = dtp->u.p.current_unit->bytes_left;
311         }
312     }
313
314   if (dtp->u.p.current_unit->flags.form == FORM_FORMATTED &&
315       (dtp->u.p.current_unit->flags.access == ACCESS_SEQUENTIAL ||
316        dtp->u.p.current_unit->flags.access == ACCESS_STREAM))
317     {
318       source = read_sf (dtp, length, 0);
319       dtp->u.p.current_unit->strm_pos +=
320         (gfc_offset) (*length + dtp->u.p.sf_seen_eor);
321       return source;
322     }
323   dtp->u.p.current_unit->bytes_left -= (gfc_offset) *length;
324
325   nread = *length;
326   source = salloc_r (dtp->u.p.current_unit->s, &nread);
327
328   if ((dtp->common.flags & IOPARM_DT_HAS_SIZE) != 0)
329     dtp->u.p.size_used += (gfc_offset) nread;
330
331   if (nread != *length)
332     {                           /* Short read, this shouldn't happen.  */
333       if (dtp->u.p.current_unit->flags.pad == PAD_YES)
334         *length = nread;
335       else
336         {
337           generate_error (&dtp->common, ERROR_EOR, NULL);
338           source = NULL;
339         }
340     }
341
342   dtp->u.p.current_unit->strm_pos += (gfc_offset) nread;
343
344   return source;
345 }
346
347
348 /* Reads a block directly into application data space.  This is for
349    unformatted files.  */
350
351 static void
352 read_block_direct (st_parameter_dt *dtp, void *buf, size_t *nbytes)
353 {
354   size_t to_read_record;
355   size_t have_read_record;
356   size_t to_read_subrecord;
357   size_t have_read_subrecord;
358   int short_record;
359
360   if (is_stream_io (dtp))
361     {
362       if (sseek (dtp->u.p.current_unit->s,
363                  dtp->u.p.current_unit->strm_pos - 1) == FAILURE)
364         {
365           generate_error (&dtp->common, ERROR_END, NULL);
366           return;
367         }
368
369       to_read_record = *nbytes;
370       have_read_record = to_read_record;
371       if (sread (dtp->u.p.current_unit->s, buf, &have_read_record) != 0)
372         {
373           generate_error (&dtp->common, ERROR_OS, NULL);
374           return;
375         }
376
377       dtp->u.p.current_unit->strm_pos += (gfc_offset) have_read_record; 
378
379       if (to_read_record != have_read_record)
380         {
381           /* Short read,  e.g. if we hit EOF.  For stream files,
382            we have to set the end-of-file condition.  */
383           generate_error (&dtp->common, ERROR_END, NULL);
384           return;
385         }
386       return;
387     }
388
389   if (dtp->u.p.current_unit->flags.access == ACCESS_DIRECT)
390     {
391       if (dtp->u.p.current_unit->bytes_left < (gfc_offset) *nbytes)
392         {
393           short_record = 1;
394           to_read_record = (size_t) dtp->u.p.current_unit->bytes_left;
395           *nbytes = to_read_record;
396         }
397
398       else
399         {
400           short_record = 0;
401           to_read_record = *nbytes;
402         }
403
404       dtp->u.p.current_unit->bytes_left -= to_read_record;
405
406       if (sread (dtp->u.p.current_unit->s, buf, &to_read_record) != 0)
407         {
408           generate_error (&dtp->common, ERROR_OS, NULL);
409           return;
410         }
411
412       if (to_read_record != *nbytes)  
413         {
414           /* Short read, e.g. if we hit EOF.  Apparently, we read
415            more than was written to the last record.  */
416           *nbytes = to_read_record;
417           return;
418         }
419
420       if (short_record)
421         {
422           generate_error (&dtp->common, ERROR_SHORT_RECORD, NULL);
423           return;
424         }
425       return;
426     }
427
428   /* Unformatted sequential.  We loop over the subrecords, reading
429      until the request has been fulfilled or the record has run out
430      of continuation subrecords.  */
431
432   if (dtp->u.p.current_unit->endfile == AT_ENDFILE)
433     {
434       generate_error (&dtp->common, ERROR_END, NULL);
435       return;
436     }
437
438   /* Check whether we exceed the total record length.  */
439
440   if (dtp->u.p.current_unit->flags.has_recl
441       && (*nbytes > (size_t) dtp->u.p.current_unit->bytes_left))
442     {
443       to_read_record = (size_t) dtp->u.p.current_unit->bytes_left;
444       short_record = 1;
445     }
446   else
447     {
448       to_read_record = *nbytes;
449       short_record = 0;
450     }
451   have_read_record = 0;
452
453   while(1)
454     {
455       if (dtp->u.p.current_unit->bytes_left_subrecord
456           < (gfc_offset) to_read_record)
457         {
458           to_read_subrecord = (size_t) dtp->u.p.current_unit->bytes_left_subrecord;
459           to_read_record -= to_read_subrecord;
460         }
461       else
462         {
463           to_read_subrecord = to_read_record;
464           to_read_record = 0;
465         }
466
467       dtp->u.p.current_unit->bytes_left_subrecord -= to_read_subrecord;
468
469       have_read_subrecord = to_read_subrecord;
470       if (sread (dtp->u.p.current_unit->s, buf + have_read_record,
471                  &have_read_subrecord) != 0)
472         {
473           generate_error (&dtp->common, ERROR_OS, NULL);
474           return;
475         }
476
477       have_read_record += have_read_subrecord;
478
479       if (to_read_subrecord != have_read_subrecord)  
480                         
481         {
482           /* Short read, e.g. if we hit EOF.  This means the record
483              structure has been corrupted, or the trailing record
484              marker would still be present.  */
485
486           *nbytes = have_read_record;
487           generate_error (&dtp->common, ERROR_CORRUPT_FILE, NULL);
488           return;
489         }
490
491       if (to_read_record > 0)
492         {
493           if (dtp->u.p.current_unit->continued)
494             {
495               next_record_r_unf (dtp, 0);
496               us_read (dtp, 1);
497             }
498           else
499             {
500               /* Let's make sure the file position is correctly pre-positioned
501                  for the next read statement.  */
502
503               dtp->u.p.current_unit->current_record = 0;
504               next_record_r_unf (dtp, 0);
505               generate_error (&dtp->common, ERROR_SHORT_RECORD, NULL);
506               return;
507             }
508         }
509       else
510         {
511           /* Normal exit, the read request has been fulfilled.  */
512           break;
513         }
514     }
515
516   dtp->u.p.current_unit->bytes_left -= have_read_record;
517   if (short_record)
518     {
519       generate_error (&dtp->common, ERROR_SHORT_RECORD, NULL);
520       return;
521     }
522   return;
523 }
524
525
526 /* Function for writing a block of bytes to the current file at the
527    current position, advancing the file pointer. We are given a length
528    and return a pointer to a buffer that the caller must (completely)
529    fill in.  Returns NULL on error.  */
530
531 void *
532 write_block (st_parameter_dt *dtp, int length)
533 {
534   char *dest;
535
536   if (is_stream_io (dtp))
537     {
538       if (sseek (dtp->u.p.current_unit->s,
539                  dtp->u.p.current_unit->strm_pos - 1) == FAILURE)
540         {
541           generate_error (&dtp->common, ERROR_OS, NULL);
542           return NULL;
543         }
544     }
545   else
546     {
547       if (dtp->u.p.current_unit->bytes_left < (gfc_offset) length)
548         {
549           /* For preconnected units with default record length, set bytes left
550              to unit record length and proceed, otherwise error.  */
551           if ((dtp->u.p.current_unit->unit_number == options.stdout_unit
552                 || dtp->u.p.current_unit->unit_number == options.stderr_unit)
553                 && dtp->u.p.current_unit->recl == DEFAULT_RECL)
554             dtp->u.p.current_unit->bytes_left = dtp->u.p.current_unit->recl;
555           else
556             {
557               generate_error (&dtp->common, ERROR_EOR, NULL);
558               return NULL;
559             }
560         }
561
562       dtp->u.p.current_unit->bytes_left -= (gfc_offset) length;
563     }
564
565   dest = salloc_w (dtp->u.p.current_unit->s, &length);
566
567   if (dest == NULL)
568     {
569       generate_error (&dtp->common, ERROR_END, NULL);
570       return NULL;
571     }
572
573   if (is_internal_unit (dtp) && dtp->u.p.current_unit->endfile == AT_ENDFILE)
574     generate_error (&dtp->common, ERROR_END, NULL);
575
576   if ((dtp->common.flags & IOPARM_DT_HAS_SIZE) != 0)
577     dtp->u.p.size_used += (gfc_offset) length;
578
579   dtp->u.p.current_unit->strm_pos += (gfc_offset) length;
580
581   return dest;
582 }
583
584
585 /* High level interface to swrite(), taking care of errors.  This is only
586    called for unformatted files.  There are three cases to consider:
587    Stream I/O, unformatted direct, unformatted sequential.  */
588
589 static try
590 write_buf (st_parameter_dt *dtp, void *buf, size_t nbytes)
591 {
592
593   size_t have_written, to_write_subrecord;
594   int short_record;
595
596
597   /* Stream I/O.  */
598
599   if (is_stream_io (dtp))
600     {
601       if (sseek (dtp->u.p.current_unit->s,
602                  dtp->u.p.current_unit->strm_pos - 1) == FAILURE)
603         {
604           generate_error (&dtp->common, ERROR_OS, NULL);
605           return FAILURE;
606         }
607
608       if (swrite (dtp->u.p.current_unit->s, buf, &nbytes) != 0)
609         {
610           generate_error (&dtp->common, ERROR_OS, NULL);
611           return FAILURE;
612         }
613
614       dtp->u.p.current_unit->strm_pos += (gfc_offset) nbytes; 
615
616       return SUCCESS;
617     }
618
619   /* Unformatted direct access.  */
620
621   if (dtp->u.p.current_unit->flags.access == ACCESS_DIRECT)
622     {
623       if (dtp->u.p.current_unit->bytes_left < (gfc_offset) nbytes)
624         {
625           generate_error (&dtp->common, ERROR_DIRECT_EOR, NULL);
626           return FAILURE;
627         }
628
629       if (swrite (dtp->u.p.current_unit->s, buf, &nbytes) != 0)
630         {
631           generate_error (&dtp->common, ERROR_OS, NULL);
632           return FAILURE;
633         }
634
635       dtp->u.p.current_unit->strm_pos += (gfc_offset) nbytes;
636       dtp->u.p.current_unit->bytes_left -= (gfc_offset) nbytes;
637
638       return SUCCESS;
639
640     }
641
642   /* Unformatted sequential.  */
643
644   have_written = 0;
645
646   if (dtp->u.p.current_unit->flags.has_recl
647       && (gfc_offset) nbytes > dtp->u.p.current_unit->bytes_left)
648     {
649       nbytes = dtp->u.p.current_unit->bytes_left;
650       short_record = 1;
651     }
652   else
653     {
654       short_record = 0;
655     }
656
657   while (1)
658     {
659
660       to_write_subrecord =
661         (size_t) dtp->u.p.current_unit->bytes_left_subrecord < nbytes ?
662         (size_t) dtp->u.p.current_unit->bytes_left_subrecord : nbytes;
663
664       dtp->u.p.current_unit->bytes_left_subrecord -=
665         (gfc_offset) to_write_subrecord;
666
667       if (swrite (dtp->u.p.current_unit->s, buf + have_written,
668                   &to_write_subrecord) != 0)
669         {
670           generate_error (&dtp->common, ERROR_OS, NULL);
671           return FAILURE;
672         }
673
674       dtp->u.p.current_unit->strm_pos += (gfc_offset) to_write_subrecord; 
675       nbytes -= to_write_subrecord;
676       have_written += to_write_subrecord;
677
678       if (nbytes == 0)
679         break;
680
681       next_record_w_unf (dtp, 1);
682       us_write (dtp, 1);
683     }
684   dtp->u.p.current_unit->bytes_left -= have_written;
685   if (short_record)
686     {
687       generate_error (&dtp->common, ERROR_SHORT_RECORD, NULL);
688       return FAILURE;
689     }
690   return SUCCESS;
691 }
692
693
694 /* Master function for unformatted reads.  */
695
696 static void
697 unformatted_read (st_parameter_dt *dtp, bt type,
698                   void *dest, int kind,
699                   size_t size, size_t nelems)
700 {
701   size_t i, sz;
702
703   /* Currently, character implies size=1.  */
704   if (dtp->u.p.current_unit->flags.convert == CONVERT_NATIVE
705       || size == 1 || type == BT_CHARACTER)
706     {
707       sz = size * nelems;
708       read_block_direct (dtp, dest, &sz);
709     }
710   else
711     {
712       char buffer[16];
713       char *p;
714       
715       /* Break up complex into its constituent reals.  */
716       if (type == BT_COMPLEX)
717         {
718           nelems *= 2;
719           size /= 2;
720         }
721       p = dest;
722       
723       /* By now, all complex variables have been split into their
724          constituent reals.  For types with padding, we only need to
725          read kind bytes.  We don't care about the contents
726          of the padding.  If we hit a short record, then sz is
727          adjusted accordingly, making later reads no-ops.  */
728       
729       sz = kind;
730       for (i=0; i<nelems; i++)
731         {
732           read_block_direct (dtp, buffer, &sz);
733           reverse_memcpy (p, buffer, sz);
734           p += size;
735         }
736     }
737 }
738
739
740 /* Master function for unformatted writes.  */
741
742 static void
743 unformatted_write (st_parameter_dt *dtp, bt type,
744                    void *source, int kind,
745                    size_t size, size_t nelems)
746 {
747   if (dtp->u.p.current_unit->flags.convert == CONVERT_NATIVE ||
748       size == 1 || type == BT_CHARACTER)
749     {
750       size *= nelems;
751
752       write_buf (dtp, source, size);
753     }
754   else
755     {
756       char buffer[16];
757       char *p;
758       size_t i, sz;
759   
760       /* Break up complex into its constituent reals.  */
761       if (type == BT_COMPLEX)
762         {
763           nelems *= 2;
764           size /= 2;
765         }      
766
767       p = source;
768
769       /* By now, all complex variables have been split into their
770          constituent reals.  For types with padding, we only need to
771          read kind bytes.  We don't care about the contents
772          of the padding.  */
773
774       sz = kind;
775       for (i=0; i<nelems; i++)
776         {
777           reverse_memcpy(buffer, p, size);
778           p+= size;
779           write_buf (dtp, buffer, sz);
780         }
781     }
782 }
783
784
785 /* Return a pointer to the name of a type.  */
786
787 const char *
788 type_name (bt type)
789 {
790   const char *p;
791
792   switch (type)
793     {
794     case BT_INTEGER:
795       p = "INTEGER";
796       break;
797     case BT_LOGICAL:
798       p = "LOGICAL";
799       break;
800     case BT_CHARACTER:
801       p = "CHARACTER";
802       break;
803     case BT_REAL:
804       p = "REAL";
805       break;
806     case BT_COMPLEX:
807       p = "COMPLEX";
808       break;
809     default:
810       internal_error (NULL, "type_name(): Bad type");
811     }
812
813   return p;
814 }
815
816
817 /* Write a constant string to the output.
818    This is complicated because the string can have doubled delimiters
819    in it.  The length in the format node is the true length.  */
820
821 static void
822 write_constant_string (st_parameter_dt *dtp, const fnode *f)
823 {
824   char c, delimiter, *p, *q;
825   int length;
826
827   length = f->u.string.length;
828   if (length == 0)
829     return;
830
831   p = write_block (dtp, length);
832   if (p == NULL)
833     return;
834
835   q = f->u.string.p;
836   delimiter = q[-1];
837
838   for (; length > 0; length--)
839     {
840       c = *p++ = *q++;
841       if (c == delimiter && c != 'H' && c != 'h')
842         q++;                    /* Skip the doubled delimiter.  */
843     }
844 }
845
846
847 /* Given actual and expected types in a formatted data transfer, make
848    sure they agree.  If not, an error message is generated.  Returns
849    nonzero if something went wrong.  */
850
851 static int
852 require_type (st_parameter_dt *dtp, bt expected, bt actual, const fnode *f)
853 {
854   char buffer[100];
855
856   if (actual == expected)
857     return 0;
858
859   st_sprintf (buffer, "Expected %s for item %d in formatted transfer, got %s",
860               type_name (expected), dtp->u.p.item_count, type_name (actual));
861
862   format_error (dtp, f, buffer);
863   return 1;
864 }
865
866
867 /* This subroutine is the main loop for a formatted data transfer
868    statement.  It would be natural to implement this as a coroutine
869    with the user program, but C makes that awkward.  We loop,
870    processing format elements.  When we actually have to transfer
871    data instead of just setting flags, we return control to the user
872    program which calls a subroutine that supplies the address and type
873    of the next element, then comes back here to process it.  */
874
875 static void
876 formatted_transfer_scalar (st_parameter_dt *dtp, bt type, void *p, int len,
877                            size_t size)
878 {
879   char scratch[SCRATCH_SIZE];
880   int pos, bytes_used;
881   const fnode *f;
882   format_token t;
883   int n;
884   int consume_data_flag;
885
886   /* Change a complex data item into a pair of reals.  */
887
888   n = (p == NULL) ? 0 : ((type != BT_COMPLEX) ? 1 : 2);
889   if (type == BT_COMPLEX)
890     {
891       type = BT_REAL;
892       size /= 2;
893     }
894
895   /* If there's an EOR condition, we simulate finalizing the transfer
896      by doing nothing.  */
897   if (dtp->u.p.eor_condition)
898     return;
899
900   /* Set this flag so that commas in reads cause the read to complete before
901      the entire field has been read.  The next read field will start right after
902      the comma in the stream.  (Set to 0 for character reads).  */
903   dtp->u.p.sf_read_comma = 1;
904
905   dtp->u.p.line_buffer = scratch;
906   for (;;)
907     {
908       /* If reversion has occurred and there is another real data item,
909          then we have to move to the next record.  */
910       if (dtp->u.p.reversion_flag && n > 0)
911         {
912           dtp->u.p.reversion_flag = 0;
913           next_record (dtp, 0);
914         }
915
916       consume_data_flag = 1 ;
917       if ((dtp->common.flags & IOPARM_LIBRETURN_MASK) != IOPARM_LIBRETURN_OK)
918         break;
919
920       f = next_format (dtp);
921       if (f == NULL)
922         {
923           /* No data descriptors left.  */
924           if (n > 0)
925             generate_error (&dtp->common, ERROR_FORMAT,
926                 "Insufficient data descriptors in format after reversion");
927           return;
928         }
929
930       /* Now discharge T, TR and X movements to the right.  This is delayed
931          until a data producing format to suppress trailing spaces.  */
932          
933       t = f->format;
934       if (dtp->u.p.mode == WRITING && dtp->u.p.skips != 0
935         && ((n>0 && (  t == FMT_I  || t == FMT_B  || t == FMT_O
936                     || t == FMT_Z  || t == FMT_F  || t == FMT_E
937                     || t == FMT_EN || t == FMT_ES || t == FMT_G
938                     || t == FMT_L  || t == FMT_A  || t == FMT_D))
939             || t == FMT_STRING))
940         {
941           if (dtp->u.p.skips > 0)
942             {
943               write_x (dtp, dtp->u.p.skips, dtp->u.p.pending_spaces);
944               dtp->u.p.max_pos = (int)(dtp->u.p.current_unit->recl
945                                        - dtp->u.p.current_unit->bytes_left);
946             }
947           if (dtp->u.p.skips < 0)
948             {
949               move_pos_offset (dtp->u.p.current_unit->s, dtp->u.p.skips);
950               dtp->u.p.current_unit->bytes_left -= (gfc_offset) dtp->u.p.skips;
951             }
952           dtp->u.p.skips = dtp->u.p.pending_spaces = 0;
953         }
954
955       bytes_used = (int)(dtp->u.p.current_unit->recl
956                          - dtp->u.p.current_unit->bytes_left);
957
958       switch (t)
959         {
960         case FMT_I:
961           if (n == 0)
962             goto need_data;
963           if (require_type (dtp, BT_INTEGER, type, f))
964             return;
965
966           if (dtp->u.p.mode == READING)
967             read_decimal (dtp, f, p, len);
968           else
969             write_i (dtp, f, p, len);
970
971           break;
972
973         case FMT_B:
974           if (n == 0)
975             goto need_data;
976
977           if (compile_options.allow_std < GFC_STD_GNU
978               && require_type (dtp, BT_INTEGER, type, f))
979             return;
980
981           if (dtp->u.p.mode == READING)
982             read_radix (dtp, f, p, len, 2);
983           else
984             write_b (dtp, f, p, len);
985
986           break;
987
988         case FMT_O:
989           if (n == 0)
990             goto need_data; 
991
992           if (compile_options.allow_std < GFC_STD_GNU
993               && require_type (dtp, BT_INTEGER, type, f))
994             return;
995
996           if (dtp->u.p.mode == READING)
997             read_radix (dtp, f, p, len, 8);
998           else
999             write_o (dtp, f, p, len);
1000
1001           break;
1002
1003         case FMT_Z:
1004           if (n == 0)
1005             goto need_data;
1006
1007           if (compile_options.allow_std < GFC_STD_GNU
1008               && require_type (dtp, BT_INTEGER, type, f))
1009             return;
1010
1011           if (dtp->u.p.mode == READING)
1012             read_radix (dtp, f, p, len, 16);
1013           else
1014             write_z (dtp, f, p, len);
1015
1016           break;
1017
1018         case FMT_A:
1019           if (n == 0)
1020             goto need_data;
1021
1022           if (dtp->u.p.mode == READING)
1023             read_a (dtp, f, p, len);
1024           else
1025             write_a (dtp, f, p, len);
1026
1027           break;
1028
1029         case FMT_L:
1030           if (n == 0)
1031             goto need_data;
1032
1033           if (dtp->u.p.mode == READING)
1034             read_l (dtp, f, p, len);
1035           else
1036             write_l (dtp, f, p, len);
1037
1038           break;
1039
1040         case FMT_D:
1041           if (n == 0)
1042             goto need_data;
1043           if (require_type (dtp, BT_REAL, type, f))
1044             return;
1045
1046           if (dtp->u.p.mode == READING)
1047             read_f (dtp, f, p, len);
1048           else
1049             write_d (dtp, f, p, len);
1050
1051           break;
1052
1053         case FMT_E:
1054           if (n == 0)
1055             goto need_data;
1056           if (require_type (dtp, BT_REAL, type, f))
1057             return;
1058
1059           if (dtp->u.p.mode == READING)
1060             read_f (dtp, f, p, len);
1061           else
1062             write_e (dtp, f, p, len);
1063           break;
1064
1065         case FMT_EN:
1066           if (n == 0)
1067             goto need_data;
1068           if (require_type (dtp, BT_REAL, type, f))
1069             return;
1070
1071           if (dtp->u.p.mode == READING)
1072             read_f (dtp, f, p, len);
1073           else
1074             write_en (dtp, f, p, len);
1075
1076           break;
1077
1078         case FMT_ES:
1079           if (n == 0)
1080             goto need_data;
1081           if (require_type (dtp, BT_REAL, type, f))
1082             return;
1083
1084           if (dtp->u.p.mode == READING)
1085             read_f (dtp, f, p, len);
1086           else
1087             write_es (dtp, f, p, len);
1088
1089           break;
1090
1091         case FMT_F:
1092           if (n == 0)
1093             goto need_data;
1094           if (require_type (dtp, BT_REAL, type, f))
1095             return;
1096
1097           if (dtp->u.p.mode == READING)
1098             read_f (dtp, f, p, len);
1099           else
1100             write_f (dtp, f, p, len);
1101
1102           break;
1103
1104         case FMT_G:
1105           if (n == 0)
1106             goto need_data;
1107           if (dtp->u.p.mode == READING)
1108             switch (type)
1109               {
1110               case BT_INTEGER:
1111                 read_decimal (dtp, f, p, len);
1112                 break;
1113               case BT_LOGICAL:
1114                 read_l (dtp, f, p, len);
1115                 break;
1116               case BT_CHARACTER:
1117                 read_a (dtp, f, p, len);
1118                 break;
1119               case BT_REAL:
1120                 read_f (dtp, f, p, len);
1121                 break;
1122               default:
1123                 goto bad_type;
1124               }
1125           else
1126             switch (type)
1127               {
1128               case BT_INTEGER:
1129                 write_i (dtp, f, p, len);
1130                 break;
1131               case BT_LOGICAL:
1132                 write_l (dtp, f, p, len);
1133                 break;
1134               case BT_CHARACTER:
1135                 write_a (dtp, f, p, len);
1136                 break;
1137               case BT_REAL:
1138                 write_d (dtp, f, p, len);
1139                 break;
1140               default:
1141               bad_type:
1142                 internal_error (&dtp->common,
1143                                 "formatted_transfer(): Bad type");
1144               }
1145
1146           break;
1147
1148         case FMT_STRING:
1149           consume_data_flag = 0 ;
1150           if (dtp->u.p.mode == READING)
1151             {
1152               format_error (dtp, f, "Constant string in input format");
1153               return;
1154             }
1155           write_constant_string (dtp, f);
1156           break;
1157
1158         /* Format codes that don't transfer data.  */
1159         case FMT_X:
1160         case FMT_TR:
1161           consume_data_flag = 0;
1162
1163           pos = bytes_used + f->u.n + dtp->u.p.skips;
1164           dtp->u.p.skips = f->u.n + dtp->u.p.skips;
1165           dtp->u.p.pending_spaces = pos - dtp->u.p.max_pos;
1166
1167           /* Writes occur just before the switch on f->format, above, so
1168              that trailing blanks are suppressed, unless we are doing a
1169              non-advancing write in which case we want to output the blanks
1170              now.  */
1171           if (dtp->u.p.mode == WRITING
1172               && dtp->u.p.advance_status == ADVANCE_NO)
1173             {
1174               write_x (dtp, dtp->u.p.skips, dtp->u.p.pending_spaces);
1175               dtp->u.p.skips = dtp->u.p.pending_spaces = 0;
1176             }
1177
1178           if (dtp->u.p.mode == READING)
1179             read_x (dtp, f->u.n);
1180
1181           break;
1182
1183         case FMT_TL:
1184         case FMT_T:
1185           consume_data_flag = 0;
1186
1187           if (f->format == FMT_TL)
1188             {
1189
1190               /* Handle the special case when no bytes have been used yet.
1191                  Cannot go below zero. */
1192               if (bytes_used == 0)
1193                 {
1194                   dtp->u.p.pending_spaces -= f->u.n;
1195                   dtp->u.p.pending_spaces = dtp->u.p.pending_spaces < 0 ? 0
1196                                             : dtp->u.p.pending_spaces;
1197                   dtp->u.p.skips -= f->u.n;
1198                   dtp->u.p.skips = dtp->u.p.skips < 0 ? 0 : dtp->u.p.skips;
1199                 }
1200
1201               pos = bytes_used - f->u.n;
1202             }
1203           else /* FMT_T */
1204             {
1205               if (dtp->u.p.mode == READING)
1206                 pos = f->u.n - 1;
1207               else
1208                 pos = f->u.n - dtp->u.p.pending_spaces - 1;
1209             }
1210
1211           /* Standard 10.6.1.1: excessive left tabbing is reset to the
1212              left tab limit.  We do not check if the position has gone
1213              beyond the end of record because a subsequent tab could
1214              bring us back again.  */
1215           pos = pos < 0 ? 0 : pos;
1216
1217           dtp->u.p.skips = dtp->u.p.skips + pos - bytes_used;
1218           dtp->u.p.pending_spaces = dtp->u.p.pending_spaces
1219                                     + pos - dtp->u.p.max_pos;
1220
1221           if (dtp->u.p.skips == 0)
1222             break;
1223
1224           /* Writes occur just before the switch on f->format, above, so that
1225              trailing blanks are suppressed.  */
1226           if (dtp->u.p.mode == READING)
1227             {
1228               /* Adjust everything for end-of-record condition */
1229               if (dtp->u.p.sf_seen_eor && !is_internal_unit (dtp))
1230                 {
1231                   if (dtp->u.p.sf_seen_eor == 2)
1232                     {
1233                       /* The EOR was a CRLF (two bytes wide).  */
1234                       dtp->u.p.current_unit->bytes_left -= 2;
1235                       dtp->u.p.skips -= 2;
1236                     }
1237                   else
1238                     {
1239                       /* The EOR marker was only one byte wide.  */
1240                       dtp->u.p.current_unit->bytes_left--;
1241                       dtp->u.p.skips--;
1242                     }
1243                   bytes_used = pos;
1244                   dtp->u.p.sf_seen_eor = 0;
1245                 }
1246               if (dtp->u.p.skips < 0)
1247                 {
1248                   move_pos_offset (dtp->u.p.current_unit->s, dtp->u.p.skips);
1249                   dtp->u.p.current_unit->bytes_left
1250                     -= (gfc_offset) dtp->u.p.skips;
1251                   dtp->u.p.skips = dtp->u.p.pending_spaces = 0;
1252                 }
1253               else
1254                 read_x (dtp, dtp->u.p.skips);
1255             }
1256
1257           break;
1258
1259         case FMT_S:
1260           consume_data_flag = 0 ;
1261           dtp->u.p.sign_status = SIGN_S;
1262           break;
1263
1264         case FMT_SS:
1265           consume_data_flag = 0 ;
1266           dtp->u.p.sign_status = SIGN_SS;
1267           break;
1268
1269         case FMT_SP:
1270           consume_data_flag = 0 ;
1271           dtp->u.p.sign_status = SIGN_SP;
1272           break;
1273
1274         case FMT_BN:
1275           consume_data_flag = 0 ;
1276           dtp->u.p.blank_status = BLANK_NULL;
1277           break;
1278
1279         case FMT_BZ:
1280           consume_data_flag = 0 ;
1281           dtp->u.p.blank_status = BLANK_ZERO;
1282           break;
1283
1284         case FMT_P:
1285           consume_data_flag = 0 ;
1286           dtp->u.p.scale_factor = f->u.k;
1287           break;
1288
1289         case FMT_DOLLAR:
1290           consume_data_flag = 0 ;
1291           dtp->u.p.seen_dollar = 1;
1292           break;
1293
1294         case FMT_SLASH:
1295           consume_data_flag = 0 ;
1296           dtp->u.p.skips = dtp->u.p.pending_spaces = 0;
1297           next_record (dtp, 0);
1298           break;
1299
1300         case FMT_COLON:
1301           /* A colon descriptor causes us to exit this loop (in
1302              particular preventing another / descriptor from being
1303              processed) unless there is another data item to be
1304              transferred.  */
1305           consume_data_flag = 0 ;
1306           if (n == 0)
1307             return;
1308           break;
1309
1310         default:
1311           internal_error (&dtp->common, "Bad format node");
1312         }
1313
1314       /* Free a buffer that we had to allocate during a sequential
1315          formatted read of a block that was larger than the static
1316          buffer.  */
1317
1318       if (dtp->u.p.line_buffer != scratch)
1319         {
1320           free_mem (dtp->u.p.line_buffer);
1321           dtp->u.p.line_buffer = scratch;
1322         }
1323
1324       /* Adjust the item count and data pointer.  */
1325
1326       if ((consume_data_flag > 0) && (n > 0))
1327       {
1328         n--;
1329         p = ((char *) p) + size;
1330       }
1331
1332       if (dtp->u.p.mode == READING)
1333         dtp->u.p.skips = 0;
1334
1335       pos = (int)(dtp->u.p.current_unit->recl - dtp->u.p.current_unit->bytes_left);
1336       dtp->u.p.max_pos = (dtp->u.p.max_pos > pos) ? dtp->u.p.max_pos : pos;
1337
1338     }
1339
1340   return;
1341
1342   /* Come here when we need a data descriptor but don't have one.  We
1343      push the current format node back onto the input, then return and
1344      let the user program call us back with the data.  */
1345  need_data:
1346   unget_format (dtp, f);
1347 }
1348
1349 static void
1350 formatted_transfer (st_parameter_dt *dtp, bt type, void *p, int kind,
1351                     size_t size, size_t nelems)
1352 {
1353   size_t elem;
1354   char *tmp;
1355
1356   tmp = (char *) p;
1357
1358   /* Big loop over all the elements.  */
1359   for (elem = 0; elem < nelems; elem++)
1360     {
1361       dtp->u.p.item_count++;
1362       formatted_transfer_scalar (dtp, type, tmp + size*elem, kind, size);
1363     }
1364 }
1365
1366
1367
1368 /* Data transfer entry points.  The type of the data entity is
1369    implicit in the subroutine call.  This prevents us from having to
1370    share a common enum with the compiler.  */
1371
1372 void
1373 transfer_integer (st_parameter_dt *dtp, void *p, int kind)
1374 {
1375   if ((dtp->common.flags & IOPARM_LIBRETURN_MASK) != IOPARM_LIBRETURN_OK)
1376     return;
1377   dtp->u.p.transfer (dtp, BT_INTEGER, p, kind, kind, 1);
1378 }
1379
1380
1381 void
1382 transfer_real (st_parameter_dt *dtp, void *p, int kind)
1383 {
1384   size_t size;
1385   if ((dtp->common.flags & IOPARM_LIBRETURN_MASK) != IOPARM_LIBRETURN_OK)
1386     return;
1387   size = size_from_real_kind (kind);
1388   dtp->u.p.transfer (dtp, BT_REAL, p, kind, size, 1);
1389 }
1390
1391
1392 void
1393 transfer_logical (st_parameter_dt *dtp, void *p, int kind)
1394 {
1395   if ((dtp->common.flags & IOPARM_LIBRETURN_MASK) != IOPARM_LIBRETURN_OK)
1396     return;
1397   dtp->u.p.transfer (dtp, BT_LOGICAL, p, kind, kind, 1);
1398 }
1399
1400
1401 void
1402 transfer_character (st_parameter_dt *dtp, void *p, int len)
1403 {
1404   static char *empty_string[0];
1405
1406   if ((dtp->common.flags & IOPARM_LIBRETURN_MASK) != IOPARM_LIBRETURN_OK)
1407     return;
1408
1409   /* Strings of zero length can have p == NULL, which confuses the
1410      transfer routines into thinking we need more data elements.  To avoid
1411      this, we give them a nice pointer.  */
1412   if (len == 0 && p == NULL)
1413     p = empty_string;
1414
1415   /* Currently we support only 1 byte chars, and the library is a bit
1416      confused of character kind vs. length, so we kludge it by setting
1417      kind = length.  */
1418   dtp->u.p.transfer (dtp, BT_CHARACTER, p, len, len, 1);
1419 }
1420
1421
1422 void
1423 transfer_complex (st_parameter_dt *dtp, void *p, int kind)
1424 {
1425   size_t size;
1426   if ((dtp->common.flags & IOPARM_LIBRETURN_MASK) != IOPARM_LIBRETURN_OK)
1427     return;
1428   size = size_from_complex_kind (kind);
1429   dtp->u.p.transfer (dtp, BT_COMPLEX, p, kind, size, 1);
1430 }
1431
1432
1433 void
1434 transfer_array (st_parameter_dt *dtp, gfc_array_char *desc, int kind,
1435                 gfc_charlen_type charlen)
1436 {
1437   index_type count[GFC_MAX_DIMENSIONS];
1438   index_type extent[GFC_MAX_DIMENSIONS];
1439   index_type stride[GFC_MAX_DIMENSIONS];
1440   index_type stride0, rank, size, type, n;
1441   size_t tsize;
1442   char *data;
1443   bt iotype;
1444
1445   if ((dtp->common.flags & IOPARM_LIBRETURN_MASK) != IOPARM_LIBRETURN_OK)
1446     return;
1447
1448   type = GFC_DESCRIPTOR_TYPE (desc);
1449   size = GFC_DESCRIPTOR_SIZE (desc);
1450
1451   /* FIXME: What a kludge: Array descriptors and the IO library use
1452      different enums for types.  */
1453   switch (type)
1454     {
1455     case GFC_DTYPE_UNKNOWN:
1456       iotype = BT_NULL;  /* Is this correct?  */
1457       break;
1458     case GFC_DTYPE_INTEGER:
1459       iotype = BT_INTEGER;
1460       break;
1461     case GFC_DTYPE_LOGICAL:
1462       iotype = BT_LOGICAL;
1463       break;
1464     case GFC_DTYPE_REAL:
1465       iotype = BT_REAL;
1466       break;
1467     case GFC_DTYPE_COMPLEX:
1468       iotype = BT_COMPLEX;
1469       break;
1470     case GFC_DTYPE_CHARACTER:
1471       iotype = BT_CHARACTER;
1472       /* FIXME: Currently dtype contains the charlen, which is
1473          clobbered if charlen > 2**24. That's why we use a separate
1474          argument for the charlen. However, if we want to support
1475          non-8-bit charsets we need to fix dtype to contain
1476          sizeof(chartype) and fix the code below.  */
1477       size = charlen;
1478       kind = charlen;
1479       break;
1480     case GFC_DTYPE_DERIVED:
1481       internal_error (&dtp->common,
1482                 "Derived type I/O should have been handled via the frontend.");
1483       break;
1484     default:
1485       internal_error (&dtp->common, "transfer_array(): Bad type");
1486     }
1487
1488   rank = GFC_DESCRIPTOR_RANK (desc);
1489   for (n = 0; n < rank; n++)
1490     {
1491       count[n] = 0;
1492       stride[n] = desc->dim[n].stride;
1493       extent[n] = desc->dim[n].ubound + 1 - desc->dim[n].lbound;
1494
1495       /* If the extent of even one dimension is zero, then the entire
1496          array section contains zero elements, so we return.  */
1497       if (extent[n] <= 0)
1498         return;
1499     }
1500
1501   stride0 = stride[0];
1502
1503   /* If the innermost dimension has stride 1, we can do the transfer
1504      in contiguous chunks.  */
1505   if (stride0 == 1)
1506     tsize = extent[0];
1507   else
1508     tsize = 1;
1509
1510   data = GFC_DESCRIPTOR_DATA (desc);
1511
1512   while (data)
1513     {
1514       dtp->u.p.transfer (dtp, iotype, data, kind, size, tsize);
1515       data += stride0 * size * tsize;
1516       count[0] += tsize;
1517       n = 0;
1518       while (count[n] == extent[n])
1519         {
1520           count[n] = 0;
1521           data -= stride[n] * extent[n] * size;
1522           n++;
1523           if (n == rank)
1524             {
1525               data = NULL;
1526               break;
1527             }
1528           else
1529             {
1530               count[n]++;
1531               data += stride[n] * size;
1532             }
1533         }
1534     }
1535 }
1536
1537
1538 /* Preposition a sequential unformatted file while reading.  */
1539
1540 static void
1541 us_read (st_parameter_dt *dtp, int continued)
1542 {
1543   char *p;
1544   int n;
1545   int nr;
1546   GFC_INTEGER_4 i4;
1547   GFC_INTEGER_8 i8;
1548   gfc_offset i;
1549
1550   if (dtp->u.p.current_unit->endfile == AT_ENDFILE)
1551     return;
1552
1553   if (compile_options.record_marker == 0)
1554     n = sizeof (GFC_INTEGER_4);
1555   else
1556     n = compile_options.record_marker;
1557
1558   nr = n;
1559
1560   p = salloc_r (dtp->u.p.current_unit->s, &n);
1561
1562   if (n == 0)
1563     {
1564       dtp->u.p.current_unit->endfile = AT_ENDFILE;
1565       return;  /* end of file */
1566     }
1567
1568   if (p == NULL || n != nr)
1569     {
1570       generate_error (&dtp->common, ERROR_BAD_US, NULL);
1571       return;
1572     }
1573
1574   /* Only CONVERT_NATIVE and CONVERT_SWAP are valid here.  */
1575   if (dtp->u.p.current_unit->flags.convert == CONVERT_NATIVE)
1576     {
1577       switch (nr)
1578         {
1579         case sizeof(GFC_INTEGER_4):
1580           memcpy (&i4, p, sizeof (i4));
1581           i = i4;
1582           break;
1583
1584         case sizeof(GFC_INTEGER_8):
1585           memcpy (&i8, p, sizeof (i8));
1586           i = i8;
1587           break;
1588
1589         default:
1590           runtime_error ("Illegal value for record marker");
1591           break;
1592         }
1593     }
1594   else
1595       switch (nr)
1596         {
1597         case sizeof(GFC_INTEGER_4):
1598           reverse_memcpy (&i4, p, sizeof (i4));
1599           i = i4;
1600           break;
1601
1602         case sizeof(GFC_INTEGER_8):
1603           reverse_memcpy (&i8, p, sizeof (i8));
1604           i = i8;
1605           break;
1606
1607         default:
1608           runtime_error ("Illegal value for record marker");
1609           break;
1610         }
1611
1612   if (i >= 0)
1613     {
1614       dtp->u.p.current_unit->bytes_left_subrecord = i;
1615       dtp->u.p.current_unit->continued = 0;
1616     }
1617   else
1618     {
1619       dtp->u.p.current_unit->bytes_left_subrecord = -i;
1620       dtp->u.p.current_unit->continued = 1;
1621     }
1622
1623   if (! continued)
1624     dtp->u.p.current_unit->bytes_left = dtp->u.p.current_unit->recl;
1625 }
1626
1627
1628 /* Preposition a sequential unformatted file while writing.  This
1629    amount to writing a bogus length that will be filled in later.  */
1630
1631 static void
1632 us_write (st_parameter_dt *dtp, int continued)
1633 {
1634   size_t nbytes;
1635   gfc_offset dummy;
1636
1637   dummy = 0;
1638
1639   if (compile_options.record_marker == 0)
1640     nbytes = sizeof (GFC_INTEGER_4);
1641   else
1642     nbytes = compile_options.record_marker ;
1643
1644   if (swrite (dtp->u.p.current_unit->s, &dummy, &nbytes) != 0)
1645     generate_error (&dtp->common, ERROR_OS, NULL);
1646
1647   /* For sequential unformatted, if RECL= was not specified in the OPEN
1648      we write until we have more bytes than can fit in the subrecord
1649      markers, then we write a new subrecord.  */
1650
1651   dtp->u.p.current_unit->bytes_left_subrecord =
1652     dtp->u.p.current_unit->recl_subrecord;
1653   dtp->u.p.current_unit->continued = continued;
1654 }
1655
1656
1657 /* Position to the next record prior to transfer.  We are assumed to
1658    be before the next record.  We also calculate the bytes in the next
1659    record.  */
1660
1661 static void
1662 pre_position (st_parameter_dt *dtp)
1663 {
1664   if (dtp->u.p.current_unit->current_record)
1665     return;                     /* Already positioned.  */
1666
1667   switch (current_mode (dtp))
1668     {
1669     case FORMATTED_STREAM:
1670     case UNFORMATTED_STREAM:
1671       /* There are no records with stream I/O.  Set the default position
1672          to the beginning of the file if no position was specified.  */
1673       if ((dtp->common.flags & IOPARM_DT_HAS_REC) == 0)
1674         dtp->u.p.current_unit->strm_pos = 1;
1675       break;
1676     
1677     case UNFORMATTED_SEQUENTIAL:
1678       if (dtp->u.p.mode == READING)
1679         us_read (dtp, 0);
1680       else
1681         us_write (dtp, 0);
1682
1683       break;
1684
1685     case FORMATTED_SEQUENTIAL:
1686     case FORMATTED_DIRECT:
1687     case UNFORMATTED_DIRECT:
1688       dtp->u.p.current_unit->bytes_left = dtp->u.p.current_unit->recl;
1689       break;
1690     }
1691
1692   dtp->u.p.current_unit->current_record = 1;
1693 }
1694
1695
1696 /* Initialize things for a data transfer.  This code is common for
1697    both reading and writing.  */
1698
1699 static void
1700 data_transfer_init (st_parameter_dt *dtp, int read_flag)
1701 {
1702   unit_flags u_flags;  /* Used for creating a unit if needed.  */
1703   GFC_INTEGER_4 cf = dtp->common.flags;
1704   namelist_info *ionml;
1705
1706   ionml = ((cf & IOPARM_DT_IONML_SET) != 0) ? dtp->u.p.ionml : NULL;
1707   memset (&dtp->u.p, 0, sizeof (dtp->u.p));
1708   dtp->u.p.ionml = ionml;
1709   dtp->u.p.mode = read_flag ? READING : WRITING;
1710
1711   if ((dtp->common.flags & IOPARM_LIBRETURN_MASK) != IOPARM_LIBRETURN_OK)
1712     return;
1713
1714   if ((cf & IOPARM_DT_HAS_SIZE) != 0)
1715     dtp->u.p.size_used = 0;  /* Initialize the count.  */
1716
1717   dtp->u.p.current_unit = get_unit (dtp, 1);
1718   if (dtp->u.p.current_unit->s == NULL)
1719   {  /* Open the unit with some default flags.  */
1720      st_parameter_open opp;
1721      unit_convert conv;
1722
1723      if (dtp->common.unit < 0)
1724      {
1725        close_unit (dtp->u.p.current_unit);
1726        dtp->u.p.current_unit = NULL;
1727        generate_error (&dtp->common, ERROR_BAD_OPTION,
1728                        "Bad unit number in OPEN statement");
1729        return;
1730      }
1731      memset (&u_flags, '\0', sizeof (u_flags));
1732      u_flags.access = ACCESS_SEQUENTIAL;
1733      u_flags.action = ACTION_READWRITE;
1734
1735      /* Is it unformatted?  */
1736      if (!(cf & (IOPARM_DT_HAS_FORMAT | IOPARM_DT_LIST_FORMAT
1737                  | IOPARM_DT_IONML_SET)))
1738        u_flags.form = FORM_UNFORMATTED;
1739      else
1740        u_flags.form = FORM_UNSPECIFIED;
1741
1742      u_flags.delim = DELIM_UNSPECIFIED;
1743      u_flags.blank = BLANK_UNSPECIFIED;
1744      u_flags.pad = PAD_UNSPECIFIED;
1745      u_flags.status = STATUS_UNKNOWN;
1746
1747      conv = get_unformatted_convert (dtp->common.unit);
1748
1749      if (conv == CONVERT_NONE)
1750        conv = compile_options.convert;
1751
1752      /* We use l8_to_l4_offset, which is 0 on little-endian machines
1753         and 1 on big-endian machines.  */
1754      switch (conv)
1755        {
1756        case CONVERT_NATIVE:
1757        case CONVERT_SWAP:
1758          break;
1759          
1760        case CONVERT_BIG:
1761          conv = l8_to_l4_offset ? CONVERT_NATIVE : CONVERT_SWAP;
1762          break;
1763       
1764        case CONVERT_LITTLE:
1765          conv = l8_to_l4_offset ? CONVERT_SWAP : CONVERT_NATIVE;
1766          break;
1767          
1768        default:
1769          internal_error (&opp.common, "Illegal value for CONVERT");
1770          break;
1771        }
1772
1773      u_flags.convert = conv;
1774
1775      opp.common = dtp->common;
1776      opp.common.flags &= IOPARM_COMMON_MASK;
1777      dtp->u.p.current_unit = new_unit (&opp, dtp->u.p.current_unit, &u_flags);
1778      dtp->common.flags &= ~IOPARM_COMMON_MASK;
1779      dtp->common.flags |= (opp.common.flags & IOPARM_COMMON_MASK);
1780      if (dtp->u.p.current_unit == NULL)
1781        return;
1782   }
1783
1784   /* Check the action.  */
1785
1786   if (read_flag && dtp->u.p.current_unit->flags.action == ACTION_WRITE)
1787     {
1788       generate_error (&dtp->common, ERROR_BAD_ACTION,
1789                       "Cannot read from file opened for WRITE");
1790       return;
1791     }
1792
1793   if (!read_flag && dtp->u.p.current_unit->flags.action == ACTION_READ)
1794     {
1795       generate_error (&dtp->common, ERROR_BAD_ACTION,
1796                       "Cannot write to file opened for READ");
1797       return;
1798     }
1799
1800   dtp->u.p.first_item = 1;
1801
1802   /* Check the format.  */
1803
1804   if ((cf & IOPARM_DT_HAS_FORMAT) != 0)
1805     parse_format (dtp);
1806
1807   if (dtp->u.p.current_unit->flags.form == FORM_UNFORMATTED
1808       && (cf & (IOPARM_DT_HAS_FORMAT | IOPARM_DT_LIST_FORMAT))
1809          != 0)
1810     {
1811       generate_error (&dtp->common, ERROR_OPTION_CONFLICT,
1812                       "Format present for UNFORMATTED data transfer");
1813       return;
1814     }
1815
1816   if ((cf & IOPARM_DT_HAS_NAMELIST_NAME) != 0 && dtp->u.p.ionml != NULL)
1817      {
1818         if ((cf & IOPARM_DT_HAS_FORMAT) != 0)
1819            generate_error (&dtp->common, ERROR_OPTION_CONFLICT,
1820                     "A format cannot be specified with a namelist");
1821      }
1822   else if (dtp->u.p.current_unit->flags.form == FORM_FORMATTED &&
1823            !(cf & (IOPARM_DT_HAS_FORMAT | IOPARM_DT_LIST_FORMAT)))
1824     {
1825       generate_error (&dtp->common, ERROR_OPTION_CONFLICT,
1826                       "Missing format for FORMATTED data transfer");
1827     }
1828
1829   if (is_internal_unit (dtp)
1830       && dtp->u.p.current_unit->flags.form == FORM_UNFORMATTED)
1831     {
1832       generate_error (&dtp->common, ERROR_OPTION_CONFLICT,
1833                       "Internal file cannot be accessed by UNFORMATTED "
1834                       "data transfer");
1835       return;
1836     }
1837
1838   /* Check the record or position number.  */
1839
1840   if (dtp->u.p.current_unit->flags.access == ACCESS_DIRECT
1841       && (cf & IOPARM_DT_HAS_REC) == 0)
1842     {
1843       generate_error (&dtp->common, ERROR_MISSING_OPTION,
1844                       "Direct access data transfer requires record number");
1845       return;
1846     }
1847
1848   if (dtp->u.p.current_unit->flags.access == ACCESS_SEQUENTIAL
1849       && (cf & IOPARM_DT_HAS_REC) != 0)
1850     {
1851       generate_error (&dtp->common, ERROR_OPTION_CONFLICT,
1852                       "Record number not allowed for sequential access data transfer");
1853       return;
1854     }
1855
1856   /* Process the ADVANCE option.  */
1857
1858   dtp->u.p.advance_status
1859     = !(cf & IOPARM_DT_HAS_ADVANCE) ? ADVANCE_UNSPECIFIED :
1860       find_option (&dtp->common, dtp->advance, dtp->advance_len, advance_opt,
1861                    "Bad ADVANCE parameter in data transfer statement");
1862
1863   if (dtp->u.p.advance_status != ADVANCE_UNSPECIFIED)
1864     {
1865       if (dtp->u.p.current_unit->flags.access == ACCESS_DIRECT)
1866         {
1867           generate_error (&dtp->common, ERROR_OPTION_CONFLICT,
1868                           "ADVANCE specification conflicts with sequential access");
1869           return;
1870         }
1871
1872       if (is_internal_unit (dtp))
1873         {
1874           generate_error (&dtp->common, ERROR_OPTION_CONFLICT,
1875                           "ADVANCE specification conflicts with internal file");
1876           return;
1877         }
1878
1879       if ((cf & (IOPARM_DT_HAS_FORMAT | IOPARM_DT_LIST_FORMAT))
1880           != IOPARM_DT_HAS_FORMAT)
1881         {
1882           generate_error (&dtp->common, ERROR_OPTION_CONFLICT,
1883                           "ADVANCE specification requires an explicit format");
1884           return;
1885         }
1886     }
1887
1888   if (read_flag)
1889     {
1890       if ((cf & IOPARM_EOR) != 0 && dtp->u.p.advance_status != ADVANCE_NO)
1891         {
1892           generate_error (&dtp->common, ERROR_MISSING_OPTION,
1893                           "EOR specification requires an ADVANCE specification "
1894                           "of NO");
1895           return;
1896         }
1897
1898       if ((cf & IOPARM_DT_HAS_SIZE) != 0 && dtp->u.p.advance_status != ADVANCE_NO)
1899         {
1900           generate_error (&dtp->common, ERROR_MISSING_OPTION,
1901                           "SIZE specification requires an ADVANCE specification of NO");
1902           return;
1903         }
1904     }
1905   else
1906     {                           /* Write constraints.  */
1907       if ((cf & IOPARM_END) != 0)
1908         {
1909           generate_error (&dtp->common, ERROR_OPTION_CONFLICT,
1910                           "END specification cannot appear in a write statement");
1911           return;
1912         }
1913
1914       if ((cf & IOPARM_EOR) != 0)
1915         {
1916           generate_error (&dtp->common, ERROR_OPTION_CONFLICT,
1917                           "EOR specification cannot appear in a write statement");
1918           return;
1919         }
1920
1921       if ((cf & IOPARM_DT_HAS_SIZE) != 0)
1922         {
1923           generate_error (&dtp->common, ERROR_OPTION_CONFLICT,
1924                           "SIZE specification cannot appear in a write statement");
1925           return;
1926         }
1927     }
1928
1929   if (dtp->u.p.advance_status == ADVANCE_UNSPECIFIED)
1930     dtp->u.p.advance_status = ADVANCE_YES;
1931
1932   /* Sanity checks on the record number.  */
1933   if ((cf & IOPARM_DT_HAS_REC) != 0)
1934     {
1935       if (dtp->rec <= 0)
1936         {
1937           generate_error (&dtp->common, ERROR_BAD_OPTION,
1938                           "Record number must be positive");
1939           return;
1940         }
1941
1942       if (dtp->rec >= dtp->u.p.current_unit->maxrec)
1943         {
1944           generate_error (&dtp->common, ERROR_BAD_OPTION,
1945                           "Record number too large");
1946           return;
1947         }
1948
1949       /* Check to see if we might be reading what we wrote before  */
1950
1951       if (dtp->u.p.mode == READING
1952           && dtp->u.p.current_unit->mode == WRITING
1953           && !is_internal_unit (dtp))
1954          flush(dtp->u.p.current_unit->s);
1955
1956       /* Check whether the record exists to be read.  Only
1957          a partial record needs to exist.  */
1958
1959       if (dtp->u.p.mode == READING && (dtp->rec -1)
1960           * dtp->u.p.current_unit->recl >= file_length (dtp->u.p.current_unit->s))
1961         {
1962           generate_error (&dtp->common, ERROR_BAD_OPTION,
1963                           "Non-existing record number");
1964           return;
1965         }
1966
1967       /* Position the file.  */
1968       if (!is_stream_io (dtp))
1969         {
1970           if (sseek (dtp->u.p.current_unit->s, (gfc_offset) (dtp->rec - 1)
1971                      * dtp->u.p.current_unit->recl) == FAILURE)
1972             {
1973               generate_error (&dtp->common, ERROR_OS, NULL);
1974               return;
1975             }
1976         }
1977       else
1978         dtp->u.p.current_unit->strm_pos = dtp->rec;
1979
1980     }
1981
1982   /* Overwriting an existing sequential file ?
1983      it is always safe to truncate the file on the first write */
1984   if (dtp->u.p.mode == WRITING
1985       && dtp->u.p.current_unit->flags.access == ACCESS_SEQUENTIAL
1986       && dtp->u.p.current_unit->last_record == 0 
1987       && !is_preconnected(dtp->u.p.current_unit->s))
1988         struncate(dtp->u.p.current_unit->s);
1989
1990   /* Bugware for badly written mixed C-Fortran I/O.  */
1991   flush_if_preconnected(dtp->u.p.current_unit->s);
1992
1993   dtp->u.p.current_unit->mode = dtp->u.p.mode;
1994
1995   /* Set the initial value of flags.  */
1996
1997   dtp->u.p.blank_status = dtp->u.p.current_unit->flags.blank;
1998   dtp->u.p.sign_status = SIGN_S;
1999   
2000   /* Set the maximum position reached from the previous I/O operation.  This
2001      could be greater than zero from a previous non-advancing write.  */
2002   dtp->u.p.max_pos = dtp->u.p.current_unit->saved_pos;
2003
2004   pre_position (dtp);
2005
2006   /* Set up the subroutine that will handle the transfers.  */
2007
2008   if (read_flag)
2009     {
2010       if (dtp->u.p.current_unit->flags.form == FORM_UNFORMATTED)
2011         dtp->u.p.transfer = unformatted_read;
2012       else
2013         {
2014           if ((cf & IOPARM_DT_LIST_FORMAT) != 0)
2015             dtp->u.p.transfer = list_formatted_read;
2016           else
2017             dtp->u.p.transfer = formatted_transfer;
2018         }
2019     }
2020   else
2021     {
2022       if (dtp->u.p.current_unit->flags.form == FORM_UNFORMATTED)
2023         dtp->u.p.transfer = unformatted_write;
2024       else
2025         {
2026           if ((cf & IOPARM_DT_LIST_FORMAT) != 0)
2027             dtp->u.p.transfer = list_formatted_write;
2028           else
2029             dtp->u.p.transfer = formatted_transfer;
2030         }
2031     }
2032
2033   /* Make sure that we don't do a read after a nonadvancing write.  */
2034
2035   if (read_flag)
2036     {
2037       if (dtp->u.p.current_unit->read_bad && !is_stream_io (dtp))
2038         {
2039           generate_error (&dtp->common, ERROR_BAD_OPTION,
2040                           "Cannot READ after a nonadvancing WRITE");
2041           return;
2042         }
2043     }
2044   else
2045     {
2046       if (dtp->u.p.advance_status == ADVANCE_YES && !dtp->u.p.seen_dollar)
2047         dtp->u.p.current_unit->read_bad = 1;
2048     }
2049
2050   /* Start the data transfer if we are doing a formatted transfer.  */
2051   if (dtp->u.p.current_unit->flags.form == FORM_FORMATTED
2052       && ((cf & (IOPARM_DT_LIST_FORMAT | IOPARM_DT_HAS_NAMELIST_NAME)) == 0)
2053       && dtp->u.p.ionml == NULL)
2054     formatted_transfer (dtp, 0, NULL, 0, 0, 1);
2055 }
2056
2057 /* Initialize an array_loop_spec given the array descriptor.  The function
2058    returns the index of the last element of the array.  */
2059    
2060 gfc_offset
2061 init_loop_spec (gfc_array_char *desc, array_loop_spec *ls)
2062 {
2063   int rank = GFC_DESCRIPTOR_RANK(desc);
2064   int i;
2065   gfc_offset index; 
2066
2067   index = 1;
2068   for (i=0; i<rank; i++)
2069     {
2070       ls[i].idx = desc->dim[i].lbound;
2071       ls[i].start = desc->dim[i].lbound;
2072       ls[i].end = desc->dim[i].ubound;
2073       ls[i].step = desc->dim[i].stride;
2074       
2075       index += (desc->dim[i].ubound - desc->dim[i].lbound)
2076                       * desc->dim[i].stride;
2077     }
2078   return index;
2079 }
2080
2081 /* Determine the index to the next record in an internal unit array by
2082    by incrementing through the array_loop_spec.  TODO:  Implement handling
2083    negative strides. */
2084    
2085 gfc_offset
2086 next_array_record (st_parameter_dt *dtp, array_loop_spec *ls)
2087 {
2088   int i, carry;
2089   gfc_offset index;
2090   
2091   carry = 1;
2092   index = 0;
2093   
2094   for (i = 0; i < dtp->u.p.current_unit->rank; i++)
2095     {
2096       if (carry)
2097         {
2098           ls[i].idx++;
2099           if (ls[i].idx > ls[i].end)
2100             {
2101               ls[i].idx = ls[i].start;
2102               carry = 1;
2103             }
2104           else
2105             carry = 0;
2106         }
2107       index = index + (ls[i].idx - ls[i].start) * ls[i].step;
2108     }
2109
2110   return index;
2111 }
2112
2113
2114
2115 /* Skip to the end of the current record, taking care of an optional
2116    record marker of size bytes.  If the file is not seekable, we
2117    read chunks of size MAX_READ until we get to the right
2118    position.  */
2119
2120 #define MAX_READ 4096
2121
2122 static void
2123 skip_record (st_parameter_dt *dtp, size_t bytes)
2124 {
2125   gfc_offset new;
2126   int rlength, length;
2127   char *p;
2128
2129   dtp->u.p.current_unit->bytes_left_subrecord += bytes;
2130   if (dtp->u.p.current_unit->bytes_left_subrecord == 0)
2131     return;
2132
2133   if (is_seekable (dtp->u.p.current_unit->s))
2134     {
2135       new = file_position (dtp->u.p.current_unit->s)
2136         + dtp->u.p.current_unit->bytes_left_subrecord;
2137
2138       /* Direct access files do not generate END conditions,
2139          only I/O errors.  */
2140       if (sseek (dtp->u.p.current_unit->s, new) == FAILURE)
2141         generate_error (&dtp->common, ERROR_OS, NULL);
2142     }
2143   else
2144     {                   /* Seek by reading data.  */
2145       while (dtp->u.p.current_unit->bytes_left_subrecord > 0)
2146         {
2147           rlength = length =
2148             (MAX_READ > dtp->u.p.current_unit->bytes_left_subrecord) ?
2149             MAX_READ : dtp->u.p.current_unit->bytes_left_subrecord;
2150
2151           p = salloc_r (dtp->u.p.current_unit->s, &rlength);
2152           if (p == NULL)
2153             {
2154               generate_error (&dtp->common, ERROR_OS, NULL);
2155               return;
2156             }
2157
2158           dtp->u.p.current_unit->bytes_left_subrecord -= length;
2159         }
2160     }
2161
2162 }
2163
2164 #undef MAX_READ
2165
2166 /* Advance to the next record reading unformatted files, taking
2167    care of subrecords.  If complete_record is nonzero, we loop
2168    until all subrecords are cleared.  */
2169
2170 static void
2171 next_record_r_unf (st_parameter_dt *dtp, int complete_record)
2172 {
2173   size_t bytes;
2174
2175   bytes =  compile_options.record_marker == 0 ?
2176     sizeof (GFC_INTEGER_4) : compile_options.record_marker;
2177
2178   while(1)
2179     {
2180
2181       /* Skip over tail */
2182
2183       skip_record (dtp, bytes);
2184
2185       if ( ! (complete_record && dtp->u.p.current_unit->continued))
2186         return;
2187
2188       us_read (dtp, 1);
2189     }
2190 }
2191
2192 /* Space to the next record for read mode.  */
2193
2194 static void
2195 next_record_r (st_parameter_dt *dtp)
2196 {
2197   gfc_offset record;
2198   int length, bytes_left;
2199   char *p;
2200
2201   switch (current_mode (dtp))
2202     {
2203     /* No records in unformatted STREAM I/O.  */
2204     case UNFORMATTED_STREAM:
2205       return;
2206     
2207     case UNFORMATTED_SEQUENTIAL:
2208       next_record_r_unf (dtp, 1);
2209       dtp->u.p.current_unit->bytes_left = dtp->u.p.current_unit->recl;
2210       break;
2211
2212     case FORMATTED_DIRECT:
2213     case UNFORMATTED_DIRECT:
2214       skip_record (dtp, 0);
2215       break;
2216
2217     case FORMATTED_STREAM:
2218     case FORMATTED_SEQUENTIAL:
2219       length = 1;
2220       /* sf_read has already terminated input because of an '\n'  */
2221       if (dtp->u.p.sf_seen_eor)
2222         {
2223           dtp->u.p.sf_seen_eor = 0;
2224           break;
2225         }
2226
2227       if (is_internal_unit (dtp))
2228         {
2229           if (is_array_io (dtp))
2230             {
2231               record = next_array_record (dtp, dtp->u.p.current_unit->ls);
2232
2233               /* Now seek to this record.  */
2234               record = record * dtp->u.p.current_unit->recl;
2235               if (sseek (dtp->u.p.current_unit->s, record) == FAILURE)
2236                 {
2237                   generate_error (&dtp->common, ERROR_INTERNAL_UNIT, NULL);
2238                   break;
2239                 }
2240               dtp->u.p.current_unit->bytes_left = dtp->u.p.current_unit->recl;
2241             }
2242           else  
2243             {
2244               bytes_left = (int) dtp->u.p.current_unit->bytes_left;
2245               p = salloc_r (dtp->u.p.current_unit->s, &bytes_left);
2246               if (p != NULL)
2247                 dtp->u.p.current_unit->bytes_left
2248                   = dtp->u.p.current_unit->recl;
2249             } 
2250           break;
2251         }
2252       else do
2253         {
2254           p = salloc_r (dtp->u.p.current_unit->s, &length);
2255
2256           if (p == NULL)
2257             {
2258               generate_error (&dtp->common, ERROR_OS, NULL);
2259               break;
2260             }
2261
2262           if (length == 0)
2263             {
2264               dtp->u.p.current_unit->endfile = AT_ENDFILE;
2265               break;
2266             }
2267
2268           if (is_stream_io (dtp))
2269             dtp->u.p.current_unit->strm_pos++;
2270         }
2271       while (*p != '\n');
2272
2273       break;
2274     }
2275 }
2276
2277
2278 /* Small utility function to write a record marker, taking care of
2279    byte swapping and of choosing the correct size.  */
2280
2281 inline static int
2282 write_us_marker (st_parameter_dt *dtp, const gfc_offset buf)
2283 {
2284   size_t len;
2285   GFC_INTEGER_4 buf4;
2286   GFC_INTEGER_8 buf8;
2287   char p[sizeof (GFC_INTEGER_8)];
2288
2289   if (compile_options.record_marker == 0)
2290     len = sizeof (GFC_INTEGER_4);
2291   else
2292     len = compile_options.record_marker;
2293
2294   /* Only CONVERT_NATIVE and CONVERT_SWAP are valid here.  */
2295   if (dtp->u.p.current_unit->flags.convert == CONVERT_NATIVE)
2296     {
2297       switch (len)
2298         {
2299         case sizeof (GFC_INTEGER_4):
2300           buf4 = buf;
2301           return swrite (dtp->u.p.current_unit->s, &buf4, &len);
2302           break;
2303
2304         case sizeof (GFC_INTEGER_8):
2305           buf8 = buf;
2306           return swrite (dtp->u.p.current_unit->s, &buf8, &len);
2307           break;
2308
2309         default:
2310           runtime_error ("Illegal value for record marker");
2311           break;
2312         }
2313     }
2314   else
2315     {
2316       switch (len)
2317         {
2318         case sizeof (GFC_INTEGER_4):
2319           buf4 = buf;
2320           reverse_memcpy (p, &buf4, sizeof (GFC_INTEGER_4));
2321           return swrite (dtp->u.p.current_unit->s, p, &len);
2322           break;
2323
2324         case sizeof (GFC_INTEGER_8):
2325           buf8 = buf;
2326           reverse_memcpy (p, &buf8, sizeof (GFC_INTEGER_8));
2327           return swrite (dtp->u.p.current_unit->s, p, &len);
2328           break;
2329
2330         default:
2331           runtime_error ("Illegal value for record marker");
2332           break;
2333         }
2334     }
2335
2336 }
2337
2338 /* Position to the next (sub)record in write mode for
2339    unformatted sequential files.  */
2340
2341 static void
2342 next_record_w_unf (st_parameter_dt *dtp, int next_subrecord)
2343 {
2344   gfc_offset c, m, m_write;
2345   size_t record_marker;
2346
2347   /* Bytes written.  */
2348   m = dtp->u.p.current_unit->recl_subrecord
2349     - dtp->u.p.current_unit->bytes_left_subrecord;
2350   c = file_position (dtp->u.p.current_unit->s);
2351
2352   /* Write the length tail.  If we finish a record containing
2353      subrecords, we write out the negative length.  */
2354
2355   if (dtp->u.p.current_unit->continued)
2356     m_write = -m;
2357   else
2358     m_write = m;
2359
2360   if (write_us_marker (dtp, m_write) != 0)
2361     goto io_error;
2362
2363   if (compile_options.record_marker == 0)
2364     record_marker = sizeof (GFC_INTEGER_4);
2365   else
2366     record_marker = compile_options.record_marker;
2367
2368   /* Seek to the head and overwrite the bogus length with the real
2369      length.  */
2370
2371   if (sseek (dtp->u.p.current_unit->s, c - m - record_marker)
2372       == FAILURE)
2373     goto io_error;
2374
2375   if (next_subrecord)
2376     m_write = -m;
2377   else
2378     m_write = m;
2379
2380   if (write_us_marker (dtp, m_write) != 0)
2381     goto io_error;
2382
2383   /* Seek past the end of the current record.  */
2384
2385   if (sseek (dtp->u.p.current_unit->s, c + record_marker) == FAILURE)
2386     goto io_error;
2387
2388   return;
2389
2390  io_error:
2391   generate_error (&dtp->common, ERROR_OS, NULL);
2392   return;
2393
2394 }
2395
2396 /* Position to the next record in write mode.  */
2397
2398 static void
2399 next_record_w (st_parameter_dt *dtp, int done)
2400 {
2401   gfc_offset m, record, max_pos;
2402   int length;
2403   char *p;
2404
2405   /* Zero counters for X- and T-editing.  */
2406   max_pos = dtp->u.p.max_pos;
2407   dtp->u.p.max_pos = dtp->u.p.skips = dtp->u.p.pending_spaces = 0;
2408
2409   switch (current_mode (dtp))
2410     {
2411     /* No records in unformatted STREAM I/O.  */
2412     case UNFORMATTED_STREAM:
2413       return;
2414
2415     case FORMATTED_DIRECT:
2416       if (dtp->u.p.current_unit->bytes_left == 0)
2417         break;
2418
2419       if (sset (dtp->u.p.current_unit->s, ' ', 
2420                 dtp->u.p.current_unit->bytes_left) == FAILURE)
2421         goto io_error;
2422
2423       break;
2424
2425     case UNFORMATTED_DIRECT:
2426       if (sfree (dtp->u.p.current_unit->s) == FAILURE)
2427         goto io_error;
2428       break;
2429
2430     case UNFORMATTED_SEQUENTIAL:
2431       next_record_w_unf (dtp, 0);
2432       dtp->u.p.current_unit->bytes_left = dtp->u.p.current_unit->recl;
2433       break;
2434
2435     case FORMATTED_STREAM:
2436     case FORMATTED_SEQUENTIAL:
2437
2438       if (is_internal_unit (dtp))
2439         {
2440           if (is_array_io (dtp))
2441             {
2442               length = (int) dtp->u.p.current_unit->bytes_left;
2443               
2444               /* If the farthest position reached is greater than current
2445               position, adjust the position and set length to pad out
2446               whats left.  Otherwise just pad whats left.
2447               (for character array unit) */
2448               m = dtp->u.p.current_unit->recl
2449                         - dtp->u.p.current_unit->bytes_left;
2450               if (max_pos > m)
2451                 {
2452                   length = (int) (max_pos - m);
2453                   p = salloc_w (dtp->u.p.current_unit->s, &length);
2454                   length = (int) (dtp->u.p.current_unit->recl - max_pos);
2455                 }
2456
2457               if (sset (dtp->u.p.current_unit->s, ' ', length) == FAILURE)
2458                 {
2459                   generate_error (&dtp->common, ERROR_END, NULL);
2460                   return;
2461                 }
2462
2463               /* Now that the current record has been padded out,
2464                  determine where the next record in the array is. */
2465               record = next_array_record (dtp, dtp->u.p.current_unit->ls);
2466               if (record == 0)
2467                 dtp->u.p.current_unit->endfile = AT_ENDFILE;
2468               
2469               /* Now seek to this record */
2470               record = record * dtp->u.p.current_unit->recl;
2471
2472               if (sseek (dtp->u.p.current_unit->s, record) == FAILURE)
2473                 {
2474                   generate_error (&dtp->common, ERROR_INTERNAL_UNIT, NULL);
2475                   return;
2476                 }
2477
2478               dtp->u.p.current_unit->bytes_left = dtp->u.p.current_unit->recl;
2479             }
2480           else
2481             {
2482               length = 1;
2483
2484               /* If this is the last call to next_record move to the farthest
2485                  position reached and set length to pad out the remainder
2486                  of the record. (for character scaler unit) */
2487               if (done)
2488                 {
2489                   m = dtp->u.p.current_unit->recl
2490                         - dtp->u.p.current_unit->bytes_left;
2491                   if (max_pos > m)
2492                     {
2493                       length = (int) (max_pos - m);
2494                       p = salloc_w (dtp->u.p.current_unit->s, &length);
2495                       length = (int) (dtp->u.p.current_unit->recl - max_pos);
2496                     }
2497                   else
2498                     length = (int) dtp->u.p.current_unit->bytes_left;
2499                 }
2500
2501               if (sset (dtp->u.p.current_unit->s, ' ', length) == FAILURE)
2502                 {
2503                   generate_error (&dtp->common, ERROR_END, NULL);
2504                   return;
2505                 }
2506             }
2507         }
2508       else
2509         {
2510           /* If this is the last call to next_record move to the farthest
2511           position reached in preparation for completing the record.
2512           (for file unit) */
2513           if (done)
2514             {
2515               m = dtp->u.p.current_unit->recl -
2516                         dtp->u.p.current_unit->bytes_left;
2517               if (max_pos > m)
2518                 {
2519                   length = (int) (max_pos - m);
2520                   p = salloc_w (dtp->u.p.current_unit->s, &length);
2521                 }
2522             }
2523           size_t len;
2524           const char crlf[] = "\r\n";
2525 #ifdef HAVE_CRLF
2526           len = 2;
2527 #else
2528           len = 1;
2529 #endif
2530           if (swrite (dtp->u.p.current_unit->s, &crlf[2-len], &len) != 0)
2531             goto io_error;
2532           
2533           if (is_stream_io (dtp))
2534             dtp->u.p.current_unit->strm_pos += len;
2535         }
2536
2537       break;
2538
2539     io_error:
2540       generate_error (&dtp->common, ERROR_OS, NULL);
2541       break;
2542     }
2543 }
2544
2545 /* Position to the next record, which means moving to the end of the
2546    current record.  This can happen under several different
2547    conditions.  If the done flag is not set, we get ready to process
2548    the next record.  */
2549
2550 void
2551 next_record (st_parameter_dt *dtp, int done)
2552 {
2553   gfc_offset fp; /* File position.  */
2554
2555   dtp->u.p.current_unit->read_bad = 0;
2556
2557   if (dtp->u.p.mode == READING)
2558     next_record_r (dtp);
2559   else
2560     next_record_w (dtp, done);
2561
2562   if (!is_stream_io (dtp))
2563     {
2564       /* Keep position up to date for INQUIRE */
2565       if (done)
2566         update_position (dtp->u.p.current_unit);
2567
2568       dtp->u.p.current_unit->current_record = 0;
2569       if (dtp->u.p.current_unit->flags.access == ACCESS_DIRECT)
2570         {
2571           fp = file_position (dtp->u.p.current_unit->s);
2572           /* Calculate next record, rounding up partial records.  */
2573           dtp->u.p.current_unit->last_record =
2574             (fp + dtp->u.p.current_unit->recl - 1) /
2575               dtp->u.p.current_unit->recl;
2576         }
2577       else
2578         dtp->u.p.current_unit->last_record++;
2579     }
2580
2581   if (!done)
2582     pre_position (dtp);
2583 }
2584
2585
2586 /* Finalize the current data transfer.  For a nonadvancing transfer,
2587    this means advancing to the next record.  For internal units close the
2588    stream associated with the unit.  */
2589
2590 static void
2591 finalize_transfer (st_parameter_dt *dtp)
2592 {
2593   jmp_buf eof_jump;
2594   GFC_INTEGER_4 cf = dtp->common.flags;
2595
2596   if ((dtp->common.flags & IOPARM_DT_HAS_SIZE) != 0)
2597     *dtp->size = (GFC_IO_INT) dtp->u.p.size_used;
2598
2599   if (dtp->u.p.eor_condition)
2600     {
2601       generate_error (&dtp->common, ERROR_EOR, NULL);
2602       return;
2603     }
2604
2605   if ((dtp->common.flags & IOPARM_LIBRETURN_MASK) != IOPARM_LIBRETURN_OK)
2606     return;
2607
2608   if ((dtp->u.p.ionml != NULL)
2609       && (cf & IOPARM_DT_HAS_NAMELIST_NAME) != 0)
2610     {
2611        if ((cf & IOPARM_DT_NAMELIST_READ_MODE) != 0)
2612          namelist_read (dtp);
2613        else
2614          namelist_write (dtp);
2615     }
2616
2617   dtp->u.p.transfer = NULL;
2618   if (dtp->u.p.current_unit == NULL)
2619     return;
2620
2621   dtp->u.p.eof_jump = &eof_jump;
2622   if (setjmp (eof_jump))
2623     {
2624       generate_error (&dtp->common, ERROR_END, NULL);
2625       return;
2626     }
2627
2628   if ((cf & IOPARM_DT_LIST_FORMAT) != 0 && dtp->u.p.mode == READING)
2629     {
2630       finish_list_read (dtp);
2631       sfree (dtp->u.p.current_unit->s);
2632       return;
2633     }
2634
2635   if (is_stream_io (dtp))
2636     {
2637       if (dtp->u.p.current_unit->flags.form == FORM_FORMATTED)
2638         next_record (dtp, 1);
2639       flush (dtp->u.p.current_unit->s);
2640       sfree (dtp->u.p.current_unit->s);
2641       return;
2642     }
2643
2644   dtp->u.p.current_unit->current_record = 0;
2645
2646   if (!is_internal_unit (dtp) && dtp->u.p.seen_dollar)
2647     {
2648       dtp->u.p.seen_dollar = 0;
2649       sfree (dtp->u.p.current_unit->s);
2650       return;
2651     }
2652
2653   /* For non-advancing I/O, save the current maximum position for use in the
2654      next I/O operation if needed.  */
2655   if (dtp->u.p.advance_status == ADVANCE_NO)
2656     {
2657       int bytes_written = (int) (dtp->u.p.current_unit->recl
2658         - dtp->u.p.current_unit->bytes_left);
2659       dtp->u.p.current_unit->saved_pos =
2660         dtp->u.p.max_pos > 0 ? dtp->u.p.max_pos - bytes_written : 0;
2661       flush (dtp->u.p.current_unit->s);
2662       return;
2663     }
2664
2665   dtp->u.p.current_unit->saved_pos = 0;
2666
2667   next_record (dtp, 1);
2668   sfree (dtp->u.p.current_unit->s);
2669 }
2670
2671 /* Transfer function for IOLENGTH. It doesn't actually do any
2672    data transfer, it just updates the length counter.  */
2673
2674 static void
2675 iolength_transfer (st_parameter_dt *dtp, bt type __attribute__((unused)), 
2676                    void *dest __attribute__ ((unused)),
2677                    int kind __attribute__((unused)), 
2678                    size_t size, size_t nelems)
2679 {
2680   if ((dtp->common.flags & IOPARM_DT_HAS_IOLENGTH) != 0)
2681     *dtp->iolength += (GFC_IO_INT) size * nelems;
2682 }
2683
2684
2685 /* Initialize the IOLENGTH data transfer. This function is in essence
2686    a very much simplified version of data_transfer_init(), because it
2687    doesn't have to deal with units at all.  */
2688
2689 static void
2690 iolength_transfer_init (st_parameter_dt *dtp)
2691 {
2692   if ((dtp->common.flags & IOPARM_DT_HAS_IOLENGTH) != 0)
2693     *dtp->iolength = 0;
2694
2695   memset (&dtp->u.p, 0, sizeof (dtp->u.p));
2696
2697   /* Set up the subroutine that will handle the transfers.  */
2698
2699   dtp->u.p.transfer = iolength_transfer;
2700 }
2701
2702
2703 /* Library entry point for the IOLENGTH form of the INQUIRE
2704    statement. The IOLENGTH form requires no I/O to be performed, but
2705    it must still be a runtime library call so that we can determine
2706    the iolength for dynamic arrays and such.  */
2707
2708 extern void st_iolength (st_parameter_dt *);
2709 export_proto(st_iolength);
2710
2711 void
2712 st_iolength (st_parameter_dt *dtp)
2713 {
2714   library_start (&dtp->common);
2715   iolength_transfer_init (dtp);
2716 }
2717
2718 extern void st_iolength_done (st_parameter_dt *);
2719 export_proto(st_iolength_done);
2720
2721 void
2722 st_iolength_done (st_parameter_dt *dtp __attribute__((unused)))
2723 {
2724   free_ionml (dtp);
2725   if (dtp->u.p.scratch != NULL)
2726     free_mem (dtp->u.p.scratch);
2727   library_end ();
2728 }
2729
2730
2731 /* The READ statement.  */
2732
2733 extern void st_read (st_parameter_dt *);
2734 export_proto(st_read);
2735
2736 void
2737 st_read (st_parameter_dt *dtp)
2738 {
2739   library_start (&dtp->common);
2740
2741   data_transfer_init (dtp, 1);
2742
2743   /* Handle complications dealing with the endfile record.  */
2744
2745   if (dtp->u.p.current_unit->flags.access == ACCESS_SEQUENTIAL)
2746     switch (dtp->u.p.current_unit->endfile)
2747       {
2748       case NO_ENDFILE:
2749         if (file_length (dtp->u.p.current_unit->s)
2750             == file_position (dtp->u.p.current_unit->s))
2751           dtp->u.p.current_unit->endfile = AT_ENDFILE;
2752         break;
2753
2754       case AT_ENDFILE:
2755         if (!is_internal_unit (dtp))
2756           {
2757             generate_error (&dtp->common, ERROR_END, NULL);
2758             dtp->u.p.current_unit->endfile = AFTER_ENDFILE;
2759             dtp->u.p.current_unit->current_record = 0;
2760           }
2761         break;
2762
2763       case AFTER_ENDFILE:
2764         generate_error (&dtp->common, ERROR_ENDFILE, NULL);
2765         dtp->u.p.current_unit->current_record = 0;
2766         break;
2767       }
2768 }
2769
2770 extern void st_read_done (st_parameter_dt *);
2771 export_proto(st_read_done);
2772
2773 void
2774 st_read_done (st_parameter_dt *dtp)
2775 {
2776   finalize_transfer (dtp);
2777   free_format_data (dtp);
2778   free_ionml (dtp);
2779   if (dtp->u.p.scratch != NULL)
2780     free_mem (dtp->u.p.scratch);
2781   if (dtp->u.p.current_unit != NULL)
2782     unlock_unit (dtp->u.p.current_unit);
2783
2784   free_internal_unit (dtp);
2785   
2786   library_end ();
2787 }
2788
2789 extern void st_write (st_parameter_dt *);
2790 export_proto(st_write);
2791
2792 void
2793 st_write (st_parameter_dt *dtp)
2794 {
2795   library_start (&dtp->common);
2796   data_transfer_init (dtp, 0);
2797 }
2798
2799 extern void st_write_done (st_parameter_dt *);
2800 export_proto(st_write_done);
2801
2802 void
2803 st_write_done (st_parameter_dt *dtp)
2804 {
2805   finalize_transfer (dtp);
2806
2807   /* Deal with endfile conditions associated with sequential files.  */
2808
2809   if (dtp->u.p.current_unit != NULL 
2810       && dtp->u.p.current_unit->flags.access == ACCESS_SEQUENTIAL)
2811     switch (dtp->u.p.current_unit->endfile)
2812       {
2813       case AT_ENDFILE:          /* Remain at the endfile record.  */
2814         break;
2815
2816       case AFTER_ENDFILE:
2817         dtp->u.p.current_unit->endfile = AT_ENDFILE;    /* Just at it now.  */
2818         break;
2819
2820       case NO_ENDFILE:
2821         /* Get rid of whatever is after this record.  */
2822         if (!is_internal_unit (dtp))
2823           {
2824             flush (dtp->u.p.current_unit->s);
2825             if (struncate (dtp->u.p.current_unit->s) == FAILURE)
2826               generate_error (&dtp->common, ERROR_OS, NULL);
2827           }
2828         dtp->u.p.current_unit->endfile = AT_ENDFILE;
2829         break;
2830       }
2831
2832   free_format_data (dtp);
2833   free_ionml (dtp);
2834   if (dtp->u.p.scratch != NULL)
2835     free_mem (dtp->u.p.scratch);
2836   if (dtp->u.p.current_unit != NULL)
2837     unlock_unit (dtp->u.p.current_unit);
2838   
2839   free_internal_unit (dtp);
2840
2841   library_end ();
2842 }
2843
2844 /* Receives the scalar information for namelist objects and stores it
2845    in a linked list of namelist_info types.  */
2846
2847 extern void st_set_nml_var (st_parameter_dt *dtp, void *, char *,
2848                             GFC_INTEGER_4, gfc_charlen_type, GFC_INTEGER_4);
2849 export_proto(st_set_nml_var);
2850
2851
2852 void
2853 st_set_nml_var (st_parameter_dt *dtp, void * var_addr, char * var_name,
2854                 GFC_INTEGER_4 len, gfc_charlen_type string_length,
2855                 GFC_INTEGER_4 dtype)
2856 {
2857   namelist_info *t1 = NULL;
2858   namelist_info *nml;
2859
2860   nml = (namelist_info*) get_mem (sizeof (namelist_info));
2861
2862   nml->mem_pos = var_addr;
2863
2864   nml->var_name = (char*) get_mem (strlen (var_name) + 1);
2865   strcpy (nml->var_name, var_name);
2866
2867   nml->len = (int) len;
2868   nml->string_length = (index_type) string_length;
2869
2870   nml->var_rank = (int) (dtype & GFC_DTYPE_RANK_MASK);
2871   nml->size = (index_type) (dtype >> GFC_DTYPE_SIZE_SHIFT);
2872   nml->type = (bt) ((dtype & GFC_DTYPE_TYPE_MASK) >> GFC_DTYPE_TYPE_SHIFT);
2873
2874   if (nml->var_rank > 0)
2875     {
2876       nml->dim = (descriptor_dimension*)
2877                    get_mem (nml->var_rank * sizeof (descriptor_dimension));
2878       nml->ls = (array_loop_spec*)
2879                   get_mem (nml->var_rank * sizeof (array_loop_spec));
2880     }
2881   else
2882     {
2883       nml->dim = NULL;
2884       nml->ls = NULL;
2885     }
2886
2887   nml->next = NULL;
2888
2889   if ((dtp->common.flags & IOPARM_DT_IONML_SET) == 0)
2890     {
2891       dtp->common.flags |= IOPARM_DT_IONML_SET;
2892       dtp->u.p.ionml = nml;
2893     }
2894   else
2895     {
2896       for (t1 = dtp->u.p.ionml; t1->next; t1 = t1->next);
2897       t1->next = nml;
2898     }
2899 }
2900
2901 /* Store the dimensional information for the namelist object.  */
2902 extern void st_set_nml_var_dim (st_parameter_dt *, GFC_INTEGER_4,
2903                                 GFC_INTEGER_4, GFC_INTEGER_4,
2904                                 GFC_INTEGER_4);
2905 export_proto(st_set_nml_var_dim);
2906
2907 void
2908 st_set_nml_var_dim (st_parameter_dt *dtp, GFC_INTEGER_4 n_dim,
2909                     GFC_INTEGER_4 stride, GFC_INTEGER_4 lbound,
2910                     GFC_INTEGER_4 ubound)
2911 {
2912   namelist_info * nml;
2913   int n;
2914
2915   n = (int)n_dim;
2916
2917   for (nml = dtp->u.p.ionml; nml->next; nml = nml->next);
2918
2919   nml->dim[n].stride = (ssize_t)stride;
2920   nml->dim[n].lbound = (ssize_t)lbound;
2921   nml->dim[n].ubound = (ssize_t)ubound;
2922 }
2923
2924 /* Reverse memcpy - used for byte swapping.  */
2925
2926 void reverse_memcpy (void *dest, const void *src, size_t n)
2927 {
2928   char *d, *s;
2929   size_t i;
2930
2931   d = (char *) dest;
2932   s = (char *) src + n - 1;
2933
2934   /* Write with ascending order - this is likely faster
2935      on modern architectures because of write combining.  */
2936   for (i=0; i<n; i++)
2937       *(d++) = *(s--);
2938 }