OSDN Git Service

2007-07-29 Thomas Koenig <tkoenig@gcc.gnu.org>
[pf3gnuchains/gcc-fork.git] / libgfortran / io / list_read.c
1 /* Copyright (C) 2002, 2003, 2004, 2005, 2007 Free Software Foundation, Inc.
2    Contributed by Andy Vaught
3    Namelist input contributed by Paul Thomas
4
5 This file is part of the GNU Fortran 95 runtime library (libgfortran).
6
7 Libgfortran is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
11
12 In addition to the permissions in the GNU General Public License, the
13 Free Software Foundation gives you unlimited permission to link the
14 compiled version of this file into combinations with other programs,
15 and to distribute those combinations without any restriction coming
16 from the use of this file.  (The General Public License restrictions
17 do apply in other respects; for example, they cover modification of
18 the file, and distribution when not linked into a combine
19 executable.)
20
21 Libgfortran is distributed in the hope that it will be useful,
22 but WITHOUT ANY WARRANTY; without even the implied warranty of
23 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
24 GNU General Public License for more details.
25
26 You should have received a copy of the GNU General Public License
27 along with Libgfortran; see the file COPYING.  If not, write to
28 the Free Software Foundation, 51 Franklin Street, Fifth Floor,
29 Boston, MA 02110-1301, USA.  */
30
31
32 #include "config.h"
33 #include <string.h>
34 #include <ctype.h>
35 #include "libgfortran.h"
36 #include "io.h"
37
38
39 /* List directed input.  Several parsing subroutines are practically
40    reimplemented from formatted input, the reason being that there are
41    all kinds of small differences between formatted and list directed
42    parsing.  */
43
44
45 /* Subroutines for reading characters from the input.  Because a
46    repeat count is ambiguous with an integer, we have to read the
47    whole digit string before seeing if there is a '*' which signals
48    the repeat count.  Since we can have a lot of potential leading
49    zeros, we have to be able to back up by arbitrary amount.  Because
50    the input might not be seekable, we have to buffer the data
51    ourselves.  */
52
53 #define CASE_DIGITS   case '0': case '1': case '2': case '3': case '4': \
54                       case '5': case '6': case '7': case '8': case '9'
55
56 #define CASE_SEPARATORS  case ' ': case ',': case '/': case '\n': case '\t': \
57                          case '\r'
58
59 /* This macro assumes that we're operating on a variable.  */
60
61 #define is_separator(c) (c == '/' ||  c == ',' || c == '\n' || c == ' ' \
62                          || c == '\t' || c == '\r')
63
64 /* Maximum repeat count.  Less than ten times the maximum signed int32.  */
65
66 #define MAX_REPEAT 200000000
67
68
69 /* Save a character to a string buffer, enlarging it as necessary.  */
70
71 static void
72 push_char (st_parameter_dt *dtp, char c)
73 {
74   char *new;
75
76   if (dtp->u.p.saved_string == NULL)
77     {
78       if (dtp->u.p.scratch == NULL)
79         dtp->u.p.scratch = get_mem (SCRATCH_SIZE);
80       dtp->u.p.saved_string = dtp->u.p.scratch;
81       memset (dtp->u.p.saved_string, 0, SCRATCH_SIZE);
82       dtp->u.p.saved_length = SCRATCH_SIZE;
83       dtp->u.p.saved_used = 0;
84     }
85
86   if (dtp->u.p.saved_used >= dtp->u.p.saved_length)
87     {
88       dtp->u.p.saved_length = 2 * dtp->u.p.saved_length;
89       new = get_mem (2 * dtp->u.p.saved_length);
90
91       memset (new, 0, 2 * dtp->u.p.saved_length);
92
93       memcpy (new, dtp->u.p.saved_string, dtp->u.p.saved_used);
94       if (dtp->u.p.saved_string != dtp->u.p.scratch)
95         free_mem (dtp->u.p.saved_string);
96
97       dtp->u.p.saved_string = new;
98     }
99
100   dtp->u.p.saved_string[dtp->u.p.saved_used++] = c;
101 }
102
103
104 /* Free the input buffer if necessary.  */
105
106 static void
107 free_saved (st_parameter_dt *dtp)
108 {
109   if (dtp->u.p.saved_string == NULL)
110     return;
111
112   if (dtp->u.p.saved_string != dtp->u.p.scratch)
113     free_mem (dtp->u.p.saved_string);
114
115   dtp->u.p.saved_string = NULL;
116   dtp->u.p.saved_used = 0;
117 }
118
119
120 /* Free the line buffer if necessary.  */
121
122 static void
123 free_line (st_parameter_dt *dtp)
124 {
125   if (dtp->u.p.line_buffer == NULL)
126     return;
127
128   free_mem (dtp->u.p.line_buffer);
129   dtp->u.p.line_buffer = NULL;
130 }
131
132
133 static char
134 next_char (st_parameter_dt *dtp)
135 {
136   int length;
137   gfc_offset record;
138   char c, *p;
139
140   if (dtp->u.p.last_char != '\0')
141     {
142       dtp->u.p.at_eol = 0;
143       c = dtp->u.p.last_char;
144       dtp->u.p.last_char = '\0';
145       goto done;
146     }
147
148   /* Read from line_buffer if enabled.  */
149
150   if (dtp->u.p.line_buffer_enabled)
151     {
152       dtp->u.p.at_eol = 0;
153
154       c = dtp->u.p.line_buffer[dtp->u.p.item_count];
155       if (c != '\0' && dtp->u.p.item_count < 64)
156         {
157           dtp->u.p.line_buffer[dtp->u.p.item_count] = '\0';
158           dtp->u.p.item_count++;
159           goto done;
160         }
161
162         dtp->u.p.item_count = 0;
163         dtp->u.p.line_buffer_enabled = 0;
164     }    
165
166   /* Handle the end-of-record and end-of-file conditions for
167      internal array unit.  */
168   if (is_array_io (dtp))
169     {
170       if (dtp->u.p.at_eof)
171         longjmp (*dtp->u.p.eof_jump, 1);
172
173       /* Check for "end-of-record" condition.  */
174       if (dtp->u.p.current_unit->bytes_left == 0)
175         {
176           c = '\n';
177           record = next_array_record (dtp, dtp->u.p.current_unit->ls);
178
179           /* Check for "end-of-file" condition.  */      
180           if (record == 0)
181             {
182               dtp->u.p.at_eof = 1;
183               goto done;
184             }
185
186           record *= dtp->u.p.current_unit->recl;
187           if (sseek (dtp->u.p.current_unit->s, record) == FAILURE)
188             longjmp (*dtp->u.p.eof_jump, 1);
189
190           dtp->u.p.current_unit->bytes_left = dtp->u.p.current_unit->recl;
191           goto done;
192         }
193     }
194
195   /* Get the next character and handle end-of-record conditions.  */
196
197   length = 1;
198
199   p = salloc_r (dtp->u.p.current_unit->s, &length);
200   
201   if (is_stream_io (dtp))
202     dtp->u.p.current_unit->strm_pos++;
203
204   if (is_internal_unit (dtp))
205     {
206       if (is_array_io (dtp))
207         {
208           /* End of record is handled in the next pass through, above.  The
209              check for NULL here is cautionary.  */
210           if (p == NULL)
211             {
212               generate_error (&dtp->common, ERROR_INTERNAL_UNIT, NULL);
213               return '\0';
214             }
215
216           dtp->u.p.current_unit->bytes_left--;
217           c = *p;
218         }
219       else
220         {
221           if (p == NULL)
222             longjmp (*dtp->u.p.eof_jump, 1);
223           if (length == 0)
224             c = '\n';
225           else
226             c = *p;
227         }
228     }
229   else
230     {
231       if (p == NULL)
232         {
233           generate_error (&dtp->common, ERROR_OS, NULL);
234           return '\0';
235         }
236       if (length == 0)
237         longjmp (*dtp->u.p.eof_jump, 1);
238       c = *p;
239     }
240 done:
241   dtp->u.p.at_eol = (c == '\n' || c == '\r');
242   return c;
243 }
244
245
246 /* Push a character back onto the input.  */
247
248 static void
249 unget_char (st_parameter_dt *dtp, char c)
250 {
251   dtp->u.p.last_char = c;
252 }
253
254
255 /* Skip over spaces in the input.  Returns the nonspace character that
256    terminated the eating and also places it back on the input.  */
257
258 static char
259 eat_spaces (st_parameter_dt *dtp)
260 {
261   char c;
262
263   do
264     {
265       c = next_char (dtp);
266     }
267   while (c == ' ' || c == '\t');
268
269   unget_char (dtp, c);
270   return c;
271 }
272
273
274 /* Skip over a separator.  Technically, we don't always eat the whole
275    separator.  This is because if we've processed the last input item,
276    then a separator is unnecessary.  Plus the fact that operating
277    systems usually deliver console input on a line basis.
278
279    The upshot is that if we see a newline as part of reading a
280    separator, we stop reading.  If there are more input items, we
281    continue reading the separator with finish_separator() which takes
282    care of the fact that we may or may not have seen a comma as part
283    of the separator.  */
284
285 static void
286 eat_separator (st_parameter_dt *dtp)
287 {
288   char c, n;
289
290   eat_spaces (dtp);
291   dtp->u.p.comma_flag = 0;
292
293   c = next_char (dtp);
294   switch (c)
295     {
296     case ',':
297       dtp->u.p.comma_flag = 1;
298       eat_spaces (dtp);
299       break;
300
301     case '/':
302       dtp->u.p.input_complete = 1;
303       break;
304
305     case '\r':
306       n = next_char(dtp);
307       if (n == '\n')
308         dtp->u.p.at_eol = 1;
309       else
310         unget_char (dtp, n);
311       break;
312
313     case '\n':
314       dtp->u.p.at_eol = 1;
315       break;
316
317     case '!':
318       if (dtp->u.p.namelist_mode)
319         {                       /* Eat a namelist comment.  */
320           do
321             c = next_char (dtp);
322           while (c != '\n');
323
324           break;
325         }
326
327       /* Fall Through...  */
328
329     default:
330       unget_char (dtp, c);
331       break;
332     }
333 }
334
335
336 /* Finish processing a separator that was interrupted by a newline.
337    If we're here, then another data item is present, so we finish what
338    we started on the previous line.  */
339
340 static void
341 finish_separator (st_parameter_dt *dtp)
342 {
343   char c;
344
345  restart:
346   eat_spaces (dtp);
347
348   c = next_char (dtp);
349   switch (c)
350     {
351     case ',':
352       if (dtp->u.p.comma_flag)
353         unget_char (dtp, c);
354       else
355         {
356           c = eat_spaces (dtp);
357           if (c == '\n' || c == '\r')
358             goto restart;
359         }
360
361       break;
362
363     case '/':
364       dtp->u.p.input_complete = 1;
365       if (!dtp->u.p.namelist_mode)
366         return;
367       break;
368
369     case '\n':
370     case '\r':
371       goto restart;
372
373     case '!':
374       if (dtp->u.p.namelist_mode)
375         {
376           do
377             c = next_char (dtp);
378           while (c != '\n');
379
380           goto restart;
381         }
382
383     default:
384       unget_char (dtp, c);
385       break;
386     }
387 }
388
389
390 /* This function reads characters through to the end of the current line and
391    just ignores them.  */
392
393 static void
394 eat_line (st_parameter_dt *dtp)
395 {
396   char c;
397   if (!is_internal_unit (dtp))
398     do
399       c = next_char (dtp);
400     while (c != '\n');
401 }
402
403
404 /* This function is needed to catch bad conversions so that namelist can
405    attempt to see if dtp->u.p.saved_string contains a new object name rather
406    than a bad value.  */
407
408 static int
409 nml_bad_return (st_parameter_dt *dtp, char c)
410 {
411   if (dtp->u.p.namelist_mode)
412     {
413       dtp->u.p.nml_read_error = 1;
414       unget_char (dtp, c);
415       return 1;
416     }
417   return 0;
418 }
419
420 /* Convert an unsigned string to an integer.  The length value is -1
421    if we are working on a repeat count.  Returns nonzero if we have a
422    range problem.  As a side effect, frees the dtp->u.p.saved_string.  */
423
424 static int
425 convert_integer (st_parameter_dt *dtp, int length, int negative)
426 {
427   char c, *buffer, message[100];
428   int m;
429   GFC_INTEGER_LARGEST v, max, max10;
430
431   buffer = dtp->u.p.saved_string;
432   v = 0;
433
434   max = (length == -1) ? MAX_REPEAT : max_value (length, 1);
435   max10 = max / 10;
436
437   for (;;)
438     {
439       c = *buffer++;
440       if (c == '\0')
441         break;
442       c -= '0';
443
444       if (v > max10)
445         goto overflow;
446       v = 10 * v;
447
448       if (v > max - c)
449         goto overflow;
450       v += c;
451     }
452
453   m = 0;
454
455   if (length != -1)
456     {
457       if (negative)
458         v = -v;
459       set_integer (dtp->u.p.value, v, length);
460     }
461   else
462     {
463       dtp->u.p.repeat_count = v;
464
465       if (dtp->u.p.repeat_count == 0)
466         {
467           sprintf (message, "Zero repeat count in item %d of list input",
468                    dtp->u.p.item_count);
469
470           generate_error (&dtp->common, ERROR_READ_VALUE, message);
471           m = 1;
472         }
473     }
474
475   free_saved (dtp);
476   return m;
477
478  overflow:
479   if (length == -1)
480     sprintf (message, "Repeat count overflow in item %d of list input",
481              dtp->u.p.item_count);
482   else
483     sprintf (message, "Integer overflow while reading item %d",
484              dtp->u.p.item_count);
485
486   free_saved (dtp);
487   generate_error (&dtp->common, ERROR_READ_VALUE, message);
488
489   return 1;
490 }
491
492
493 /* Parse a repeat count for logical and complex values which cannot
494    begin with a digit.  Returns nonzero if we are done, zero if we
495    should continue on.  */
496
497 static int
498 parse_repeat (st_parameter_dt *dtp)
499 {
500   char c, message[100];
501   int repeat;
502
503   c = next_char (dtp);
504   switch (c)
505     {
506     CASE_DIGITS:
507       repeat = c - '0';
508       break;
509
510     CASE_SEPARATORS:
511       unget_char (dtp, c);
512       eat_separator (dtp);
513       return 1;
514
515     default:
516       unget_char (dtp, c);
517       return 0;
518     }
519
520   for (;;)
521     {
522       c = next_char (dtp);
523       switch (c)
524         {
525         CASE_DIGITS:
526           repeat = 10 * repeat + c - '0';
527
528           if (repeat > MAX_REPEAT)
529             {
530               sprintf (message,
531                        "Repeat count overflow in item %d of list input",
532                        dtp->u.p.item_count);
533
534               generate_error (&dtp->common, ERROR_READ_VALUE, message);
535               return 1;
536             }
537
538           break;
539
540         case '*':
541           if (repeat == 0)
542             {
543               sprintf (message,
544                        "Zero repeat count in item %d of list input",
545                        dtp->u.p.item_count);
546
547               generate_error (&dtp->common, ERROR_READ_VALUE, message);
548               return 1;
549             }
550
551           goto done;
552
553         default:
554           goto bad_repeat;
555         }
556     }
557
558  done:
559   dtp->u.p.repeat_count = repeat;
560   return 0;
561
562  bad_repeat:
563
564   eat_line (dtp);
565   free_saved (dtp);
566   sprintf (message, "Bad repeat count in item %d of list input",
567            dtp->u.p.item_count);
568   generate_error (&dtp->common, ERROR_READ_VALUE, message);
569   return 1;
570 }
571
572
573 /* To read a logical we have to look ahead in the input stream to make sure
574     there is not an equal sign indicating a variable name.  To do this we use 
575     line_buffer to point to a temporary buffer, pushing characters there for
576     possible later reading. */
577
578 static void
579 l_push_char (st_parameter_dt *dtp, char c)
580 {
581   if (dtp->u.p.line_buffer == NULL)
582     {
583       dtp->u.p.line_buffer = get_mem (SCRATCH_SIZE);
584       memset (dtp->u.p.line_buffer, 0, SCRATCH_SIZE);
585     }
586
587   dtp->u.p.line_buffer[dtp->u.p.item_count++] = c;
588 }
589
590
591 /* Read a logical character on the input.  */
592
593 static void
594 read_logical (st_parameter_dt *dtp, int length)
595 {
596   char c, message[100];
597   int i, v;
598
599   if (parse_repeat (dtp))
600     return;
601
602   c = tolower (next_char (dtp));
603   l_push_char (dtp, c);
604   switch (c)
605     {
606     case 't':
607       v = 1;
608       c = next_char (dtp);
609       l_push_char (dtp, c);
610
611       if (!is_separator(c))
612         goto possible_name;
613
614       unget_char (dtp, c);
615       break;
616     case 'f':
617       v = 0;
618       c = next_char (dtp);
619       l_push_char (dtp, c);
620
621       if (!is_separator(c))
622         goto possible_name;
623
624       unget_char (dtp, c);
625       break;
626     case '.':
627       c = tolower (next_char (dtp));
628       switch (c)
629         {
630           case 't':
631             v = 1;
632             break;
633           case 'f':
634             v = 0;
635             break;
636           default:
637             goto bad_logical;
638         }
639
640       break;
641
642     CASE_SEPARATORS:
643       unget_char (dtp, c);
644       eat_separator (dtp);
645       return;                   /* Null value.  */
646
647     default:
648       goto bad_logical;
649     }
650
651   dtp->u.p.saved_type = BT_LOGICAL;
652   dtp->u.p.saved_length = length;
653
654   /* Eat trailing garbage.  */
655   do
656     {
657       c = next_char (dtp);
658     }
659   while (!is_separator (c));
660
661   unget_char (dtp, c);
662   eat_separator (dtp);
663   dtp->u.p.item_count = 0;
664   dtp->u.p.line_buffer_enabled = 0;
665   set_integer ((int *) dtp->u.p.value, v, length);
666   free_line (dtp);
667
668   return;
669
670  possible_name:
671
672   for(i = 0; i < 63; i++)
673     {
674       c = next_char (dtp);
675       if (is_separator(c))
676         {
677           /* All done if this is not a namelist read.  */
678           if (!dtp->u.p.namelist_mode)
679             goto logical_done;
680
681           unget_char (dtp, c);
682           eat_separator (dtp);
683           c = next_char (dtp);
684           if (c != '=')
685             {
686               unget_char (dtp, c);
687               goto logical_done;
688             }
689         }
690  
691       l_push_char (dtp, c);
692       if (c == '=')
693         {
694           dtp->u.p.nml_read_error = 1;
695           dtp->u.p.line_buffer_enabled = 1;
696           dtp->u.p.item_count = 0;
697           return;
698         }
699       
700     }
701
702  bad_logical:
703
704   free_line (dtp);
705
706   if (nml_bad_return (dtp, c))
707     return;
708
709   eat_line (dtp);
710   free_saved (dtp);
711   sprintf (message, "Bad logical value while reading item %d",
712               dtp->u.p.item_count);
713   generate_error (&dtp->common, ERROR_READ_VALUE, message);
714   return;
715
716  logical_done:
717
718   dtp->u.p.item_count = 0;
719   dtp->u.p.line_buffer_enabled = 0;
720   dtp->u.p.saved_type = BT_LOGICAL;
721   dtp->u.p.saved_length = length;
722   set_integer ((int *) dtp->u.p.value, v, length);
723   free_saved (dtp);
724   free_line (dtp);
725 }
726
727
728 /* Reading integers is tricky because we can actually be reading a
729    repeat count.  We have to store the characters in a buffer because
730    we could be reading an integer that is larger than the default int
731    used for repeat counts.  */
732
733 static void
734 read_integer (st_parameter_dt *dtp, int length)
735 {
736   char c, message[100];
737   int negative;
738
739   negative = 0;
740
741   c = next_char (dtp);
742   switch (c)
743     {
744     case '-':
745       negative = 1;
746       /* Fall through...  */
747
748     case '+':
749       c = next_char (dtp);
750       goto get_integer;
751
752     CASE_SEPARATORS:            /* Single null.  */
753       unget_char (dtp, c);
754       eat_separator (dtp);
755       return;
756
757     CASE_DIGITS:
758       push_char (dtp, c);
759       break;
760
761     default:
762       goto bad_integer;
763     }
764
765   /* Take care of what may be a repeat count.  */
766
767   for (;;)
768     {
769       c = next_char (dtp);
770       switch (c)
771         {
772         CASE_DIGITS:
773           push_char (dtp, c);
774           break;
775
776         case '*':
777           push_char (dtp, '\0');
778           goto repeat;
779
780         CASE_SEPARATORS:        /* Not a repeat count.  */
781           goto done;
782
783         default:
784           goto bad_integer;
785         }
786     }
787
788  repeat:
789   if (convert_integer (dtp, -1, 0))
790     return;
791
792   /* Get the real integer.  */
793
794   c = next_char (dtp);
795   switch (c)
796     {
797     CASE_DIGITS:
798       break;
799
800     CASE_SEPARATORS:
801       unget_char (dtp, c);
802       eat_separator (dtp);
803       return;
804
805     case '-':
806       negative = 1;
807       /* Fall through...  */
808
809     case '+':
810       c = next_char (dtp);
811       break;
812     }
813
814  get_integer:
815   if (!isdigit (c))
816     goto bad_integer;
817   push_char (dtp, c);
818
819   for (;;)
820     {
821       c = next_char (dtp);
822       switch (c)
823         {
824         CASE_DIGITS:
825           push_char (dtp, c);
826           break;
827
828         CASE_SEPARATORS:
829           goto done;
830
831         default:
832           goto bad_integer;
833         }
834     }
835
836  bad_integer:
837
838   if (nml_bad_return (dtp, c))
839     return;
840   
841   eat_line (dtp);
842   free_saved (dtp);
843   sprintf (message, "Bad integer for item %d in list input",
844               dtp->u.p.item_count);
845   generate_error (&dtp->common, ERROR_READ_VALUE, message);
846
847   return;
848
849  done:
850   unget_char (dtp, c);
851   eat_separator (dtp);
852
853   push_char (dtp, '\0');
854   if (convert_integer (dtp, length, negative))
855     {
856        free_saved (dtp);
857        return;
858     }
859
860   free_saved (dtp);
861   dtp->u.p.saved_type = BT_INTEGER;
862 }
863
864
865 /* Read a character variable.  */
866
867 static void
868 read_character (st_parameter_dt *dtp, int length __attribute__ ((unused)))
869 {
870   char c, quote, message[100];
871
872   quote = ' ';                  /* Space means no quote character.  */
873
874   c = next_char (dtp);
875   switch (c)
876     {
877     CASE_DIGITS:
878       push_char (dtp, c);
879       break;
880
881     CASE_SEPARATORS:
882       unget_char (dtp, c);              /* NULL value.  */
883       eat_separator (dtp);
884       return;
885
886     case '"':
887     case '\'':
888       quote = c;
889       goto get_string;
890
891     default:
892       if (dtp->u.p.namelist_mode)
893         {
894           unget_char (dtp,c);
895           return;
896         }
897       push_char (dtp, c);
898       goto get_string;
899     }
900
901   /* Deal with a possible repeat count.  */
902
903   for (;;)
904     {
905       c = next_char (dtp);
906       switch (c)
907         {
908         CASE_DIGITS:
909           push_char (dtp, c);
910           break;
911
912         CASE_SEPARATORS:
913           unget_char (dtp, c);
914           goto done;            /* String was only digits!  */
915
916         case '*':
917           push_char (dtp, '\0');
918           goto got_repeat;
919
920         default:
921           push_char (dtp, c);
922           goto get_string;      /* Not a repeat count after all.  */
923         }
924     }
925
926  got_repeat:
927   if (convert_integer (dtp, -1, 0))
928     return;
929
930   /* Now get the real string.  */
931
932   c = next_char (dtp);
933   switch (c)
934     {
935     CASE_SEPARATORS:
936       unget_char (dtp, c);              /* Repeated NULL values.  */
937       eat_separator (dtp);
938       return;
939
940     case '"':
941     case '\'':
942       quote = c;
943       break;
944
945     default:
946       push_char (dtp, c);
947       break;
948     }
949
950  get_string:
951   for (;;)
952     {
953       c = next_char (dtp);
954       switch (c)
955         {
956         case '"':
957         case '\'':
958           if (c != quote)
959             {
960               push_char (dtp, c);
961               break;
962             }
963
964           /* See if we have a doubled quote character or the end of
965              the string.  */
966
967           c = next_char (dtp);
968           if (c == quote)
969             {
970               push_char (dtp, quote);
971               break;
972             }
973
974           unget_char (dtp, c);
975           goto done;
976
977         CASE_SEPARATORS:
978           if (quote == ' ')
979             {
980               unget_char (dtp, c);
981               goto done;
982             }
983
984           if (c != '\n' && c != '\r')
985             push_char (dtp, c);
986           break;
987
988         default:
989           push_char (dtp, c);
990           break;
991         }
992     }
993
994   /* At this point, we have to have a separator, or else the string is
995      invalid.  */
996  done:
997   c = next_char (dtp);
998   if (is_separator (c))
999     {
1000       unget_char (dtp, c);
1001       eat_separator (dtp);
1002       dtp->u.p.saved_type = BT_CHARACTER;
1003     }
1004   else
1005     {
1006       free_saved (dtp);
1007       sprintf (message, "Invalid string input in item %d",
1008                   dtp->u.p.item_count);
1009       generate_error (&dtp->common, ERROR_READ_VALUE, message);
1010     }
1011 }
1012
1013
1014 /* Parse a component of a complex constant or a real number that we
1015    are sure is already there.  This is a straight real number parser.  */
1016
1017 static int
1018 parse_real (st_parameter_dt *dtp, void *buffer, int length)
1019 {
1020   char c, message[100];
1021   int m, seen_dp;
1022
1023   c = next_char (dtp);
1024   if (c == '-' || c == '+')
1025     {
1026       push_char (dtp, c);
1027       c = next_char (dtp);
1028     }
1029
1030   if (!isdigit (c) && c != '.')
1031     goto bad;
1032
1033   push_char (dtp, c);
1034
1035   seen_dp = (c == '.') ? 1 : 0;
1036
1037   for (;;)
1038     {
1039       c = next_char (dtp);
1040       switch (c)
1041         {
1042         CASE_DIGITS:
1043           push_char (dtp, c);
1044           break;
1045
1046         case '.':
1047           if (seen_dp)
1048             goto bad;
1049
1050           seen_dp = 1;
1051           push_char (dtp, c);
1052           break;
1053
1054         case 'e':
1055         case 'E':
1056         case 'd':
1057         case 'D':
1058           push_char (dtp, 'e');
1059           goto exp1;
1060
1061         case '-':
1062         case '+':
1063           push_char (dtp, 'e');
1064           push_char (dtp, c);
1065           c = next_char (dtp);
1066           goto exp2;
1067
1068         CASE_SEPARATORS:
1069           unget_char (dtp, c);
1070           goto done;
1071
1072         default:
1073           goto done;
1074         }
1075     }
1076
1077  exp1:
1078   c = next_char (dtp);
1079   if (c != '-' && c != '+')
1080     push_char (dtp, '+');
1081   else
1082     {
1083       push_char (dtp, c);
1084       c = next_char (dtp);
1085     }
1086
1087  exp2:
1088   if (!isdigit (c))
1089     goto bad;
1090   push_char (dtp, c);
1091
1092   for (;;)
1093     {
1094       c = next_char (dtp);
1095       switch (c)
1096         {
1097         CASE_DIGITS:
1098           push_char (dtp, c);
1099           break;
1100
1101         CASE_SEPARATORS:
1102           unget_char (dtp, c);
1103           goto done;
1104
1105         default:
1106           goto done;
1107         }
1108     }
1109
1110  done:
1111   unget_char (dtp, c);
1112   push_char (dtp, '\0');
1113
1114   m = convert_real (dtp, buffer, dtp->u.p.saved_string, length);
1115   free_saved (dtp);
1116
1117   return m;
1118
1119  bad:
1120
1121   if (nml_bad_return (dtp, c))
1122     return 0;
1123
1124   eat_line (dtp);
1125   free_saved (dtp);
1126   sprintf (message, "Bad floating point number for item %d",
1127               dtp->u.p.item_count);
1128   generate_error (&dtp->common, ERROR_READ_VALUE, message);
1129
1130   return 1;
1131 }
1132
1133
1134 /* Reading a complex number is straightforward because we can tell
1135    what it is right away.  */
1136
1137 static void
1138 read_complex (st_parameter_dt *dtp, int kind, size_t size)
1139 {
1140   char message[100];
1141   char c;
1142
1143   if (parse_repeat (dtp))
1144     return;
1145
1146   c = next_char (dtp);
1147   switch (c)
1148     {
1149     case '(':
1150       break;
1151
1152     CASE_SEPARATORS:
1153       unget_char (dtp, c);
1154       eat_separator (dtp);
1155       return;
1156
1157     default:
1158       goto bad_complex;
1159     }
1160
1161   eat_spaces (dtp);
1162   if (parse_real (dtp, dtp->u.p.value, kind))
1163     return;
1164
1165 eol_1:
1166   eat_spaces (dtp);
1167   c = next_char (dtp);
1168   if (c == '\n' || c== '\r')
1169     goto eol_1;
1170   else
1171     unget_char (dtp, c);
1172
1173   if (next_char (dtp) != ',')
1174     goto bad_complex;
1175
1176 eol_2:
1177   eat_spaces (dtp);
1178   c = next_char (dtp);
1179   if (c == '\n' || c== '\r')
1180     goto eol_2;
1181   else
1182     unget_char (dtp, c);
1183
1184   if (parse_real (dtp, dtp->u.p.value + size / 2, kind))
1185     return;
1186
1187   eat_spaces (dtp);
1188   if (next_char (dtp) != ')')
1189     goto bad_complex;
1190
1191   c = next_char (dtp);
1192   if (!is_separator (c))
1193     goto bad_complex;
1194
1195   unget_char (dtp, c);
1196   eat_separator (dtp);
1197
1198   free_saved (dtp);
1199   dtp->u.p.saved_type = BT_COMPLEX;
1200   return;
1201
1202  bad_complex:
1203
1204   if (nml_bad_return (dtp, c))
1205     return;
1206
1207   eat_line (dtp);
1208   free_saved (dtp);
1209   sprintf (message, "Bad complex value in item %d of list input",
1210               dtp->u.p.item_count);
1211   generate_error (&dtp->common, ERROR_READ_VALUE, message);
1212 }
1213
1214
1215 /* Parse a real number with a possible repeat count.  */
1216
1217 static void
1218 read_real (st_parameter_dt *dtp, int length)
1219 {
1220   char c, message[100];
1221   int seen_dp;
1222
1223   seen_dp = 0;
1224
1225   c = next_char (dtp);
1226   switch (c)
1227     {
1228     CASE_DIGITS:
1229       push_char (dtp, c);
1230       break;
1231
1232     case '.':
1233       push_char (dtp, c);
1234       seen_dp = 1;
1235       break;
1236
1237     case '+':
1238     case '-':
1239       goto got_sign;
1240
1241     CASE_SEPARATORS:
1242       unget_char (dtp, c);              /* Single null.  */
1243       eat_separator (dtp);
1244       return;
1245
1246     default:
1247       goto bad_real;
1248     }
1249
1250   /* Get the digit string that might be a repeat count.  */
1251
1252   for (;;)
1253     {
1254       c = next_char (dtp);
1255       switch (c)
1256         {
1257         CASE_DIGITS:
1258           push_char (dtp, c);
1259           break;
1260
1261         case '.':
1262           if (seen_dp)
1263             goto bad_real;
1264
1265           seen_dp = 1;
1266           push_char (dtp, c);
1267           goto real_loop;
1268
1269         case 'E':
1270         case 'e':
1271         case 'D':
1272         case 'd':
1273           goto exp1;
1274
1275         case '+':
1276         case '-':
1277           push_char (dtp, 'e');
1278           push_char (dtp, c);
1279           c = next_char (dtp);
1280           goto exp2;
1281
1282         case '*':
1283           push_char (dtp, '\0');
1284           goto got_repeat;
1285
1286         CASE_SEPARATORS:
1287           if (c != '\n' &&  c != ',' && c != '\r')
1288             unget_char (dtp, c);
1289           goto done;
1290
1291         default:
1292           goto bad_real;
1293         }
1294     }
1295
1296  got_repeat:
1297   if (convert_integer (dtp, -1, 0))
1298     return;
1299
1300   /* Now get the number itself.  */
1301
1302   c = next_char (dtp);
1303   if (is_separator (c))
1304     {                           /* Repeated null value.  */
1305       unget_char (dtp, c);
1306       eat_separator (dtp);
1307       return;
1308     }
1309
1310   if (c != '-' && c != '+')
1311     push_char (dtp, '+');
1312   else
1313     {
1314     got_sign:
1315       push_char (dtp, c);
1316       c = next_char (dtp);
1317     }
1318
1319   if (!isdigit (c) && c != '.')
1320     goto bad_real;
1321
1322   if (c == '.')
1323     {
1324       if (seen_dp)
1325         goto bad_real;
1326       else
1327         seen_dp = 1;
1328     }
1329
1330   push_char (dtp, c);
1331
1332  real_loop:
1333   for (;;)
1334     {
1335       c = next_char (dtp);
1336       switch (c)
1337         {
1338         CASE_DIGITS:
1339           push_char (dtp, c);
1340           break;
1341
1342         CASE_SEPARATORS:
1343           goto done;
1344
1345         case '.':
1346           if (seen_dp)
1347             goto bad_real;
1348
1349           seen_dp = 1;
1350           push_char (dtp, c);
1351           break;
1352
1353         case 'E':
1354         case 'e':
1355         case 'D':
1356         case 'd':
1357           goto exp1;
1358
1359         case '+':
1360         case '-':
1361           push_char (dtp, 'e');
1362           push_char (dtp, c);
1363           c = next_char (dtp);
1364           goto exp2;
1365
1366         default:
1367           goto bad_real;
1368         }
1369     }
1370
1371  exp1:
1372   push_char (dtp, 'e');
1373
1374   c = next_char (dtp);
1375   if (c != '+' && c != '-')
1376     push_char (dtp, '+');
1377   else
1378     {
1379       push_char (dtp, c);
1380       c = next_char (dtp);
1381     }
1382
1383  exp2:
1384   if (!isdigit (c))
1385     goto bad_real;
1386   push_char (dtp, c);
1387
1388   for (;;)
1389     {
1390       c = next_char (dtp);
1391
1392       switch (c)
1393         {
1394         CASE_DIGITS:
1395           push_char (dtp, c);
1396           break;
1397
1398         CASE_SEPARATORS:
1399           goto done;
1400
1401         default:
1402           goto bad_real;
1403         }
1404     }
1405
1406  done:
1407   unget_char (dtp, c);
1408   eat_separator (dtp);
1409   push_char (dtp, '\0');
1410   if (convert_real (dtp, dtp->u.p.value, dtp->u.p.saved_string, length))
1411     return;
1412
1413   free_saved (dtp);
1414   dtp->u.p.saved_type = BT_REAL;
1415   return;
1416
1417  bad_real:
1418
1419   if (nml_bad_return (dtp, c))
1420     return;
1421
1422   eat_line (dtp);
1423   free_saved (dtp);
1424   sprintf (message, "Bad real number in item %d of list input",
1425               dtp->u.p.item_count);
1426   generate_error (&dtp->common, ERROR_READ_VALUE, message);
1427 }
1428
1429
1430 /* Check the current type against the saved type to make sure they are
1431    compatible.  Returns nonzero if incompatible.  */
1432
1433 static int
1434 check_type (st_parameter_dt *dtp, bt type, int len)
1435 {
1436   char message[100];
1437
1438   if (dtp->u.p.saved_type != BT_NULL && dtp->u.p.saved_type != type)
1439     {
1440       sprintf (message, "Read type %s where %s was expected for item %d",
1441                   type_name (dtp->u.p.saved_type), type_name (type),
1442                   dtp->u.p.item_count);
1443
1444       generate_error (&dtp->common, ERROR_READ_VALUE, message);
1445       return 1;
1446     }
1447
1448   if (dtp->u.p.saved_type == BT_NULL || dtp->u.p.saved_type == BT_CHARACTER)
1449     return 0;
1450
1451   if (dtp->u.p.saved_length != len)
1452     {
1453       sprintf (message,
1454                   "Read kind %d %s where kind %d is required for item %d",
1455                   dtp->u.p.saved_length, type_name (dtp->u.p.saved_type), len,
1456                   dtp->u.p.item_count);
1457       generate_error (&dtp->common, ERROR_READ_VALUE, message);
1458       return 1;
1459     }
1460
1461   return 0;
1462 }
1463
1464
1465 /* Top level data transfer subroutine for list reads.  Because we have
1466    to deal with repeat counts, the data item is always saved after
1467    reading, usually in the dtp->u.p.value[] array.  If a repeat count is
1468    greater than one, we copy the data item multiple times.  */
1469
1470 static void
1471 list_formatted_read_scalar (st_parameter_dt *dtp, bt type, void *p, int kind,
1472                             size_t size)
1473 {
1474   char c;
1475   int m;
1476   jmp_buf eof_jump;
1477
1478   dtp->u.p.namelist_mode = 0;
1479
1480   dtp->u.p.eof_jump = &eof_jump;
1481   if (setjmp (eof_jump))
1482     {
1483       generate_error (&dtp->common, ERROR_END, NULL);
1484       goto cleanup;
1485     }
1486
1487   if (dtp->u.p.first_item)
1488     {
1489       dtp->u.p.first_item = 0;
1490       dtp->u.p.input_complete = 0;
1491       dtp->u.p.repeat_count = 1;
1492       dtp->u.p.at_eol = 0;
1493
1494       c = eat_spaces (dtp);
1495       if (is_separator (c))
1496         {
1497           /* Found a null value.  */
1498           eat_separator (dtp);
1499           dtp->u.p.repeat_count = 0;
1500
1501           /* eat_separator sets this flag if the separator was a comma.  */
1502           if (dtp->u.p.comma_flag)
1503             goto cleanup;
1504
1505           /* eat_separator sets this flag if the separator was a \n or \r.  */
1506           if (dtp->u.p.at_eol)
1507             finish_separator (dtp);
1508           else
1509             goto cleanup;
1510         }
1511
1512     }
1513   else
1514     {
1515       if (dtp->u.p.input_complete)
1516         goto cleanup;
1517
1518       if (dtp->u.p.repeat_count > 0)
1519         {
1520           if (check_type (dtp, type, kind))
1521             return;
1522           goto set_value;
1523         }
1524
1525       if (dtp->u.p.at_eol)
1526         finish_separator (dtp);
1527       else
1528         {
1529           eat_spaces (dtp);
1530           /* Trailing spaces prior to end of line.  */
1531           if (dtp->u.p.at_eol)
1532             finish_separator (dtp);
1533         }
1534
1535       dtp->u.p.saved_type = BT_NULL;
1536       dtp->u.p.repeat_count = 1;
1537     }
1538
1539   switch (type)
1540     {
1541     case BT_INTEGER:
1542       read_integer (dtp, kind);
1543       break;
1544     case BT_LOGICAL:
1545       read_logical (dtp, kind);
1546       break;
1547     case BT_CHARACTER:
1548       read_character (dtp, kind);
1549       break;
1550     case BT_REAL:
1551       read_real (dtp, kind);
1552       break;
1553     case BT_COMPLEX:
1554       read_complex (dtp, kind, size);
1555       break;
1556     default:
1557       internal_error (&dtp->common, "Bad type for list read");
1558     }
1559
1560   if (dtp->u.p.saved_type != BT_CHARACTER && dtp->u.p.saved_type != BT_NULL)
1561     dtp->u.p.saved_length = size;
1562
1563   if ((dtp->common.flags & IOPARM_LIBRETURN_MASK) != IOPARM_LIBRETURN_OK)
1564     goto cleanup;
1565
1566  set_value:
1567   switch (dtp->u.p.saved_type)
1568     {
1569     case BT_COMPLEX:
1570     case BT_INTEGER:
1571     case BT_REAL:
1572     case BT_LOGICAL:
1573       memcpy (p, dtp->u.p.value, size);
1574       break;
1575
1576     case BT_CHARACTER:
1577       if (dtp->u.p.saved_string)
1578        {
1579           m = ((int) size < dtp->u.p.saved_used)
1580               ? (int) size : dtp->u.p.saved_used;
1581           memcpy (p, dtp->u.p.saved_string, m);
1582        }
1583       else
1584         /* Just delimiters encountered, nothing to copy but SPACE.  */
1585         m = 0;
1586
1587       if (m < (int) size)
1588         memset (((char *) p) + m, ' ', size - m);
1589       break;
1590
1591     case BT_NULL:
1592       break;
1593     }
1594
1595   if (--dtp->u.p.repeat_count <= 0)
1596     free_saved (dtp);
1597
1598 cleanup:
1599   dtp->u.p.eof_jump = NULL;
1600 }
1601
1602
1603 void
1604 list_formatted_read (st_parameter_dt *dtp, bt type, void *p, int kind,
1605                      size_t size, size_t nelems)
1606 {
1607   size_t elem;
1608   char *tmp;
1609
1610   tmp = (char *) p;
1611
1612   /* Big loop over all the elements.  */
1613   for (elem = 0; elem < nelems; elem++)
1614     {
1615       dtp->u.p.item_count++;
1616       list_formatted_read_scalar (dtp, type, tmp + size*elem, kind, size);
1617     }
1618 }
1619
1620
1621 /* Finish a list read.  */
1622
1623 void
1624 finish_list_read (st_parameter_dt *dtp)
1625 {
1626   char c;
1627
1628   free_saved (dtp);
1629
1630   if (dtp->u.p.at_eol)
1631     {
1632       dtp->u.p.at_eol = 0;
1633       return;
1634     }
1635
1636   do
1637     {
1638       c = next_char (dtp);
1639     }
1640   while (c != '\n');
1641 }
1642
1643 /*                      NAMELIST INPUT
1644
1645 void namelist_read (st_parameter_dt *dtp)
1646 calls:
1647    static void nml_match_name (char *name, int len)
1648    static int nml_query (st_parameter_dt *dtp)
1649    static int nml_get_obj_data (st_parameter_dt *dtp,
1650                                 namelist_info **prev_nl, char *)
1651 calls:
1652       static void nml_untouch_nodes (st_parameter_dt *dtp)
1653       static namelist_info * find_nml_node (st_parameter_dt *dtp,
1654                                             char * var_name)
1655       static int nml_parse_qualifier(descriptor_dimension * ad,
1656                                      array_loop_spec * ls, int rank, char *)
1657       static void nml_touch_nodes (namelist_info * nl)
1658       static int nml_read_obj (namelist_info *nl, index_type offset,
1659                                namelist_info **prev_nl, char *,
1660                                index_type clow, index_type chigh)
1661 calls:
1662       -itself-  */
1663
1664 /* Inputs a rank-dimensional qualifier, which can contain
1665    singlets, doublets, triplets or ':' with the standard meanings.  */
1666
1667 static try
1668 nml_parse_qualifier (st_parameter_dt *dtp, descriptor_dimension *ad,
1669                      array_loop_spec *ls, int rank, char *parse_err_msg)
1670 {
1671   int dim;
1672   int indx;
1673   int neg;
1674   int null_flag;
1675   int is_array_section;
1676   char c;
1677
1678   is_array_section = 0;
1679   dtp->u.p.expanded_read = 0;
1680
1681   /* The next character in the stream should be the '('.  */
1682
1683   c = next_char (dtp);
1684
1685   /* Process the qualifier, by dimension and triplet.  */
1686
1687   for (dim=0; dim < rank; dim++ )
1688     {
1689       for (indx=0; indx<3; indx++)
1690         {
1691           free_saved (dtp);
1692           eat_spaces (dtp);
1693           neg = 0;
1694
1695           /* Process a potential sign.  */
1696           c = next_char (dtp);
1697           switch (c)
1698             {
1699             case '-':
1700               neg = 1;
1701               break;
1702
1703             case '+':
1704               break;
1705
1706             default:
1707               unget_char (dtp, c);
1708               break;
1709             }
1710
1711           /* Process characters up to the next ':' , ',' or ')'.  */
1712           for (;;)
1713             {
1714               c = next_char (dtp);
1715
1716               switch (c)
1717                 {
1718                 case ':':
1719                   is_array_section = 1;
1720                   break;
1721
1722                 case ',': case ')':
1723                   if ((c==',' && dim == rank -1)
1724                       || (c==')' && dim < rank -1))
1725                     {
1726                       sprintf (parse_err_msg,
1727                                "Bad number of index fields");
1728                       goto err_ret;
1729                     }
1730                   break;
1731
1732                 CASE_DIGITS:
1733                   push_char (dtp, c);
1734                   continue;
1735
1736                 case ' ': case '\t':
1737                   eat_spaces (dtp);
1738                   c = next_char (dtp);
1739                   break;
1740
1741                 default:
1742                   sprintf (parse_err_msg, "Bad character in index");
1743                   goto err_ret;
1744                 }
1745
1746               if ((c == ',' || c == ')') && indx == 0
1747                   && dtp->u.p.saved_string == 0)
1748                 {
1749                   sprintf (parse_err_msg, "Null index field");
1750                   goto err_ret;
1751                 }
1752
1753               if ((c == ':' && indx == 1 && dtp->u.p.saved_string == 0)
1754                   || (indx == 2 && dtp->u.p.saved_string == 0))
1755                 {
1756                   sprintf(parse_err_msg, "Bad index triplet");
1757                   goto err_ret;
1758                 }
1759
1760               /* If '( : ? )' or '( ? : )' break and flag read failure.  */
1761               null_flag = 0;
1762               if ((c == ':' && indx == 0 && dtp->u.p.saved_string == 0)
1763                   || (indx==1 && dtp->u.p.saved_string == 0))
1764                 {
1765                   null_flag = 1;
1766                   break;
1767                 }
1768
1769               /* Now read the index.  */
1770               if (convert_integer (dtp, sizeof(ssize_t), neg))
1771                 {
1772                   sprintf (parse_err_msg, "Bad integer in index");
1773                   goto err_ret;
1774                 }
1775               break;
1776             }
1777
1778           /* Feed the index values to the triplet arrays.  */
1779           if (!null_flag)
1780             {
1781               if (indx == 0)
1782                 memcpy (&ls[dim].start, dtp->u.p.value, sizeof(ssize_t));
1783               if (indx == 1)
1784                 memcpy (&ls[dim].end, dtp->u.p.value, sizeof(ssize_t));
1785               if (indx == 2)
1786                 memcpy (&ls[dim].step, dtp->u.p.value, sizeof(ssize_t));
1787             }
1788
1789           /* Singlet or doublet indices.  */
1790           if (c==',' || c==')')
1791             {
1792               if (indx == 0)
1793                 {
1794                   memcpy (&ls[dim].start, dtp->u.p.value, sizeof(ssize_t));
1795
1796                   /*  If -std=f95/2003 or an array section is specified,
1797                       do not allow excess data to be processed.  */
1798                   if (is_array_section == 1
1799                       || compile_options.allow_std < GFC_STD_GNU)
1800                     ls[dim].end = ls[dim].start;
1801                   else
1802                     dtp->u.p.expanded_read = 1;
1803                 }
1804               break;
1805             }
1806         }
1807
1808       /* Check the values of the triplet indices.  */
1809       if ((ls[dim].start > (ssize_t)ad[dim].ubound)
1810           || (ls[dim].start < (ssize_t)ad[dim].lbound)
1811           || (ls[dim].end > (ssize_t)ad[dim].ubound)
1812           || (ls[dim].end < (ssize_t)ad[dim].lbound))
1813         {
1814           sprintf (parse_err_msg, "Index %d out of range", dim + 1);
1815           goto err_ret;
1816         }
1817       if (((ls[dim].end - ls[dim].start ) * ls[dim].step < 0)
1818           || (ls[dim].step == 0))
1819         {
1820           sprintf (parse_err_msg, "Bad range in index %d", dim + 1);
1821           goto err_ret;
1822         }
1823
1824       /* Initialise the loop index counter.  */
1825       ls[dim].idx = ls[dim].start;
1826     }
1827   eat_spaces (dtp);
1828   return SUCCESS;
1829
1830 err_ret:
1831
1832   return FAILURE;
1833 }
1834
1835 static namelist_info *
1836 find_nml_node (st_parameter_dt *dtp, char * var_name)
1837 {
1838   namelist_info * t = dtp->u.p.ionml;
1839   while (t != NULL)
1840     {
1841       if (strcmp (var_name, t->var_name) == 0)
1842         {
1843           t->touched = 1;
1844           return t;
1845         }
1846       t = t->next;
1847     }
1848   return NULL;
1849 }
1850
1851 /* Visits all the components of a derived type that have
1852    not explicitly been identified in the namelist input.
1853    touched is set and the loop specification initialised
1854    to default values  */
1855
1856 static void
1857 nml_touch_nodes (namelist_info * nl)
1858 {
1859   index_type len = strlen (nl->var_name) + 1;
1860   int dim;
1861   char * ext_name = (char*)get_mem (len + 1);
1862   memcpy (ext_name, nl->var_name, len-1);
1863   memcpy (ext_name + len - 1, "%", 2);
1864   for (nl = nl->next; nl; nl = nl->next)
1865     {
1866       if (strncmp (nl->var_name, ext_name, len) == 0)
1867         {
1868           nl->touched = 1;
1869           for (dim=0; dim < nl->var_rank; dim++)
1870             {
1871               nl->ls[dim].step = 1;
1872               nl->ls[dim].end = nl->dim[dim].ubound;
1873               nl->ls[dim].start = nl->dim[dim].lbound;
1874               nl->ls[dim].idx = nl->ls[dim].start;
1875             }
1876         }
1877       else
1878         break;
1879     }
1880   free_mem (ext_name);
1881   return;
1882 }
1883
1884 /* Resets touched for the entire list of nml_nodes, ready for a
1885    new object.  */
1886
1887 static void
1888 nml_untouch_nodes (st_parameter_dt *dtp)
1889 {
1890   namelist_info * t;
1891   for (t = dtp->u.p.ionml; t; t = t->next)
1892     t->touched = 0;
1893   return;
1894 }
1895
1896 /* Attempts to input name to namelist name.  Returns
1897    dtp->u.p.nml_read_error = 1 on no match.  */
1898
1899 static void
1900 nml_match_name (st_parameter_dt *dtp, const char *name, index_type len)
1901 {
1902   index_type i;
1903   char c;
1904   dtp->u.p.nml_read_error = 0;
1905   for (i = 0; i < len; i++)
1906     {
1907       c = next_char (dtp);
1908       if (tolower (c) != tolower (name[i]))
1909         {
1910           dtp->u.p.nml_read_error = 1;
1911           break;
1912         }
1913     }
1914 }
1915
1916 /* If the namelist read is from stdin, output the current state of the
1917    namelist to stdout.  This is used to implement the non-standard query
1918    features, ? and =?. If c == '=' the full namelist is printed. Otherwise
1919    the names alone are printed.  */
1920
1921 static void
1922 nml_query (st_parameter_dt *dtp, char c)
1923 {
1924   gfc_unit * temp_unit;
1925   namelist_info * nl;
1926   index_type len;
1927   char * p;
1928
1929   if (dtp->u.p.current_unit->unit_number != options.stdin_unit)
1930     return;
1931
1932   /* Store the current unit and transfer to stdout.  */
1933
1934   temp_unit = dtp->u.p.current_unit;
1935   dtp->u.p.current_unit = find_unit (options.stdout_unit);
1936
1937   if (dtp->u.p.current_unit)
1938     {
1939       dtp->u.p.mode = WRITING;
1940       next_record (dtp, 0);
1941
1942       /* Write the namelist in its entirety.  */
1943
1944       if (c == '=')
1945         namelist_write (dtp);
1946
1947       /* Or write the list of names.  */
1948
1949       else
1950         {
1951
1952           /* "&namelist_name\n"  */
1953
1954           len = dtp->namelist_name_len;
1955 #ifdef HAVE_CRLF
1956           p = write_block (dtp, len + 3);
1957 #else
1958           p = write_block (dtp, len + 2);
1959 #endif
1960           if (!p)
1961             goto query_return;
1962           memcpy (p, "&", 1);
1963           memcpy ((char*)(p + 1), dtp->namelist_name, len);
1964 #ifdef HAVE_CRLF
1965           memcpy ((char*)(p + len + 1), "\r\n", 2);
1966 #else
1967           memcpy ((char*)(p + len + 1), "\n", 1);
1968 #endif
1969           for (nl = dtp->u.p.ionml; nl; nl = nl->next)
1970             {
1971
1972               /* " var_name\n"  */
1973
1974               len = strlen (nl->var_name);
1975 #ifdef HAVE_CRLF
1976               p = write_block (dtp, len + 3);
1977 #else
1978               p = write_block (dtp, len + 2);
1979 #endif
1980               if (!p)
1981                 goto query_return;
1982               memcpy (p, " ", 1);
1983               memcpy ((char*)(p + 1), nl->var_name, len);
1984 #ifdef HAVE_CRLF
1985               memcpy ((char*)(p + len + 1), "\r\n", 2);
1986 #else
1987               memcpy ((char*)(p + len + 1), "\n", 1);
1988 #endif
1989             }
1990
1991           /* "&end\n"  */
1992
1993 #ifdef HAVE_CRLF
1994           p = write_block (dtp, 6);
1995 #else
1996           p = write_block (dtp, 5);
1997 #endif
1998           if (!p)
1999             goto query_return;
2000 #ifdef HAVE_CRLF
2001           memcpy (p, "&end\r\n", 6);
2002 #else
2003           memcpy (p, "&end\n", 5);
2004 #endif
2005         }
2006
2007       /* Flush the stream to force immediate output.  */
2008
2009       flush (dtp->u.p.current_unit->s);
2010       unlock_unit (dtp->u.p.current_unit);
2011     }
2012
2013 query_return:
2014
2015   /* Restore the current unit.  */
2016
2017   dtp->u.p.current_unit = temp_unit;
2018   dtp->u.p.mode = READING;
2019   return;
2020 }
2021
2022 /* Reads and stores the input for the namelist object nl.  For an array,
2023    the function loops over the ranges defined by the loop specification.
2024    This default to all the data or to the specification from a qualifier.
2025    nml_read_obj recursively calls itself to read derived types. It visits
2026    all its own components but only reads data for those that were touched
2027    when the name was parsed.  If a read error is encountered, an attempt is
2028    made to return to read a new object name because the standard allows too
2029    little data to be available.  On the other hand, too much data is an
2030    error.  */
2031
2032 static try
2033 nml_read_obj (st_parameter_dt *dtp, namelist_info * nl, index_type offset,
2034               namelist_info **pprev_nl, char *nml_err_msg,
2035               index_type clow, index_type chigh)
2036 {
2037
2038   namelist_info * cmp;
2039   char * obj_name;
2040   int nml_carry;
2041   int len;
2042   int dim;
2043   index_type dlen;
2044   index_type m;
2045   index_type obj_name_len;
2046   void * pdata;
2047
2048   /* This object not touched in name parsing.  */
2049
2050   if (!nl->touched)
2051     return SUCCESS;
2052
2053   dtp->u.p.repeat_count = 0;
2054   eat_spaces (dtp);
2055
2056   len = nl->len;
2057   switch (nl->type)
2058   {
2059
2060     case GFC_DTYPE_INTEGER:
2061     case GFC_DTYPE_LOGICAL:
2062       dlen = len;
2063       break;
2064
2065     case GFC_DTYPE_REAL:
2066       dlen = size_from_real_kind (len);
2067       break;
2068
2069     case GFC_DTYPE_COMPLEX:
2070       dlen = size_from_complex_kind (len);
2071       break;
2072
2073     case GFC_DTYPE_CHARACTER:
2074       dlen = chigh ? (chigh - clow + 1) : nl->string_length;
2075       break;
2076
2077     default:
2078       dlen = 0;
2079     }
2080
2081   do
2082     {
2083
2084       /* Update the pointer to the data, using the current index vector  */
2085
2086       pdata = (void*)(nl->mem_pos + offset);
2087       for (dim = 0; dim < nl->var_rank; dim++)
2088         pdata = (void*)(pdata + (nl->ls[dim].idx - nl->dim[dim].lbound) *
2089                  nl->dim[dim].stride * nl->size);
2090
2091       /* Reset the error flag and try to read next value, if
2092          dtp->u.p.repeat_count=0  */
2093
2094       dtp->u.p.nml_read_error = 0;
2095       nml_carry = 0;
2096       if (--dtp->u.p.repeat_count <= 0)
2097         {
2098           if (dtp->u.p.input_complete)
2099             return SUCCESS;
2100           if (dtp->u.p.at_eol)
2101             finish_separator (dtp);
2102           if (dtp->u.p.input_complete)
2103             return SUCCESS;
2104
2105           /* GFC_TYPE_UNKNOWN through for nulls and is detected
2106              after the switch block.  */
2107
2108           dtp->u.p.saved_type = GFC_DTYPE_UNKNOWN;
2109           free_saved (dtp);
2110
2111           switch (nl->type)
2112           {
2113           case GFC_DTYPE_INTEGER:
2114               read_integer (dtp, len);
2115               break;
2116
2117           case GFC_DTYPE_LOGICAL:
2118               read_logical (dtp, len);
2119               break;
2120
2121           case GFC_DTYPE_CHARACTER:
2122               read_character (dtp, len);
2123               break;
2124
2125           case GFC_DTYPE_REAL:
2126               read_real (dtp, len);
2127               break;
2128
2129           case GFC_DTYPE_COMPLEX:
2130               read_complex (dtp, len, dlen);
2131               break;
2132
2133           case GFC_DTYPE_DERIVED:
2134             obj_name_len = strlen (nl->var_name) + 1;
2135             obj_name = get_mem (obj_name_len+1);
2136             memcpy (obj_name, nl->var_name, obj_name_len-1);
2137             memcpy (obj_name + obj_name_len - 1, "%", 2);
2138
2139             /* If reading a derived type, disable the expanded read warning
2140                since a single object can have multiple reads.  */
2141             dtp->u.p.expanded_read = 0;
2142
2143             /* Now loop over the components. Update the component pointer
2144                with the return value from nml_write_obj.  This loop jumps
2145                past nested derived types by testing if the potential
2146                component name contains '%'.  */
2147
2148             for (cmp = nl->next;
2149                  cmp &&
2150                    !strncmp (cmp->var_name, obj_name, obj_name_len) &&
2151                    !strchr (cmp->var_name + obj_name_len, '%');
2152                  cmp = cmp->next)
2153               {
2154
2155                 if (nml_read_obj (dtp, cmp, (index_type)(pdata - nl->mem_pos),
2156                                   pprev_nl, nml_err_msg, clow, chigh)
2157                     == FAILURE)
2158                   {
2159                     free_mem (obj_name);
2160                     return FAILURE;
2161                   }
2162
2163                 if (dtp->u.p.input_complete)
2164                   {
2165                     free_mem (obj_name);
2166                     return SUCCESS;
2167                   }
2168               }
2169
2170             free_mem (obj_name);
2171             goto incr_idx;
2172
2173           default:
2174             sprintf (nml_err_msg, "Bad type for namelist object %s",
2175                         nl->var_name);
2176             internal_error (&dtp->common, nml_err_msg);
2177             goto nml_err_ret;
2178           }
2179         }
2180
2181       /* The standard permits array data to stop short of the number of
2182          elements specified in the loop specification.  In this case, we
2183          should be here with dtp->u.p.nml_read_error != 0.  Control returns to
2184          nml_get_obj_data and an attempt is made to read object name.  */
2185
2186       *pprev_nl = nl;
2187       if (dtp->u.p.nml_read_error)
2188         {
2189           dtp->u.p.expanded_read = 0;
2190           return SUCCESS;
2191         }
2192
2193       if (dtp->u.p.saved_type == GFC_DTYPE_UNKNOWN)
2194         {
2195           dtp->u.p.expanded_read = 0;
2196           goto incr_idx;
2197         }
2198
2199       /* Note the switch from GFC_DTYPE_type to BT_type at this point.
2200          This comes about because the read functions return BT_types.  */
2201
2202       switch (dtp->u.p.saved_type)
2203       {
2204
2205         case BT_COMPLEX:
2206         case BT_REAL:
2207         case BT_INTEGER:
2208         case BT_LOGICAL:
2209           memcpy (pdata, dtp->u.p.value, dlen);
2210           break;
2211
2212         case BT_CHARACTER:
2213           m = (dlen < dtp->u.p.saved_used) ? dlen : dtp->u.p.saved_used;
2214           pdata = (void*)( pdata + clow - 1 );
2215           memcpy (pdata, dtp->u.p.saved_string, m);
2216           if (m < dlen)
2217             memset ((void*)( pdata + m ), ' ', dlen - m);
2218           break;
2219
2220         default:
2221           break;
2222       }
2223
2224       /* Warn if a non-standard expanded read occurs. A single read of a
2225          single object is acceptable.  If a second read occurs, issue a warning
2226          and set the flag to zero to prevent further warnings.  */
2227       if (dtp->u.p.expanded_read == 2)
2228         {
2229           notify_std (&dtp->common, GFC_STD_GNU, "Non-standard expanded namelist read.");
2230           dtp->u.p.expanded_read = 0;
2231         }
2232
2233       /* If the expanded read warning flag is set, increment it,
2234          indicating that a single read has occurred.  */
2235       if (dtp->u.p.expanded_read >= 1)
2236         dtp->u.p.expanded_read++;
2237
2238       /* Break out of loop if scalar.  */
2239       if (!nl->var_rank)
2240         break;
2241
2242       /* Now increment the index vector.  */
2243
2244 incr_idx:
2245
2246       nml_carry = 1;
2247       for (dim = 0; dim < nl->var_rank; dim++)
2248         {
2249           nl->ls[dim].idx += nml_carry * nl->ls[dim].step;
2250           nml_carry = 0;
2251           if (((nl->ls[dim].step > 0) && (nl->ls[dim].idx > nl->ls[dim].end))
2252               ||
2253               ((nl->ls[dim].step < 0) && (nl->ls[dim].idx < nl->ls[dim].end)))
2254             {
2255               nl->ls[dim].idx = nl->ls[dim].start;
2256               nml_carry = 1;
2257             }
2258         }
2259     } while (!nml_carry);
2260
2261   if (dtp->u.p.repeat_count > 1)
2262     {
2263        sprintf (nml_err_msg, "Repeat count too large for namelist object %s" ,
2264                    nl->var_name );
2265        goto nml_err_ret;
2266     }
2267   return SUCCESS;
2268
2269 nml_err_ret:
2270
2271   return FAILURE;
2272 }
2273
2274 /* Parses the object name, including array and substring qualifiers.  It
2275    iterates over derived type components, touching those components and
2276    setting their loop specifications, if there is a qualifier.  If the
2277    object is itself a derived type, its components and subcomponents are
2278    touched.  nml_read_obj is called at the end and this reads the data in
2279    the manner specified by the object name.  */
2280
2281 static try
2282 nml_get_obj_data (st_parameter_dt *dtp, namelist_info **pprev_nl,
2283                   char *nml_err_msg)
2284 {
2285   char c;
2286   namelist_info * nl;
2287   namelist_info * first_nl = NULL;
2288   namelist_info * root_nl = NULL;
2289   int dim;
2290   int component_flag;
2291   char parse_err_msg[30];
2292   index_type clow, chigh;
2293
2294   /* Look for end of input or object name.  If '?' or '=?' are encountered
2295      in stdin, print the node names or the namelist to stdout.  */
2296
2297   eat_separator (dtp);
2298   if (dtp->u.p.input_complete)
2299     return SUCCESS;
2300
2301   if (dtp->u.p.at_eol)
2302     finish_separator (dtp);
2303   if (dtp->u.p.input_complete)
2304     return SUCCESS;
2305
2306   c = next_char (dtp);
2307   switch (c)
2308     {
2309     case '=':
2310       c = next_char (dtp);
2311       if (c != '?')
2312         {
2313           sprintf (nml_err_msg, "namelist read: misplaced = sign");
2314           goto nml_err_ret;
2315         }
2316       nml_query (dtp, '=');
2317       return SUCCESS;
2318
2319     case '?':
2320       nml_query (dtp, '?');
2321       return SUCCESS;
2322
2323     case '$':
2324     case '&':
2325       nml_match_name (dtp, "end", 3);
2326       if (dtp->u.p.nml_read_error)
2327         {
2328           sprintf (nml_err_msg, "namelist not terminated with / or &end");
2329           goto nml_err_ret;
2330         }
2331     case '/':
2332       dtp->u.p.input_complete = 1;
2333       return SUCCESS;
2334
2335     default :
2336       break;
2337     }
2338
2339   /* Untouch all nodes of the namelist and reset the flag that is set for
2340      derived type components.  */
2341
2342   nml_untouch_nodes (dtp);
2343   component_flag = 0;
2344
2345   /* Get the object name - should '!' and '\n' be permitted separators?  */
2346
2347 get_name:
2348
2349   free_saved (dtp);
2350
2351   do
2352     {
2353       push_char (dtp, tolower(c));
2354       c = next_char (dtp);
2355     } while (!( c=='=' || c==' ' || c=='\t' || c =='(' || c =='%' ));
2356
2357   unget_char (dtp, c);
2358
2359   /* Check that the name is in the namelist and get pointer to object.
2360      Three error conditions exist: (i) An attempt is being made to
2361      identify a non-existent object, following a failed data read or
2362      (ii) The object name does not exist or (iii) Too many data items
2363      are present for an object.  (iii) gives the same error message
2364      as (i)  */
2365
2366   push_char (dtp, '\0');
2367
2368   if (component_flag)
2369     {
2370       size_t var_len = strlen (root_nl->var_name);
2371       size_t saved_len
2372         = dtp->u.p.saved_string ? strlen (dtp->u.p.saved_string) : 0;
2373       char ext_name[var_len + saved_len + 1];
2374
2375       memcpy (ext_name, root_nl->var_name, var_len);
2376       if (dtp->u.p.saved_string)
2377         memcpy (ext_name + var_len, dtp->u.p.saved_string, saved_len);
2378       ext_name[var_len + saved_len] = '\0';
2379       nl = find_nml_node (dtp, ext_name);
2380     }
2381   else
2382     nl = find_nml_node (dtp, dtp->u.p.saved_string);
2383
2384   if (nl == NULL)
2385     {
2386       if (dtp->u.p.nml_read_error && *pprev_nl)
2387         sprintf (nml_err_msg, "Bad data for namelist object %s",
2388                     (*pprev_nl)->var_name);
2389
2390       else
2391         sprintf (nml_err_msg, "Cannot match namelist object name %s",
2392                     dtp->u.p.saved_string);
2393
2394       goto nml_err_ret;
2395     }
2396
2397   /* Get the length, data length, base pointer and rank of the variable.
2398      Set the default loop specification first.  */
2399
2400   for (dim=0; dim < nl->var_rank; dim++)
2401     {
2402       nl->ls[dim].step = 1;
2403       nl->ls[dim].end = nl->dim[dim].ubound;
2404       nl->ls[dim].start = nl->dim[dim].lbound;
2405       nl->ls[dim].idx = nl->ls[dim].start;
2406     }
2407
2408 /* Check to see if there is a qualifier: if so, parse it.*/
2409
2410   if (c == '(' && nl->var_rank)
2411     {
2412       if (nml_parse_qualifier (dtp, nl->dim, nl->ls, nl->var_rank,
2413                                parse_err_msg) == FAILURE)
2414         {
2415           sprintf (nml_err_msg, "%s for namelist variable %s",
2416                       parse_err_msg, nl->var_name);
2417           goto nml_err_ret;
2418         }
2419       c = next_char (dtp);
2420       unget_char (dtp, c);
2421     }
2422
2423   /* Now parse a derived type component. The root namelist_info address
2424      is backed up, as is the previous component level.  The  component flag
2425      is set and the iteration is made by jumping back to get_name.  */
2426
2427   if (c == '%')
2428     {
2429
2430       if (nl->type != GFC_DTYPE_DERIVED)
2431         {
2432           sprintf (nml_err_msg, "Attempt to get derived component for %s",
2433                       nl->var_name);
2434           goto nml_err_ret;
2435         }
2436
2437       if (!component_flag)
2438         first_nl = nl;
2439
2440       root_nl = nl;
2441       component_flag = 1;
2442       c = next_char (dtp);
2443       goto get_name;
2444
2445     }
2446
2447   /* Parse a character qualifier, if present.  chigh = 0 is a default
2448      that signals that the string length = string_length.  */
2449
2450   clow = 1;
2451   chigh = 0;
2452
2453   if (c == '(' && nl->type == GFC_DTYPE_CHARACTER)
2454     {
2455       descriptor_dimension chd[1] = { {1, clow, nl->string_length} };
2456       array_loop_spec ind[1] = { {1, clow, nl->string_length, 1} };
2457
2458       if (nml_parse_qualifier (dtp, chd, ind, 1, parse_err_msg) == FAILURE)
2459         {
2460           sprintf (nml_err_msg, "%s for namelist variable %s",
2461                       parse_err_msg, nl->var_name);
2462           goto nml_err_ret;
2463         }
2464
2465       clow = ind[0].start;
2466       chigh = ind[0].end;
2467
2468       if (ind[0].step != 1)
2469         {
2470           sprintf (nml_err_msg,
2471                       "Bad step in substring for namelist object %s",
2472                       nl->var_name);
2473           goto nml_err_ret;
2474         }
2475
2476       c = next_char (dtp);
2477       unget_char (dtp, c);
2478     }
2479
2480   /* If a derived type touch its components and restore the root
2481      namelist_info if we have parsed a qualified derived type
2482      component.  */
2483
2484   if (nl->type == GFC_DTYPE_DERIVED)
2485     nml_touch_nodes (nl);
2486   if (component_flag)
2487     nl = first_nl;
2488
2489   /*make sure no extraneous qualifiers are there.*/
2490
2491   if (c == '(')
2492     {
2493       sprintf (nml_err_msg, "Qualifier for a scalar or non-character"
2494                   " namelist object %s", nl->var_name);
2495       goto nml_err_ret;
2496     }
2497
2498 /* According to the standard, an equal sign MUST follow an object name. The
2499    following is possibly lax - it allows comments, blank lines and so on to
2500    intervene.  eat_spaces (dtp); c = next_char (dtp); would be compliant*/
2501
2502   free_saved (dtp);
2503
2504   eat_separator (dtp);
2505   if (dtp->u.p.input_complete)
2506     return SUCCESS;
2507
2508   if (dtp->u.p.at_eol)
2509     finish_separator (dtp);
2510   if (dtp->u.p.input_complete)
2511     return SUCCESS;
2512
2513   c = next_char (dtp);
2514
2515   if (c != '=')
2516     {
2517       sprintf (nml_err_msg, "Equal sign must follow namelist object name %s",
2518                   nl->var_name);
2519       goto nml_err_ret;
2520     }
2521
2522   if (nml_read_obj (dtp, nl, 0, pprev_nl, nml_err_msg, clow, chigh) == FAILURE)
2523     goto nml_err_ret;
2524
2525   return SUCCESS;
2526
2527 nml_err_ret:
2528
2529   return FAILURE;
2530 }
2531
2532 /* Entry point for namelist input.  Goes through input until namelist name
2533   is matched.  Then cycles through nml_get_obj_data until the input is
2534   completed or there is an error.  */
2535
2536 void
2537 namelist_read (st_parameter_dt *dtp)
2538 {
2539   char c;
2540   jmp_buf eof_jump;
2541   char nml_err_msg[100];
2542   /* Pointer to the previously read object, in case attempt is made to read
2543      new object name.  Should this fail, error message can give previous
2544      name.  */
2545   namelist_info *prev_nl = NULL;
2546
2547   dtp->u.p.namelist_mode = 1;
2548   dtp->u.p.input_complete = 0;
2549   dtp->u.p.expanded_read = 0;
2550
2551   dtp->u.p.eof_jump = &eof_jump;
2552   if (setjmp (eof_jump))
2553     {
2554       dtp->u.p.eof_jump = NULL;
2555       generate_error (&dtp->common, ERROR_END, NULL);
2556       return;
2557     }
2558
2559   /* Look for &namelist_name .  Skip all characters, testing for $nmlname.
2560      Exit on success or EOF. If '?' or '=?' encountered in stdin, print
2561      node names or namelist on stdout.  */
2562
2563 find_nml_name:
2564   switch (c = next_char (dtp))
2565     {
2566     case '$':
2567     case '&':
2568           break;
2569
2570     case '!':
2571       eat_line (dtp);
2572       goto find_nml_name;
2573
2574     case '=':
2575       c = next_char (dtp);
2576       if (c == '?')
2577         nml_query (dtp, '=');
2578       else
2579         unget_char (dtp, c);
2580       goto find_nml_name;
2581
2582     case '?':
2583       nml_query (dtp, '?');
2584
2585     default:
2586       goto find_nml_name;
2587     }
2588
2589   /* Match the name of the namelist.  */
2590
2591   nml_match_name (dtp, dtp->namelist_name, dtp->namelist_name_len);
2592
2593   if (dtp->u.p.nml_read_error)
2594     goto find_nml_name;
2595
2596   /* Ready to read namelist objects.  If there is an error in input
2597      from stdin, output the error message and continue.  */
2598
2599   while (!dtp->u.p.input_complete)
2600     {
2601       if (nml_get_obj_data (dtp, &prev_nl, nml_err_msg) == FAILURE)
2602         {
2603           gfc_unit *u;
2604
2605           if (dtp->u.p.current_unit->unit_number != options.stdin_unit)
2606             goto nml_err_ret;
2607
2608           u = find_unit (options.stderr_unit);
2609           st_printf ("%s\n", nml_err_msg);
2610           if (u != NULL)
2611             {
2612               flush (u->s);
2613               unlock_unit (u);
2614             }
2615         }
2616
2617    }
2618
2619   dtp->u.p.eof_jump = NULL;
2620   free_saved (dtp);
2621   free_line (dtp);
2622   return;
2623
2624   /* All namelist error calls return from here */
2625
2626 nml_err_ret:
2627
2628   dtp->u.p.eof_jump = NULL;
2629   free_saved (dtp);
2630   free_line (dtp);
2631   generate_error (&dtp->common, ERROR_READ_VALUE, nml_err_msg);
2632   return;
2633 }