* config/xtensa/xtensa.c (xtensa_expand_builtin): Use CALL_EXPR_FN.
[official-gcc.git] / libgfortran / io / list_read.c
blob3203f3116f7889b8093dd58fdfb8f40f97057ee9
1 /* Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
2 Contributed by Andy Vaught
3 Namelist input contributed by Paul Thomas
5 This file is part of the GNU Fortran 95 runtime library (libgfortran).
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.
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.)
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.
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. */
32 #include "config.h"
33 #include <string.h>
34 #include <ctype.h>
35 #include "libgfortran.h"
36 #include "io.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'
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')
64 /* Maximum repeat count. Less than ten times the maximum signed int32. */
66 #define MAX_REPEAT 200000000
69 /* Save a character to a string buffer, enlarging it as necessary. */
71 static void
72 push_char (st_parameter_dt *dtp, char c)
74 char *new;
76 if (dtp->u.p.saved_string == NULL)
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;
86 if (dtp->u.p.saved_used >= dtp->u.p.saved_length)
88 dtp->u.p.saved_length = 2 * dtp->u.p.saved_length;
89 new = get_mem (2 * dtp->u.p.saved_length);
91 memset (new, 0, 2 * dtp->u.p.saved_length);
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);
97 dtp->u.p.saved_string = new;
100 dtp->u.p.saved_string[dtp->u.p.saved_used++] = c;
104 /* Free the input buffer if necessary. */
106 static void
107 free_saved (st_parameter_dt *dtp)
109 if (dtp->u.p.saved_string == NULL)
110 return;
112 if (dtp->u.p.saved_string != dtp->u.p.scratch)
113 free_mem (dtp->u.p.saved_string);
115 dtp->u.p.saved_string = NULL;
116 dtp->u.p.saved_used = 0;
120 /* Free the line buffer if necessary. */
122 static void
123 free_line (st_parameter_dt *dtp)
125 if (dtp->u.p.line_buffer == NULL)
126 return;
128 free_mem (dtp->u.p.line_buffer);
129 dtp->u.p.line_buffer = NULL;
133 static char
134 next_char (st_parameter_dt *dtp)
136 int length;
137 gfc_offset record;
138 char c, *p;
140 if (dtp->u.p.last_char != '\0')
142 dtp->u.p.at_eol = 0;
143 c = dtp->u.p.last_char;
144 dtp->u.p.last_char = '\0';
145 goto done;
148 /* Read from line_buffer if enabled. */
150 if (dtp->u.p.line_buffer_enabled)
152 dtp->u.p.at_eol = 0;
154 c = dtp->u.p.line_buffer[dtp->u.p.item_count];
155 if (c != '\0' && dtp->u.p.item_count < 64)
157 dtp->u.p.line_buffer[dtp->u.p.item_count] = '\0';
158 dtp->u.p.item_count++;
159 goto done;
162 dtp->u.p.item_count = 0;
163 dtp->u.p.line_buffer_enabled = 0;
166 /* Handle the end-of-record and end-of-file conditions for
167 internal array unit. */
168 if (is_array_io(dtp))
170 if (dtp->u.p.at_eof)
171 longjmp (*dtp->u.p.eof_jump, 1);
173 /* Check for "end-of-record" condition. */
174 if (dtp->u.p.current_unit->bytes_left == 0)
176 c = '\n';
177 record = next_array_record (dtp, dtp->u.p.current_unit->ls);
179 /* Check for "end-of-file" condition. */
180 if (record == 0)
182 dtp->u.p.at_eof = 1;
183 goto done;
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);
190 dtp->u.p.current_unit->bytes_left = dtp->u.p.current_unit->recl;
191 goto done;
195 /* Get the next character and handle end-of-record conditions. */
197 length = 1;
199 p = salloc_r (dtp->u.p.current_unit->s, &length);
201 if (is_stream_io (dtp))
202 dtp->u.p.current_unit->strm_pos++;
204 if (is_internal_unit(dtp))
206 if (is_array_io(dtp))
208 /* End of record is handled in the next pass through, above. The
209 check for NULL here is cautionary. */
210 if (p == NULL)
212 generate_error (&dtp->common, ERROR_INTERNAL_UNIT, NULL);
213 return '\0';
216 dtp->u.p.current_unit->bytes_left--;
217 c = *p;
219 else
221 if (p == NULL)
222 longjmp (*dtp->u.p.eof_jump, 1);
223 if (length == 0)
224 c = '\n';
225 else
226 c = *p;
229 else
231 if (p == NULL)
233 generate_error (&dtp->common, ERROR_OS, NULL);
234 return '\0';
236 if (length == 0)
237 longjmp (*dtp->u.p.eof_jump, 1);
238 c = *p;
240 done:
241 dtp->u.p.at_eol = (c == '\n' || c == '\r');
242 return c;
246 /* Push a character back onto the input. */
248 static void
249 unget_char (st_parameter_dt *dtp, char c)
251 dtp->u.p.last_char = c;
255 /* Skip over spaces in the input. Returns the nonspace character that
256 terminated the eating and also places it back on the input. */
258 static char
259 eat_spaces (st_parameter_dt *dtp)
261 char c;
265 c = next_char (dtp);
267 while (c == ' ' || c == '\t');
269 unget_char (dtp, c);
270 return c;
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.
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. */
285 static void
286 eat_separator (st_parameter_dt *dtp)
288 char c, n;
290 eat_spaces (dtp);
291 dtp->u.p.comma_flag = 0;
293 c = next_char (dtp);
294 switch (c)
296 case ',':
297 dtp->u.p.comma_flag = 1;
298 eat_spaces (dtp);
299 break;
301 case '/':
302 dtp->u.p.input_complete = 1;
303 break;
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;
313 case '\n':
314 dtp->u.p.at_eol = 1;
315 break;
317 case '!':
318 if (dtp->u.p.namelist_mode)
319 { /* Eat a namelist comment. */
321 c = next_char (dtp);
322 while (c != '\n');
324 break;
327 /* Fall Through... */
329 default:
330 unget_char (dtp, c);
331 break;
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. */
340 static void
341 finish_separator (st_parameter_dt *dtp)
343 char c;
345 restart:
346 eat_spaces (dtp);
348 c = next_char (dtp);
349 switch (c)
351 case ',':
352 if (dtp->u.p.comma_flag)
353 unget_char (dtp, c);
354 else
356 c = eat_spaces (dtp);
357 if (c == '\n' || c == '\r')
358 goto restart;
361 break;
363 case '/':
364 dtp->u.p.input_complete = 1;
365 if (!dtp->u.p.namelist_mode)
366 return;
367 break;
369 case '\n':
370 case '\r':
371 goto restart;
373 case '!':
374 if (dtp->u.p.namelist_mode)
377 c = next_char (dtp);
378 while (c != '\n');
380 goto restart;
383 default:
384 unget_char (dtp, c);
385 break;
390 /* This function reads characters through to the end of the current line and
391 just ignores them. */
393 static void
394 eat_line (st_parameter_dt *dtp)
396 char c;
397 if (!is_internal_unit (dtp))
399 c = next_char (dtp);
400 while (c != '\n');
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. */
408 static int
409 nml_bad_return (st_parameter_dt *dtp, char c)
411 if (dtp->u.p.namelist_mode)
413 dtp->u.p.nml_read_error = 1;
414 unget_char (dtp, c);
415 return 1;
417 return 0;
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. */
424 static int
425 convert_integer (st_parameter_dt *dtp, int length, int negative)
427 char c, *buffer, message[100];
428 int m;
429 GFC_INTEGER_LARGEST v, max, max10;
431 buffer = dtp->u.p.saved_string;
432 v = 0;
434 max = (length == -1) ? MAX_REPEAT : max_value (length, 1);
435 max10 = max / 10;
437 for (;;)
439 c = *buffer++;
440 if (c == '\0')
441 break;
442 c -= '0';
444 if (v > max10)
445 goto overflow;
446 v = 10 * v;
448 if (v > max - c)
449 goto overflow;
450 v += c;
453 m = 0;
455 if (length != -1)
457 if (negative)
458 v = -v;
459 set_integer (dtp->u.p.value, v, length);
461 else
463 dtp->u.p.repeat_count = v;
465 if (dtp->u.p.repeat_count == 0)
467 st_sprintf (message, "Zero repeat count in item %d of list input",
468 dtp->u.p.item_count);
470 generate_error (&dtp->common, ERROR_READ_VALUE, message);
471 m = 1;
475 free_saved (dtp);
476 return m;
478 overflow:
479 if (length == -1)
480 st_sprintf (message, "Repeat count overflow in item %d of list input",
481 dtp->u.p.item_count);
482 else
483 st_sprintf (message, "Integer overflow while reading item %d",
484 dtp->u.p.item_count);
486 free_saved (dtp);
487 generate_error (&dtp->common, ERROR_READ_VALUE, message);
489 return 1;
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. */
497 static int
498 parse_repeat (st_parameter_dt *dtp)
500 char c, message[100];
501 int repeat;
503 c = next_char (dtp);
504 switch (c)
506 CASE_DIGITS:
507 repeat = c - '0';
508 break;
510 CASE_SEPARATORS:
511 unget_char (dtp, c);
512 eat_separator (dtp);
513 return 1;
515 default:
516 unget_char (dtp, c);
517 return 0;
520 for (;;)
522 c = next_char (dtp);
523 switch (c)
525 CASE_DIGITS:
526 repeat = 10 * repeat + c - '0';
528 if (repeat > MAX_REPEAT)
530 st_sprintf (message,
531 "Repeat count overflow in item %d of list input",
532 dtp->u.p.item_count);
534 generate_error (&dtp->common, ERROR_READ_VALUE, message);
535 return 1;
538 break;
540 case '*':
541 if (repeat == 0)
543 st_sprintf (message,
544 "Zero repeat count in item %d of list input",
545 dtp->u.p.item_count);
547 generate_error (&dtp->common, ERROR_READ_VALUE, message);
548 return 1;
551 goto done;
553 default:
554 goto bad_repeat;
558 done:
559 dtp->u.p.repeat_count = repeat;
560 return 0;
562 bad_repeat:
564 eat_line (dtp);
565 free_saved (dtp);
566 st_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;
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. */
578 static void
579 l_push_char (st_parameter_dt *dtp, char c)
581 if (dtp->u.p.line_buffer == NULL)
583 dtp->u.p.line_buffer = get_mem (SCRATCH_SIZE);
584 memset (dtp->u.p.line_buffer, 0, SCRATCH_SIZE);
587 dtp->u.p.line_buffer[dtp->u.p.item_count++] = c;
591 /* Read a logical character on the input. */
593 static void
594 read_logical (st_parameter_dt *dtp, int length)
596 char c, message[100];
597 int i, v;
599 if (parse_repeat (dtp))
600 return;
602 c = tolower (next_char (dtp));
603 l_push_char (dtp, c);
604 switch (c)
606 case 't':
607 v = 1;
608 c = next_char (dtp);
609 l_push_char (dtp, c);
611 if (!is_separator(c))
612 goto possible_name;
614 unget_char (dtp, c);
615 break;
616 case 'f':
617 v = 0;
618 c = next_char (dtp);
619 l_push_char (dtp, c);
621 if (!is_separator(c))
622 goto possible_name;
624 unget_char (dtp, c);
625 break;
626 case '.':
627 c = tolower (next_char (dtp));
628 switch (c)
630 case 't':
631 v = 1;
632 break;
633 case 'f':
634 v = 0;
635 break;
636 default:
637 goto bad_logical;
640 break;
642 CASE_SEPARATORS:
643 unget_char (dtp, c);
644 eat_separator (dtp);
645 return; /* Null value. */
647 default:
648 goto bad_logical;
651 dtp->u.p.saved_type = BT_LOGICAL;
652 dtp->u.p.saved_length = length;
654 /* Eat trailing garbage. */
657 c = next_char (dtp);
659 while (!is_separator (c));
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);
668 return;
670 possible_name:
672 for(i = 0; i < 63; i++)
674 c = next_char (dtp);
675 if (is_separator(c))
677 /* All done if this is not a namelist read. */
678 if (!dtp->u.p.namelist_mode)
679 goto logical_done;
681 unget_char (dtp, c);
682 eat_separator (dtp);
683 c = next_char (dtp);
684 if (c != '=')
686 unget_char (dtp, c);
687 goto logical_done;
691 l_push_char (dtp, c);
692 if (c == '=')
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;
702 bad_logical:
704 free_line (dtp);
706 if (nml_bad_return (dtp, c))
707 return;
709 eat_line (dtp);
710 free_saved (dtp);
711 st_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;
716 logical_done:
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);
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. */
733 static void
734 read_integer (st_parameter_dt *dtp, int length)
736 char c, message[100];
737 int negative;
739 negative = 0;
741 c = next_char (dtp);
742 switch (c)
744 case '-':
745 negative = 1;
746 /* Fall through... */
748 case '+':
749 c = next_char (dtp);
750 goto get_integer;
752 CASE_SEPARATORS: /* Single null. */
753 unget_char (dtp, c);
754 eat_separator (dtp);
755 return;
757 CASE_DIGITS:
758 push_char (dtp, c);
759 break;
761 default:
762 goto bad_integer;
765 /* Take care of what may be a repeat count. */
767 for (;;)
769 c = next_char (dtp);
770 switch (c)
772 CASE_DIGITS:
773 push_char (dtp, c);
774 break;
776 case '*':
777 push_char (dtp, '\0');
778 goto repeat;
780 CASE_SEPARATORS: /* Not a repeat count. */
781 goto done;
783 default:
784 goto bad_integer;
788 repeat:
789 if (convert_integer (dtp, -1, 0))
790 return;
792 /* Get the real integer. */
794 c = next_char (dtp);
795 switch (c)
797 CASE_DIGITS:
798 break;
800 CASE_SEPARATORS:
801 unget_char (dtp, c);
802 eat_separator (dtp);
803 return;
805 case '-':
806 negative = 1;
807 /* Fall through... */
809 case '+':
810 c = next_char (dtp);
811 break;
814 get_integer:
815 if (!isdigit (c))
816 goto bad_integer;
817 push_char (dtp, c);
819 for (;;)
821 c = next_char (dtp);
822 switch (c)
824 CASE_DIGITS:
825 push_char (dtp, c);
826 break;
828 CASE_SEPARATORS:
829 goto done;
831 default:
832 goto bad_integer;
836 bad_integer:
838 if (nml_bad_return (dtp, c))
839 return;
841 eat_line (dtp);
842 free_saved (dtp);
843 st_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);
847 return;
849 done:
850 unget_char (dtp, c);
851 eat_separator (dtp);
853 push_char (dtp, '\0');
854 if (convert_integer (dtp, length, negative))
856 free_saved (dtp);
857 return;
860 free_saved (dtp);
861 dtp->u.p.saved_type = BT_INTEGER;
865 /* Read a character variable. */
867 static void
868 read_character (st_parameter_dt *dtp, int length __attribute__ ((unused)))
870 char c, quote, message[100];
872 quote = ' '; /* Space means no quote character. */
874 c = next_char (dtp);
875 switch (c)
877 CASE_DIGITS:
878 push_char (dtp, c);
879 break;
881 CASE_SEPARATORS:
882 unget_char (dtp, c); /* NULL value. */
883 eat_separator (dtp);
884 return;
886 case '"':
887 case '\'':
888 quote = c;
889 goto get_string;
891 default:
892 if (dtp->u.p.namelist_mode)
894 unget_char (dtp,c);
895 return;
897 push_char (dtp, c);
898 goto get_string;
901 /* Deal with a possible repeat count. */
903 for (;;)
905 c = next_char (dtp);
906 switch (c)
908 CASE_DIGITS:
909 push_char (dtp, c);
910 break;
912 CASE_SEPARATORS:
913 unget_char (dtp, c);
914 goto done; /* String was only digits! */
916 case '*':
917 push_char (dtp, '\0');
918 goto got_repeat;
920 default:
921 push_char (dtp, c);
922 goto get_string; /* Not a repeat count after all. */
926 got_repeat:
927 if (convert_integer (dtp, -1, 0))
928 return;
930 /* Now get the real string. */
932 c = next_char (dtp);
933 switch (c)
935 CASE_SEPARATORS:
936 unget_char (dtp, c); /* Repeated NULL values. */
937 eat_separator (dtp);
938 return;
940 case '"':
941 case '\'':
942 quote = c;
943 break;
945 default:
946 push_char (dtp, c);
947 break;
950 get_string:
951 for (;;)
953 c = next_char (dtp);
954 switch (c)
956 case '"':
957 case '\'':
958 if (c != quote)
960 push_char (dtp, c);
961 break;
964 /* See if we have a doubled quote character or the end of
965 the string. */
967 c = next_char (dtp);
968 if (c == quote)
970 push_char (dtp, quote);
971 break;
974 unget_char (dtp, c);
975 goto done;
977 CASE_SEPARATORS:
978 if (quote == ' ')
980 unget_char (dtp, c);
981 goto done;
984 if (c != '\n' && c != '\r')
985 push_char (dtp, c);
986 break;
988 default:
989 push_char (dtp, c);
990 break;
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))
1000 unget_char (dtp, c);
1001 eat_separator (dtp);
1002 dtp->u.p.saved_type = BT_CHARACTER;
1004 else
1006 free_saved (dtp);
1007 st_sprintf (message, "Invalid string input in item %d",
1008 dtp->u.p.item_count);
1009 generate_error (&dtp->common, ERROR_READ_VALUE, message);
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. */
1017 static int
1018 parse_real (st_parameter_dt *dtp, void *buffer, int length)
1020 char c, message[100];
1021 int m, seen_dp;
1023 c = next_char (dtp);
1024 if (c == '-' || c == '+')
1026 push_char (dtp, c);
1027 c = next_char (dtp);
1030 if (!isdigit (c) && c != '.')
1031 goto bad;
1033 push_char (dtp, c);
1035 seen_dp = (c == '.') ? 1 : 0;
1037 for (;;)
1039 c = next_char (dtp);
1040 switch (c)
1042 CASE_DIGITS:
1043 push_char (dtp, c);
1044 break;
1046 case '.':
1047 if (seen_dp)
1048 goto bad;
1050 seen_dp = 1;
1051 push_char (dtp, c);
1052 break;
1054 case 'e':
1055 case 'E':
1056 case 'd':
1057 case 'D':
1058 push_char (dtp, 'e');
1059 goto exp1;
1061 case '-':
1062 case '+':
1063 push_char (dtp, 'e');
1064 push_char (dtp, c);
1065 c = next_char (dtp);
1066 goto exp2;
1068 CASE_SEPARATORS:
1069 unget_char (dtp, c);
1070 goto done;
1072 default:
1073 goto done;
1077 exp1:
1078 c = next_char (dtp);
1079 if (c != '-' && c != '+')
1080 push_char (dtp, '+');
1081 else
1083 push_char (dtp, c);
1084 c = next_char (dtp);
1087 exp2:
1088 if (!isdigit (c))
1089 goto bad;
1090 push_char (dtp, c);
1092 for (;;)
1094 c = next_char (dtp);
1095 switch (c)
1097 CASE_DIGITS:
1098 push_char (dtp, c);
1099 break;
1101 CASE_SEPARATORS:
1102 unget_char (dtp, c);
1103 goto done;
1105 default:
1106 goto done;
1110 done:
1111 unget_char (dtp, c);
1112 push_char (dtp, '\0');
1114 m = convert_real (dtp, buffer, dtp->u.p.saved_string, length);
1115 free_saved (dtp);
1117 return m;
1119 bad:
1121 if (nml_bad_return (dtp, c))
1122 return 0;
1124 eat_line (dtp);
1125 free_saved (dtp);
1126 st_sprintf (message, "Bad floating point number for item %d",
1127 dtp->u.p.item_count);
1128 generate_error (&dtp->common, ERROR_READ_VALUE, message);
1130 return 1;
1134 /* Reading a complex number is straightforward because we can tell
1135 what it is right away. */
1137 static void
1138 read_complex (st_parameter_dt *dtp, int kind, size_t size)
1140 char message[100];
1141 char c;
1143 if (parse_repeat (dtp))
1144 return;
1146 c = next_char (dtp);
1147 switch (c)
1149 case '(':
1150 break;
1152 CASE_SEPARATORS:
1153 unget_char (dtp, c);
1154 eat_separator (dtp);
1155 return;
1157 default:
1158 goto bad_complex;
1161 eat_spaces (dtp);
1162 if (parse_real (dtp, dtp->u.p.value, kind))
1163 return;
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);
1173 if (next_char (dtp) != ',')
1174 goto bad_complex;
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);
1184 if (parse_real (dtp, dtp->u.p.value + size / 2, kind))
1185 return;
1187 eat_spaces (dtp);
1188 if (next_char (dtp) != ')')
1189 goto bad_complex;
1191 c = next_char (dtp);
1192 if (!is_separator (c))
1193 goto bad_complex;
1195 unget_char (dtp, c);
1196 eat_separator (dtp);
1198 free_saved (dtp);
1199 dtp->u.p.saved_type = BT_COMPLEX;
1200 return;
1202 bad_complex:
1204 if (nml_bad_return (dtp, c))
1205 return;
1207 eat_line (dtp);
1208 free_saved (dtp);
1209 st_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);
1215 /* Parse a real number with a possible repeat count. */
1217 static void
1218 read_real (st_parameter_dt *dtp, int length)
1220 char c, message[100];
1221 int seen_dp;
1223 seen_dp = 0;
1225 c = next_char (dtp);
1226 switch (c)
1228 CASE_DIGITS:
1229 push_char (dtp, c);
1230 break;
1232 case '.':
1233 push_char (dtp, c);
1234 seen_dp = 1;
1235 break;
1237 case '+':
1238 case '-':
1239 goto got_sign;
1241 CASE_SEPARATORS:
1242 unget_char (dtp, c); /* Single null. */
1243 eat_separator (dtp);
1244 return;
1246 default:
1247 goto bad_real;
1250 /* Get the digit string that might be a repeat count. */
1252 for (;;)
1254 c = next_char (dtp);
1255 switch (c)
1257 CASE_DIGITS:
1258 push_char (dtp, c);
1259 break;
1261 case '.':
1262 if (seen_dp)
1263 goto bad_real;
1265 seen_dp = 1;
1266 push_char (dtp, c);
1267 goto real_loop;
1269 case 'E':
1270 case 'e':
1271 case 'D':
1272 case 'd':
1273 goto exp1;
1275 case '+':
1276 case '-':
1277 push_char (dtp, 'e');
1278 push_char (dtp, c);
1279 c = next_char (dtp);
1280 goto exp2;
1282 case '*':
1283 push_char (dtp, '\0');
1284 goto got_repeat;
1286 CASE_SEPARATORS:
1287 if (c != '\n' && c != ',' && c != '\r')
1288 unget_char (dtp, c);
1289 goto done;
1291 default:
1292 goto bad_real;
1296 got_repeat:
1297 if (convert_integer (dtp, -1, 0))
1298 return;
1300 /* Now get the number itself. */
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;
1310 if (c != '-' && c != '+')
1311 push_char (dtp, '+');
1312 else
1314 got_sign:
1315 push_char (dtp, c);
1316 c = next_char (dtp);
1319 if (!isdigit (c) && c != '.')
1320 goto bad_real;
1322 if (c == '.')
1324 if (seen_dp)
1325 goto bad_real;
1326 else
1327 seen_dp = 1;
1330 push_char (dtp, c);
1332 real_loop:
1333 for (;;)
1335 c = next_char (dtp);
1336 switch (c)
1338 CASE_DIGITS:
1339 push_char (dtp, c);
1340 break;
1342 CASE_SEPARATORS:
1343 goto done;
1345 case '.':
1346 if (seen_dp)
1347 goto bad_real;
1349 seen_dp = 1;
1350 push_char (dtp, c);
1351 break;
1353 case 'E':
1354 case 'e':
1355 case 'D':
1356 case 'd':
1357 goto exp1;
1359 case '+':
1360 case '-':
1361 push_char (dtp, 'e');
1362 push_char (dtp, c);
1363 c = next_char (dtp);
1364 goto exp2;
1366 default:
1367 goto bad_real;
1371 exp1:
1372 push_char (dtp, 'e');
1374 c = next_char (dtp);
1375 if (c != '+' && c != '-')
1376 push_char (dtp, '+');
1377 else
1379 push_char (dtp, c);
1380 c = next_char (dtp);
1383 exp2:
1384 if (!isdigit (c))
1385 goto bad_real;
1386 push_char (dtp, c);
1388 for (;;)
1390 c = next_char (dtp);
1392 switch (c)
1394 CASE_DIGITS:
1395 push_char (dtp, c);
1396 break;
1398 CASE_SEPARATORS:
1399 goto done;
1401 default:
1402 goto bad_real;
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;
1413 free_saved (dtp);
1414 dtp->u.p.saved_type = BT_REAL;
1415 return;
1417 bad_real:
1419 if (nml_bad_return (dtp, c))
1420 return;
1422 eat_line (dtp);
1423 free_saved (dtp);
1424 st_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);
1430 /* Check the current type against the saved type to make sure they are
1431 compatible. Returns nonzero if incompatible. */
1433 static int
1434 check_type (st_parameter_dt *dtp, bt type, int len)
1436 char message[100];
1438 if (dtp->u.p.saved_type != BT_NULL && dtp->u.p.saved_type != type)
1440 st_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);
1444 generate_error (&dtp->common, ERROR_READ_VALUE, message);
1445 return 1;
1448 if (dtp->u.p.saved_type == BT_NULL || dtp->u.p.saved_type == BT_CHARACTER)
1449 return 0;
1451 if (dtp->u.p.saved_length != len)
1453 st_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;
1461 return 0;
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. */
1470 static void
1471 list_formatted_read_scalar (st_parameter_dt *dtp, bt type, void *p, int kind,
1472 size_t size)
1474 char c;
1475 int m;
1476 jmp_buf eof_jump;
1478 dtp->u.p.namelist_mode = 0;
1480 dtp->u.p.eof_jump = &eof_jump;
1481 if (setjmp (eof_jump))
1483 generate_error (&dtp->common, ERROR_END, NULL);
1484 goto cleanup;
1487 if (dtp->u.p.first_item)
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;
1494 c = eat_spaces (dtp);
1495 if (is_separator (c))
1497 /* Found a null value. */
1498 eat_separator (dtp);
1499 dtp->u.p.repeat_count = 0;
1501 /* eat_separator sets this flag if the separator was a comma. */
1502 if (dtp->u.p.comma_flag)
1503 goto cleanup;
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;
1513 else
1515 if (dtp->u.p.input_complete)
1516 goto cleanup;
1518 if (dtp->u.p.repeat_count > 0)
1520 if (check_type (dtp, type, kind))
1521 return;
1522 goto set_value;
1525 if (dtp->u.p.at_eol)
1526 finish_separator (dtp);
1527 else
1529 eat_spaces (dtp);
1530 /* Trailing spaces prior to end of line. */
1531 if (dtp->u.p.at_eol)
1532 finish_separator (dtp);
1535 dtp->u.p.saved_type = BT_NULL;
1536 dtp->u.p.repeat_count = 1;
1539 switch (type)
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");
1560 if (dtp->u.p.saved_type != BT_CHARACTER && dtp->u.p.saved_type != BT_NULL)
1561 dtp->u.p.saved_length = size;
1563 if ((dtp->common.flags & IOPARM_LIBRETURN_MASK) != IOPARM_LIBRETURN_OK)
1564 goto cleanup;
1566 set_value:
1567 switch (dtp->u.p.saved_type)
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;
1576 case BT_CHARACTER:
1577 if (dtp->u.p.saved_string)
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);
1583 else
1584 /* Just delimiters encountered, nothing to copy but SPACE. */
1585 m = 0;
1587 if (m < (int) size)
1588 memset (((char *) p) + m, ' ', size - m);
1589 break;
1591 case BT_NULL:
1592 break;
1595 if (--dtp->u.p.repeat_count <= 0)
1596 free_saved (dtp);
1598 cleanup:
1599 dtp->u.p.eof_jump = NULL;
1603 void
1604 list_formatted_read (st_parameter_dt *dtp, bt type, void *p, int kind,
1605 size_t size, size_t nelems)
1607 size_t elem;
1608 char *tmp;
1610 tmp = (char *) p;
1612 /* Big loop over all the elements. */
1613 for (elem = 0; elem < nelems; elem++)
1615 dtp->u.p.item_count++;
1616 list_formatted_read_scalar (dtp, type, tmp + size*elem, kind, size);
1621 /* Finish a list read. */
1623 void
1624 finish_list_read (st_parameter_dt *dtp)
1626 char c;
1628 free_saved (dtp);
1630 if (dtp->u.p.at_eol)
1632 dtp->u.p.at_eol = 0;
1633 return;
1638 c = next_char (dtp);
1640 while (c != '\n');
1643 /* NAMELIST INPUT
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- */
1664 /* Inputs a rank-dimensional qualifier, which can contain
1665 singlets, doublets, triplets or ':' with the standard meanings. */
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)
1671 int dim;
1672 int indx;
1673 int neg;
1674 int null_flag;
1675 int is_array_section;
1676 char c;
1678 is_array_section = 0;
1679 dtp->u.p.expanded_read = 0;
1681 /* The next character in the stream should be the '('. */
1683 c = next_char (dtp);
1685 /* Process the qualifier, by dimension and triplet. */
1687 for (dim=0; dim < rank; dim++ )
1689 for (indx=0; indx<3; indx++)
1691 free_saved (dtp);
1692 eat_spaces (dtp);
1693 neg = 0;
1695 /* Process a potential sign. */
1696 c = next_char (dtp);
1697 switch (c)
1699 case '-':
1700 neg = 1;
1701 break;
1703 case '+':
1704 break;
1706 default:
1707 unget_char (dtp, c);
1708 break;
1711 /* Process characters up to the next ':' , ',' or ')'. */
1712 for (;;)
1714 c = next_char (dtp);
1716 switch (c)
1718 case ':':
1719 is_array_section = 1;
1720 break;
1722 case ',': case ')':
1723 if ((c==',' && dim == rank -1)
1724 || (c==')' && dim < rank -1))
1726 st_sprintf (parse_err_msg,
1727 "Bad number of index fields");
1728 goto err_ret;
1730 break;
1732 CASE_DIGITS:
1733 push_char (dtp, c);
1734 continue;
1736 case ' ': case '\t':
1737 eat_spaces (dtp);
1738 c = next_char (dtp);
1739 break;
1741 default:
1742 st_sprintf (parse_err_msg, "Bad character in index");
1743 goto err_ret;
1746 if ((c == ',' || c == ')') && indx == 0
1747 && dtp->u.p.saved_string == 0)
1749 st_sprintf (parse_err_msg, "Null index field");
1750 goto err_ret;
1753 if ((c == ':' && indx == 1 && dtp->u.p.saved_string == 0)
1754 || (indx == 2 && dtp->u.p.saved_string == 0))
1756 st_sprintf(parse_err_msg, "Bad index triplet");
1757 goto err_ret;
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))
1765 null_flag = 1;
1766 break;
1769 /* Now read the index. */
1770 if (convert_integer (dtp, sizeof(ssize_t), neg))
1772 st_sprintf (parse_err_msg, "Bad integer in index");
1773 goto err_ret;
1775 break;
1778 /* Feed the index values to the triplet arrays. */
1779 if (!null_flag)
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));
1789 /* Singlet or doublet indices. */
1790 if (c==',' || c==')')
1792 if (indx == 0)
1794 memcpy (&ls[dim].start, dtp->u.p.value, sizeof(ssize_t));
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;
1804 break;
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))
1814 st_sprintf (parse_err_msg, "Index %d out of range", dim + 1);
1815 goto err_ret;
1817 if (((ls[dim].end - ls[dim].start ) * ls[dim].step < 0)
1818 || (ls[dim].step == 0))
1820 st_sprintf (parse_err_msg, "Bad range in index %d", dim + 1);
1821 goto err_ret;
1824 /* Initialise the loop index counter. */
1825 ls[dim].idx = ls[dim].start;
1827 eat_spaces (dtp);
1828 return SUCCESS;
1830 err_ret:
1832 return FAILURE;
1835 static namelist_info *
1836 find_nml_node (st_parameter_dt *dtp, char * var_name)
1838 namelist_info * t = dtp->u.p.ionml;
1839 while (t != NULL)
1841 if (strcmp (var_name, t->var_name) == 0)
1843 t->touched = 1;
1844 return t;
1846 t = t->next;
1848 return NULL;
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 */
1856 static void
1857 nml_touch_nodes (namelist_info * nl)
1859 index_type len = strlen (nl->var_name) + 1;
1860 int dim;
1861 char * ext_name = (char*)get_mem (len + 1);
1862 strcpy (ext_name, nl->var_name);
1863 strcat (ext_name, "%");
1864 for (nl = nl->next; nl; nl = nl->next)
1866 if (strncmp (nl->var_name, ext_name, len) == 0)
1868 nl->touched = 1;
1869 for (dim=0; dim < nl->var_rank; dim++)
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;
1877 else
1878 break;
1880 free_mem (ext_name);
1881 return;
1884 /* Resets touched for the entire list of nml_nodes, ready for a
1885 new object. */
1887 static void
1888 nml_untouch_nodes (st_parameter_dt *dtp)
1890 namelist_info * t;
1891 for (t = dtp->u.p.ionml; t; t = t->next)
1892 t->touched = 0;
1893 return;
1896 /* Attempts to input name to namelist name. Returns
1897 dtp->u.p.nml_read_error = 1 on no match. */
1899 static void
1900 nml_match_name (st_parameter_dt *dtp, const char *name, index_type len)
1902 index_type i;
1903 char c;
1904 dtp->u.p.nml_read_error = 0;
1905 for (i = 0; i < len; i++)
1907 c = next_char (dtp);
1908 if (tolower (c) != tolower (name[i]))
1910 dtp->u.p.nml_read_error = 1;
1911 break;
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. */
1921 static void
1922 nml_query (st_parameter_dt *dtp, char c)
1924 gfc_unit * temp_unit;
1925 namelist_info * nl;
1926 index_type len;
1927 char * p;
1929 if (dtp->u.p.current_unit->unit_number != options.stdin_unit)
1930 return;
1932 /* Store the current unit and transfer to stdout. */
1934 temp_unit = dtp->u.p.current_unit;
1935 dtp->u.p.current_unit = find_unit (options.stdout_unit);
1937 if (dtp->u.p.current_unit)
1939 dtp->u.p.mode = WRITING;
1940 next_record (dtp, 0);
1942 /* Write the namelist in its entirety. */
1944 if (c == '=')
1945 namelist_write (dtp);
1947 /* Or write the list of names. */
1949 else
1952 /* "&namelist_name\n" */
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)
1972 /* " var_name\n" */
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
1991 /* "&end\n" */
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
2007 /* Flush the stream to force immediate output. */
2009 flush (dtp->u.p.current_unit->s);
2010 unlock_unit (dtp->u.p.current_unit);
2013 query_return:
2015 /* Restore the current unit. */
2017 dtp->u.p.current_unit = temp_unit;
2018 dtp->u.p.mode = READING;
2019 return;
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. */
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)
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;
2048 /* This object not touched in name parsing. */
2050 if (!nl->touched)
2051 return SUCCESS;
2053 dtp->u.p.repeat_count = 0;
2054 eat_spaces (dtp);
2056 len = nl->len;
2057 switch (nl->type)
2060 case GFC_DTYPE_INTEGER:
2061 case GFC_DTYPE_LOGICAL:
2062 dlen = len;
2063 break;
2065 case GFC_DTYPE_REAL:
2066 dlen = size_from_real_kind (len);
2067 break;
2069 case GFC_DTYPE_COMPLEX:
2070 dlen = size_from_complex_kind (len);
2071 break;
2073 case GFC_DTYPE_CHARACTER:
2074 dlen = chigh ? (chigh - clow + 1) : nl->string_length;
2075 break;
2077 default:
2078 dlen = 0;
2084 /* Update the pointer to the data, using the current index vector */
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);
2091 /* Reset the error flag and try to read next value, if
2092 dtp->u.p.repeat_count=0 */
2094 dtp->u.p.nml_read_error = 0;
2095 nml_carry = 0;
2096 if (--dtp->u.p.repeat_count <= 0)
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;
2105 /* GFC_TYPE_UNKNOWN through for nulls and is detected
2106 after the switch block. */
2108 dtp->u.p.saved_type = GFC_DTYPE_UNKNOWN;
2109 free_saved (dtp);
2111 switch (nl->type)
2113 case GFC_DTYPE_INTEGER:
2114 read_integer (dtp, len);
2115 break;
2117 case GFC_DTYPE_LOGICAL:
2118 read_logical (dtp, len);
2119 break;
2121 case GFC_DTYPE_CHARACTER:
2122 read_character (dtp, len);
2123 break;
2125 case GFC_DTYPE_REAL:
2126 read_real (dtp, len);
2127 break;
2129 case GFC_DTYPE_COMPLEX:
2130 read_complex (dtp, len, dlen);
2131 break;
2133 case GFC_DTYPE_DERIVED:
2134 obj_name_len = strlen (nl->var_name) + 1;
2135 obj_name = get_mem (obj_name_len+1);
2136 strcpy (obj_name, nl->var_name);
2137 strcat (obj_name, "%");
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;
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 '%'. */
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)
2155 if (nml_read_obj (dtp, cmp, (index_type)(pdata - nl->mem_pos),
2156 pprev_nl, nml_err_msg, clow, chigh)
2157 == FAILURE)
2159 free_mem (obj_name);
2160 return FAILURE;
2163 if (dtp->u.p.input_complete)
2165 free_mem (obj_name);
2166 return SUCCESS;
2170 free_mem (obj_name);
2171 goto incr_idx;
2173 default:
2174 st_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;
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. */
2186 *pprev_nl = nl;
2187 if (dtp->u.p.nml_read_error)
2189 dtp->u.p.expanded_read = 0;
2190 return SUCCESS;
2193 if (dtp->u.p.saved_type == GFC_DTYPE_UNKNOWN)
2195 dtp->u.p.expanded_read = 0;
2196 goto incr_idx;
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. */
2202 switch (dtp->u.p.saved_type)
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;
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;
2220 default:
2221 break;
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)
2229 notify_std (&dtp->common, GFC_STD_GNU, "Non-standard expanded namelist read.");
2230 dtp->u.p.expanded_read = 0;
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++;
2238 /* Break out of loop if scalar. */
2239 if (!nl->var_rank)
2240 break;
2242 /* Now increment the index vector. */
2244 incr_idx:
2246 nml_carry = 1;
2247 for (dim = 0; dim < nl->var_rank; dim++)
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))
2253 ((nl->ls[dim].step < 0) && (nl->ls[dim].idx < nl->ls[dim].end)))
2255 nl->ls[dim].idx = nl->ls[dim].start;
2256 nml_carry = 1;
2259 } while (!nml_carry);
2261 if (dtp->u.p.repeat_count > 1)
2263 st_sprintf (nml_err_msg, "Repeat count too large for namelist object %s" ,
2264 nl->var_name );
2265 goto nml_err_ret;
2267 return SUCCESS;
2269 nml_err_ret:
2271 return FAILURE;
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. */
2281 static try
2282 nml_get_obj_data (st_parameter_dt *dtp, namelist_info **pprev_nl,
2283 char *nml_err_msg)
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;
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. */
2297 eat_separator (dtp);
2298 if (dtp->u.p.input_complete)
2299 return SUCCESS;
2301 if (dtp->u.p.at_eol)
2302 finish_separator (dtp);
2303 if (dtp->u.p.input_complete)
2304 return SUCCESS;
2306 c = next_char (dtp);
2307 switch (c)
2309 case '=':
2310 c = next_char (dtp);
2311 if (c != '?')
2313 st_sprintf (nml_err_msg, "namelist read: misplaced = sign");
2314 goto nml_err_ret;
2316 nml_query (dtp, '=');
2317 return SUCCESS;
2319 case '?':
2320 nml_query (dtp, '?');
2321 return SUCCESS;
2323 case '$':
2324 case '&':
2325 nml_match_name (dtp, "end", 3);
2326 if (dtp->u.p.nml_read_error)
2328 st_sprintf (nml_err_msg, "namelist not terminated with / or &end");
2329 goto nml_err_ret;
2331 case '/':
2332 dtp->u.p.input_complete = 1;
2333 return SUCCESS;
2335 default :
2336 break;
2339 /* Untouch all nodes of the namelist and reset the flag that is set for
2340 derived type components. */
2342 nml_untouch_nodes (dtp);
2343 component_flag = 0;
2345 /* Get the object name - should '!' and '\n' be permitted separators? */
2347 get_name:
2349 free_saved (dtp);
2353 push_char (dtp, tolower(c));
2354 c = next_char (dtp);
2355 } while (!( c=='=' || c==' ' || c=='\t' || c =='(' || c =='%' ));
2357 unget_char (dtp, c);
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) */
2366 push_char (dtp, '\0');
2368 if (component_flag)
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];
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);
2381 else
2382 nl = find_nml_node (dtp, dtp->u.p.saved_string);
2384 if (nl == NULL)
2386 if (dtp->u.p.nml_read_error && *pprev_nl)
2387 st_sprintf (nml_err_msg, "Bad data for namelist object %s",
2388 (*pprev_nl)->var_name);
2390 else
2391 st_sprintf (nml_err_msg, "Cannot match namelist object name %s",
2392 dtp->u.p.saved_string);
2394 goto nml_err_ret;
2397 /* Get the length, data length, base pointer and rank of the variable.
2398 Set the default loop specification first. */
2400 for (dim=0; dim < nl->var_rank; dim++)
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;
2408 /* Check to see if there is a qualifier: if so, parse it.*/
2410 if (c == '(' && nl->var_rank)
2412 if (nml_parse_qualifier (dtp, nl->dim, nl->ls, nl->var_rank,
2413 parse_err_msg) == FAILURE)
2415 st_sprintf (nml_err_msg, "%s for namelist variable %s",
2416 parse_err_msg, nl->var_name);
2417 goto nml_err_ret;
2419 c = next_char (dtp);
2420 unget_char (dtp, c);
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. */
2427 if (c == '%')
2430 if (nl->type != GFC_DTYPE_DERIVED)
2432 st_sprintf (nml_err_msg, "Attempt to get derived component for %s",
2433 nl->var_name);
2434 goto nml_err_ret;
2437 if (!component_flag)
2438 first_nl = nl;
2440 root_nl = nl;
2441 component_flag = 1;
2442 c = next_char (dtp);
2443 goto get_name;
2447 /* Parse a character qualifier, if present. chigh = 0 is a default
2448 that signals that the string length = string_length. */
2450 clow = 1;
2451 chigh = 0;
2453 if (c == '(' && nl->type == GFC_DTYPE_CHARACTER)
2455 descriptor_dimension chd[1] = { {1, clow, nl->string_length} };
2456 array_loop_spec ind[1] = { {1, clow, nl->string_length, 1} };
2458 if (nml_parse_qualifier (dtp, chd, ind, 1, parse_err_msg) == FAILURE)
2460 st_sprintf (nml_err_msg, "%s for namelist variable %s",
2461 parse_err_msg, nl->var_name);
2462 goto nml_err_ret;
2465 clow = ind[0].start;
2466 chigh = ind[0].end;
2468 if (ind[0].step != 1)
2470 st_sprintf (nml_err_msg,
2471 "Bad step in substring for namelist object %s",
2472 nl->var_name);
2473 goto nml_err_ret;
2476 c = next_char (dtp);
2477 unget_char (dtp, c);
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. */
2484 if (nl->type == GFC_DTYPE_DERIVED)
2485 nml_touch_nodes (nl);
2486 if (component_flag)
2487 nl = first_nl;
2489 /*make sure no extraneous qualifiers are there.*/
2491 if (c == '(')
2493 st_sprintf (nml_err_msg, "Qualifier for a scalar or non-character"
2494 " namelist object %s", nl->var_name);
2495 goto nml_err_ret;
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*/
2502 free_saved (dtp);
2504 eat_separator (dtp);
2505 if (dtp->u.p.input_complete)
2506 return SUCCESS;
2508 if (dtp->u.p.at_eol)
2509 finish_separator (dtp);
2510 if (dtp->u.p.input_complete)
2511 return SUCCESS;
2513 c = next_char (dtp);
2515 if (c != '=')
2517 st_sprintf (nml_err_msg, "Equal sign must follow namelist object name %s",
2518 nl->var_name);
2519 goto nml_err_ret;
2522 if (nml_read_obj (dtp, nl, 0, pprev_nl, nml_err_msg, clow, chigh) == FAILURE)
2523 goto nml_err_ret;
2525 return SUCCESS;
2527 nml_err_ret:
2529 return FAILURE;
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. */
2536 void
2537 namelist_read (st_parameter_dt *dtp)
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;
2547 dtp->u.p.namelist_mode = 1;
2548 dtp->u.p.input_complete = 0;
2549 dtp->u.p.expanded_read = 0;
2551 dtp->u.p.eof_jump = &eof_jump;
2552 if (setjmp (eof_jump))
2554 dtp->u.p.eof_jump = NULL;
2555 generate_error (&dtp->common, ERROR_END, NULL);
2556 return;
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. */
2563 find_nml_name:
2564 switch (c = next_char (dtp))
2566 case '$':
2567 case '&':
2568 break;
2570 case '!':
2571 eat_line (dtp);
2572 goto find_nml_name;
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;
2582 case '?':
2583 nml_query (dtp, '?');
2585 default:
2586 goto find_nml_name;
2589 /* Match the name of the namelist. */
2591 nml_match_name (dtp, dtp->namelist_name, dtp->namelist_name_len);
2593 if (dtp->u.p.nml_read_error)
2594 goto find_nml_name;
2596 /* Ready to read namelist objects. If there is an error in input
2597 from stdin, output the error message and continue. */
2599 while (!dtp->u.p.input_complete)
2601 if (nml_get_obj_data (dtp, &prev_nl, nml_err_msg) == FAILURE)
2603 gfc_unit *u;
2605 if (dtp->u.p.current_unit->unit_number != options.stdin_unit)
2606 goto nml_err_ret;
2608 u = find_unit (options.stderr_unit);
2609 st_printf ("%s\n", nml_err_msg);
2610 if (u != NULL)
2612 flush (u->s);
2613 unlock_unit (u);
2619 dtp->u.p.eof_jump = NULL;
2620 free_saved (dtp);
2621 free_line (dtp);
2622 return;
2624 /* All namelist error calls return from here */
2626 nml_err_ret:
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;