rtl.h (emit_clobber, [...]): Declare.
[official-gcc.git] / libgfortran / io / list_read.c
blob1aa84704d8a6e9a5110a642ee73098f85621a1a6
1 /* Copyright (C) 2002, 2003, 2004, 2005, 2007, 2008
2 Free Software Foundation, Inc.
3 Contributed by Andy Vaught
4 Namelist input contributed by Paul Thomas
5 F2003 I/O support contributed by Jerry DeLisle
7 This file is part of the GNU Fortran 95 runtime library (libgfortran).
9 Libgfortran is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2, or (at your option)
12 any later version.
14 In addition to the permissions in the GNU General Public License, the
15 Free Software Foundation gives you unlimited permission to link the
16 compiled version of this file into combinations with other programs,
17 and to distribute those combinations without any restriction coming
18 from the use of this file. (The General Public License restrictions
19 do apply in other respects; for example, they cover modification of
20 the file, and distribution when not linked into a combine
21 executable.)
23 Libgfortran is distributed in the hope that it will be useful,
24 but WITHOUT ANY WARRANTY; without even the implied warranty of
25 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
26 GNU General Public License for more details.
28 You should have received a copy of the GNU General Public License
29 along with Libgfortran; see the file COPYING. If not, write to
30 the Free Software Foundation, 51 Franklin Street, Fifth Floor,
31 Boston, MA 02110-1301, USA. */
34 #include "io.h"
35 #include <string.h>
36 #include <ctype.h>
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. */
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. */
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'
56 #define CASE_SEPARATORS case ' ': case ',': case '/': case '\n': case '\t': \
57 case '\r': case ';'
59 /* This macro assumes that we're operating on a variable. */
61 #define is_separator(c) (c == '/' || c == ',' || c == '\n' || c == ' ' \
62 || c == '\t' || c == '\r' || c == ';')
64 /* Maximum repeat count. Less than ten times the maximum signed int32. */
66 #define MAX_REPEAT 200000000
68 #ifndef HAVE_SNPRINTF
69 # undef snprintf
70 # define snprintf(str, size, ...) sprintf (str, __VA_ARGS__)
71 #endif
73 /* Save a character to a string buffer, enlarging it as necessary. */
75 static void
76 push_char (st_parameter_dt *dtp, char c)
78 char *new;
80 if (dtp->u.p.saved_string == NULL)
82 if (dtp->u.p.scratch == NULL)
83 dtp->u.p.scratch = get_mem (SCRATCH_SIZE);
84 dtp->u.p.saved_string = dtp->u.p.scratch;
85 memset (dtp->u.p.saved_string, 0, SCRATCH_SIZE);
86 dtp->u.p.saved_length = SCRATCH_SIZE;
87 dtp->u.p.saved_used = 0;
90 if (dtp->u.p.saved_used >= dtp->u.p.saved_length)
92 dtp->u.p.saved_length = 2 * dtp->u.p.saved_length;
93 new = get_mem (2 * dtp->u.p.saved_length);
95 memset (new, 0, 2 * dtp->u.p.saved_length);
97 memcpy (new, dtp->u.p.saved_string, dtp->u.p.saved_used);
98 if (dtp->u.p.saved_string != dtp->u.p.scratch)
99 free_mem (dtp->u.p.saved_string);
101 dtp->u.p.saved_string = new;
104 dtp->u.p.saved_string[dtp->u.p.saved_used++] = c;
108 /* Free the input buffer if necessary. */
110 static void
111 free_saved (st_parameter_dt *dtp)
113 if (dtp->u.p.saved_string == NULL)
114 return;
116 if (dtp->u.p.saved_string != dtp->u.p.scratch)
117 free_mem (dtp->u.p.saved_string);
119 dtp->u.p.saved_string = NULL;
120 dtp->u.p.saved_used = 0;
124 /* Free the line buffer if necessary. */
126 static void
127 free_line (st_parameter_dt *dtp)
129 dtp->u.p.item_count = 0;
130 dtp->u.p.line_buffer_enabled = 0;
132 if (dtp->u.p.line_buffer == NULL)
133 return;
135 free_mem (dtp->u.p.line_buffer);
136 dtp->u.p.line_buffer = NULL;
140 static char
141 next_char (st_parameter_dt *dtp)
143 size_t length;
144 gfc_offset record;
145 char c;
147 if (dtp->u.p.last_char != '\0')
149 dtp->u.p.at_eol = 0;
150 c = dtp->u.p.last_char;
151 dtp->u.p.last_char = '\0';
152 goto done;
155 /* Read from line_buffer if enabled. */
157 if (dtp->u.p.line_buffer_enabled)
159 dtp->u.p.at_eol = 0;
161 c = dtp->u.p.line_buffer[dtp->u.p.item_count];
162 if (c != '\0' && dtp->u.p.item_count < 64)
164 dtp->u.p.line_buffer[dtp->u.p.item_count] = '\0';
165 dtp->u.p.item_count++;
166 goto done;
169 dtp->u.p.item_count = 0;
170 dtp->u.p.line_buffer_enabled = 0;
173 /* Handle the end-of-record and end-of-file conditions for
174 internal array unit. */
175 if (is_array_io (dtp))
177 if (dtp->u.p.at_eof)
178 longjmp (*dtp->u.p.eof_jump, 1);
180 /* Check for "end-of-record" condition. */
181 if (dtp->u.p.current_unit->bytes_left == 0)
183 int finished;
185 c = '\n';
186 record = next_array_record (dtp, dtp->u.p.current_unit->ls,
187 &finished);
189 /* Check for "end-of-file" condition. */
190 if (finished)
192 dtp->u.p.at_eof = 1;
193 goto done;
196 record *= dtp->u.p.current_unit->recl;
197 if (sseek (dtp->u.p.current_unit->s, record) == FAILURE)
198 longjmp (*dtp->u.p.eof_jump, 1);
200 dtp->u.p.current_unit->bytes_left = dtp->u.p.current_unit->recl;
201 goto done;
205 /* Get the next character and handle end-of-record conditions. */
207 length = 1;
209 if (sread (dtp->u.p.current_unit->s, &c, &length) != 0)
211 generate_error (&dtp->common, LIBERROR_OS, NULL);
212 return '\0';
215 if (is_stream_io (dtp) && length == 1)
216 dtp->u.p.current_unit->strm_pos++;
218 if (is_internal_unit (dtp))
220 if (is_array_io (dtp))
222 /* Check whether we hit EOF. */
223 if (length == 0)
225 generate_error (&dtp->common, LIBERROR_INTERNAL_UNIT, NULL);
226 return '\0';
228 dtp->u.p.current_unit->bytes_left--;
230 else
232 if (dtp->u.p.at_eof)
233 longjmp (*dtp->u.p.eof_jump, 1);
234 if (length == 0)
236 c = '\n';
237 dtp->u.p.at_eof = 1;
241 else
243 if (length == 0)
245 if (dtp->u.p.advance_status == ADVANCE_NO)
247 if (dtp->u.p.current_unit->endfile == AT_ENDFILE)
248 longjmp (*dtp->u.p.eof_jump, 1);
249 dtp->u.p.current_unit->endfile = AT_ENDFILE;
250 c = '\n';
252 else
253 longjmp (*dtp->u.p.eof_jump, 1);
256 done:
257 dtp->u.p.at_eol = (c == '\n' || c == '\r');
258 return c;
262 /* Push a character back onto the input. */
264 static void
265 unget_char (st_parameter_dt *dtp, char c)
267 dtp->u.p.last_char = c;
271 /* Skip over spaces in the input. Returns the nonspace character that
272 terminated the eating and also places it back on the input. */
274 static char
275 eat_spaces (st_parameter_dt *dtp)
277 char c;
281 c = next_char (dtp);
283 while (c == ' ' || c == '\t');
285 unget_char (dtp, c);
286 return c;
290 /* This function reads characters through to the end of the current line and
291 just ignores them. */
293 static void
294 eat_line (st_parameter_dt *dtp)
296 char c;
297 if (!is_internal_unit (dtp))
299 c = next_char (dtp);
300 while (c != '\n');
304 /* Skip over a separator. Technically, we don't always eat the whole
305 separator. This is because if we've processed the last input item,
306 then a separator is unnecessary. Plus the fact that operating
307 systems usually deliver console input on a line basis.
309 The upshot is that if we see a newline as part of reading a
310 separator, we stop reading. If there are more input items, we
311 continue reading the separator with finish_separator() which takes
312 care of the fact that we may or may not have seen a comma as part
313 of the separator. */
315 static void
316 eat_separator (st_parameter_dt *dtp)
318 char c, n;
320 eat_spaces (dtp);
321 dtp->u.p.comma_flag = 0;
323 c = next_char (dtp);
324 switch (c)
326 case ',':
327 if (dtp->u.p.decimal_status == DECIMAL_COMMA)
329 unget_char (dtp, c);
330 break;
332 /* Fall through. */
333 case ';':
334 dtp->u.p.comma_flag = 1;
335 eat_spaces (dtp);
336 break;
338 case '/':
339 dtp->u.p.input_complete = 1;
340 break;
342 case '\r':
343 dtp->u.p.at_eol = 1;
344 n = next_char(dtp);
345 if (n != '\n')
347 unget_char (dtp, n);
348 break;
350 /* Fall through. */
351 case '\n':
352 dtp->u.p.at_eol = 1;
353 if (dtp->u.p.namelist_mode)
357 c = next_char (dtp);
358 if (c == '!')
360 eat_line (dtp);
361 c = next_char (dtp);
362 if (c == '!')
364 eat_line (dtp);
365 c = next_char (dtp);
369 while (c == '\n' || c == '\r' || c == ' ');
370 unget_char (dtp, c);
372 break;
374 case '!':
375 if (dtp->u.p.namelist_mode)
376 { /* Eat a namelist comment. */
378 c = next_char (dtp);
379 while (c != '\n');
381 break;
384 /* Fall Through... */
386 default:
387 unget_char (dtp, c);
388 break;
393 /* Finish processing a separator that was interrupted by a newline.
394 If we're here, then another data item is present, so we finish what
395 we started on the previous line. */
397 static void
398 finish_separator (st_parameter_dt *dtp)
400 char c;
402 restart:
403 eat_spaces (dtp);
405 c = next_char (dtp);
406 switch (c)
408 case ',':
409 if (dtp->u.p.comma_flag)
410 unget_char (dtp, c);
411 else
413 c = eat_spaces (dtp);
414 if (c == '\n' || c == '\r')
415 goto restart;
418 break;
420 case '/':
421 dtp->u.p.input_complete = 1;
422 if (!dtp->u.p.namelist_mode)
423 return;
424 break;
426 case '\n':
427 case '\r':
428 goto restart;
430 case '!':
431 if (dtp->u.p.namelist_mode)
434 c = next_char (dtp);
435 while (c != '\n');
437 goto restart;
440 default:
441 unget_char (dtp, c);
442 break;
447 /* This function is needed to catch bad conversions so that namelist can
448 attempt to see if dtp->u.p.saved_string contains a new object name rather
449 than a bad value. */
451 static int
452 nml_bad_return (st_parameter_dt *dtp, char c)
454 if (dtp->u.p.namelist_mode)
456 dtp->u.p.nml_read_error = 1;
457 unget_char (dtp, c);
458 return 1;
460 return 0;
463 /* Convert an unsigned string to an integer. The length value is -1
464 if we are working on a repeat count. Returns nonzero if we have a
465 range problem. As a side effect, frees the dtp->u.p.saved_string. */
467 static int
468 convert_integer (st_parameter_dt *dtp, int length, int negative)
470 char c, *buffer, message[100];
471 int m;
472 GFC_INTEGER_LARGEST v, max, max10;
474 buffer = dtp->u.p.saved_string;
475 v = 0;
477 max = (length == -1) ? MAX_REPEAT : max_value (length, 1);
478 max10 = max / 10;
480 for (;;)
482 c = *buffer++;
483 if (c == '\0')
484 break;
485 c -= '0';
487 if (v > max10)
488 goto overflow;
489 v = 10 * v;
491 if (v > max - c)
492 goto overflow;
493 v += c;
496 m = 0;
498 if (length != -1)
500 if (negative)
501 v = -v;
502 set_integer (dtp->u.p.value, v, length);
504 else
506 dtp->u.p.repeat_count = v;
508 if (dtp->u.p.repeat_count == 0)
510 sprintf (message, "Zero repeat count in item %d of list input",
511 dtp->u.p.item_count);
513 generate_error (&dtp->common, LIBERROR_READ_VALUE, message);
514 m = 1;
518 free_saved (dtp);
519 return m;
521 overflow:
522 if (length == -1)
523 sprintf (message, "Repeat count overflow in item %d of list input",
524 dtp->u.p.item_count);
525 else
526 sprintf (message, "Integer overflow while reading item %d",
527 dtp->u.p.item_count);
529 free_saved (dtp);
530 generate_error (&dtp->common, LIBERROR_READ_VALUE, message);
532 return 1;
536 /* Parse a repeat count for logical and complex values which cannot
537 begin with a digit. Returns nonzero if we are done, zero if we
538 should continue on. */
540 static int
541 parse_repeat (st_parameter_dt *dtp)
543 char c, message[100];
544 int repeat;
546 c = next_char (dtp);
547 switch (c)
549 CASE_DIGITS:
550 repeat = c - '0';
551 break;
553 CASE_SEPARATORS:
554 unget_char (dtp, c);
555 eat_separator (dtp);
556 return 1;
558 default:
559 unget_char (dtp, c);
560 return 0;
563 for (;;)
565 c = next_char (dtp);
566 switch (c)
568 CASE_DIGITS:
569 repeat = 10 * repeat + c - '0';
571 if (repeat > MAX_REPEAT)
573 sprintf (message,
574 "Repeat count overflow in item %d of list input",
575 dtp->u.p.item_count);
577 generate_error (&dtp->common, LIBERROR_READ_VALUE, message);
578 return 1;
581 break;
583 case '*':
584 if (repeat == 0)
586 sprintf (message,
587 "Zero repeat count in item %d of list input",
588 dtp->u.p.item_count);
590 generate_error (&dtp->common, LIBERROR_READ_VALUE, message);
591 return 1;
594 goto done;
596 default:
597 goto bad_repeat;
601 done:
602 dtp->u.p.repeat_count = repeat;
603 return 0;
605 bad_repeat:
607 eat_line (dtp);
608 free_saved (dtp);
609 sprintf (message, "Bad repeat count in item %d of list input",
610 dtp->u.p.item_count);
611 generate_error (&dtp->common, LIBERROR_READ_VALUE, message);
612 return 1;
616 /* To read a logical we have to look ahead in the input stream to make sure
617 there is not an equal sign indicating a variable name. To do this we use
618 line_buffer to point to a temporary buffer, pushing characters there for
619 possible later reading. */
621 static void
622 l_push_char (st_parameter_dt *dtp, char c)
624 if (dtp->u.p.line_buffer == NULL)
626 dtp->u.p.line_buffer = get_mem (SCRATCH_SIZE);
627 memset (dtp->u.p.line_buffer, 0, SCRATCH_SIZE);
630 dtp->u.p.line_buffer[dtp->u.p.item_count++] = c;
634 /* Read a logical character on the input. */
636 static void
637 read_logical (st_parameter_dt *dtp, int length)
639 char c, message[100];
640 int i, v;
642 if (parse_repeat (dtp))
643 return;
645 c = tolower (next_char (dtp));
646 l_push_char (dtp, c);
647 switch (c)
649 case 't':
650 v = 1;
651 c = next_char (dtp);
652 l_push_char (dtp, c);
654 if (!is_separator(c))
655 goto possible_name;
657 unget_char (dtp, c);
658 break;
659 case 'f':
660 v = 0;
661 c = next_char (dtp);
662 l_push_char (dtp, c);
664 if (!is_separator(c))
665 goto possible_name;
667 unget_char (dtp, c);
668 break;
670 case '.':
671 c = tolower (next_char (dtp));
672 switch (c)
674 case 't':
675 v = 1;
676 break;
677 case 'f':
678 v = 0;
679 break;
680 default:
681 goto bad_logical;
684 break;
686 CASE_SEPARATORS:
687 unget_char (dtp, c);
688 eat_separator (dtp);
689 return; /* Null value. */
691 default:
692 /* Save the character in case it is the beginning
693 of the next object name. */
694 unget_char (dtp, c);
695 goto bad_logical;
698 dtp->u.p.saved_type = BT_LOGICAL;
699 dtp->u.p.saved_length = length;
701 /* Eat trailing garbage. */
704 c = next_char (dtp);
706 while (!is_separator (c));
708 unget_char (dtp, c);
709 eat_separator (dtp);
710 set_integer ((int *) dtp->u.p.value, v, length);
711 free_line (dtp);
713 return;
715 possible_name:
717 for(i = 0; i < 63; i++)
719 c = next_char (dtp);
720 if (is_separator(c))
722 /* All done if this is not a namelist read. */
723 if (!dtp->u.p.namelist_mode)
724 goto logical_done;
726 unget_char (dtp, c);
727 eat_separator (dtp);
728 c = next_char (dtp);
729 if (c != '=')
731 unget_char (dtp, c);
732 goto logical_done;
736 l_push_char (dtp, c);
737 if (c == '=')
739 dtp->u.p.nml_read_error = 1;
740 dtp->u.p.line_buffer_enabled = 1;
741 dtp->u.p.item_count = 0;
742 return;
747 bad_logical:
749 free_line (dtp);
751 if (nml_bad_return (dtp, c))
752 return;
754 eat_line (dtp);
755 free_saved (dtp);
756 sprintf (message, "Bad logical value while reading item %d",
757 dtp->u.p.item_count);
758 generate_error (&dtp->common, LIBERROR_READ_VALUE, message);
759 return;
761 logical_done:
763 dtp->u.p.saved_type = BT_LOGICAL;
764 dtp->u.p.saved_length = length;
765 set_integer ((int *) dtp->u.p.value, v, length);
766 free_saved (dtp);
767 free_line (dtp);
771 /* Reading integers is tricky because we can actually be reading a
772 repeat count. We have to store the characters in a buffer because
773 we could be reading an integer that is larger than the default int
774 used for repeat counts. */
776 static void
777 read_integer (st_parameter_dt *dtp, int length)
779 char c, message[100];
780 int negative;
782 negative = 0;
784 c = next_char (dtp);
785 switch (c)
787 case '-':
788 negative = 1;
789 /* Fall through... */
791 case '+':
792 c = next_char (dtp);
793 goto get_integer;
795 CASE_SEPARATORS: /* Single null. */
796 unget_char (dtp, c);
797 eat_separator (dtp);
798 return;
800 CASE_DIGITS:
801 push_char (dtp, c);
802 break;
804 default:
805 goto bad_integer;
808 /* Take care of what may be a repeat count. */
810 for (;;)
812 c = next_char (dtp);
813 switch (c)
815 CASE_DIGITS:
816 push_char (dtp, c);
817 break;
819 case '*':
820 push_char (dtp, '\0');
821 goto repeat;
823 CASE_SEPARATORS: /* Not a repeat count. */
824 goto done;
826 default:
827 goto bad_integer;
831 repeat:
832 if (convert_integer (dtp, -1, 0))
833 return;
835 /* Get the real integer. */
837 c = next_char (dtp);
838 switch (c)
840 CASE_DIGITS:
841 break;
843 CASE_SEPARATORS:
844 unget_char (dtp, c);
845 eat_separator (dtp);
846 return;
848 case '-':
849 negative = 1;
850 /* Fall through... */
852 case '+':
853 c = next_char (dtp);
854 break;
857 get_integer:
858 if (!isdigit (c))
859 goto bad_integer;
860 push_char (dtp, c);
862 for (;;)
864 c = next_char (dtp);
865 switch (c)
867 CASE_DIGITS:
868 push_char (dtp, c);
869 break;
871 CASE_SEPARATORS:
872 goto done;
874 default:
875 goto bad_integer;
879 bad_integer:
881 if (nml_bad_return (dtp, c))
882 return;
884 eat_line (dtp);
885 free_saved (dtp);
886 sprintf (message, "Bad integer for item %d in list input",
887 dtp->u.p.item_count);
888 generate_error (&dtp->common, LIBERROR_READ_VALUE, message);
890 return;
892 done:
893 unget_char (dtp, c);
894 eat_separator (dtp);
896 push_char (dtp, '\0');
897 if (convert_integer (dtp, length, negative))
899 free_saved (dtp);
900 return;
903 free_saved (dtp);
904 dtp->u.p.saved_type = BT_INTEGER;
908 /* Read a character variable. */
910 static void
911 read_character (st_parameter_dt *dtp, int length __attribute__ ((unused)))
913 char c, quote, message[100];
915 quote = ' '; /* Space means no quote character. */
917 c = next_char (dtp);
918 switch (c)
920 CASE_DIGITS:
921 push_char (dtp, c);
922 break;
924 CASE_SEPARATORS:
925 unget_char (dtp, c); /* NULL value. */
926 eat_separator (dtp);
927 return;
929 case '"':
930 case '\'':
931 quote = c;
932 goto get_string;
934 default:
935 if (dtp->u.p.namelist_mode)
937 if (dtp->u.p.delim_status == DELIM_APOSTROPHE
938 || dtp->u.p.delim_status == DELIM_QUOTE
939 || c == '&' || c == '$' || c == '/')
941 unget_char (dtp, c);
942 return;
945 /* Check to see if we are seeing a namelist object name by using the
946 line buffer and looking ahead for an '=' or '('. */
947 l_push_char (dtp, c);
949 int i;
950 for(i = 0; i < 63; i++)
952 c = next_char (dtp);
953 if (is_separator(c))
955 unget_char (dtp, c);
956 eat_separator (dtp);
957 c = next_char (dtp);
958 if (c != '=')
960 l_push_char (dtp, c);
961 dtp->u.p.item_count = 0;
962 dtp->u.p.line_buffer_enabled = 1;
963 goto get_string;
967 l_push_char (dtp, c);
969 if (c == '=' || c == '(')
971 dtp->u.p.item_count = 0;
972 dtp->u.p.nml_read_error = 1;
973 dtp->u.p.line_buffer_enabled = 1;
974 return;
978 /* The string is too long to be a valid object name so assume that it
979 is a string to be read in as a value. */
980 dtp->u.p.item_count = 0;
981 dtp->u.p.line_buffer_enabled = 1;
982 goto get_string;
985 push_char (dtp, c);
986 goto get_string;
989 /* Deal with a possible repeat count. */
991 for (;;)
993 c = next_char (dtp);
994 switch (c)
996 CASE_DIGITS:
997 push_char (dtp, c);
998 break;
1000 CASE_SEPARATORS:
1001 unget_char (dtp, c);
1002 goto done; /* String was only digits! */
1004 case '*':
1005 push_char (dtp, '\0');
1006 goto got_repeat;
1008 default:
1009 push_char (dtp, c);
1010 goto get_string; /* Not a repeat count after all. */
1014 got_repeat:
1015 if (convert_integer (dtp, -1, 0))
1016 return;
1018 /* Now get the real string. */
1020 c = next_char (dtp);
1021 switch (c)
1023 CASE_SEPARATORS:
1024 unget_char (dtp, c); /* Repeated NULL values. */
1025 eat_separator (dtp);
1026 return;
1028 case '"':
1029 case '\'':
1030 quote = c;
1031 break;
1033 default:
1034 push_char (dtp, c);
1035 break;
1038 get_string:
1039 for (;;)
1041 c = next_char (dtp);
1042 switch (c)
1044 case '"':
1045 case '\'':
1046 if (c != quote)
1048 push_char (dtp, c);
1049 break;
1052 /* See if we have a doubled quote character or the end of
1053 the string. */
1055 c = next_char (dtp);
1056 if (c == quote)
1058 push_char (dtp, quote);
1059 break;
1062 unget_char (dtp, c);
1063 goto done;
1065 CASE_SEPARATORS:
1066 if (quote == ' ')
1068 unget_char (dtp, c);
1069 goto done;
1072 if (c != '\n' && c != '\r')
1073 push_char (dtp, c);
1074 break;
1076 default:
1077 push_char (dtp, c);
1078 break;
1082 /* At this point, we have to have a separator, or else the string is
1083 invalid. */
1084 done:
1085 c = next_char (dtp);
1086 if (is_separator (c))
1088 unget_char (dtp, c);
1089 eat_separator (dtp);
1090 dtp->u.p.saved_type = BT_CHARACTER;
1091 free_line (dtp);
1093 else
1095 free_saved (dtp);
1096 sprintf (message, "Invalid string input in item %d",
1097 dtp->u.p.item_count);
1098 generate_error (&dtp->common, LIBERROR_READ_VALUE, message);
1103 /* Parse a component of a complex constant or a real number that we
1104 are sure is already there. This is a straight real number parser. */
1106 static int
1107 parse_real (st_parameter_dt *dtp, void *buffer, int length)
1109 char c, message[100];
1110 int m, seen_dp;
1112 c = next_char (dtp);
1113 if (c == '-' || c == '+')
1115 push_char (dtp, c);
1116 c = next_char (dtp);
1119 if (c == ',' && dtp->u.p.decimal_status == DECIMAL_COMMA)
1120 c = '.';
1122 if (!isdigit (c) && c != '.')
1124 if (c == 'i' || c == 'I' || c == 'n' || c == 'N')
1125 goto inf_nan;
1126 else
1127 goto bad;
1130 push_char (dtp, c);
1132 seen_dp = (c == '.') ? 1 : 0;
1134 for (;;)
1136 c = next_char (dtp);
1137 if (c == ',' && dtp->u.p.decimal_status == DECIMAL_COMMA)
1138 c = '.';
1139 switch (c)
1141 CASE_DIGITS:
1142 push_char (dtp, c);
1143 break;
1145 case '.':
1146 if (seen_dp)
1147 goto bad;
1149 seen_dp = 1;
1150 push_char (dtp, c);
1151 break;
1153 case 'e':
1154 case 'E':
1155 case 'd':
1156 case 'D':
1157 push_char (dtp, 'e');
1158 goto exp1;
1160 case '-':
1161 case '+':
1162 push_char (dtp, 'e');
1163 push_char (dtp, c);
1164 c = next_char (dtp);
1165 goto exp2;
1167 CASE_SEPARATORS:
1168 unget_char (dtp, c);
1169 goto done;
1171 default:
1172 goto done;
1176 exp1:
1177 c = next_char (dtp);
1178 if (c != '-' && c != '+')
1179 push_char (dtp, '+');
1180 else
1182 push_char (dtp, c);
1183 c = next_char (dtp);
1186 exp2:
1187 if (!isdigit (c))
1188 goto bad;
1190 push_char (dtp, c);
1192 for (;;)
1194 c = next_char (dtp);
1195 switch (c)
1197 CASE_DIGITS:
1198 push_char (dtp, c);
1199 break;
1201 CASE_SEPARATORS:
1202 unget_char (dtp, c);
1203 goto done;
1205 default:
1206 goto done;
1210 done:
1211 unget_char (dtp, c);
1212 push_char (dtp, '\0');
1214 m = convert_real (dtp, buffer, dtp->u.p.saved_string, length);
1215 free_saved (dtp);
1217 return m;
1219 inf_nan:
1220 /* Match INF and Infinity. */
1221 if ((c == 'i' || c == 'I')
1222 && ((c = next_char (dtp)) == 'n' || c == 'N')
1223 && ((c = next_char (dtp)) == 'f' || c == 'F'))
1225 c = next_char (dtp);
1226 if ((c != 'i' && c != 'I')
1227 || ((c == 'i' || c == 'I')
1228 && ((c = next_char (dtp)) == 'n' || c == 'N')
1229 && ((c = next_char (dtp)) == 'i' || c == 'I')
1230 && ((c = next_char (dtp)) == 't' || c == 'T')
1231 && ((c = next_char (dtp)) == 'y' || c == 'Y')
1232 && (c = next_char (dtp))))
1234 if (is_separator (c))
1235 unget_char (dtp, c);
1236 push_char (dtp, 'i');
1237 push_char (dtp, 'n');
1238 push_char (dtp, 'f');
1239 goto done;
1241 } /* Match NaN. */
1242 else if (((c = next_char (dtp)) == 'a' || c == 'A')
1243 && ((c = next_char (dtp)) == 'n' || c == 'N')
1244 && (c = next_char (dtp)))
1246 if (is_separator (c))
1247 unget_char (dtp, c);
1248 push_char (dtp, 'n');
1249 push_char (dtp, 'a');
1250 push_char (dtp, 'n');
1251 goto done;
1254 bad:
1256 if (nml_bad_return (dtp, c))
1257 return 0;
1259 eat_line (dtp);
1260 free_saved (dtp);
1261 sprintf (message, "Bad floating point number for item %d",
1262 dtp->u.p.item_count);
1263 generate_error (&dtp->common, LIBERROR_READ_VALUE, message);
1265 return 1;
1269 /* Reading a complex number is straightforward because we can tell
1270 what it is right away. */
1272 static void
1273 read_complex (st_parameter_dt *dtp, int kind, size_t size)
1275 char message[100];
1276 char c;
1278 if (parse_repeat (dtp))
1279 return;
1281 c = next_char (dtp);
1282 switch (c)
1284 case '(':
1285 break;
1287 CASE_SEPARATORS:
1288 unget_char (dtp, c);
1289 eat_separator (dtp);
1290 return;
1292 default:
1293 goto bad_complex;
1296 eat_spaces (dtp);
1297 if (parse_real (dtp, dtp->u.p.value, kind))
1298 return;
1300 eol_1:
1301 eat_spaces (dtp);
1302 c = next_char (dtp);
1303 if (c == '\n' || c== '\r')
1304 goto eol_1;
1305 else
1306 unget_char (dtp, c);
1308 if (next_char (dtp)
1309 != (dtp->u.p.decimal_status == DECIMAL_POINT ? ',' : ';'))
1310 goto bad_complex;
1312 eol_2:
1313 eat_spaces (dtp);
1314 c = next_char (dtp);
1315 if (c == '\n' || c== '\r')
1316 goto eol_2;
1317 else
1318 unget_char (dtp, c);
1320 if (parse_real (dtp, dtp->u.p.value + size / 2, kind))
1321 return;
1323 eat_spaces (dtp);
1324 if (next_char (dtp) != ')')
1325 goto bad_complex;
1327 c = next_char (dtp);
1328 if (!is_separator (c))
1329 goto bad_complex;
1331 unget_char (dtp, c);
1332 eat_separator (dtp);
1334 free_saved (dtp);
1335 dtp->u.p.saved_type = BT_COMPLEX;
1336 return;
1338 bad_complex:
1340 if (nml_bad_return (dtp, c))
1341 return;
1343 eat_line (dtp);
1344 free_saved (dtp);
1345 sprintf (message, "Bad complex value in item %d of list input",
1346 dtp->u.p.item_count);
1347 generate_error (&dtp->common, LIBERROR_READ_VALUE, message);
1351 /* Parse a real number with a possible repeat count. */
1353 static void
1354 read_real (st_parameter_dt *dtp, int length)
1356 char c, message[100];
1357 int seen_dp;
1358 int is_inf;
1360 seen_dp = 0;
1362 c = next_char (dtp);
1363 if (c == ',' && dtp->u.p.decimal_status == DECIMAL_COMMA)
1364 c = '.';
1365 switch (c)
1367 CASE_DIGITS:
1368 push_char (dtp, c);
1369 break;
1371 case '.':
1372 push_char (dtp, c);
1373 seen_dp = 1;
1374 break;
1376 case '+':
1377 case '-':
1378 goto got_sign;
1380 CASE_SEPARATORS:
1381 unget_char (dtp, c); /* Single null. */
1382 eat_separator (dtp);
1383 return;
1385 case 'i':
1386 case 'I':
1387 case 'n':
1388 case 'N':
1389 goto inf_nan;
1391 default:
1392 goto bad_real;
1395 /* Get the digit string that might be a repeat count. */
1397 for (;;)
1399 c = next_char (dtp);
1400 if (c == ',' && dtp->u.p.decimal_status == DECIMAL_COMMA)
1401 c = '.';
1402 switch (c)
1404 CASE_DIGITS:
1405 push_char (dtp, c);
1406 break;
1408 case '.':
1409 if (seen_dp)
1410 goto bad_real;
1412 seen_dp = 1;
1413 push_char (dtp, c);
1414 goto real_loop;
1416 case 'E':
1417 case 'e':
1418 case 'D':
1419 case 'd':
1420 goto exp1;
1422 case '+':
1423 case '-':
1424 push_char (dtp, 'e');
1425 push_char (dtp, c);
1426 c = next_char (dtp);
1427 goto exp2;
1429 case '*':
1430 push_char (dtp, '\0');
1431 goto got_repeat;
1433 CASE_SEPARATORS:
1434 if (c != '\n' && c != ',' && c != '\r' && c != ';')
1435 unget_char (dtp, c);
1436 goto done;
1438 default:
1439 goto bad_real;
1443 got_repeat:
1444 if (convert_integer (dtp, -1, 0))
1445 return;
1447 /* Now get the number itself. */
1449 c = next_char (dtp);
1450 if (is_separator (c))
1451 { /* Repeated null value. */
1452 unget_char (dtp, c);
1453 eat_separator (dtp);
1454 return;
1457 if (c != '-' && c != '+')
1458 push_char (dtp, '+');
1459 else
1461 got_sign:
1462 push_char (dtp, c);
1463 c = next_char (dtp);
1466 if (c == ',' && dtp->u.p.decimal_status == DECIMAL_COMMA)
1467 c = '.';
1469 if (!isdigit (c) && c != '.')
1471 if (c == 'i' || c == 'I' || c == 'n' || c == 'N')
1472 goto inf_nan;
1473 else
1474 goto bad_real;
1477 if (c == '.')
1479 if (seen_dp)
1480 goto bad_real;
1481 else
1482 seen_dp = 1;
1485 push_char (dtp, c);
1487 real_loop:
1488 for (;;)
1490 c = next_char (dtp);
1491 if (c == ',' && dtp->u.p.decimal_status == DECIMAL_COMMA)
1492 c = '.';
1493 switch (c)
1495 CASE_DIGITS:
1496 push_char (dtp, c);
1497 break;
1499 CASE_SEPARATORS:
1500 goto done;
1502 case '.':
1503 if (seen_dp)
1504 goto bad_real;
1506 seen_dp = 1;
1507 push_char (dtp, c);
1508 break;
1510 case 'E':
1511 case 'e':
1512 case 'D':
1513 case 'd':
1514 goto exp1;
1516 case '+':
1517 case '-':
1518 push_char (dtp, 'e');
1519 push_char (dtp, c);
1520 c = next_char (dtp);
1521 goto exp2;
1523 default:
1524 goto bad_real;
1528 exp1:
1529 push_char (dtp, 'e');
1531 c = next_char (dtp);
1532 if (c != '+' && c != '-')
1533 push_char (dtp, '+');
1534 else
1536 push_char (dtp, c);
1537 c = next_char (dtp);
1540 exp2:
1541 if (!isdigit (c))
1542 goto bad_real;
1543 push_char (dtp, c);
1545 for (;;)
1547 c = next_char (dtp);
1549 switch (c)
1551 CASE_DIGITS:
1552 push_char (dtp, c);
1553 break;
1555 CASE_SEPARATORS:
1556 goto done;
1558 default:
1559 goto bad_real;
1563 done:
1564 unget_char (dtp, c);
1565 eat_separator (dtp);
1566 push_char (dtp, '\0');
1567 if (convert_real (dtp, dtp->u.p.value, dtp->u.p.saved_string, length))
1568 return;
1570 free_saved (dtp);
1571 dtp->u.p.saved_type = BT_REAL;
1572 return;
1574 inf_nan:
1575 l_push_char (dtp, c);
1576 is_inf = 0;
1578 /* Match INF and Infinity. */
1579 if (c == 'i' || c == 'I')
1581 c = next_char (dtp);
1582 l_push_char (dtp, c);
1583 if (c != 'n' && c != 'N')
1584 goto unwind;
1585 c = next_char (dtp);
1586 l_push_char (dtp, c);
1587 if (c != 'f' && c != 'F')
1588 goto unwind;
1589 c = next_char (dtp);
1590 l_push_char (dtp, c);
1591 if (!is_separator (c))
1593 if (c != 'i' && c != 'I')
1594 goto unwind;
1595 c = next_char (dtp);
1596 l_push_char (dtp, c);
1597 if (c != 'n' && c != 'N')
1598 goto unwind;
1599 c = next_char (dtp);
1600 l_push_char (dtp, c);
1601 if (c != 'i' && c != 'I')
1602 goto unwind;
1603 c = next_char (dtp);
1604 l_push_char (dtp, c);
1605 if (c != 't' && c != 'T')
1606 goto unwind;
1607 c = next_char (dtp);
1608 l_push_char (dtp, c);
1609 if (c != 'y' && c != 'Y')
1610 goto unwind;
1611 c = next_char (dtp);
1612 l_push_char (dtp, c);
1614 is_inf = 1;
1615 } /* Match NaN. */
1616 else
1618 c = next_char (dtp);
1619 l_push_char (dtp, c);
1620 if (c != 'a' && c != 'A')
1621 goto unwind;
1622 c = next_char (dtp);
1623 l_push_char (dtp, c);
1624 if (c != 'n' && c != 'N')
1625 goto unwind;
1626 c = next_char (dtp);
1627 l_push_char (dtp, c);
1630 if (!is_separator (c))
1631 goto unwind;
1633 if (dtp->u.p.namelist_mode)
1635 if (c == ' ' || c =='\n' || c == '\r')
1638 c = next_char (dtp);
1639 while (c == ' ' || c =='\n' || c == '\r');
1641 l_push_char (dtp, c);
1643 if (c == '=')
1644 goto unwind;
1648 if (is_inf)
1650 push_char (dtp, 'i');
1651 push_char (dtp, 'n');
1652 push_char (dtp, 'f');
1654 else
1656 push_char (dtp, 'n');
1657 push_char (dtp, 'a');
1658 push_char (dtp, 'n');
1661 free_line (dtp);
1662 goto done;
1664 unwind:
1665 if (dtp->u.p.namelist_mode)
1667 dtp->u.p.nml_read_error = 1;
1668 dtp->u.p.line_buffer_enabled = 1;
1669 dtp->u.p.item_count = 0;
1670 return;
1673 bad_real:
1675 if (nml_bad_return (dtp, c))
1676 return;
1678 eat_line (dtp);
1679 free_saved (dtp);
1680 sprintf (message, "Bad real number in item %d of list input",
1681 dtp->u.p.item_count);
1682 generate_error (&dtp->common, LIBERROR_READ_VALUE, message);
1686 /* Check the current type against the saved type to make sure they are
1687 compatible. Returns nonzero if incompatible. */
1689 static int
1690 check_type (st_parameter_dt *dtp, bt type, int len)
1692 char message[100];
1694 if (dtp->u.p.saved_type != BT_NULL && dtp->u.p.saved_type != type)
1696 sprintf (message, "Read type %s where %s was expected for item %d",
1697 type_name (dtp->u.p.saved_type), type_name (type),
1698 dtp->u.p.item_count);
1700 generate_error (&dtp->common, LIBERROR_READ_VALUE, message);
1701 return 1;
1704 if (dtp->u.p.saved_type == BT_NULL || dtp->u.p.saved_type == BT_CHARACTER)
1705 return 0;
1707 if (dtp->u.p.saved_length != len)
1709 sprintf (message,
1710 "Read kind %d %s where kind %d is required for item %d",
1711 dtp->u.p.saved_length, type_name (dtp->u.p.saved_type), len,
1712 dtp->u.p.item_count);
1713 generate_error (&dtp->common, LIBERROR_READ_VALUE, message);
1714 return 1;
1717 return 0;
1721 /* Top level data transfer subroutine for list reads. Because we have
1722 to deal with repeat counts, the data item is always saved after
1723 reading, usually in the dtp->u.p.value[] array. If a repeat count is
1724 greater than one, we copy the data item multiple times. */
1726 static void
1727 list_formatted_read_scalar (st_parameter_dt *dtp, volatile bt type, void *p,
1728 int kind, size_t size)
1730 char c;
1731 int m;
1732 jmp_buf eof_jump;
1734 dtp->u.p.namelist_mode = 0;
1736 dtp->u.p.eof_jump = &eof_jump;
1737 if (setjmp (eof_jump))
1739 generate_error (&dtp->common, LIBERROR_END, NULL);
1740 goto cleanup;
1743 if (dtp->u.p.first_item)
1745 dtp->u.p.first_item = 0;
1746 dtp->u.p.input_complete = 0;
1747 dtp->u.p.repeat_count = 1;
1748 dtp->u.p.at_eol = 0;
1750 c = eat_spaces (dtp);
1751 if (is_separator (c))
1753 /* Found a null value. */
1754 eat_separator (dtp);
1755 dtp->u.p.repeat_count = 0;
1757 /* eat_separator sets this flag if the separator was a comma. */
1758 if (dtp->u.p.comma_flag)
1759 goto cleanup;
1761 /* eat_separator sets this flag if the separator was a \n or \r. */
1762 if (dtp->u.p.at_eol)
1763 finish_separator (dtp);
1764 else
1765 goto cleanup;
1769 else
1771 if (dtp->u.p.input_complete)
1772 goto cleanup;
1774 if (dtp->u.p.repeat_count > 0)
1776 if (check_type (dtp, type, kind))
1777 return;
1778 goto set_value;
1781 if (dtp->u.p.at_eol)
1782 finish_separator (dtp);
1783 else
1785 eat_spaces (dtp);
1786 /* Trailing spaces prior to end of line. */
1787 if (dtp->u.p.at_eol)
1788 finish_separator (dtp);
1791 dtp->u.p.saved_type = BT_NULL;
1792 dtp->u.p.repeat_count = 1;
1795 switch (type)
1797 case BT_INTEGER:
1798 read_integer (dtp, kind);
1799 break;
1800 case BT_LOGICAL:
1801 read_logical (dtp, kind);
1802 break;
1803 case BT_CHARACTER:
1804 read_character (dtp, kind);
1805 break;
1806 case BT_REAL:
1807 read_real (dtp, kind);
1808 break;
1809 case BT_COMPLEX:
1810 read_complex (dtp, kind, size);
1811 break;
1812 default:
1813 internal_error (&dtp->common, "Bad type for list read");
1816 if (dtp->u.p.saved_type != BT_CHARACTER && dtp->u.p.saved_type != BT_NULL)
1817 dtp->u.p.saved_length = size;
1819 if ((dtp->common.flags & IOPARM_LIBRETURN_MASK) != IOPARM_LIBRETURN_OK)
1820 goto cleanup;
1822 set_value:
1823 switch (dtp->u.p.saved_type)
1825 case BT_COMPLEX:
1826 case BT_INTEGER:
1827 case BT_REAL:
1828 case BT_LOGICAL:
1829 memcpy (p, dtp->u.p.value, size);
1830 break;
1832 case BT_CHARACTER:
1833 if (dtp->u.p.saved_string)
1835 m = ((int) size < dtp->u.p.saved_used)
1836 ? (int) size : dtp->u.p.saved_used;
1837 memcpy (p, dtp->u.p.saved_string, m);
1839 else
1840 /* Just delimiters encountered, nothing to copy but SPACE. */
1841 m = 0;
1843 if (m < (int) size)
1844 memset (((char *) p) + m, ' ', size - m);
1845 break;
1847 case BT_NULL:
1848 break;
1851 if (--dtp->u.p.repeat_count <= 0)
1852 free_saved (dtp);
1854 cleanup:
1855 dtp->u.p.eof_jump = NULL;
1859 void
1860 list_formatted_read (st_parameter_dt *dtp, bt type, void *p, int kind,
1861 size_t size, size_t nelems)
1863 size_t elem;
1864 char *tmp;
1866 tmp = (char *) p;
1868 /* Big loop over all the elements. */
1869 for (elem = 0; elem < nelems; elem++)
1871 dtp->u.p.item_count++;
1872 list_formatted_read_scalar (dtp, type, tmp + size*elem, kind, size);
1877 /* Finish a list read. */
1879 void
1880 finish_list_read (st_parameter_dt *dtp)
1882 char c;
1884 free_saved (dtp);
1886 if (dtp->u.p.at_eol)
1888 dtp->u.p.at_eol = 0;
1889 return;
1894 c = next_char (dtp);
1896 while (c != '\n');
1899 /* NAMELIST INPUT
1901 void namelist_read (st_parameter_dt *dtp)
1902 calls:
1903 static void nml_match_name (char *name, int len)
1904 static int nml_query (st_parameter_dt *dtp)
1905 static int nml_get_obj_data (st_parameter_dt *dtp,
1906 namelist_info **prev_nl, char *, size_t)
1907 calls:
1908 static void nml_untouch_nodes (st_parameter_dt *dtp)
1909 static namelist_info * find_nml_node (st_parameter_dt *dtp,
1910 char * var_name)
1911 static int nml_parse_qualifier(descriptor_dimension * ad,
1912 array_loop_spec * ls, int rank, char *)
1913 static void nml_touch_nodes (namelist_info * nl)
1914 static int nml_read_obj (namelist_info *nl, index_type offset,
1915 namelist_info **prev_nl, char *, size_t,
1916 index_type clow, index_type chigh)
1917 calls:
1918 -itself- */
1920 /* Inputs a rank-dimensional qualifier, which can contain
1921 singlets, doublets, triplets or ':' with the standard meanings. */
1923 static try
1924 nml_parse_qualifier (st_parameter_dt *dtp, descriptor_dimension *ad,
1925 array_loop_spec *ls, int rank, char *parse_err_msg,
1926 int *parsed_rank)
1928 int dim;
1929 int indx;
1930 int neg;
1931 int null_flag;
1932 int is_array_section, is_char;
1933 char c;
1935 is_char = 0;
1936 is_array_section = 0;
1937 dtp->u.p.expanded_read = 0;
1939 /* See if this is a character substring qualifier we are looking for. */
1940 if (rank == -1)
1942 rank = 1;
1943 is_char = 1;
1946 /* The next character in the stream should be the '('. */
1948 c = next_char (dtp);
1950 /* Process the qualifier, by dimension and triplet. */
1952 for (dim=0; dim < rank; dim++ )
1954 for (indx=0; indx<3; indx++)
1956 free_saved (dtp);
1957 eat_spaces (dtp);
1958 neg = 0;
1960 /* Process a potential sign. */
1961 c = next_char (dtp);
1962 switch (c)
1964 case '-':
1965 neg = 1;
1966 break;
1968 case '+':
1969 break;
1971 default:
1972 unget_char (dtp, c);
1973 break;
1976 /* Process characters up to the next ':' , ',' or ')'. */
1977 for (;;)
1979 c = next_char (dtp);
1981 switch (c)
1983 case ':':
1984 is_array_section = 1;
1985 break;
1987 case ',': case ')':
1988 if ((c==',' && dim == rank -1)
1989 || (c==')' && dim < rank -1))
1991 if (is_char)
1992 sprintf (parse_err_msg, "Bad substring qualifier");
1993 else
1994 sprintf (parse_err_msg, "Bad number of index fields");
1995 goto err_ret;
1997 break;
1999 CASE_DIGITS:
2000 push_char (dtp, c);
2001 continue;
2003 case ' ': case '\t':
2004 eat_spaces (dtp);
2005 c = next_char (dtp);
2006 break;
2008 default:
2009 if (is_char)
2010 sprintf (parse_err_msg,
2011 "Bad character in substring qualifier");
2012 else
2013 sprintf (parse_err_msg, "Bad character in index");
2014 goto err_ret;
2017 if ((c == ',' || c == ')') && indx == 0
2018 && dtp->u.p.saved_string == 0)
2020 if (is_char)
2021 sprintf (parse_err_msg, "Null substring qualifier");
2022 else
2023 sprintf (parse_err_msg, "Null index field");
2024 goto err_ret;
2027 if ((c == ':' && indx == 1 && dtp->u.p.saved_string == 0)
2028 || (indx == 2 && dtp->u.p.saved_string == 0))
2030 if (is_char)
2031 sprintf (parse_err_msg, "Bad substring qualifier");
2032 else
2033 sprintf (parse_err_msg, "Bad index triplet");
2034 goto err_ret;
2037 if (is_char && !is_array_section)
2039 sprintf (parse_err_msg,
2040 "Missing colon in substring qualifier");
2041 goto err_ret;
2044 /* If '( : ? )' or '( ? : )' break and flag read failure. */
2045 null_flag = 0;
2046 if ((c == ':' && indx == 0 && dtp->u.p.saved_string == 0)
2047 || (indx==1 && dtp->u.p.saved_string == 0))
2049 null_flag = 1;
2050 break;
2053 /* Now read the index. */
2054 if (convert_integer (dtp, sizeof(ssize_t), neg))
2056 if (is_char)
2057 sprintf (parse_err_msg, "Bad integer substring qualifier");
2058 else
2059 sprintf (parse_err_msg, "Bad integer in index");
2060 goto err_ret;
2062 break;
2065 /* Feed the index values to the triplet arrays. */
2066 if (!null_flag)
2068 if (indx == 0)
2069 memcpy (&ls[dim].start, dtp->u.p.value, sizeof(ssize_t));
2070 if (indx == 1)
2071 memcpy (&ls[dim].end, dtp->u.p.value, sizeof(ssize_t));
2072 if (indx == 2)
2073 memcpy (&ls[dim].step, dtp->u.p.value, sizeof(ssize_t));
2076 /* Singlet or doublet indices. */
2077 if (c==',' || c==')')
2079 if (indx == 0)
2081 memcpy (&ls[dim].start, dtp->u.p.value, sizeof(ssize_t));
2083 /* If -std=f95/2003 or an array section is specified,
2084 do not allow excess data to be processed. */
2085 if (is_array_section == 1
2086 || compile_options.allow_std < GFC_STD_GNU)
2087 ls[dim].end = ls[dim].start;
2088 else
2089 dtp->u.p.expanded_read = 1;
2092 /* Check for non-zero rank. */
2093 if (is_array_section == 1 && ls[dim].start != ls[dim].end)
2094 *parsed_rank = 1;
2096 break;
2100 /* Check the values of the triplet indices. */
2101 if ((ls[dim].start > (ssize_t)ad[dim].ubound)
2102 || (ls[dim].start < (ssize_t)ad[dim].lbound)
2103 || (ls[dim].end > (ssize_t)ad[dim].ubound)
2104 || (ls[dim].end < (ssize_t)ad[dim].lbound))
2106 if (is_char)
2107 sprintf (parse_err_msg, "Substring out of range");
2108 else
2109 sprintf (parse_err_msg, "Index %d out of range", dim + 1);
2110 goto err_ret;
2113 if (((ls[dim].end - ls[dim].start ) * ls[dim].step < 0)
2114 || (ls[dim].step == 0))
2116 sprintf (parse_err_msg, "Bad range in index %d", dim + 1);
2117 goto err_ret;
2120 /* Initialise the loop index counter. */
2121 ls[dim].idx = ls[dim].start;
2123 eat_spaces (dtp);
2124 return SUCCESS;
2126 err_ret:
2128 return FAILURE;
2131 static namelist_info *
2132 find_nml_node (st_parameter_dt *dtp, char * var_name)
2134 namelist_info * t = dtp->u.p.ionml;
2135 while (t != NULL)
2137 if (strcmp (var_name, t->var_name) == 0)
2139 t->touched = 1;
2140 return t;
2142 t = t->next;
2144 return NULL;
2147 /* Visits all the components of a derived type that have
2148 not explicitly been identified in the namelist input.
2149 touched is set and the loop specification initialised
2150 to default values */
2152 static void
2153 nml_touch_nodes (namelist_info * nl)
2155 index_type len = strlen (nl->var_name) + 1;
2156 int dim;
2157 char * ext_name = (char*)get_mem (len + 1);
2158 memcpy (ext_name, nl->var_name, len-1);
2159 memcpy (ext_name + len - 1, "%", 2);
2160 for (nl = nl->next; nl; nl = nl->next)
2162 if (strncmp (nl->var_name, ext_name, len) == 0)
2164 nl->touched = 1;
2165 for (dim=0; dim < nl->var_rank; dim++)
2167 nl->ls[dim].step = 1;
2168 nl->ls[dim].end = nl->dim[dim].ubound;
2169 nl->ls[dim].start = nl->dim[dim].lbound;
2170 nl->ls[dim].idx = nl->ls[dim].start;
2173 else
2174 break;
2176 free_mem (ext_name);
2177 return;
2180 /* Resets touched for the entire list of nml_nodes, ready for a
2181 new object. */
2183 static void
2184 nml_untouch_nodes (st_parameter_dt *dtp)
2186 namelist_info * t;
2187 for (t = dtp->u.p.ionml; t; t = t->next)
2188 t->touched = 0;
2189 return;
2192 /* Attempts to input name to namelist name. Returns
2193 dtp->u.p.nml_read_error = 1 on no match. */
2195 static void
2196 nml_match_name (st_parameter_dt *dtp, const char *name, index_type len)
2198 index_type i;
2199 char c;
2200 dtp->u.p.nml_read_error = 0;
2201 for (i = 0; i < len; i++)
2203 c = next_char (dtp);
2204 if (tolower (c) != tolower (name[i]))
2206 dtp->u.p.nml_read_error = 1;
2207 break;
2212 /* If the namelist read is from stdin, output the current state of the
2213 namelist to stdout. This is used to implement the non-standard query
2214 features, ? and =?. If c == '=' the full namelist is printed. Otherwise
2215 the names alone are printed. */
2217 static void
2218 nml_query (st_parameter_dt *dtp, char c)
2220 gfc_unit * temp_unit;
2221 namelist_info * nl;
2222 index_type len;
2223 char * p;
2224 #ifdef HAVE_CRLF
2225 static const index_type endlen = 3;
2226 static const char endl[] = "\r\n";
2227 static const char nmlend[] = "&end\r\n";
2228 #else
2229 static const index_type endlen = 2;
2230 static const char endl[] = "\n";
2231 static const char nmlend[] = "&end\n";
2232 #endif
2234 if (dtp->u.p.current_unit->unit_number != options.stdin_unit)
2235 return;
2237 /* Store the current unit and transfer to stdout. */
2239 temp_unit = dtp->u.p.current_unit;
2240 dtp->u.p.current_unit = find_unit (options.stdout_unit);
2242 if (dtp->u.p.current_unit)
2244 dtp->u.p.mode = WRITING;
2245 next_record (dtp, 0);
2247 /* Write the namelist in its entirety. */
2249 if (c == '=')
2250 namelist_write (dtp);
2252 /* Or write the list of names. */
2254 else
2256 /* "&namelist_name\n" */
2258 len = dtp->namelist_name_len;
2259 p = write_block (dtp, len + endlen);
2260 if (!p)
2261 goto query_return;
2262 memcpy (p, "&", 1);
2263 memcpy ((char*)(p + 1), dtp->namelist_name, len);
2264 memcpy ((char*)(p + len + 1), &endl, endlen - 1);
2265 for (nl = dtp->u.p.ionml; nl; nl = nl->next)
2267 /* " var_name\n" */
2269 len = strlen (nl->var_name);
2270 p = write_block (dtp, len + endlen);
2271 if (!p)
2272 goto query_return;
2273 memcpy (p, " ", 1);
2274 memcpy ((char*)(p + 1), nl->var_name, len);
2275 memcpy ((char*)(p + len + 1), &endl, endlen - 1);
2278 /* "&end\n" */
2280 p = write_block (dtp, endlen + 3);
2281 goto query_return;
2282 memcpy (p, &nmlend, endlen + 3);
2285 /* Flush the stream to force immediate output. */
2287 fbuf_flush (dtp->u.p.current_unit, 1);
2288 flush (dtp->u.p.current_unit->s);
2289 unlock_unit (dtp->u.p.current_unit);
2292 query_return:
2294 /* Restore the current unit. */
2296 dtp->u.p.current_unit = temp_unit;
2297 dtp->u.p.mode = READING;
2298 return;
2301 /* Reads and stores the input for the namelist object nl. For an array,
2302 the function loops over the ranges defined by the loop specification.
2303 This default to all the data or to the specification from a qualifier.
2304 nml_read_obj recursively calls itself to read derived types. It visits
2305 all its own components but only reads data for those that were touched
2306 when the name was parsed. If a read error is encountered, an attempt is
2307 made to return to read a new object name because the standard allows too
2308 little data to be available. On the other hand, too much data is an
2309 error. */
2311 static try
2312 nml_read_obj (st_parameter_dt *dtp, namelist_info * nl, index_type offset,
2313 namelist_info **pprev_nl, char *nml_err_msg,
2314 size_t nml_err_msg_size, index_type clow, index_type chigh)
2316 namelist_info * cmp;
2317 char * obj_name;
2318 int nml_carry;
2319 int len;
2320 int dim;
2321 index_type dlen;
2322 index_type m;
2323 index_type obj_name_len;
2324 void * pdata;
2326 /* This object not touched in name parsing. */
2328 if (!nl->touched)
2329 return SUCCESS;
2331 dtp->u.p.repeat_count = 0;
2332 eat_spaces (dtp);
2334 len = nl->len;
2335 switch (nl->type)
2337 case GFC_DTYPE_INTEGER:
2338 case GFC_DTYPE_LOGICAL:
2339 dlen = len;
2340 break;
2342 case GFC_DTYPE_REAL:
2343 dlen = size_from_real_kind (len);
2344 break;
2346 case GFC_DTYPE_COMPLEX:
2347 dlen = size_from_complex_kind (len);
2348 break;
2350 case GFC_DTYPE_CHARACTER:
2351 dlen = chigh ? (chigh - clow + 1) : nl->string_length;
2352 break;
2354 default:
2355 dlen = 0;
2360 /* Update the pointer to the data, using the current index vector */
2362 pdata = (void*)(nl->mem_pos + offset);
2363 for (dim = 0; dim < nl->var_rank; dim++)
2364 pdata = (void*)(pdata + (nl->ls[dim].idx - nl->dim[dim].lbound) *
2365 nl->dim[dim].stride * nl->size);
2367 /* Reset the error flag and try to read next value, if
2368 dtp->u.p.repeat_count=0 */
2370 dtp->u.p.nml_read_error = 0;
2371 nml_carry = 0;
2372 if (--dtp->u.p.repeat_count <= 0)
2374 if (dtp->u.p.input_complete)
2375 return SUCCESS;
2376 if (dtp->u.p.at_eol)
2377 finish_separator (dtp);
2378 if (dtp->u.p.input_complete)
2379 return SUCCESS;
2381 /* GFC_TYPE_UNKNOWN through for nulls and is detected
2382 after the switch block. */
2384 dtp->u.p.saved_type = GFC_DTYPE_UNKNOWN;
2385 free_saved (dtp);
2387 switch (nl->type)
2389 case GFC_DTYPE_INTEGER:
2390 read_integer (dtp, len);
2391 break;
2393 case GFC_DTYPE_LOGICAL:
2394 read_logical (dtp, len);
2395 break;
2397 case GFC_DTYPE_CHARACTER:
2398 read_character (dtp, len);
2399 break;
2401 case GFC_DTYPE_REAL:
2402 read_real (dtp, len);
2403 break;
2405 case GFC_DTYPE_COMPLEX:
2406 read_complex (dtp, len, dlen);
2407 break;
2409 case GFC_DTYPE_DERIVED:
2410 obj_name_len = strlen (nl->var_name) + 1;
2411 obj_name = get_mem (obj_name_len+1);
2412 memcpy (obj_name, nl->var_name, obj_name_len-1);
2413 memcpy (obj_name + obj_name_len - 1, "%", 2);
2415 /* If reading a derived type, disable the expanded read warning
2416 since a single object can have multiple reads. */
2417 dtp->u.p.expanded_read = 0;
2419 /* Now loop over the components. Update the component pointer
2420 with the return value from nml_write_obj. This loop jumps
2421 past nested derived types by testing if the potential
2422 component name contains '%'. */
2424 for (cmp = nl->next;
2425 cmp &&
2426 !strncmp (cmp->var_name, obj_name, obj_name_len) &&
2427 !strchr (cmp->var_name + obj_name_len, '%');
2428 cmp = cmp->next)
2431 if (nml_read_obj (dtp, cmp, (index_type)(pdata - nl->mem_pos),
2432 pprev_nl, nml_err_msg, nml_err_msg_size,
2433 clow, chigh) == FAILURE)
2435 free_mem (obj_name);
2436 return FAILURE;
2439 if (dtp->u.p.input_complete)
2441 free_mem (obj_name);
2442 return SUCCESS;
2446 free_mem (obj_name);
2447 goto incr_idx;
2449 default:
2450 snprintf (nml_err_msg, nml_err_msg_size,
2451 "Bad type for namelist object %s", nl->var_name);
2452 internal_error (&dtp->common, nml_err_msg);
2453 goto nml_err_ret;
2457 /* The standard permits array data to stop short of the number of
2458 elements specified in the loop specification. In this case, we
2459 should be here with dtp->u.p.nml_read_error != 0. Control returns to
2460 nml_get_obj_data and an attempt is made to read object name. */
2462 *pprev_nl = nl;
2463 if (dtp->u.p.nml_read_error)
2465 dtp->u.p.expanded_read = 0;
2466 return SUCCESS;
2469 if (dtp->u.p.saved_type == GFC_DTYPE_UNKNOWN)
2471 dtp->u.p.expanded_read = 0;
2472 goto incr_idx;
2475 /* Note the switch from GFC_DTYPE_type to BT_type at this point.
2476 This comes about because the read functions return BT_types. */
2478 switch (dtp->u.p.saved_type)
2481 case BT_COMPLEX:
2482 case BT_REAL:
2483 case BT_INTEGER:
2484 case BT_LOGICAL:
2485 memcpy (pdata, dtp->u.p.value, dlen);
2486 break;
2488 case BT_CHARACTER:
2489 m = (dlen < dtp->u.p.saved_used) ? dlen : dtp->u.p.saved_used;
2490 pdata = (void*)( pdata + clow - 1 );
2491 memcpy (pdata, dtp->u.p.saved_string, m);
2492 if (m < dlen)
2493 memset ((void*)( pdata + m ), ' ', dlen - m);
2494 break;
2496 default:
2497 break;
2500 /* Warn if a non-standard expanded read occurs. A single read of a
2501 single object is acceptable. If a second read occurs, issue a warning
2502 and set the flag to zero to prevent further warnings. */
2503 if (dtp->u.p.expanded_read == 2)
2505 notify_std (&dtp->common, GFC_STD_GNU, "Non-standard expanded namelist read.");
2506 dtp->u.p.expanded_read = 0;
2509 /* If the expanded read warning flag is set, increment it,
2510 indicating that a single read has occurred. */
2511 if (dtp->u.p.expanded_read >= 1)
2512 dtp->u.p.expanded_read++;
2514 /* Break out of loop if scalar. */
2515 if (!nl->var_rank)
2516 break;
2518 /* Now increment the index vector. */
2520 incr_idx:
2522 nml_carry = 1;
2523 for (dim = 0; dim < nl->var_rank; dim++)
2525 nl->ls[dim].idx += nml_carry * nl->ls[dim].step;
2526 nml_carry = 0;
2527 if (((nl->ls[dim].step > 0) && (nl->ls[dim].idx > nl->ls[dim].end))
2529 ((nl->ls[dim].step < 0) && (nl->ls[dim].idx < nl->ls[dim].end)))
2531 nl->ls[dim].idx = nl->ls[dim].start;
2532 nml_carry = 1;
2535 } while (!nml_carry);
2537 if (dtp->u.p.repeat_count > 1)
2539 snprintf (nml_err_msg, nml_err_msg_size,
2540 "Repeat count too large for namelist object %s", nl->var_name);
2541 goto nml_err_ret;
2543 return SUCCESS;
2545 nml_err_ret:
2547 return FAILURE;
2550 /* Parses the object name, including array and substring qualifiers. It
2551 iterates over derived type components, touching those components and
2552 setting their loop specifications, if there is a qualifier. If the
2553 object is itself a derived type, its components and subcomponents are
2554 touched. nml_read_obj is called at the end and this reads the data in
2555 the manner specified by the object name. */
2557 static try
2558 nml_get_obj_data (st_parameter_dt *dtp, namelist_info **pprev_nl,
2559 char *nml_err_msg, size_t nml_err_msg_size)
2561 char c;
2562 namelist_info * nl;
2563 namelist_info * first_nl = NULL;
2564 namelist_info * root_nl = NULL;
2565 int dim, parsed_rank;
2566 int component_flag;
2567 index_type clow, chigh;
2568 int non_zero_rank_count;
2570 /* Look for end of input or object name. If '?' or '=?' are encountered
2571 in stdin, print the node names or the namelist to stdout. */
2573 eat_separator (dtp);
2574 if (dtp->u.p.input_complete)
2575 return SUCCESS;
2577 if (dtp->u.p.at_eol)
2578 finish_separator (dtp);
2579 if (dtp->u.p.input_complete)
2580 return SUCCESS;
2582 c = next_char (dtp);
2583 switch (c)
2585 case '=':
2586 c = next_char (dtp);
2587 if (c != '?')
2589 sprintf (nml_err_msg, "namelist read: misplaced = sign");
2590 goto nml_err_ret;
2592 nml_query (dtp, '=');
2593 return SUCCESS;
2595 case '?':
2596 nml_query (dtp, '?');
2597 return SUCCESS;
2599 case '$':
2600 case '&':
2601 nml_match_name (dtp, "end", 3);
2602 if (dtp->u.p.nml_read_error)
2604 sprintf (nml_err_msg, "namelist not terminated with / or &end");
2605 goto nml_err_ret;
2607 case '/':
2608 dtp->u.p.input_complete = 1;
2609 return SUCCESS;
2611 default :
2612 break;
2615 /* Untouch all nodes of the namelist and reset the flag that is set for
2616 derived type components. */
2618 nml_untouch_nodes (dtp);
2619 component_flag = 0;
2620 non_zero_rank_count = 0;
2622 /* Get the object name - should '!' and '\n' be permitted separators? */
2624 get_name:
2626 free_saved (dtp);
2630 if (!is_separator (c))
2631 push_char (dtp, tolower(c));
2632 c = next_char (dtp);
2633 } while (!( c=='=' || c==' ' || c=='\t' || c =='(' || c =='%' ));
2635 unget_char (dtp, c);
2637 /* Check that the name is in the namelist and get pointer to object.
2638 Three error conditions exist: (i) An attempt is being made to
2639 identify a non-existent object, following a failed data read or
2640 (ii) The object name does not exist or (iii) Too many data items
2641 are present for an object. (iii) gives the same error message
2642 as (i) */
2644 push_char (dtp, '\0');
2646 if (component_flag)
2648 size_t var_len = strlen (root_nl->var_name);
2649 size_t saved_len
2650 = dtp->u.p.saved_string ? strlen (dtp->u.p.saved_string) : 0;
2651 char ext_name[var_len + saved_len + 1];
2653 memcpy (ext_name, root_nl->var_name, var_len);
2654 if (dtp->u.p.saved_string)
2655 memcpy (ext_name + var_len, dtp->u.p.saved_string, saved_len);
2656 ext_name[var_len + saved_len] = '\0';
2657 nl = find_nml_node (dtp, ext_name);
2659 else
2660 nl = find_nml_node (dtp, dtp->u.p.saved_string);
2662 if (nl == NULL)
2664 if (dtp->u.p.nml_read_error && *pprev_nl)
2665 snprintf (nml_err_msg, nml_err_msg_size,
2666 "Bad data for namelist object %s", (*pprev_nl)->var_name);
2668 else
2669 snprintf (nml_err_msg, nml_err_msg_size,
2670 "Cannot match namelist object name %s",
2671 dtp->u.p.saved_string);
2673 goto nml_err_ret;
2676 /* Get the length, data length, base pointer and rank of the variable.
2677 Set the default loop specification first. */
2679 for (dim=0; dim < nl->var_rank; dim++)
2681 nl->ls[dim].step = 1;
2682 nl->ls[dim].end = nl->dim[dim].ubound;
2683 nl->ls[dim].start = nl->dim[dim].lbound;
2684 nl->ls[dim].idx = nl->ls[dim].start;
2687 /* Check to see if there is a qualifier: if so, parse it.*/
2689 if (c == '(' && nl->var_rank)
2691 parsed_rank = 0;
2692 if (nml_parse_qualifier (dtp, nl->dim, nl->ls, nl->var_rank,
2693 nml_err_msg, &parsed_rank) == FAILURE)
2695 char *nml_err_msg_end = strchr (nml_err_msg, '\0');
2696 snprintf (nml_err_msg_end,
2697 nml_err_msg_size - (nml_err_msg_end - nml_err_msg),
2698 " for namelist variable %s", nl->var_name);
2699 goto nml_err_ret;
2702 if (parsed_rank > 0)
2703 non_zero_rank_count++;
2705 c = next_char (dtp);
2706 unget_char (dtp, c);
2708 else if (nl->var_rank > 0)
2709 non_zero_rank_count++;
2711 /* Now parse a derived type component. The root namelist_info address
2712 is backed up, as is the previous component level. The component flag
2713 is set and the iteration is made by jumping back to get_name. */
2715 if (c == '%')
2717 if (nl->type != GFC_DTYPE_DERIVED)
2719 snprintf (nml_err_msg, nml_err_msg_size,
2720 "Attempt to get derived component for %s", nl->var_name);
2721 goto nml_err_ret;
2724 if (!component_flag)
2725 first_nl = nl;
2727 root_nl = nl;
2728 component_flag = 1;
2729 c = next_char (dtp);
2730 goto get_name;
2733 /* Parse a character qualifier, if present. chigh = 0 is a default
2734 that signals that the string length = string_length. */
2736 clow = 1;
2737 chigh = 0;
2739 if (c == '(' && nl->type == GFC_DTYPE_CHARACTER)
2741 descriptor_dimension chd[1] = { {1, clow, nl->string_length} };
2742 array_loop_spec ind[1] = { {1, clow, nl->string_length, 1} };
2744 if (nml_parse_qualifier (dtp, chd, ind, -1, nml_err_msg, &parsed_rank)
2745 == FAILURE)
2747 char *nml_err_msg_end = strchr (nml_err_msg, '\0');
2748 snprintf (nml_err_msg_end,
2749 nml_err_msg_size - (nml_err_msg_end - nml_err_msg),
2750 " for namelist variable %s", nl->var_name);
2751 goto nml_err_ret;
2754 clow = ind[0].start;
2755 chigh = ind[0].end;
2757 if (ind[0].step != 1)
2759 snprintf (nml_err_msg, nml_err_msg_size,
2760 "Step not allowed in substring qualifier"
2761 " for namelist object %s", nl->var_name);
2762 goto nml_err_ret;
2765 c = next_char (dtp);
2766 unget_char (dtp, c);
2769 /* If a derived type touch its components and restore the root
2770 namelist_info if we have parsed a qualified derived type
2771 component. */
2773 if (nl->type == GFC_DTYPE_DERIVED)
2774 nml_touch_nodes (nl);
2775 if (component_flag)
2776 nl = first_nl;
2778 /* Make sure no extraneous qualifiers are there. */
2780 if (c == '(')
2782 snprintf (nml_err_msg, nml_err_msg_size,
2783 "Qualifier for a scalar or non-character namelist object %s",
2784 nl->var_name);
2785 goto nml_err_ret;
2788 /* Make sure there is no more than one non-zero rank object. */
2789 if (non_zero_rank_count > 1)
2791 snprintf (nml_err_msg, nml_err_msg_size,
2792 "Multiple sub-objects with non-zero rank in namelist object %s",
2793 nl->var_name);
2794 non_zero_rank_count = 0;
2795 goto nml_err_ret;
2798 /* According to the standard, an equal sign MUST follow an object name. The
2799 following is possibly lax - it allows comments, blank lines and so on to
2800 intervene. eat_spaces (dtp); c = next_char (dtp); would be compliant*/
2802 free_saved (dtp);
2804 eat_separator (dtp);
2805 if (dtp->u.p.input_complete)
2806 return SUCCESS;
2808 if (dtp->u.p.at_eol)
2809 finish_separator (dtp);
2810 if (dtp->u.p.input_complete)
2811 return SUCCESS;
2813 c = next_char (dtp);
2815 if (c != '=')
2817 snprintf (nml_err_msg, nml_err_msg_size,
2818 "Equal sign must follow namelist object name %s",
2819 nl->var_name);
2820 goto nml_err_ret;
2823 if (nml_read_obj (dtp, nl, 0, pprev_nl, nml_err_msg, nml_err_msg_size,
2824 clow, chigh) == FAILURE)
2825 goto nml_err_ret;
2827 return SUCCESS;
2829 nml_err_ret:
2831 return FAILURE;
2834 /* Entry point for namelist input. Goes through input until namelist name
2835 is matched. Then cycles through nml_get_obj_data until the input is
2836 completed or there is an error. */
2838 void
2839 namelist_read (st_parameter_dt *dtp)
2841 char c;
2842 jmp_buf eof_jump;
2843 char nml_err_msg[200];
2844 /* Pointer to the previously read object, in case attempt is made to read
2845 new object name. Should this fail, error message can give previous
2846 name. */
2847 namelist_info *prev_nl = NULL;
2849 dtp->u.p.namelist_mode = 1;
2850 dtp->u.p.input_complete = 0;
2851 dtp->u.p.expanded_read = 0;
2853 dtp->u.p.eof_jump = &eof_jump;
2854 if (setjmp (eof_jump))
2856 dtp->u.p.eof_jump = NULL;
2857 generate_error (&dtp->common, LIBERROR_END, NULL);
2858 return;
2861 /* Look for &namelist_name . Skip all characters, testing for $nmlname.
2862 Exit on success or EOF. If '?' or '=?' encountered in stdin, print
2863 node names or namelist on stdout. */
2865 find_nml_name:
2866 switch (c = next_char (dtp))
2868 case '$':
2869 case '&':
2870 break;
2872 case '!':
2873 eat_line (dtp);
2874 goto find_nml_name;
2876 case '=':
2877 c = next_char (dtp);
2878 if (c == '?')
2879 nml_query (dtp, '=');
2880 else
2881 unget_char (dtp, c);
2882 goto find_nml_name;
2884 case '?':
2885 nml_query (dtp, '?');
2887 default:
2888 goto find_nml_name;
2891 /* Match the name of the namelist. */
2893 nml_match_name (dtp, dtp->namelist_name, dtp->namelist_name_len);
2895 if (dtp->u.p.nml_read_error)
2896 goto find_nml_name;
2898 /* A trailing space is required, we give a little lattitude here, 10.9.1. */
2899 c = next_char (dtp);
2900 if (!is_separator(c))
2902 unget_char (dtp, c);
2903 goto find_nml_name;
2906 /* Ready to read namelist objects. If there is an error in input
2907 from stdin, output the error message and continue. */
2909 while (!dtp->u.p.input_complete)
2911 if (nml_get_obj_data (dtp, &prev_nl, nml_err_msg, sizeof nml_err_msg)
2912 == FAILURE)
2914 gfc_unit *u;
2916 if (dtp->u.p.current_unit->unit_number != options.stdin_unit)
2917 goto nml_err_ret;
2919 u = find_unit (options.stderr_unit);
2920 st_printf ("%s\n", nml_err_msg);
2921 if (u != NULL)
2923 flush (u->s);
2924 unlock_unit (u);
2930 dtp->u.p.eof_jump = NULL;
2931 free_saved (dtp);
2932 free_line (dtp);
2933 return;
2935 /* All namelist error calls return from here */
2937 nml_err_ret:
2939 dtp->u.p.eof_jump = NULL;
2940 free_saved (dtp);
2941 free_line (dtp);
2942 generate_error (&dtp->common, LIBERROR_READ_VALUE, nml_err_msg);
2943 return;