re PR target/91498 (STV change in r274481 causes 300.twolf regression on Haswell)
[official-gcc.git] / libgfortran / io / list_read.c
blobd9af255a03486ed3cfef99c5c52c25e04bb0f55f
1 /* Copyright (C) 2002-2019 Free Software Foundation, Inc.
2 Contributed by Andy Vaught
3 Namelist input contributed by Paul Thomas
4 F2003 I/O support contributed by Jerry DeLisle
6 This file is part of the GNU Fortran runtime library (libgfortran).
8 Libgfortran is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3, or (at your option)
11 any later version.
13 Libgfortran is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 Under Section 7 of GPL version 3, you are granted additional
19 permissions described in the GCC Runtime Library Exception, version
20 3.1, as published by the Free Software Foundation.
22 You should have received a copy of the GNU General Public License and
23 a copy of the GCC Runtime Library Exception along with this program;
24 see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
25 <http://www.gnu.org/licenses/>. */
28 #include "io.h"
29 #include "fbuf.h"
30 #include "unix.h"
31 #include <string.h>
32 #include <ctype.h>
34 typedef unsigned char uchar;
37 /* List directed input. Several parsing subroutines are practically
38 reimplemented from formatted input, the reason being that there are
39 all kinds of small differences between formatted and list directed
40 parsing. */
43 /* Subroutines for reading characters from the input. Because a
44 repeat count is ambiguous with an integer, we have to read the
45 whole digit string before seeing if there is a '*' which signals
46 the repeat count. Since we can have a lot of potential leading
47 zeros, we have to be able to back up by arbitrary amount. Because
48 the input might not be seekable, we have to buffer the data
49 ourselves. */
51 #define CASE_DIGITS case '0': case '1': case '2': case '3': case '4': \
52 case '5': case '6': case '7': case '8': case '9'
54 #define CASE_SEPARATORS /* Fall through. */ \
55 case ' ': case ',': case '/': case '\n': \
56 case '\t': case '\r': case ';'
58 /* This macro assumes that we're operating on a variable. */
60 #define is_separator(c) (c == '/' || c == ',' || c == '\n' || c == ' ' \
61 || c == '\t' || c == '\r' || c == ';' || \
62 (dtp->u.p.namelist_mode && c == '!'))
64 /* Maximum repeat count. Less than ten times the maximum signed int32. */
66 #define MAX_REPEAT 200000000
69 #define MSGLEN 100
72 /* Wrappers for calling the current worker functions. */
74 #define next_char(dtp) ((dtp)->u.p.current_unit->next_char_fn_ptr (dtp))
75 #define push_char(dtp, c) ((dtp)->u.p.current_unit->push_char_fn_ptr (dtp, c))
77 /* Worker function to save a default KIND=1 character to a string
78 buffer, enlarging it as necessary. */
80 static void
81 push_char_default (st_parameter_dt *dtp, int c)
85 if (dtp->u.p.saved_string == NULL)
87 /* Plain malloc should suffice here, zeroing not needed? */
88 dtp->u.p.saved_string = xcalloc (SCRATCH_SIZE, 1);
89 dtp->u.p.saved_length = SCRATCH_SIZE;
90 dtp->u.p.saved_used = 0;
93 if (dtp->u.p.saved_used >= dtp->u.p.saved_length)
95 dtp->u.p.saved_length = 2 * dtp->u.p.saved_length;
96 dtp->u.p.saved_string =
97 xrealloc (dtp->u.p.saved_string, dtp->u.p.saved_length);
100 dtp->u.p.saved_string[dtp->u.p.saved_used++] = (char) c;
104 /* Worker function to save a KIND=4 character to a string buffer,
105 enlarging the buffer as necessary. */
106 static void
107 push_char4 (st_parameter_dt *dtp, int c)
109 gfc_char4_t *p = (gfc_char4_t *) dtp->u.p.saved_string;
111 if (p == NULL)
113 dtp->u.p.saved_string = xcalloc (SCRATCH_SIZE, sizeof (gfc_char4_t));
114 dtp->u.p.saved_length = SCRATCH_SIZE;
115 dtp->u.p.saved_used = 0;
116 p = (gfc_char4_t *) dtp->u.p.saved_string;
119 if (dtp->u.p.saved_used >= dtp->u.p.saved_length)
121 dtp->u.p.saved_length = 2 * dtp->u.p.saved_length;
122 dtp->u.p.saved_string =
123 xrealloc (dtp->u.p.saved_string,
124 dtp->u.p.saved_length * sizeof (gfc_char4_t));
125 p = (gfc_char4_t *) dtp->u.p.saved_string;
128 p[dtp->u.p.saved_used++] = c;
132 /* Free the input buffer if necessary. */
134 static void
135 free_saved (st_parameter_dt *dtp)
137 if (dtp->u.p.saved_string == NULL)
138 return;
140 free (dtp->u.p.saved_string);
142 dtp->u.p.saved_string = NULL;
143 dtp->u.p.saved_used = 0;
147 /* Free the line buffer if necessary. */
149 static void
150 free_line (st_parameter_dt *dtp)
152 dtp->u.p.line_buffer_pos = 0;
153 dtp->u.p.line_buffer_enabled = 0;
155 if (dtp->u.p.line_buffer == NULL)
156 return;
158 free (dtp->u.p.line_buffer);
159 dtp->u.p.line_buffer = NULL;
163 /* Unget saves the last character so when reading the next character,
164 we need to check to see if there is a character waiting. Similar,
165 if the line buffer is being used to read_logical, check it too. */
167 static int
168 check_buffers (st_parameter_dt *dtp)
170 int c;
172 c = '\0';
173 if (dtp->u.p.current_unit->last_char != EOF - 1)
175 dtp->u.p.at_eol = 0;
176 c = dtp->u.p.current_unit->last_char;
177 dtp->u.p.current_unit->last_char = EOF - 1;
178 goto done;
181 /* Read from line_buffer if enabled. */
183 if (dtp->u.p.line_buffer_enabled)
185 dtp->u.p.at_eol = 0;
187 c = dtp->u.p.line_buffer[dtp->u.p.line_buffer_pos];
188 if (c != '\0' && dtp->u.p.line_buffer_pos < 64)
190 dtp->u.p.line_buffer[dtp->u.p.line_buffer_pos] = '\0';
191 dtp->u.p.line_buffer_pos++;
192 goto done;
195 dtp->u.p.line_buffer_pos = 0;
196 dtp->u.p.line_buffer_enabled = 0;
199 done:
200 dtp->u.p.at_eol = (c == '\n' || c == '\r' || c == EOF);
201 return c;
205 /* Worker function for default character encoded file. */
206 static int
207 next_char_default (st_parameter_dt *dtp)
209 int c;
211 /* Always check the unget and line buffer first. */
212 if ((c = check_buffers (dtp)))
213 return c;
215 c = fbuf_getc (dtp->u.p.current_unit);
216 if (c != EOF && is_stream_io (dtp))
217 dtp->u.p.current_unit->strm_pos++;
219 dtp->u.p.at_eol = (c == '\n' || c == EOF);
220 return c;
224 /* Worker function for internal and array I/O units. */
225 static int
226 next_char_internal (st_parameter_dt *dtp)
228 ssize_t length;
229 gfc_offset record;
230 int c;
232 /* Always check the unget and line buffer first. */
233 if ((c = check_buffers (dtp)))
234 return c;
236 /* Handle the end-of-record and end-of-file conditions for
237 internal array unit. */
238 if (is_array_io (dtp))
240 if (dtp->u.p.at_eof)
241 return EOF;
243 /* Check for "end-of-record" condition. */
244 if (dtp->u.p.current_unit->bytes_left == 0)
246 int finished;
248 c = '\n';
249 record = next_array_record (dtp, dtp->u.p.current_unit->ls,
250 &finished);
252 /* Check for "end-of-file" condition. */
253 if (finished)
255 dtp->u.p.at_eof = 1;
256 goto done;
259 record *= dtp->u.p.current_unit->recl;
260 if (sseek (dtp->u.p.current_unit->s, record, SEEK_SET) < 0)
261 return EOF;
263 dtp->u.p.current_unit->bytes_left = dtp->u.p.current_unit->recl;
264 goto done;
268 /* Get the next character and handle end-of-record conditions. */
269 if (likely (dtp->u.p.current_unit->bytes_left > 0))
271 if (unlikely (is_char4_unit(dtp))) /* Check for kind=4 internal unit. */
272 length = sread (dtp->u.p.current_unit->s, &c, 1);
273 else
275 char cc;
276 length = sread (dtp->u.p.current_unit->s, &cc, 1);
277 c = cc;
280 else
281 length = 0;
283 if (unlikely (length < 0))
285 generate_error (&dtp->common, LIBERROR_OS, NULL);
286 return '\0';
289 if (is_array_io (dtp))
291 /* Check whether we hit EOF. */
292 if (unlikely (length == 0))
294 generate_error (&dtp->common, LIBERROR_INTERNAL_UNIT, NULL);
295 return '\0';
298 else
300 if (dtp->u.p.at_eof)
301 return EOF;
302 if (length == 0)
304 c = '\n';
305 dtp->u.p.at_eof = 1;
308 dtp->u.p.current_unit->bytes_left--;
310 done:
311 dtp->u.p.at_eol = (c == '\n' || c == EOF);
312 return c;
316 /* Worker function for UTF encoded files. */
317 static int
318 next_char_utf8 (st_parameter_dt *dtp)
320 static const uchar masks[6] = { 0x7F, 0x1F, 0x0F, 0x07, 0x02, 0x01 };
321 static const uchar patns[6] = { 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC };
322 int i, nb;
323 gfc_char4_t c;
325 /* Always check the unget and line buffer first. */
326 if (!(c = check_buffers (dtp)))
327 c = fbuf_getc (dtp->u.p.current_unit);
329 if (c < 0x80)
330 goto utf_done;
332 /* The number of leading 1-bits in the first byte indicates how many
333 bytes follow. */
334 for (nb = 2; nb < 7; nb++)
335 if ((c & ~masks[nb-1]) == patns[nb-1])
336 goto found;
337 goto invalid;
339 found:
340 c = (c & masks[nb-1]);
342 /* Decode the bytes read. */
343 for (i = 1; i < nb; i++)
345 gfc_char4_t n = fbuf_getc (dtp->u.p.current_unit);
346 if ((n & 0xC0) != 0x80)
347 goto invalid;
348 c = ((c << 6) + (n & 0x3F));
351 /* Make sure the shortest possible encoding was used. */
352 if (c <= 0x7F && nb > 1) goto invalid;
353 if (c <= 0x7FF && nb > 2) goto invalid;
354 if (c <= 0xFFFF && nb > 3) goto invalid;
355 if (c <= 0x1FFFFF && nb > 4) goto invalid;
356 if (c <= 0x3FFFFFF && nb > 5) goto invalid;
358 /* Make sure the character is valid. */
359 if (c > 0x7FFFFFFF || (c >= 0xD800 && c <= 0xDFFF))
360 goto invalid;
362 utf_done:
363 dtp->u.p.at_eol = (c == '\n' || c == (gfc_char4_t) EOF);
364 return (int) c;
366 invalid:
367 generate_error (&dtp->common, LIBERROR_READ_VALUE, "Invalid UTF-8 encoding");
368 return (gfc_char4_t) '?';
371 /* Push a character back onto the input. */
373 static void
374 unget_char (st_parameter_dt *dtp, int c)
376 dtp->u.p.current_unit->last_char = c;
380 /* Skip over spaces in the input. Returns the nonspace character that
381 terminated the eating and also places it back on the input. */
383 static int
384 eat_spaces (st_parameter_dt *dtp)
386 int c;
388 /* If internal character array IO, peak ahead and seek past spaces.
389 This is an optimization unique to character arrays with large
390 character lengths (PR38199). This code eliminates numerous calls
391 to next_character. */
392 if (is_array_io (dtp) && (dtp->u.p.current_unit->last_char == EOF - 1))
394 gfc_offset offset = stell (dtp->u.p.current_unit->s);
395 gfc_offset i;
397 if (is_char4_unit(dtp)) /* kind=4 */
399 for (i = 0; i < dtp->u.p.current_unit->bytes_left; i++)
401 if (dtp->internal_unit[(offset + i) * sizeof (gfc_char4_t)]
402 != (gfc_char4_t)' ')
403 break;
406 else
408 for (i = 0; i < dtp->u.p.current_unit->bytes_left; i++)
410 if (dtp->internal_unit[offset + i] != ' ')
411 break;
415 if (i != 0)
417 sseek (dtp->u.p.current_unit->s, offset + i, SEEK_SET);
418 dtp->u.p.current_unit->bytes_left -= i;
422 /* Now skip spaces, EOF and EOL are handled in next_char. */
424 c = next_char (dtp);
425 while (c != EOF && (c == ' ' || c == '\r' || c == '\t'));
427 unget_char (dtp, c);
428 return c;
432 /* This function reads characters through to the end of the current
433 line and just ignores them. Returns 0 for success and LIBERROR_END
434 if it hit EOF. */
436 static int
437 eat_line (st_parameter_dt *dtp)
439 int c;
442 c = next_char (dtp);
443 while (c != EOF && c != '\n');
444 if (c == EOF)
445 return LIBERROR_END;
446 return 0;
450 /* Skip over a separator. Technically, we don't always eat the whole
451 separator. This is because if we've processed the last input item,
452 then a separator is unnecessary. Plus the fact that operating
453 systems usually deliver console input on a line basis.
455 The upshot is that if we see a newline as part of reading a
456 separator, we stop reading. If there are more input items, we
457 continue reading the separator with finish_separator() which takes
458 care of the fact that we may or may not have seen a comma as part
459 of the separator.
461 Returns 0 for success, and non-zero error code otherwise. */
463 static int
464 eat_separator (st_parameter_dt *dtp)
466 int c, n;
467 int err = 0;
469 eat_spaces (dtp);
470 dtp->u.p.comma_flag = 0;
472 if ((c = next_char (dtp)) == EOF)
473 return LIBERROR_END;
474 switch (c)
476 case ',':
477 if (dtp->u.p.current_unit->decimal_status == DECIMAL_COMMA)
479 unget_char (dtp, c);
480 break;
482 /* Fall through. */
483 case ';':
484 dtp->u.p.comma_flag = 1;
485 eat_spaces (dtp);
486 break;
488 case '/':
489 dtp->u.p.input_complete = 1;
490 break;
492 case '\r':
493 if ((n = next_char(dtp)) == EOF)
494 return LIBERROR_END;
495 if (n != '\n')
497 unget_char (dtp, n);
498 break;
500 /* Fall through. */
501 case '\n':
502 dtp->u.p.at_eol = 1;
503 if (dtp->u.p.namelist_mode)
507 if ((c = next_char (dtp)) == EOF)
508 return LIBERROR_END;
509 if (c == '!')
511 err = eat_line (dtp);
512 if (err)
513 return err;
514 c = '\n';
517 while (c == '\n' || c == '\r' || c == ' ' || c == '\t');
518 unget_char (dtp, c);
520 break;
522 case '!':
523 /* Eat a namelist comment. */
524 if (dtp->u.p.namelist_mode)
526 err = eat_line (dtp);
527 if (err)
528 return err;
530 break;
533 /* Fall Through... */
535 default:
536 unget_char (dtp, c);
537 break;
539 return err;
543 /* Finish processing a separator that was interrupted by a newline.
544 If we're here, then another data item is present, so we finish what
545 we started on the previous line. Return 0 on success, error code
546 on failure. */
548 static int
549 finish_separator (st_parameter_dt *dtp)
551 int c;
552 int err = LIBERROR_OK;
554 restart:
555 eat_spaces (dtp);
557 if ((c = next_char (dtp)) == EOF)
558 return LIBERROR_END;
559 switch (c)
561 case ',':
562 if (dtp->u.p.comma_flag)
563 unget_char (dtp, c);
564 else
566 if ((c = eat_spaces (dtp)) == EOF)
567 return LIBERROR_END;
568 if (c == '\n' || c == '\r')
569 goto restart;
572 break;
574 case '/':
575 dtp->u.p.input_complete = 1;
576 if (!dtp->u.p.namelist_mode)
577 return err;
578 break;
580 case '\n':
581 case '\r':
582 goto restart;
584 case '!':
585 if (dtp->u.p.namelist_mode)
587 err = eat_line (dtp);
588 if (err)
589 return err;
590 goto restart;
592 /* Fall through. */
593 default:
594 unget_char (dtp, c);
595 break;
597 return err;
601 /* This function is needed to catch bad conversions so that namelist can
602 attempt to see if dtp->u.p.saved_string contains a new object name rather
603 than a bad value. */
605 static int
606 nml_bad_return (st_parameter_dt *dtp, char c)
608 if (dtp->u.p.namelist_mode)
610 dtp->u.p.nml_read_error = 1;
611 unget_char (dtp, c);
612 return 1;
614 return 0;
617 /* Convert an unsigned string to an integer. The length value is -1
618 if we are working on a repeat count. Returns nonzero if we have a
619 range problem. As a side effect, frees the dtp->u.p.saved_string. */
621 static int
622 convert_integer (st_parameter_dt *dtp, int length, int negative)
624 char c, *buffer, message[MSGLEN];
625 int m;
626 GFC_UINTEGER_LARGEST v, max, max10;
627 GFC_INTEGER_LARGEST value;
629 buffer = dtp->u.p.saved_string;
630 v = 0;
632 if (length == -1)
633 max = MAX_REPEAT;
634 else
636 max = si_max (length);
637 if (negative)
638 max++;
640 max10 = max / 10;
642 for (;;)
644 c = *buffer++;
645 if (c == '\0')
646 break;
647 c -= '0';
649 if (v > max10)
650 goto overflow;
651 v = 10 * v;
653 if (v > max - c)
654 goto overflow;
655 v += c;
658 m = 0;
660 if (length != -1)
662 if (negative)
663 value = -v;
664 else
665 value = v;
666 set_integer (dtp->u.p.value, value, length);
668 else
670 dtp->u.p.repeat_count = v;
672 if (dtp->u.p.repeat_count == 0)
674 snprintf (message, MSGLEN, "Zero repeat count in item %d of list input",
675 dtp->u.p.item_count);
677 generate_error (&dtp->common, LIBERROR_READ_VALUE, message);
678 m = 1;
682 free_saved (dtp);
683 return m;
685 overflow:
686 if (length == -1)
687 snprintf (message, MSGLEN, "Repeat count overflow in item %d of list input",
688 dtp->u.p.item_count);
689 else
690 snprintf (message, MSGLEN, "Integer overflow while reading item %d",
691 dtp->u.p.item_count);
693 free_saved (dtp);
694 generate_error (&dtp->common, LIBERROR_READ_VALUE, message);
696 return 1;
700 /* Parse a repeat count for logical and complex values which cannot
701 begin with a digit. Returns nonzero if we are done, zero if we
702 should continue on. */
704 static int
705 parse_repeat (st_parameter_dt *dtp)
707 char message[MSGLEN];
708 int c, repeat;
710 if ((c = next_char (dtp)) == EOF)
711 goto bad_repeat;
712 switch (c)
714 CASE_DIGITS:
715 repeat = c - '0';
716 break;
718 CASE_SEPARATORS:
719 unget_char (dtp, c);
720 eat_separator (dtp);
721 return 1;
723 default:
724 unget_char (dtp, c);
725 return 0;
728 for (;;)
730 c = next_char (dtp);
731 switch (c)
733 CASE_DIGITS:
734 repeat = 10 * repeat + c - '0';
736 if (repeat > MAX_REPEAT)
738 snprintf (message, MSGLEN,
739 "Repeat count overflow in item %d of list input",
740 dtp->u.p.item_count);
742 generate_error (&dtp->common, LIBERROR_READ_VALUE, message);
743 return 1;
746 break;
748 case '*':
749 if (repeat == 0)
751 snprintf (message, MSGLEN,
752 "Zero repeat count in item %d of list input",
753 dtp->u.p.item_count);
755 generate_error (&dtp->common, LIBERROR_READ_VALUE, message);
756 return 1;
759 goto done;
761 default:
762 goto bad_repeat;
766 done:
767 dtp->u.p.repeat_count = repeat;
768 return 0;
770 bad_repeat:
772 free_saved (dtp);
773 if (c == EOF)
775 free_line (dtp);
776 hit_eof (dtp);
777 return 1;
779 else
780 eat_line (dtp);
781 snprintf (message, MSGLEN, "Bad repeat count in item %d of list input",
782 dtp->u.p.item_count);
783 generate_error (&dtp->common, LIBERROR_READ_VALUE, message);
784 return 1;
788 /* To read a logical we have to look ahead in the input stream to make sure
789 there is not an equal sign indicating a variable name. To do this we use
790 line_buffer to point to a temporary buffer, pushing characters there for
791 possible later reading. */
793 static void
794 l_push_char (st_parameter_dt *dtp, char c)
796 if (dtp->u.p.line_buffer == NULL)
797 dtp->u.p.line_buffer = xcalloc (SCRATCH_SIZE, 1);
799 dtp->u.p.line_buffer[dtp->u.p.line_buffer_pos++] = c;
803 /* Read a logical character on the input. */
805 static void
806 read_logical (st_parameter_dt *dtp, int length)
808 char message[MSGLEN];
809 int c, i, v;
811 if (parse_repeat (dtp))
812 return;
814 c = tolower (next_char (dtp));
815 l_push_char (dtp, c);
816 switch (c)
818 case 't':
819 v = 1;
820 c = next_char (dtp);
821 l_push_char (dtp, c);
823 if (!is_separator(c) && c != EOF)
824 goto possible_name;
826 unget_char (dtp, c);
827 break;
828 case 'f':
829 v = 0;
830 c = next_char (dtp);
831 l_push_char (dtp, c);
833 if (!is_separator(c) && c != EOF)
834 goto possible_name;
836 unget_char (dtp, c);
837 break;
839 case '.':
840 c = tolower (next_char (dtp));
841 switch (c)
843 case 't':
844 v = 1;
845 break;
846 case 'f':
847 v = 0;
848 break;
849 default:
850 goto bad_logical;
853 break;
855 case '!':
856 if (!dtp->u.p.namelist_mode)
857 goto bad_logical;
859 CASE_SEPARATORS:
860 case EOF:
861 unget_char (dtp, c);
862 eat_separator (dtp);
863 return; /* Null value. */
865 default:
866 /* Save the character in case it is the beginning
867 of the next object name. */
868 unget_char (dtp, c);
869 goto bad_logical;
872 dtp->u.p.saved_type = BT_LOGICAL;
873 dtp->u.p.saved_length = length;
875 /* Eat trailing garbage. */
877 c = next_char (dtp);
878 while (c != EOF && !is_separator (c));
880 unget_char (dtp, c);
881 eat_separator (dtp);
882 set_integer ((int *) dtp->u.p.value, v, length);
883 free_line (dtp);
885 return;
887 possible_name:
889 for(i = 0; i < 63; i++)
891 c = next_char (dtp);
892 if (is_separator(c))
894 /* All done if this is not a namelist read. */
895 if (!dtp->u.p.namelist_mode)
896 goto logical_done;
898 unget_char (dtp, c);
899 eat_separator (dtp);
900 c = next_char (dtp);
901 if (c != '=')
903 unget_char (dtp, c);
904 goto logical_done;
908 l_push_char (dtp, c);
909 if (c == '=')
911 dtp->u.p.nml_read_error = 1;
912 dtp->u.p.line_buffer_enabled = 1;
913 dtp->u.p.line_buffer_pos = 0;
914 return;
919 bad_logical:
921 if (nml_bad_return (dtp, c))
923 free_line (dtp);
924 return;
928 free_saved (dtp);
929 if (c == EOF)
931 free_line (dtp);
932 hit_eof (dtp);
933 return;
935 else if (c != '\n')
936 eat_line (dtp);
937 snprintf (message, MSGLEN, "Bad logical value while reading item %d",
938 dtp->u.p.item_count);
939 free_line (dtp);
940 generate_error (&dtp->common, LIBERROR_READ_VALUE, message);
941 return;
943 logical_done:
945 dtp->u.p.saved_type = BT_LOGICAL;
946 dtp->u.p.saved_length = length;
947 set_integer ((int *) dtp->u.p.value, v, length);
948 free_saved (dtp);
949 free_line (dtp);
953 /* Reading integers is tricky because we can actually be reading a
954 repeat count. We have to store the characters in a buffer because
955 we could be reading an integer that is larger than the default int
956 used for repeat counts. */
958 static void
959 read_integer (st_parameter_dt *dtp, int length)
961 char message[MSGLEN];
962 int c, negative;
964 negative = 0;
966 c = next_char (dtp);
967 switch (c)
969 case '-':
970 negative = 1;
971 /* Fall through... */
973 case '+':
974 if ((c = next_char (dtp)) == EOF)
975 goto bad_integer;
976 goto get_integer;
978 case '!':
979 if (!dtp->u.p.namelist_mode)
980 goto bad_integer;
982 CASE_SEPARATORS: /* Single null. */
983 unget_char (dtp, c);
984 eat_separator (dtp);
985 return;
987 CASE_DIGITS:
988 push_char (dtp, c);
989 break;
991 default:
992 goto bad_integer;
995 /* Take care of what may be a repeat count. */
997 for (;;)
999 c = next_char (dtp);
1000 switch (c)
1002 CASE_DIGITS:
1003 push_char (dtp, c);
1004 break;
1006 case '*':
1007 push_char (dtp, '\0');
1008 goto repeat;
1010 case '!':
1011 if (!dtp->u.p.namelist_mode)
1012 goto bad_integer;
1014 CASE_SEPARATORS: /* Not a repeat count. */
1015 case EOF:
1016 goto done;
1018 default:
1019 goto bad_integer;
1023 repeat:
1024 if (convert_integer (dtp, -1, 0))
1025 return;
1027 /* Get the real integer. */
1029 if ((c = next_char (dtp)) == EOF)
1030 goto bad_integer;
1031 switch (c)
1033 CASE_DIGITS:
1034 break;
1036 case '!':
1037 if (!dtp->u.p.namelist_mode)
1038 goto bad_integer;
1040 CASE_SEPARATORS:
1041 unget_char (dtp, c);
1042 eat_separator (dtp);
1043 return;
1045 case '-':
1046 negative = 1;
1047 /* Fall through... */
1049 case '+':
1050 c = next_char (dtp);
1051 break;
1054 get_integer:
1055 if (!isdigit (c))
1056 goto bad_integer;
1057 push_char (dtp, c);
1059 for (;;)
1061 c = next_char (dtp);
1062 switch (c)
1064 CASE_DIGITS:
1065 push_char (dtp, c);
1066 break;
1068 case '!':
1069 if (!dtp->u.p.namelist_mode)
1070 goto bad_integer;
1072 CASE_SEPARATORS:
1073 case EOF:
1074 goto done;
1076 default:
1077 goto bad_integer;
1081 bad_integer:
1083 if (nml_bad_return (dtp, c))
1084 return;
1086 free_saved (dtp);
1087 if (c == EOF)
1089 free_line (dtp);
1090 hit_eof (dtp);
1091 return;
1093 else if (c != '\n')
1094 eat_line (dtp);
1096 snprintf (message, MSGLEN, "Bad integer for item %d in list input",
1097 dtp->u.p.item_count);
1098 free_line (dtp);
1099 generate_error (&dtp->common, LIBERROR_READ_VALUE, message);
1101 return;
1103 done:
1104 unget_char (dtp, c);
1105 eat_separator (dtp);
1107 push_char (dtp, '\0');
1108 if (convert_integer (dtp, length, negative))
1110 free_saved (dtp);
1111 return;
1114 free_saved (dtp);
1115 dtp->u.p.saved_type = BT_INTEGER;
1119 /* Read a character variable. */
1121 static void
1122 read_character (st_parameter_dt *dtp, int length __attribute__ ((unused)))
1124 char quote, message[MSGLEN];
1125 int c;
1127 quote = ' '; /* Space means no quote character. */
1129 if ((c = next_char (dtp)) == EOF)
1130 goto eof;
1131 switch (c)
1133 CASE_DIGITS:
1134 push_char (dtp, c);
1135 break;
1137 CASE_SEPARATORS:
1138 case EOF:
1139 unget_char (dtp, c); /* NULL value. */
1140 eat_separator (dtp);
1141 return;
1143 case '"':
1144 case '\'':
1145 quote = c;
1146 goto get_string;
1148 default:
1149 if (dtp->u.p.namelist_mode)
1151 unget_char (dtp, c);
1152 return;
1154 push_char (dtp, c);
1155 goto get_string;
1158 /* Deal with a possible repeat count. */
1160 for (;;)
1162 c = next_char (dtp);
1163 switch (c)
1165 CASE_DIGITS:
1166 push_char (dtp, c);
1167 break;
1169 CASE_SEPARATORS:
1170 case EOF:
1171 unget_char (dtp, c);
1172 goto done; /* String was only digits! */
1174 case '*':
1175 push_char (dtp, '\0');
1176 goto got_repeat;
1178 default:
1179 push_char (dtp, c);
1180 goto get_string; /* Not a repeat count after all. */
1184 got_repeat:
1185 if (convert_integer (dtp, -1, 0))
1186 return;
1188 /* Now get the real string. */
1190 if ((c = next_char (dtp)) == EOF)
1191 goto eof;
1192 switch (c)
1194 CASE_SEPARATORS:
1195 unget_char (dtp, c); /* Repeated NULL values. */
1196 eat_separator (dtp);
1197 return;
1199 case '"':
1200 case '\'':
1201 quote = c;
1202 break;
1204 default:
1205 push_char (dtp, c);
1206 break;
1209 get_string:
1211 for (;;)
1213 if ((c = next_char (dtp)) == EOF)
1214 goto done_eof;
1215 switch (c)
1217 case '"':
1218 case '\'':
1219 if (c != quote)
1221 push_char (dtp, c);
1222 break;
1225 /* See if we have a doubled quote character or the end of
1226 the string. */
1228 if ((c = next_char (dtp)) == EOF)
1229 goto done_eof;
1230 if (c == quote)
1232 push_char (dtp, quote);
1233 break;
1236 unget_char (dtp, c);
1237 goto done;
1239 CASE_SEPARATORS:
1240 if (quote == ' ')
1242 unget_char (dtp, c);
1243 goto done;
1246 if (c != '\n' && c != '\r')
1247 push_char (dtp, c);
1248 break;
1250 default:
1251 push_char (dtp, c);
1252 break;
1256 /* At this point, we have to have a separator, or else the string is
1257 invalid. */
1258 done:
1259 c = next_char (dtp);
1260 done_eof:
1261 if (is_separator (c) || c == EOF)
1263 unget_char (dtp, c);
1264 eat_separator (dtp);
1265 dtp->u.p.saved_type = BT_CHARACTER;
1267 else
1269 free_saved (dtp);
1270 snprintf (message, MSGLEN, "Invalid string input in item %d",
1271 dtp->u.p.item_count);
1272 generate_error (&dtp->common, LIBERROR_READ_VALUE, message);
1274 free_line (dtp);
1275 return;
1277 eof:
1278 free_saved (dtp);
1279 free_line (dtp);
1280 hit_eof (dtp);
1284 /* Parse a component of a complex constant or a real number that we
1285 are sure is already there. This is a straight real number parser. */
1287 static int
1288 parse_real (st_parameter_dt *dtp, void *buffer, int length)
1290 char message[MSGLEN];
1291 int c, m, seen_dp;
1293 if ((c = next_char (dtp)) == EOF)
1294 goto bad;
1296 if (c == '-' || c == '+')
1298 push_char (dtp, c);
1299 if ((c = next_char (dtp)) == EOF)
1300 goto bad;
1303 if (c == ',' && dtp->u.p.current_unit->decimal_status == DECIMAL_COMMA)
1304 c = '.';
1306 if (!isdigit (c) && c != '.')
1308 if (c == 'i' || c == 'I' || c == 'n' || c == 'N')
1309 goto inf_nan;
1310 else
1311 goto bad;
1314 push_char (dtp, c);
1316 seen_dp = (c == '.') ? 1 : 0;
1318 for (;;)
1320 if ((c = next_char (dtp)) == EOF)
1321 goto bad;
1322 if (c == ',' && dtp->u.p.current_unit->decimal_status == DECIMAL_COMMA)
1323 c = '.';
1324 switch (c)
1326 CASE_DIGITS:
1327 push_char (dtp, c);
1328 break;
1330 case '.':
1331 if (seen_dp)
1332 goto bad;
1334 seen_dp = 1;
1335 push_char (dtp, c);
1336 break;
1338 case 'e':
1339 case 'E':
1340 case 'd':
1341 case 'D':
1342 case 'q':
1343 case 'Q':
1344 push_char (dtp, 'e');
1345 goto exp1;
1347 case '-':
1348 case '+':
1349 push_char (dtp, 'e');
1350 push_char (dtp, c);
1351 if ((c = next_char (dtp)) == EOF)
1352 goto bad;
1353 goto exp2;
1355 case '!':
1356 if (!dtp->u.p.namelist_mode)
1357 goto bad;
1359 CASE_SEPARATORS:
1360 case EOF:
1361 goto done;
1363 default:
1364 goto done;
1368 exp1:
1369 if ((c = next_char (dtp)) == EOF)
1370 goto bad;
1371 if (c != '-' && c != '+')
1372 push_char (dtp, '+');
1373 else
1375 push_char (dtp, c);
1376 c = next_char (dtp);
1379 exp2:
1380 if (!isdigit (c))
1382 /* Extension: allow default exponent of 0 when omitted. */
1383 if (dtp->common.flags & IOPARM_DT_DEC_EXT)
1385 push_char (dtp, '0');
1386 goto done;
1388 else
1389 goto bad_exponent;
1392 push_char (dtp, c);
1394 for (;;)
1396 if ((c = next_char (dtp)) == EOF)
1397 goto bad;
1398 switch (c)
1400 CASE_DIGITS:
1401 push_char (dtp, c);
1402 break;
1404 case '!':
1405 if (!dtp->u.p.namelist_mode)
1406 goto bad;
1408 CASE_SEPARATORS:
1409 case EOF:
1410 unget_char (dtp, c);
1411 goto done;
1413 default:
1414 goto done;
1418 done:
1419 unget_char (dtp, c);
1420 push_char (dtp, '\0');
1422 m = convert_real (dtp, buffer, dtp->u.p.saved_string, length);
1423 free_saved (dtp);
1425 return m;
1427 done_infnan:
1428 unget_char (dtp, c);
1429 push_char (dtp, '\0');
1431 m = convert_infnan (dtp, buffer, dtp->u.p.saved_string, length);
1432 free_saved (dtp);
1434 return m;
1436 inf_nan:
1437 /* Match INF and Infinity. */
1438 if ((c == 'i' || c == 'I')
1439 && ((c = next_char (dtp)) == 'n' || c == 'N')
1440 && ((c = next_char (dtp)) == 'f' || c == 'F'))
1442 c = next_char (dtp);
1443 if ((c != 'i' && c != 'I')
1444 || ((c == 'i' || c == 'I')
1445 && ((c = next_char (dtp)) == 'n' || c == 'N')
1446 && ((c = next_char (dtp)) == 'i' || c == 'I')
1447 && ((c = next_char (dtp)) == 't' || c == 'T')
1448 && ((c = next_char (dtp)) == 'y' || c == 'Y')
1449 && (c = next_char (dtp))))
1451 if (is_separator (c) || (c == EOF))
1452 unget_char (dtp, c);
1453 push_char (dtp, 'i');
1454 push_char (dtp, 'n');
1455 push_char (dtp, 'f');
1456 goto done_infnan;
1458 } /* Match NaN. */
1459 else if (((c = next_char (dtp)) == 'a' || c == 'A')
1460 && ((c = next_char (dtp)) == 'n' || c == 'N')
1461 && (c = next_char (dtp)))
1463 if (is_separator (c) || (c == EOF))
1464 unget_char (dtp, c);
1465 push_char (dtp, 'n');
1466 push_char (dtp, 'a');
1467 push_char (dtp, 'n');
1469 /* Match "NAN(alphanum)". */
1470 if (c == '(')
1472 for ( ; c != ')'; c = next_char (dtp))
1473 if (is_separator (c))
1474 goto bad;
1476 c = next_char (dtp);
1477 if (is_separator (c) || (c == EOF))
1478 unget_char (dtp, c);
1480 goto done_infnan;
1483 bad:
1485 if (nml_bad_return (dtp, c))
1486 return 0;
1488 bad_exponent:
1490 free_saved (dtp);
1491 if (c == EOF)
1493 free_line (dtp);
1494 hit_eof (dtp);
1495 return 1;
1497 else if (c != '\n')
1498 eat_line (dtp);
1500 snprintf (message, MSGLEN, "Bad complex floating point "
1501 "number for item %d", dtp->u.p.item_count);
1502 free_line (dtp);
1503 generate_error (&dtp->common, LIBERROR_READ_VALUE, message);
1505 return 1;
1509 /* Reading a complex number is straightforward because we can tell
1510 what it is right away. */
1512 static void
1513 read_complex (st_parameter_dt *dtp, void *dest, int kind, size_t size)
1515 char message[MSGLEN];
1516 int c;
1518 if (parse_repeat (dtp))
1519 return;
1521 c = next_char (dtp);
1522 switch (c)
1524 case '(':
1525 break;
1527 case '!':
1528 if (!dtp->u.p.namelist_mode)
1529 goto bad_complex;
1531 CASE_SEPARATORS:
1532 case EOF:
1533 unget_char (dtp, c);
1534 eat_separator (dtp);
1535 return;
1537 default:
1538 goto bad_complex;
1541 eol_1:
1542 eat_spaces (dtp);
1543 c = next_char (dtp);
1544 if (c == '\n' || c== '\r')
1545 goto eol_1;
1546 else
1547 unget_char (dtp, c);
1549 if (parse_real (dtp, dest, kind))
1550 return;
1552 eol_2:
1553 eat_spaces (dtp);
1554 c = next_char (dtp);
1555 if (c == '\n' || c== '\r')
1556 goto eol_2;
1557 else
1558 unget_char (dtp, c);
1560 if (next_char (dtp)
1561 != (dtp->u.p.current_unit->decimal_status == DECIMAL_POINT ? ',' : ';'))
1562 goto bad_complex;
1564 eol_3:
1565 eat_spaces (dtp);
1566 c = next_char (dtp);
1567 if (c == '\n' || c== '\r')
1568 goto eol_3;
1569 else
1570 unget_char (dtp, c);
1572 if (parse_real (dtp, dest + size / 2, kind))
1573 return;
1575 eol_4:
1576 eat_spaces (dtp);
1577 c = next_char (dtp);
1578 if (c == '\n' || c== '\r')
1579 goto eol_4;
1580 else
1581 unget_char (dtp, c);
1583 if (next_char (dtp) != ')')
1584 goto bad_complex;
1586 c = next_char (dtp);
1587 if (!is_separator (c) && (c != EOF))
1588 goto bad_complex;
1590 unget_char (dtp, c);
1591 eat_separator (dtp);
1593 free_saved (dtp);
1594 dtp->u.p.saved_type = BT_COMPLEX;
1595 return;
1597 bad_complex:
1599 if (nml_bad_return (dtp, c))
1600 return;
1602 free_saved (dtp);
1603 if (c == EOF)
1605 free_line (dtp);
1606 hit_eof (dtp);
1607 return;
1609 else if (c != '\n')
1610 eat_line (dtp);
1612 snprintf (message, MSGLEN, "Bad complex value in item %d of list input",
1613 dtp->u.p.item_count);
1614 free_line (dtp);
1615 generate_error (&dtp->common, LIBERROR_READ_VALUE, message);
1619 /* Parse a real number with a possible repeat count. */
1621 static void
1622 read_real (st_parameter_dt *dtp, void *dest, int length)
1624 char message[MSGLEN];
1625 int c;
1626 int seen_dp;
1627 int is_inf;
1629 seen_dp = 0;
1631 c = next_char (dtp);
1632 if (c == ',' && dtp->u.p.current_unit->decimal_status == DECIMAL_COMMA)
1633 c = '.';
1634 switch (c)
1636 CASE_DIGITS:
1637 push_char (dtp, c);
1638 break;
1640 case '.':
1641 push_char (dtp, c);
1642 seen_dp = 1;
1643 break;
1645 case '+':
1646 case '-':
1647 goto got_sign;
1649 case '!':
1650 if (!dtp->u.p.namelist_mode)
1651 goto bad_real;
1653 CASE_SEPARATORS:
1654 unget_char (dtp, c); /* Single null. */
1655 eat_separator (dtp);
1656 return;
1658 case 'i':
1659 case 'I':
1660 case 'n':
1661 case 'N':
1662 goto inf_nan;
1664 default:
1665 goto bad_real;
1668 /* Get the digit string that might be a repeat count. */
1670 for (;;)
1672 c = next_char (dtp);
1673 if (c == ',' && dtp->u.p.current_unit->decimal_status == DECIMAL_COMMA)
1674 c = '.';
1675 switch (c)
1677 CASE_DIGITS:
1678 push_char (dtp, c);
1679 break;
1681 case '.':
1682 if (seen_dp)
1683 goto bad_real;
1685 seen_dp = 1;
1686 push_char (dtp, c);
1687 goto real_loop;
1689 case 'E':
1690 case 'e':
1691 case 'D':
1692 case 'd':
1693 case 'Q':
1694 case 'q':
1695 goto exp1;
1697 case '+':
1698 case '-':
1699 push_char (dtp, 'e');
1700 push_char (dtp, c);
1701 c = next_char (dtp);
1702 goto exp2;
1704 case '*':
1705 push_char (dtp, '\0');
1706 goto got_repeat;
1708 case '!':
1709 if (!dtp->u.p.namelist_mode)
1710 goto bad_real;
1712 CASE_SEPARATORS:
1713 case EOF:
1714 if (c != '\n' && c != ',' && c != '\r' && c != ';')
1715 unget_char (dtp, c);
1716 goto done;
1718 default:
1719 goto bad_real;
1723 got_repeat:
1724 if (convert_integer (dtp, -1, 0))
1725 return;
1727 /* Now get the number itself. */
1729 if ((c = next_char (dtp)) == EOF)
1730 goto bad_real;
1731 if (is_separator (c))
1732 { /* Repeated null value. */
1733 unget_char (dtp, c);
1734 eat_separator (dtp);
1735 return;
1738 if (c != '-' && c != '+')
1739 push_char (dtp, '+');
1740 else
1742 got_sign:
1743 push_char (dtp, c);
1744 if ((c = next_char (dtp)) == EOF)
1745 goto bad_real;
1748 if (c == ',' && dtp->u.p.current_unit->decimal_status == DECIMAL_COMMA)
1749 c = '.';
1751 if (!isdigit (c) && c != '.')
1753 if (c == 'i' || c == 'I' || c == 'n' || c == 'N')
1754 goto inf_nan;
1755 else
1756 goto bad_real;
1759 if (c == '.')
1761 if (seen_dp)
1762 goto bad_real;
1763 else
1764 seen_dp = 1;
1767 push_char (dtp, c);
1769 real_loop:
1770 for (;;)
1772 c = next_char (dtp);
1773 if (c == ',' && dtp->u.p.current_unit->decimal_status == DECIMAL_COMMA)
1774 c = '.';
1775 switch (c)
1777 CASE_DIGITS:
1778 push_char (dtp, c);
1779 break;
1781 case '!':
1782 if (!dtp->u.p.namelist_mode)
1783 goto bad_real;
1785 CASE_SEPARATORS:
1786 case EOF:
1787 goto done;
1789 case '.':
1790 if (seen_dp)
1791 goto bad_real;
1793 seen_dp = 1;
1794 push_char (dtp, c);
1795 break;
1797 case 'E':
1798 case 'e':
1799 case 'D':
1800 case 'd':
1801 case 'Q':
1802 case 'q':
1803 goto exp1;
1805 case '+':
1806 case '-':
1807 push_char (dtp, 'e');
1808 push_char (dtp, c);
1809 c = next_char (dtp);
1810 goto exp2;
1812 default:
1813 goto bad_real;
1817 exp1:
1818 push_char (dtp, 'e');
1820 if ((c = next_char (dtp)) == EOF)
1821 goto bad_real;
1822 if (c != '+' && c != '-')
1823 push_char (dtp, '+');
1824 else
1826 push_char (dtp, c);
1827 c = next_char (dtp);
1830 exp2:
1831 if (!isdigit (c))
1833 /* Extension: allow default exponent of 0 when omitted. */
1834 if (dtp->common.flags & IOPARM_DT_DEC_EXT)
1836 push_char (dtp, '0');
1837 goto done;
1839 else
1840 goto bad_exponent;
1843 push_char (dtp, c);
1845 for (;;)
1847 c = next_char (dtp);
1849 switch (c)
1851 CASE_DIGITS:
1852 push_char (dtp, c);
1853 break;
1855 case '!':
1856 if (!dtp->u.p.namelist_mode)
1857 goto bad_real;
1859 CASE_SEPARATORS:
1860 case EOF:
1861 goto done;
1863 default:
1864 goto bad_real;
1868 done:
1869 unget_char (dtp, c);
1870 eat_separator (dtp);
1871 push_char (dtp, '\0');
1872 if (convert_real (dtp, dest, dtp->u.p.saved_string, length))
1874 free_saved (dtp);
1875 return;
1878 free_saved (dtp);
1879 dtp->u.p.saved_type = BT_REAL;
1880 return;
1882 inf_nan:
1883 l_push_char (dtp, c);
1884 is_inf = 0;
1886 /* Match INF and Infinity. */
1887 if (c == 'i' || c == 'I')
1889 c = next_char (dtp);
1890 l_push_char (dtp, c);
1891 if (c != 'n' && c != 'N')
1892 goto unwind;
1893 c = next_char (dtp);
1894 l_push_char (dtp, c);
1895 if (c != 'f' && c != 'F')
1896 goto unwind;
1897 c = next_char (dtp);
1898 l_push_char (dtp, c);
1899 if (!is_separator (c) && (c != EOF))
1901 if (c != 'i' && c != 'I')
1902 goto unwind;
1903 c = next_char (dtp);
1904 l_push_char (dtp, c);
1905 if (c != 'n' && c != 'N')
1906 goto unwind;
1907 c = next_char (dtp);
1908 l_push_char (dtp, c);
1909 if (c != 'i' && c != 'I')
1910 goto unwind;
1911 c = next_char (dtp);
1912 l_push_char (dtp, c);
1913 if (c != 't' && c != 'T')
1914 goto unwind;
1915 c = next_char (dtp);
1916 l_push_char (dtp, c);
1917 if (c != 'y' && c != 'Y')
1918 goto unwind;
1919 c = next_char (dtp);
1920 l_push_char (dtp, c);
1922 is_inf = 1;
1923 } /* Match NaN. */
1924 else
1926 c = next_char (dtp);
1927 l_push_char (dtp, c);
1928 if (c != 'a' && c != 'A')
1929 goto unwind;
1930 c = next_char (dtp);
1931 l_push_char (dtp, c);
1932 if (c != 'n' && c != 'N')
1933 goto unwind;
1934 c = next_char (dtp);
1935 l_push_char (dtp, c);
1937 /* Match NAN(alphanum). */
1938 if (c == '(')
1940 for (c = next_char (dtp); c != ')'; c = next_char (dtp))
1941 if (is_separator (c))
1942 goto unwind;
1943 else
1944 l_push_char (dtp, c);
1946 l_push_char (dtp, ')');
1947 c = next_char (dtp);
1948 l_push_char (dtp, c);
1952 if (!is_separator (c) && (c != EOF))
1953 goto unwind;
1955 if (dtp->u.p.namelist_mode)
1957 if (c == ' ' || c =='\n' || c == '\r')
1961 if ((c = next_char (dtp)) == EOF)
1962 goto bad_real;
1964 while (c == ' ' || c =='\n' || c == '\r');
1966 l_push_char (dtp, c);
1968 if (c == '=')
1969 goto unwind;
1973 if (is_inf)
1975 push_char (dtp, 'i');
1976 push_char (dtp, 'n');
1977 push_char (dtp, 'f');
1979 else
1981 push_char (dtp, 'n');
1982 push_char (dtp, 'a');
1983 push_char (dtp, 'n');
1986 free_line (dtp);
1987 unget_char (dtp, c);
1988 eat_separator (dtp);
1989 push_char (dtp, '\0');
1990 if (convert_infnan (dtp, dest, dtp->u.p.saved_string, length))
1991 return;
1993 free_saved (dtp);
1994 dtp->u.p.saved_type = BT_REAL;
1995 return;
1997 unwind:
1998 if (dtp->u.p.namelist_mode)
2000 dtp->u.p.nml_read_error = 1;
2001 dtp->u.p.line_buffer_enabled = 1;
2002 dtp->u.p.line_buffer_pos = 0;
2003 return;
2006 bad_real:
2008 if (nml_bad_return (dtp, c))
2009 return;
2011 bad_exponent:
2013 free_saved (dtp);
2014 if (c == EOF)
2016 free_line (dtp);
2017 hit_eof (dtp);
2018 return;
2020 else if (c != '\n')
2021 eat_line (dtp);
2023 snprintf (message, MSGLEN, "Bad real number in item %d of list input",
2024 dtp->u.p.item_count);
2025 free_line (dtp);
2026 generate_error (&dtp->common, LIBERROR_READ_VALUE, message);
2030 /* Check the current type against the saved type to make sure they are
2031 compatible. Returns nonzero if incompatible. */
2033 static int
2034 check_type (st_parameter_dt *dtp, bt type, int kind)
2036 char message[MSGLEN];
2038 if (dtp->u.p.saved_type != BT_UNKNOWN && dtp->u.p.saved_type != type)
2040 snprintf (message, MSGLEN, "Read type %s where %s was expected for item %d",
2041 type_name (dtp->u.p.saved_type), type_name (type),
2042 dtp->u.p.item_count);
2043 free_line (dtp);
2044 generate_error (&dtp->common, LIBERROR_READ_VALUE, message);
2045 return 1;
2048 if (dtp->u.p.saved_type == BT_UNKNOWN || dtp->u.p.saved_type == BT_CHARACTER)
2049 return 0;
2051 if ((type != BT_COMPLEX && dtp->u.p.saved_length != kind)
2052 || (type == BT_COMPLEX && dtp->u.p.saved_length != kind*2))
2054 snprintf (message, MSGLEN,
2055 "Read kind %d %s where kind %d is required for item %d",
2056 type == BT_COMPLEX ? dtp->u.p.saved_length / 2
2057 : dtp->u.p.saved_length,
2058 type_name (dtp->u.p.saved_type), kind,
2059 dtp->u.p.item_count);
2060 free_line (dtp);
2061 generate_error (&dtp->common, LIBERROR_READ_VALUE, message);
2062 return 1;
2065 return 0;
2069 /* Initialize the function pointers to select the correct versions of
2070 next_char and push_char depending on what we are doing. */
2072 static void
2073 set_workers (st_parameter_dt *dtp)
2075 if (dtp->u.p.current_unit->flags.encoding == ENCODING_UTF8)
2077 dtp->u.p.current_unit->next_char_fn_ptr = &next_char_utf8;
2078 dtp->u.p.current_unit->push_char_fn_ptr = &push_char4;
2080 else if (is_internal_unit (dtp))
2082 dtp->u.p.current_unit->next_char_fn_ptr = &next_char_internal;
2083 dtp->u.p.current_unit->push_char_fn_ptr = &push_char_default;
2085 else
2087 dtp->u.p.current_unit->next_char_fn_ptr = &next_char_default;
2088 dtp->u.p.current_unit->push_char_fn_ptr = &push_char_default;
2093 /* Top level data transfer subroutine for list reads. Because we have
2094 to deal with repeat counts, the data item is always saved after
2095 reading, usually in the dtp->u.p.value[] array. If a repeat count is
2096 greater than one, we copy the data item multiple times. */
2098 static int
2099 list_formatted_read_scalar (st_parameter_dt *dtp, bt type, void *p,
2100 int kind, size_t size)
2102 gfc_char4_t *q, *r;
2103 size_t m;
2104 int c;
2105 int err = 0;
2107 /* Set the next_char and push_char worker functions. */
2108 set_workers (dtp);
2110 if (dtp->u.p.first_item)
2112 dtp->u.p.first_item = 0;
2113 dtp->u.p.input_complete = 0;
2114 dtp->u.p.repeat_count = 1;
2115 dtp->u.p.at_eol = 0;
2117 if ((c = eat_spaces (dtp)) == EOF)
2119 err = LIBERROR_END;
2120 goto cleanup;
2122 if (is_separator (c))
2124 /* Found a null value. */
2125 dtp->u.p.repeat_count = 0;
2126 eat_separator (dtp);
2128 /* Set end-of-line flag. */
2129 if (c == '\n' || c == '\r')
2131 dtp->u.p.at_eol = 1;
2132 if (finish_separator (dtp) == LIBERROR_END)
2134 err = LIBERROR_END;
2135 goto cleanup;
2138 else
2139 goto cleanup;
2142 else
2144 if (dtp->u.p.repeat_count > 0)
2146 if (check_type (dtp, type, kind))
2147 return err;
2148 goto set_value;
2151 if (dtp->u.p.input_complete)
2152 goto cleanup;
2154 if (dtp->u.p.at_eol)
2155 finish_separator (dtp);
2156 else
2158 eat_spaces (dtp);
2159 /* Trailing spaces prior to end of line. */
2160 if (dtp->u.p.at_eol)
2161 finish_separator (dtp);
2164 dtp->u.p.saved_type = BT_UNKNOWN;
2165 dtp->u.p.repeat_count = 1;
2168 switch (type)
2170 case BT_INTEGER:
2171 read_integer (dtp, kind);
2172 break;
2173 case BT_LOGICAL:
2174 read_logical (dtp, kind);
2175 break;
2176 case BT_CHARACTER:
2177 read_character (dtp, kind);
2178 break;
2179 case BT_REAL:
2180 read_real (dtp, p, kind);
2181 /* Copy value back to temporary if needed. */
2182 if (dtp->u.p.repeat_count > 0)
2183 memcpy (dtp->u.p.value, p, size);
2184 break;
2185 case BT_COMPLEX:
2186 read_complex (dtp, p, kind, size);
2187 /* Copy value back to temporary if needed. */
2188 if (dtp->u.p.repeat_count > 0)
2189 memcpy (dtp->u.p.value, p, size);
2190 break;
2191 case BT_CLASS:
2193 int unit = dtp->u.p.current_unit->unit_number;
2194 char iotype[] = "LISTDIRECTED";
2195 gfc_charlen_type iotype_len = 12;
2196 char tmp_iomsg[IOMSG_LEN] = "";
2197 char *child_iomsg;
2198 gfc_charlen_type child_iomsg_len;
2199 int noiostat;
2200 int *child_iostat = NULL;
2201 gfc_full_array_i4 vlist;
2203 GFC_DESCRIPTOR_DATA(&vlist) = NULL;
2204 GFC_DIMENSION_SET(vlist.dim[0],1, 0, 0);
2206 /* Set iostat, intent(out). */
2207 noiostat = 0;
2208 child_iostat = (dtp->common.flags & IOPARM_HAS_IOSTAT) ?
2209 dtp->common.iostat : &noiostat;
2211 /* Set iomsge, intent(inout). */
2212 if (dtp->common.flags & IOPARM_HAS_IOMSG)
2214 child_iomsg = dtp->common.iomsg;
2215 child_iomsg_len = dtp->common.iomsg_len;
2217 else
2219 child_iomsg = tmp_iomsg;
2220 child_iomsg_len = IOMSG_LEN;
2223 /* Call the user defined formatted READ procedure. */
2224 dtp->u.p.current_unit->child_dtio++;
2225 dtp->u.p.fdtio_ptr (p, &unit, iotype, &vlist,
2226 child_iostat, child_iomsg,
2227 iotype_len, child_iomsg_len);
2228 dtp->u.p.child_saved_iostat = *child_iostat;
2229 dtp->u.p.current_unit->child_dtio--;
2231 break;
2232 default:
2233 internal_error (&dtp->common, "Bad type for list read");
2236 if (dtp->u.p.saved_type != BT_CHARACTER && dtp->u.p.saved_type != BT_UNKNOWN)
2237 dtp->u.p.saved_length = size;
2239 if ((dtp->common.flags & IOPARM_LIBRETURN_MASK) != IOPARM_LIBRETURN_OK)
2240 goto cleanup;
2242 set_value:
2243 switch (dtp->u.p.saved_type)
2245 case BT_COMPLEX:
2246 case BT_REAL:
2247 if (dtp->u.p.repeat_count > 0)
2248 memcpy (p, dtp->u.p.value, size);
2249 break;
2251 case BT_INTEGER:
2252 case BT_LOGICAL:
2253 memcpy (p, dtp->u.p.value, size);
2254 break;
2256 case BT_CHARACTER:
2257 if (dtp->u.p.saved_string)
2259 m = (size < (size_t) dtp->u.p.saved_used)
2260 ? size : (size_t) dtp->u.p.saved_used;
2262 q = (gfc_char4_t *) p;
2263 r = (gfc_char4_t *) dtp->u.p.saved_string;
2264 if (dtp->u.p.current_unit->flags.encoding == ENCODING_UTF8)
2265 for (size_t i = 0; i < m; i++)
2266 *q++ = *r++;
2267 else
2269 if (kind == 1)
2270 memcpy (p, dtp->u.p.saved_string, m);
2271 else
2272 for (size_t i = 0; i < m; i++)
2273 *q++ = *r++;
2276 else
2277 /* Just delimiters encountered, nothing to copy but SPACE. */
2278 m = 0;
2280 if (m < size)
2282 if (kind == 1)
2283 memset (((char *) p) + m, ' ', size - m);
2284 else
2286 q = (gfc_char4_t *) p;
2287 for (size_t i = m; i < size; i++)
2288 q[i] = (unsigned char) ' ';
2291 break;
2293 case BT_UNKNOWN:
2294 break;
2296 default:
2297 internal_error (&dtp->common, "Bad type for list read");
2300 if (--dtp->u.p.repeat_count <= 0)
2301 free_saved (dtp);
2303 cleanup:
2304 /* err may have been set above from finish_separator, so if it is set
2305 trigger the hit_eof. The hit_eof will set bits in common.flags. */
2306 if (err == LIBERROR_END)
2308 free_line (dtp);
2309 hit_eof (dtp);
2311 /* Now we check common.flags for any errors that could have occurred in
2312 a READ elsewhere such as in read_integer. */
2313 err = dtp->common.flags & IOPARM_LIBRETURN_MASK;
2314 fbuf_flush_list (dtp->u.p.current_unit, LIST_READING);
2315 return err;
2319 void
2320 list_formatted_read (st_parameter_dt *dtp, bt type, void *p, int kind,
2321 size_t size, size_t nelems)
2323 size_t elem;
2324 char *tmp;
2325 size_t stride = type == BT_CHARACTER ?
2326 size * GFC_SIZE_OF_CHAR_KIND(kind) : size;
2327 int err;
2329 tmp = (char *) p;
2331 /* Big loop over all the elements. */
2332 for (elem = 0; elem < nelems; elem++)
2334 dtp->u.p.item_count++;
2335 err = list_formatted_read_scalar (dtp, type, tmp + stride*elem,
2336 kind, size);
2337 if (err)
2338 break;
2343 /* Finish a list read. */
2345 void
2346 finish_list_read (st_parameter_dt *dtp)
2348 free_saved (dtp);
2350 fbuf_flush (dtp->u.p.current_unit, dtp->u.p.mode);
2352 if (dtp->u.p.at_eol)
2354 dtp->u.p.at_eol = 0;
2355 return;
2358 if (!is_internal_unit (dtp))
2360 int c;
2362 /* Set the next_char and push_char worker functions. */
2363 set_workers (dtp);
2365 if (likely (dtp->u.p.child_saved_iostat == LIBERROR_OK))
2367 c = next_char (dtp);
2368 if (c == EOF)
2370 free_line (dtp);
2371 hit_eof (dtp);
2372 return;
2374 if (c != '\n')
2375 eat_line (dtp);
2379 free_line (dtp);
2383 /* NAMELIST INPUT
2385 void namelist_read (st_parameter_dt *dtp)
2386 calls:
2387 static void nml_match_name (char *name, int len)
2388 static int nml_query (st_parameter_dt *dtp)
2389 static int nml_get_obj_data (st_parameter_dt *dtp,
2390 namelist_info **prev_nl, char *, size_t)
2391 calls:
2392 static void nml_untouch_nodes (st_parameter_dt *dtp)
2393 static namelist_info *find_nml_node (st_parameter_dt *dtp,
2394 char *var_name)
2395 static int nml_parse_qualifier(descriptor_dimension *ad,
2396 array_loop_spec *ls, int rank, char *)
2397 static void nml_touch_nodes (namelist_info *nl)
2398 static int nml_read_obj (namelist_info *nl, index_type offset,
2399 namelist_info **prev_nl, char *, size_t,
2400 index_type clow, index_type chigh)
2401 calls:
2402 -itself- */
2404 /* Inputs a rank-dimensional qualifier, which can contain
2405 singlets, doublets, triplets or ':' with the standard meanings. */
2407 static bool
2408 nml_parse_qualifier (st_parameter_dt *dtp, descriptor_dimension *ad,
2409 array_loop_spec *ls, int rank, bt nml_elem_type,
2410 char *parse_err_msg, size_t parse_err_msg_size,
2411 int *parsed_rank)
2413 int dim;
2414 int indx;
2415 int neg;
2416 int null_flag;
2417 int is_array_section, is_char;
2418 int c;
2420 is_char = 0;
2421 is_array_section = 0;
2422 dtp->u.p.expanded_read = 0;
2424 /* See if this is a character substring qualifier we are looking for. */
2425 if (rank == -1)
2427 rank = 1;
2428 is_char = 1;
2431 /* The next character in the stream should be the '('. */
2433 if ((c = next_char (dtp)) == EOF)
2434 goto err_ret;
2436 /* Process the qualifier, by dimension and triplet. */
2438 for (dim=0; dim < rank; dim++ )
2440 for (indx=0; indx<3; indx++)
2442 free_saved (dtp);
2443 eat_spaces (dtp);
2444 neg = 0;
2446 /* Process a potential sign. */
2447 if ((c = next_char (dtp)) == EOF)
2448 goto err_ret;
2449 switch (c)
2451 case '-':
2452 neg = 1;
2453 break;
2455 case '+':
2456 break;
2458 default:
2459 unget_char (dtp, c);
2460 break;
2463 /* Process characters up to the next ':' , ',' or ')'. */
2464 for (;;)
2466 c = next_char (dtp);
2467 switch (c)
2469 case EOF:
2470 goto err_ret;
2472 case ':':
2473 is_array_section = 1;
2474 break;
2476 case ',': case ')':
2477 if ((c==',' && dim == rank -1)
2478 || (c==')' && dim < rank -1))
2480 if (is_char)
2481 snprintf (parse_err_msg, parse_err_msg_size,
2482 "Bad substring qualifier");
2483 else
2484 snprintf (parse_err_msg, parse_err_msg_size,
2485 "Bad number of index fields");
2486 goto err_ret;
2488 break;
2490 CASE_DIGITS:
2491 push_char (dtp, c);
2492 continue;
2494 case ' ': case '\t': case '\r': case '\n':
2495 eat_spaces (dtp);
2496 break;
2498 default:
2499 if (is_char)
2500 snprintf (parse_err_msg, parse_err_msg_size,
2501 "Bad character in substring qualifier");
2502 else
2503 snprintf (parse_err_msg, parse_err_msg_size,
2504 "Bad character in index");
2505 goto err_ret;
2508 if ((c == ',' || c == ')') && indx == 0
2509 && dtp->u.p.saved_string == 0)
2511 if (is_char)
2512 snprintf (parse_err_msg, parse_err_msg_size,
2513 "Null substring qualifier");
2514 else
2515 snprintf (parse_err_msg, parse_err_msg_size,
2516 "Null index field");
2517 goto err_ret;
2520 if ((c == ':' && indx == 1 && dtp->u.p.saved_string == 0)
2521 || (indx == 2 && dtp->u.p.saved_string == 0))
2523 if (is_char)
2524 snprintf (parse_err_msg, parse_err_msg_size,
2525 "Bad substring qualifier");
2526 else
2527 snprintf (parse_err_msg, parse_err_msg_size,
2528 "Bad index triplet");
2529 goto err_ret;
2532 if (is_char && !is_array_section)
2534 snprintf (parse_err_msg, parse_err_msg_size,
2535 "Missing colon in substring qualifier");
2536 goto err_ret;
2539 /* If '( : ? )' or '( ? : )' break and flag read failure. */
2540 null_flag = 0;
2541 if ((c == ':' && indx == 0 && dtp->u.p.saved_string == 0)
2542 || (indx==1 && dtp->u.p.saved_string == 0))
2544 null_flag = 1;
2545 break;
2548 /* Now read the index. */
2549 if (convert_integer (dtp, sizeof(index_type), neg))
2551 if (is_char)
2552 snprintf (parse_err_msg, parse_err_msg_size,
2553 "Bad integer substring qualifier");
2554 else
2555 snprintf (parse_err_msg, parse_err_msg_size,
2556 "Bad integer in index");
2557 goto err_ret;
2559 break;
2562 /* Feed the index values to the triplet arrays. */
2563 if (!null_flag)
2565 if (indx == 0)
2566 memcpy (&ls[dim].start, dtp->u.p.value, sizeof(index_type));
2567 if (indx == 1)
2568 memcpy (&ls[dim].end, dtp->u.p.value, sizeof(index_type));
2569 if (indx == 2)
2570 memcpy (&ls[dim].step, dtp->u.p.value, sizeof(index_type));
2573 /* Singlet or doublet indices. */
2574 if (c==',' || c==')')
2576 if (indx == 0)
2578 memcpy (&ls[dim].start, dtp->u.p.value, sizeof(index_type));
2580 /* If -std=f95/2003 or an array section is specified,
2581 do not allow excess data to be processed. */
2582 if (is_array_section == 1
2583 || !(compile_options.allow_std & GFC_STD_GNU)
2584 || nml_elem_type == BT_DERIVED)
2585 ls[dim].end = ls[dim].start;
2586 else
2587 dtp->u.p.expanded_read = 1;
2590 /* Check for non-zero rank. */
2591 if (is_array_section == 1 && ls[dim].start != ls[dim].end)
2592 *parsed_rank = 1;
2594 break;
2598 if (is_array_section == 1 && dtp->u.p.expanded_read == 1)
2600 int i;
2601 dtp->u.p.expanded_read = 0;
2602 for (i = 0; i < dim; i++)
2603 ls[i].end = ls[i].start;
2606 /* Check the values of the triplet indices. */
2607 if ((ls[dim].start > GFC_DIMENSION_UBOUND(ad[dim]))
2608 || (ls[dim].start < GFC_DIMENSION_LBOUND(ad[dim]))
2609 || (ls[dim].end > GFC_DIMENSION_UBOUND(ad[dim]))
2610 || (ls[dim].end < GFC_DIMENSION_LBOUND(ad[dim])))
2612 if (is_char)
2613 snprintf (parse_err_msg, parse_err_msg_size,
2614 "Substring out of range");
2615 else
2616 snprintf (parse_err_msg, parse_err_msg_size,
2617 "Index %d out of range", dim + 1);
2618 goto err_ret;
2621 if (((ls[dim].end - ls[dim].start ) * ls[dim].step < 0)
2622 || (ls[dim].step == 0))
2624 snprintf (parse_err_msg, parse_err_msg_size,
2625 "Bad range in index %d", dim + 1);
2626 goto err_ret;
2629 /* Initialise the loop index counter. */
2630 ls[dim].idx = ls[dim].start;
2632 eat_spaces (dtp);
2633 return true;
2635 err_ret:
2637 /* The EOF error message is issued by hit_eof. Return true so that the
2638 caller does not use parse_err_msg and parse_err_msg_size to generate
2639 an unrelated error message. */
2640 if (c == EOF)
2642 hit_eof (dtp);
2643 dtp->u.p.input_complete = 1;
2644 return true;
2646 return false;
2650 static bool
2651 extended_look_ahead (char *p, char *q)
2653 char *r, *s;
2655 /* Scan ahead to find a '%' in the p string. */
2656 for(r = p, s = q; *r && *s; s++)
2657 if ((*s == '%' || *s == '+') && strcmp (r + 1, s + 1) == 0)
2658 return true;
2659 return false;
2663 static bool
2664 strcmp_extended_type (char *p, char *q)
2666 char *r, *s;
2668 for (r = p, s = q; *r && *s; r++, s++)
2670 if (*r != *s)
2672 if (*r == '%' && *s == '+' && extended_look_ahead (r, s))
2673 return true;
2674 break;
2677 return false;
2681 static namelist_info *
2682 find_nml_node (st_parameter_dt *dtp, char *var_name)
2684 namelist_info *t = dtp->u.p.ionml;
2685 while (t != NULL)
2687 if (strcmp (var_name, t->var_name) == 0)
2689 t->touched = 1;
2690 return t;
2692 if (strcmp_extended_type (var_name, t->var_name))
2694 t->touched = 1;
2695 return t;
2697 t = t->next;
2699 return NULL;
2702 /* Visits all the components of a derived type that have
2703 not explicitly been identified in the namelist input.
2704 touched is set and the loop specification initialised
2705 to default values */
2707 static void
2708 nml_touch_nodes (namelist_info *nl)
2710 index_type len = strlen (nl->var_name) + 1;
2711 int dim;
2712 char *ext_name = xmalloc (len + 1);
2713 memcpy (ext_name, nl->var_name, len-1);
2714 memcpy (ext_name + len - 1, "%", 2);
2715 for (nl = nl->next; nl; nl = nl->next)
2717 if (strncmp (nl->var_name, ext_name, len) == 0)
2719 nl->touched = 1;
2720 for (dim=0; dim < nl->var_rank; dim++)
2722 nl->ls[dim].step = 1;
2723 nl->ls[dim].end = GFC_DESCRIPTOR_UBOUND(nl,dim);
2724 nl->ls[dim].start = GFC_DESCRIPTOR_LBOUND(nl,dim);
2725 nl->ls[dim].idx = nl->ls[dim].start;
2728 else
2729 break;
2731 free (ext_name);
2732 return;
2735 /* Resets touched for the entire list of nml_nodes, ready for a
2736 new object. */
2738 static void
2739 nml_untouch_nodes (st_parameter_dt *dtp)
2741 namelist_info *t;
2742 for (t = dtp->u.p.ionml; t; t = t->next)
2743 t->touched = 0;
2744 return;
2747 /* Attempts to input name to namelist name. Returns
2748 dtp->u.p.nml_read_error = 1 on no match. */
2750 static void
2751 nml_match_name (st_parameter_dt *dtp, const char *name, index_type len)
2753 index_type i;
2754 int c;
2756 dtp->u.p.nml_read_error = 0;
2757 for (i = 0; i < len; i++)
2759 c = next_char (dtp);
2760 if (c == EOF || (tolower (c) != tolower (name[i])))
2762 dtp->u.p.nml_read_error = 1;
2763 break;
2768 /* If the namelist read is from stdin, output the current state of the
2769 namelist to stdout. This is used to implement the non-standard query
2770 features, ? and =?. If c == '=' the full namelist is printed. Otherwise
2771 the names alone are printed. */
2773 static void
2774 nml_query (st_parameter_dt *dtp, char c)
2776 gfc_unit *temp_unit;
2777 namelist_info *nl;
2778 index_type len;
2779 char *p;
2780 #ifdef HAVE_CRLF
2781 static const index_type endlen = 2;
2782 static const char endl[] = "\r\n";
2783 static const char nmlend[] = "&end\r\n";
2784 #else
2785 static const index_type endlen = 1;
2786 static const char endl[] = "\n";
2787 static const char nmlend[] = "&end\n";
2788 #endif
2790 if (dtp->u.p.current_unit->unit_number != options.stdin_unit)
2791 return;
2793 /* Store the current unit and transfer to stdout. */
2795 temp_unit = dtp->u.p.current_unit;
2796 dtp->u.p.current_unit = find_unit (options.stdout_unit);
2798 if (dtp->u.p.current_unit)
2800 dtp->u.p.mode = WRITING;
2801 next_record (dtp, 0);
2803 /* Write the namelist in its entirety. */
2805 if (c == '=')
2806 namelist_write (dtp);
2808 /* Or write the list of names. */
2810 else
2812 /* "&namelist_name\n" */
2814 len = dtp->namelist_name_len;
2815 p = write_block (dtp, len - 1 + endlen);
2816 if (!p)
2817 goto query_return;
2818 memcpy (p, "&", 1);
2819 memcpy ((char*)(p + 1), dtp->namelist_name, len);
2820 memcpy ((char*)(p + len + 1), &endl, endlen);
2821 for (nl = dtp->u.p.ionml; nl; nl = nl->next)
2823 /* " var_name\n" */
2825 len = strlen (nl->var_name);
2826 p = write_block (dtp, len + endlen);
2827 if (!p)
2828 goto query_return;
2829 memcpy (p, " ", 1);
2830 memcpy ((char*)(p + 1), nl->var_name, len);
2831 memcpy ((char*)(p + len + 1), &endl, endlen);
2834 /* "&end\n" */
2836 p = write_block (dtp, endlen + 4);
2837 if (!p)
2838 goto query_return;
2839 memcpy (p, &nmlend, endlen + 4);
2842 /* Flush the stream to force immediate output. */
2844 fbuf_flush (dtp->u.p.current_unit, WRITING);
2845 sflush (dtp->u.p.current_unit->s);
2846 unlock_unit (dtp->u.p.current_unit);
2849 query_return:
2851 /* Restore the current unit. */
2853 dtp->u.p.current_unit = temp_unit;
2854 dtp->u.p.mode = READING;
2855 return;
2858 /* Reads and stores the input for the namelist object nl. For an array,
2859 the function loops over the ranges defined by the loop specification.
2860 This default to all the data or to the specification from a qualifier.
2861 nml_read_obj recursively calls itself to read derived types. It visits
2862 all its own components but only reads data for those that were touched
2863 when the name was parsed. If a read error is encountered, an attempt is
2864 made to return to read a new object name because the standard allows too
2865 little data to be available. On the other hand, too much data is an
2866 error. */
2868 static bool
2869 nml_read_obj (st_parameter_dt *dtp, namelist_info *nl, index_type offset,
2870 namelist_info **pprev_nl, char *nml_err_msg,
2871 size_t nml_err_msg_size, index_type clow, index_type chigh)
2873 namelist_info *cmp;
2874 char *obj_name;
2875 int nml_carry;
2876 int len;
2877 int dim;
2878 index_type dlen;
2879 index_type m;
2880 size_t obj_name_len;
2881 void *pdata;
2882 gfc_class list_obj;
2884 /* If we have encountered a previous read error or this object has not been
2885 touched in name parsing, just return. */
2886 if (dtp->u.p.nml_read_error || !nl->touched)
2887 return true;
2889 dtp->u.p.item_count++; /* Used in error messages. */
2890 dtp->u.p.repeat_count = 0;
2891 eat_spaces (dtp);
2893 len = nl->len;
2894 switch (nl->type)
2896 case BT_INTEGER:
2897 case BT_LOGICAL:
2898 dlen = len;
2899 break;
2901 case BT_REAL:
2902 dlen = size_from_real_kind (len);
2903 break;
2905 case BT_COMPLEX:
2906 dlen = size_from_complex_kind (len);
2907 break;
2909 case BT_CHARACTER:
2910 dlen = chigh ? (chigh - clow + 1) : nl->string_length;
2911 break;
2913 default:
2914 dlen = 0;
2919 /* Update the pointer to the data, using the current index vector */
2921 if ((nl->type == BT_DERIVED || nl->type == BT_CLASS)
2922 && nl->dtio_sub != NULL)
2924 pdata = NULL; /* Not used under these conidtions. */
2925 if (nl->type == BT_CLASS)
2926 list_obj.data = ((gfc_class*)nl->mem_pos)->data;
2927 else
2928 list_obj.data = (void *)nl->mem_pos;
2930 for (dim = 0; dim < nl->var_rank; dim++)
2931 list_obj.data = list_obj.data + (nl->ls[dim].idx
2932 - GFC_DESCRIPTOR_LBOUND(nl,dim))
2933 * GFC_DESCRIPTOR_STRIDE(nl,dim) * nl->size;
2935 else
2937 pdata = (void*)(nl->mem_pos + offset);
2938 for (dim = 0; dim < nl->var_rank; dim++)
2939 pdata = (void*)(pdata + (nl->ls[dim].idx
2940 - GFC_DESCRIPTOR_LBOUND(nl,dim))
2941 * GFC_DESCRIPTOR_STRIDE(nl,dim) * nl->size);
2944 /* If we are finished with the repeat count, try to read next value. */
2946 nml_carry = 0;
2947 if (--dtp->u.p.repeat_count <= 0)
2949 if (dtp->u.p.input_complete)
2950 return true;
2951 if (dtp->u.p.at_eol)
2952 finish_separator (dtp);
2953 if (dtp->u.p.input_complete)
2954 return true;
2956 dtp->u.p.saved_type = BT_UNKNOWN;
2957 free_saved (dtp);
2959 switch (nl->type)
2961 case BT_INTEGER:
2962 read_integer (dtp, len);
2963 break;
2965 case BT_LOGICAL:
2966 read_logical (dtp, len);
2967 break;
2969 case BT_CHARACTER:
2970 read_character (dtp, len);
2971 break;
2973 case BT_REAL:
2974 /* Need to copy data back from the real location to the temp in
2975 order to handle nml reads into arrays. */
2976 read_real (dtp, pdata, len);
2977 memcpy (dtp->u.p.value, pdata, dlen);
2978 break;
2980 case BT_COMPLEX:
2981 /* Same as for REAL, copy back to temp. */
2982 read_complex (dtp, pdata, len, dlen);
2983 memcpy (dtp->u.p.value, pdata, dlen);
2984 break;
2986 case BT_DERIVED:
2987 case BT_CLASS:
2988 /* If this object has a User Defined procedure, call it. */
2989 if (nl->dtio_sub != NULL)
2991 int unit = dtp->u.p.current_unit->unit_number;
2992 char iotype[] = "NAMELIST";
2993 gfc_charlen_type iotype_len = 8;
2994 char tmp_iomsg[IOMSG_LEN] = "";
2995 char *child_iomsg;
2996 gfc_charlen_type child_iomsg_len;
2997 int noiostat;
2998 int *child_iostat = NULL;
2999 gfc_full_array_i4 vlist;
3000 formatted_dtio dtio_ptr = (formatted_dtio)nl->dtio_sub;
3002 GFC_DESCRIPTOR_DATA(&vlist) = NULL;
3003 GFC_DIMENSION_SET(vlist.dim[0],1, 0, 0);
3005 list_obj.vptr = nl->vtable;
3006 list_obj.len = 0;
3008 /* Set iostat, intent(out). */
3009 noiostat = 0;
3010 child_iostat = (dtp->common.flags & IOPARM_HAS_IOSTAT) ?
3011 dtp->common.iostat : &noiostat;
3013 /* Set iomsg, intent(inout). */
3014 if (dtp->common.flags & IOPARM_HAS_IOMSG)
3016 child_iomsg = dtp->common.iomsg;
3017 child_iomsg_len = dtp->common.iomsg_len;
3019 else
3021 child_iomsg = tmp_iomsg;
3022 child_iomsg_len = IOMSG_LEN;
3025 /* Call the user defined formatted READ procedure. */
3026 dtp->u.p.current_unit->child_dtio++;
3027 dtio_ptr ((void *)&list_obj, &unit, iotype, &vlist,
3028 child_iostat, child_iomsg,
3029 iotype_len, child_iomsg_len);
3030 dtp->u.p.child_saved_iostat = *child_iostat;
3031 dtp->u.p.current_unit->child_dtio--;
3032 goto incr_idx;
3035 /* Must be default derived type namelist read. */
3036 obj_name_len = strlen (nl->var_name) + 1;
3037 obj_name = xmalloc (obj_name_len+1);
3038 memcpy (obj_name, nl->var_name, obj_name_len-1);
3039 memcpy (obj_name + obj_name_len - 1, "%", 2);
3041 /* If reading a derived type, disable the expanded read warning
3042 since a single object can have multiple reads. */
3043 dtp->u.p.expanded_read = 0;
3045 /* Now loop over the components. */
3047 for (cmp = nl->next;
3048 cmp &&
3049 !strncmp (cmp->var_name, obj_name, obj_name_len);
3050 cmp = cmp->next)
3052 /* Jump over nested derived type by testing if the potential
3053 component name contains '%'. */
3054 if (strchr (cmp->var_name + obj_name_len, '%'))
3055 continue;
3057 if (!nml_read_obj (dtp, cmp, (index_type)(pdata - nl->mem_pos),
3058 pprev_nl, nml_err_msg, nml_err_msg_size,
3059 clow, chigh))
3061 free (obj_name);
3062 return false;
3065 if (dtp->u.p.input_complete)
3067 free (obj_name);
3068 return true;
3072 free (obj_name);
3073 goto incr_idx;
3075 default:
3076 snprintf (nml_err_msg, nml_err_msg_size,
3077 "Bad type for namelist object %s", nl->var_name);
3078 internal_error (&dtp->common, nml_err_msg);
3079 goto nml_err_ret;
3083 /* The standard permits array data to stop short of the number of
3084 elements specified in the loop specification. In this case, we
3085 should be here with dtp->u.p.nml_read_error != 0. Control returns to
3086 nml_get_obj_data and an attempt is made to read object name. */
3088 *pprev_nl = nl;
3089 if (dtp->u.p.nml_read_error)
3091 dtp->u.p.expanded_read = 0;
3092 return true;
3095 if (dtp->u.p.saved_type == BT_UNKNOWN)
3097 dtp->u.p.expanded_read = 0;
3098 goto incr_idx;
3101 switch (dtp->u.p.saved_type)
3104 case BT_COMPLEX:
3105 case BT_REAL:
3106 case BT_INTEGER:
3107 case BT_LOGICAL:
3108 memcpy (pdata, dtp->u.p.value, dlen);
3109 break;
3111 case BT_CHARACTER:
3112 if (dlen < dtp->u.p.saved_used)
3114 if (compile_options.bounds_check)
3116 snprintf (nml_err_msg, nml_err_msg_size,
3117 "Namelist object '%s' truncated on read.",
3118 nl->var_name);
3119 generate_warning (&dtp->common, nml_err_msg);
3121 m = dlen;
3123 else
3124 m = dtp->u.p.saved_used;
3126 if (dtp->u.p.current_unit->flags.encoding == ENCODING_UTF8)
3128 gfc_char4_t *q4, *p4 = pdata;
3129 int i;
3131 q4 = (gfc_char4_t *) dtp->u.p.saved_string;
3132 p4 += clow -1;
3133 for (i = 0; i < m; i++)
3134 *p4++ = *q4++;
3135 if (m < dlen)
3136 for (i = 0; i < dlen - m; i++)
3137 *p4++ = (gfc_char4_t) ' ';
3139 else
3141 pdata = (void*)( pdata + clow - 1 );
3142 memcpy (pdata, dtp->u.p.saved_string, m);
3143 if (m < dlen)
3144 memset ((void*)( pdata + m ), ' ', dlen - m);
3146 break;
3148 default:
3149 break;
3152 /* Warn if a non-standard expanded read occurs. A single read of a
3153 single object is acceptable. If a second read occurs, issue a warning
3154 and set the flag to zero to prevent further warnings. */
3155 if (dtp->u.p.expanded_read == 2)
3157 notify_std (&dtp->common, GFC_STD_GNU, "Non-standard expanded namelist read.");
3158 dtp->u.p.expanded_read = 0;
3161 /* If the expanded read warning flag is set, increment it,
3162 indicating that a single read has occurred. */
3163 if (dtp->u.p.expanded_read >= 1)
3164 dtp->u.p.expanded_read++;
3166 /* Break out of loop if scalar. */
3167 if (!nl->var_rank)
3168 break;
3170 /* Now increment the index vector. */
3172 incr_idx:
3174 nml_carry = 1;
3175 for (dim = 0; dim < nl->var_rank; dim++)
3177 nl->ls[dim].idx += nml_carry * nl->ls[dim].step;
3178 nml_carry = 0;
3179 if (((nl->ls[dim].step > 0) && (nl->ls[dim].idx > nl->ls[dim].end))
3181 ((nl->ls[dim].step < 0) && (nl->ls[dim].idx < nl->ls[dim].end)))
3183 nl->ls[dim].idx = nl->ls[dim].start;
3184 nml_carry = 1;
3187 } while (!nml_carry);
3189 if (dtp->u.p.repeat_count > 1)
3191 snprintf (nml_err_msg, nml_err_msg_size,
3192 "Repeat count too large for namelist object %s", nl->var_name);
3193 goto nml_err_ret;
3195 return true;
3197 nml_err_ret:
3199 return false;
3202 /* Parses the object name, including array and substring qualifiers. It
3203 iterates over derived type components, touching those components and
3204 setting their loop specifications, if there is a qualifier. If the
3205 object is itself a derived type, its components and subcomponents are
3206 touched. nml_read_obj is called at the end and this reads the data in
3207 the manner specified by the object name. */
3209 static bool
3210 nml_get_obj_data (st_parameter_dt *dtp, namelist_info **pprev_nl,
3211 char *nml_err_msg, size_t nml_err_msg_size)
3213 int c;
3214 namelist_info *nl;
3215 namelist_info *first_nl = NULL;
3216 namelist_info *root_nl = NULL;
3217 int dim, parsed_rank;
3218 int component_flag, qualifier_flag;
3219 index_type clow, chigh;
3220 int non_zero_rank_count;
3222 /* Look for end of input or object name. If '?' or '=?' are encountered
3223 in stdin, print the node names or the namelist to stdout. */
3225 eat_separator (dtp);
3226 if (dtp->u.p.input_complete)
3227 return true;
3229 if (dtp->u.p.at_eol)
3230 finish_separator (dtp);
3231 if (dtp->u.p.input_complete)
3232 return true;
3234 if ((c = next_char (dtp)) == EOF)
3235 goto nml_err_ret;
3236 switch (c)
3238 case '=':
3239 if ((c = next_char (dtp)) == EOF)
3240 goto nml_err_ret;
3241 if (c != '?')
3243 snprintf (nml_err_msg, nml_err_msg_size,
3244 "namelist read: misplaced = sign");
3245 goto nml_err_ret;
3247 nml_query (dtp, '=');
3248 return true;
3250 case '?':
3251 nml_query (dtp, '?');
3252 return true;
3254 case '$':
3255 case '&':
3256 nml_match_name (dtp, "end", 3);
3257 if (dtp->u.p.nml_read_error)
3259 snprintf (nml_err_msg, nml_err_msg_size,
3260 "namelist not terminated with / or &end");
3261 goto nml_err_ret;
3263 /* Fall through. */
3264 case '/':
3265 dtp->u.p.input_complete = 1;
3266 return true;
3268 default :
3269 break;
3272 /* Untouch all nodes of the namelist and reset the flags that are set for
3273 derived type components. */
3275 nml_untouch_nodes (dtp);
3276 component_flag = 0;
3277 qualifier_flag = 0;
3278 non_zero_rank_count = 0;
3280 /* Get the object name - should '!' and '\n' be permitted separators? */
3282 get_name:
3284 free_saved (dtp);
3288 if (!is_separator (c))
3289 push_char_default (dtp, tolower(c));
3290 if ((c = next_char (dtp)) == EOF)
3291 goto nml_err_ret;
3293 while (!( c=='=' || c==' ' || c=='\t' || c =='(' || c =='%' ));
3295 unget_char (dtp, c);
3297 /* Check that the name is in the namelist and get pointer to object.
3298 Three error conditions exist: (i) An attempt is being made to
3299 identify a non-existent object, following a failed data read or
3300 (ii) The object name does not exist or (iii) Too many data items
3301 are present for an object. (iii) gives the same error message
3302 as (i) */
3304 push_char_default (dtp, '\0');
3306 if (component_flag)
3308 #define EXT_STACK_SZ 100
3309 char ext_stack[EXT_STACK_SZ];
3310 char *ext_name;
3311 size_t var_len = strlen (root_nl->var_name);
3312 size_t saved_len
3313 = dtp->u.p.saved_string ? strlen (dtp->u.p.saved_string) : 0;
3314 size_t ext_size = var_len + saved_len + 1;
3316 if (ext_size > EXT_STACK_SZ)
3317 ext_name = xmalloc (ext_size);
3318 else
3319 ext_name = ext_stack;
3321 memcpy (ext_name, root_nl->var_name, var_len);
3322 if (dtp->u.p.saved_string)
3323 memcpy (ext_name + var_len, dtp->u.p.saved_string, saved_len);
3324 ext_name[var_len + saved_len] = '\0';
3325 nl = find_nml_node (dtp, ext_name);
3327 if (ext_size > EXT_STACK_SZ)
3328 free (ext_name);
3330 else
3331 nl = find_nml_node (dtp, dtp->u.p.saved_string);
3333 if (nl == NULL)
3335 if (dtp->u.p.nml_read_error && *pprev_nl)
3336 snprintf (nml_err_msg, nml_err_msg_size,
3337 "Bad data for namelist object %s", (*pprev_nl)->var_name);
3339 else
3340 snprintf (nml_err_msg, nml_err_msg_size,
3341 "Cannot match namelist object name %s",
3342 dtp->u.p.saved_string);
3344 goto nml_err_ret;
3347 /* Get the length, data length, base pointer and rank of the variable.
3348 Set the default loop specification first. */
3350 for (dim=0; dim < nl->var_rank; dim++)
3352 nl->ls[dim].step = 1;
3353 nl->ls[dim].end = GFC_DESCRIPTOR_UBOUND(nl,dim);
3354 nl->ls[dim].start = GFC_DESCRIPTOR_LBOUND(nl,dim);
3355 nl->ls[dim].idx = nl->ls[dim].start;
3358 /* Check to see if there is a qualifier: if so, parse it.*/
3360 if (c == '(' && nl->var_rank)
3362 parsed_rank = 0;
3363 if (!nml_parse_qualifier (dtp, nl->dim, nl->ls, nl->var_rank,
3364 nl->type, nml_err_msg, nml_err_msg_size,
3365 &parsed_rank))
3367 char *nml_err_msg_end = strchr (nml_err_msg, '\0');
3368 snprintf (nml_err_msg_end,
3369 nml_err_msg_size - (nml_err_msg_end - nml_err_msg),
3370 " for namelist variable %s", nl->var_name);
3371 goto nml_err_ret;
3373 if (parsed_rank > 0)
3374 non_zero_rank_count++;
3376 qualifier_flag = 1;
3378 if ((c = next_char (dtp)) == EOF)
3379 goto nml_err_ret;
3380 unget_char (dtp, c);
3382 else if (nl->var_rank > 0)
3383 non_zero_rank_count++;
3385 /* Now parse a derived type component. The root namelist_info address
3386 is backed up, as is the previous component level. The component flag
3387 is set and the iteration is made by jumping back to get_name. */
3389 if (c == '%')
3391 if (nl->type != BT_DERIVED)
3393 snprintf (nml_err_msg, nml_err_msg_size,
3394 "Attempt to get derived component for %s", nl->var_name);
3395 goto nml_err_ret;
3398 /* Don't move first_nl further in the list if a qualifier was found. */
3399 if ((*pprev_nl == NULL && !qualifier_flag) || !component_flag)
3400 first_nl = nl;
3402 root_nl = nl;
3404 component_flag = 1;
3405 if ((c = next_char (dtp)) == EOF)
3406 goto nml_err_ret;
3407 goto get_name;
3410 /* Parse a character qualifier, if present. chigh = 0 is a default
3411 that signals that the string length = string_length. */
3413 clow = 1;
3414 chigh = 0;
3416 if (c == '(' && nl->type == BT_CHARACTER)
3418 descriptor_dimension chd[1] = { {1, clow, nl->string_length} };
3419 array_loop_spec ind[1] = { {1, clow, nl->string_length, 1} };
3421 if (!nml_parse_qualifier (dtp, chd, ind, -1, nl->type,
3422 nml_err_msg, nml_err_msg_size, &parsed_rank))
3424 char *nml_err_msg_end = strchr (nml_err_msg, '\0');
3425 snprintf (nml_err_msg_end,
3426 nml_err_msg_size - (nml_err_msg_end - nml_err_msg),
3427 " for namelist variable %s", nl->var_name);
3428 goto nml_err_ret;
3431 clow = ind[0].start;
3432 chigh = ind[0].end;
3434 if (ind[0].step != 1)
3436 snprintf (nml_err_msg, nml_err_msg_size,
3437 "Step not allowed in substring qualifier"
3438 " for namelist object %s", nl->var_name);
3439 goto nml_err_ret;
3442 if ((c = next_char (dtp)) == EOF)
3443 goto nml_err_ret;
3444 unget_char (dtp, c);
3447 /* Make sure no extraneous qualifiers are there. */
3449 if (c == '(')
3451 snprintf (nml_err_msg, nml_err_msg_size,
3452 "Qualifier for a scalar or non-character namelist object %s",
3453 nl->var_name);
3454 goto nml_err_ret;
3457 /* Make sure there is no more than one non-zero rank object. */
3458 if (non_zero_rank_count > 1)
3460 snprintf (nml_err_msg, nml_err_msg_size,
3461 "Multiple sub-objects with non-zero rank in namelist object %s",
3462 nl->var_name);
3463 non_zero_rank_count = 0;
3464 goto nml_err_ret;
3467 /* According to the standard, an equal sign MUST follow an object name. The
3468 following is possibly lax - it allows comments, blank lines and so on to
3469 intervene. eat_spaces (dtp); c = next_char (dtp); would be compliant*/
3471 free_saved (dtp);
3473 eat_separator (dtp);
3474 if (dtp->u.p.input_complete)
3475 return true;
3477 if (dtp->u.p.at_eol)
3478 finish_separator (dtp);
3479 if (dtp->u.p.input_complete)
3480 return true;
3482 if ((c = next_char (dtp)) == EOF)
3483 goto nml_err_ret;
3485 if (c != '=')
3487 snprintf (nml_err_msg, nml_err_msg_size,
3488 "Equal sign must follow namelist object name %s",
3489 nl->var_name);
3490 goto nml_err_ret;
3493 /* If a derived type, touch its components and restore the root
3494 namelist_info if we have parsed a qualified derived type
3495 component. */
3497 if (nl->type == BT_DERIVED && nl->dtio_sub == NULL)
3498 nml_touch_nodes (nl);
3500 if (first_nl)
3502 if (first_nl->var_rank == 0)
3504 if (component_flag && qualifier_flag)
3505 nl = first_nl;
3507 else
3508 nl = first_nl;
3511 dtp->u.p.nml_read_error = 0;
3512 if (!nml_read_obj (dtp, nl, 0, pprev_nl, nml_err_msg, nml_err_msg_size,
3513 clow, chigh))
3514 goto nml_err_ret;
3516 return true;
3518 nml_err_ret:
3520 /* The EOF error message is issued by hit_eof. Return true so that the
3521 caller does not use nml_err_msg and nml_err_msg_size to generate
3522 an unrelated error message. */
3523 if (c == EOF)
3525 dtp->u.p.input_complete = 1;
3526 unget_char (dtp, c);
3527 hit_eof (dtp);
3528 return true;
3530 return false;
3533 /* Entry point for namelist input. Goes through input until namelist name
3534 is matched. Then cycles through nml_get_obj_data until the input is
3535 completed or there is an error. */
3537 void
3538 namelist_read (st_parameter_dt *dtp)
3540 int c;
3541 char nml_err_msg[200];
3543 /* Initialize the error string buffer just in case we get an unexpected fail
3544 somewhere and end up at nml_err_ret. */
3545 strcpy (nml_err_msg, "Internal namelist read error");
3547 /* Pointer to the previously read object, in case attempt is made to read
3548 new object name. Should this fail, error message can give previous
3549 name. */
3550 namelist_info *prev_nl = NULL;
3552 dtp->u.p.input_complete = 0;
3553 dtp->u.p.expanded_read = 0;
3555 /* Set the next_char and push_char worker functions. */
3556 set_workers (dtp);
3558 /* Look for &namelist_name . Skip all characters, testing for $nmlname.
3559 Exit on success or EOF. If '?' or '=?' encountered in stdin, print
3560 node names or namelist on stdout. */
3562 find_nml_name:
3563 c = next_char (dtp);
3564 switch (c)
3566 case '$':
3567 case '&':
3568 break;
3570 case '!':
3571 eat_line (dtp);
3572 goto find_nml_name;
3574 case '=':
3575 c = next_char (dtp);
3576 if (c == '?')
3577 nml_query (dtp, '=');
3578 else
3579 unget_char (dtp, c);
3580 goto find_nml_name;
3582 case '?':
3583 nml_query (dtp, '?');
3584 goto find_nml_name;
3586 case EOF:
3587 return;
3589 default:
3590 goto find_nml_name;
3593 /* Match the name of the namelist. */
3595 nml_match_name (dtp, dtp->namelist_name, dtp->namelist_name_len);
3597 if (dtp->u.p.nml_read_error)
3598 goto find_nml_name;
3600 /* A trailing space is required, we give a little latitude here, 10.9.1. */
3601 c = next_char (dtp);
3602 if (!is_separator(c) && c != '!')
3604 unget_char (dtp, c);
3605 goto find_nml_name;
3608 unget_char (dtp, c);
3609 eat_separator (dtp);
3611 /* Ready to read namelist objects. If there is an error in input
3612 from stdin, output the error message and continue. */
3614 while (!dtp->u.p.input_complete)
3616 if (!nml_get_obj_data (dtp, &prev_nl, nml_err_msg, sizeof nml_err_msg))
3617 goto nml_err_ret;
3619 /* Reset the previous namelist pointer if we know we are not going
3620 to be doing multiple reads within a single namelist object. */
3621 if (prev_nl && prev_nl->var_rank == 0)
3622 prev_nl = NULL;
3625 free_saved (dtp);
3626 free_line (dtp);
3627 return;
3630 nml_err_ret:
3632 /* All namelist error calls return from here */
3633 free_saved (dtp);
3634 free_line (dtp);
3635 generate_error (&dtp->common, LIBERROR_READ_VALUE, nml_err_msg);
3636 return;