Fix typo in common.opt
[official-gcc.git] / libgfortran / io / list_read.c
blob9175a6bb677f3f2c7fd7992a225ed4eb7cf8eb9d
1 /* Copyright (C) 2002-2017 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. */
270 if (is_char4_unit(dtp)) /* Check for kind=4 internal unit. */
271 length = sread (dtp->u.p.current_unit->s, &c, 1);
272 else
274 char cc;
275 length = sread (dtp->u.p.current_unit->s, &cc, 1);
276 c = cc;
279 if (unlikely (length < 0))
281 generate_error (&dtp->common, LIBERROR_OS, NULL);
282 return '\0';
285 if (is_array_io (dtp))
287 /* Check whether we hit EOF. */
288 if (unlikely (length == 0))
290 generate_error (&dtp->common, LIBERROR_INTERNAL_UNIT, NULL);
291 return '\0';
293 dtp->u.p.current_unit->bytes_left--;
295 else
297 if (dtp->u.p.at_eof)
298 return EOF;
299 if (length == 0)
301 c = '\n';
302 dtp->u.p.at_eof = 1;
306 done:
307 dtp->u.p.at_eol = (c == '\n' || c == EOF);
308 return c;
312 /* Worker function for UTF encoded files. */
313 static int
314 next_char_utf8 (st_parameter_dt *dtp)
316 static const uchar masks[6] = { 0x7F, 0x1F, 0x0F, 0x07, 0x02, 0x01 };
317 static const uchar patns[6] = { 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC };
318 int i, nb;
319 gfc_char4_t c;
321 /* Always check the unget and line buffer first. */
322 if (!(c = check_buffers (dtp)))
323 c = fbuf_getc (dtp->u.p.current_unit);
325 if (c < 0x80)
326 goto utf_done;
328 /* The number of leading 1-bits in the first byte indicates how many
329 bytes follow. */
330 for (nb = 2; nb < 7; nb++)
331 if ((c & ~masks[nb-1]) == patns[nb-1])
332 goto found;
333 goto invalid;
335 found:
336 c = (c & masks[nb-1]);
338 /* Decode the bytes read. */
339 for (i = 1; i < nb; i++)
341 gfc_char4_t n = fbuf_getc (dtp->u.p.current_unit);
342 if ((n & 0xC0) != 0x80)
343 goto invalid;
344 c = ((c << 6) + (n & 0x3F));
347 /* Make sure the shortest possible encoding was used. */
348 if (c <= 0x7F && nb > 1) goto invalid;
349 if (c <= 0x7FF && nb > 2) goto invalid;
350 if (c <= 0xFFFF && nb > 3) goto invalid;
351 if (c <= 0x1FFFFF && nb > 4) goto invalid;
352 if (c <= 0x3FFFFFF && nb > 5) goto invalid;
354 /* Make sure the character is valid. */
355 if (c > 0x7FFFFFFF || (c >= 0xD800 && c <= 0xDFFF))
356 goto invalid;
358 utf_done:
359 dtp->u.p.at_eol = (c == '\n' || c == (gfc_char4_t) EOF);
360 return (int) c;
362 invalid:
363 generate_error (&dtp->common, LIBERROR_READ_VALUE, "Invalid UTF-8 encoding");
364 return (gfc_char4_t) '?';
367 /* Push a character back onto the input. */
369 static void
370 unget_char (st_parameter_dt *dtp, int c)
372 dtp->u.p.current_unit->last_char = c;
376 /* Skip over spaces in the input. Returns the nonspace character that
377 terminated the eating and also places it back on the input. */
379 static int
380 eat_spaces (st_parameter_dt *dtp)
382 int c;
384 /* If internal character array IO, peak ahead and seek past spaces.
385 This is an optimization unique to character arrays with large
386 character lengths (PR38199). This code eliminates numerous calls
387 to next_character. */
388 if (is_array_io (dtp) && (dtp->u.p.current_unit->last_char == EOF - 1))
390 gfc_offset offset = stell (dtp->u.p.current_unit->s);
391 gfc_offset i;
393 if (is_char4_unit(dtp)) /* kind=4 */
395 for (i = 0; i < dtp->u.p.current_unit->bytes_left; i++)
397 if (dtp->internal_unit[(offset + i) * sizeof (gfc_char4_t)]
398 != (gfc_char4_t)' ')
399 break;
402 else
404 for (i = 0; i < dtp->u.p.current_unit->bytes_left; i++)
406 if (dtp->internal_unit[offset + i] != ' ')
407 break;
411 if (i != 0)
413 sseek (dtp->u.p.current_unit->s, offset + i, SEEK_SET);
414 dtp->u.p.current_unit->bytes_left -= i;
418 /* Now skip spaces, EOF and EOL are handled in next_char. */
420 c = next_char (dtp);
421 while (c != EOF && (c == ' ' || c == '\r' || c == '\t'));
423 unget_char (dtp, c);
424 return c;
428 /* This function reads characters through to the end of the current
429 line and just ignores them. Returns 0 for success and LIBERROR_END
430 if it hit EOF. */
432 static int
433 eat_line (st_parameter_dt *dtp)
435 int c;
438 c = next_char (dtp);
439 while (c != EOF && c != '\n');
440 if (c == EOF)
441 return LIBERROR_END;
442 return 0;
446 /* Skip over a separator. Technically, we don't always eat the whole
447 separator. This is because if we've processed the last input item,
448 then a separator is unnecessary. Plus the fact that operating
449 systems usually deliver console input on a line basis.
451 The upshot is that if we see a newline as part of reading a
452 separator, we stop reading. If there are more input items, we
453 continue reading the separator with finish_separator() which takes
454 care of the fact that we may or may not have seen a comma as part
455 of the separator.
457 Returns 0 for success, and non-zero error code otherwise. */
459 static int
460 eat_separator (st_parameter_dt *dtp)
462 int c, n;
463 int err = 0;
465 eat_spaces (dtp);
466 dtp->u.p.comma_flag = 0;
468 if ((c = next_char (dtp)) == EOF)
469 return LIBERROR_END;
470 switch (c)
472 case ',':
473 if (dtp->u.p.current_unit->decimal_status == DECIMAL_COMMA)
475 unget_char (dtp, c);
476 break;
478 /* Fall through. */
479 case ';':
480 dtp->u.p.comma_flag = 1;
481 eat_spaces (dtp);
482 break;
484 case '/':
485 dtp->u.p.input_complete = 1;
486 break;
488 case '\r':
489 if ((n = next_char(dtp)) == EOF)
490 return LIBERROR_END;
491 if (n != '\n')
493 unget_char (dtp, n);
494 break;
496 /* Fall through. */
497 case '\n':
498 dtp->u.p.at_eol = 1;
499 if (dtp->u.p.namelist_mode)
503 if ((c = next_char (dtp)) == EOF)
504 return LIBERROR_END;
505 if (c == '!')
507 err = eat_line (dtp);
508 if (err)
509 return err;
510 c = '\n';
513 while (c == '\n' || c == '\r' || c == ' ' || c == '\t');
514 unget_char (dtp, c);
516 break;
518 case '!':
519 /* Eat a namelist comment. */
520 if (dtp->u.p.namelist_mode)
522 err = eat_line (dtp);
523 if (err)
524 return err;
526 break;
529 /* Fall Through... */
531 default:
532 unget_char (dtp, c);
533 break;
535 return err;
539 /* Finish processing a separator that was interrupted by a newline.
540 If we're here, then another data item is present, so we finish what
541 we started on the previous line. Return 0 on success, error code
542 on failure. */
544 static int
545 finish_separator (st_parameter_dt *dtp)
547 int c;
548 int err = LIBERROR_OK;
550 restart:
551 eat_spaces (dtp);
553 if ((c = next_char (dtp)) == EOF)
554 return LIBERROR_END;
555 switch (c)
557 case ',':
558 if (dtp->u.p.comma_flag)
559 unget_char (dtp, c);
560 else
562 if ((c = eat_spaces (dtp)) == EOF)
563 return LIBERROR_END;
564 if (c == '\n' || c == '\r')
565 goto restart;
568 break;
570 case '/':
571 dtp->u.p.input_complete = 1;
572 if (!dtp->u.p.namelist_mode)
573 return err;
574 break;
576 case '\n':
577 case '\r':
578 goto restart;
580 case '!':
581 if (dtp->u.p.namelist_mode)
583 err = eat_line (dtp);
584 if (err)
585 return err;
586 goto restart;
588 /* Fall through. */
589 default:
590 unget_char (dtp, c);
591 break;
593 return err;
597 /* This function is needed to catch bad conversions so that namelist can
598 attempt to see if dtp->u.p.saved_string contains a new object name rather
599 than a bad value. */
601 static int
602 nml_bad_return (st_parameter_dt *dtp, char c)
604 if (dtp->u.p.namelist_mode)
606 dtp->u.p.nml_read_error = 1;
607 unget_char (dtp, c);
608 return 1;
610 return 0;
613 /* Convert an unsigned string to an integer. The length value is -1
614 if we are working on a repeat count. Returns nonzero if we have a
615 range problem. As a side effect, frees the dtp->u.p.saved_string. */
617 static int
618 convert_integer (st_parameter_dt *dtp, int length, int negative)
620 char c, *buffer, message[MSGLEN];
621 int m;
622 GFC_UINTEGER_LARGEST v, max, max10;
623 GFC_INTEGER_LARGEST value;
625 buffer = dtp->u.p.saved_string;
626 v = 0;
628 if (length == -1)
629 max = MAX_REPEAT;
630 else
632 max = si_max (length);
633 if (negative)
634 max++;
636 max10 = max / 10;
638 for (;;)
640 c = *buffer++;
641 if (c == '\0')
642 break;
643 c -= '0';
645 if (v > max10)
646 goto overflow;
647 v = 10 * v;
649 if (v > max - c)
650 goto overflow;
651 v += c;
654 m = 0;
656 if (length != -1)
658 if (negative)
659 value = -v;
660 else
661 value = v;
662 set_integer (dtp->u.p.value, value, length);
664 else
666 dtp->u.p.repeat_count = v;
668 if (dtp->u.p.repeat_count == 0)
670 snprintf (message, MSGLEN, "Zero repeat count in item %d of list input",
671 dtp->u.p.item_count);
673 generate_error (&dtp->common, LIBERROR_READ_VALUE, message);
674 m = 1;
678 free_saved (dtp);
679 return m;
681 overflow:
682 if (length == -1)
683 snprintf (message, MSGLEN, "Repeat count overflow in item %d of list input",
684 dtp->u.p.item_count);
685 else
686 snprintf (message, MSGLEN, "Integer overflow while reading item %d",
687 dtp->u.p.item_count);
689 free_saved (dtp);
690 generate_error (&dtp->common, LIBERROR_READ_VALUE, message);
692 return 1;
696 /* Parse a repeat count for logical and complex values which cannot
697 begin with a digit. Returns nonzero if we are done, zero if we
698 should continue on. */
700 static int
701 parse_repeat (st_parameter_dt *dtp)
703 char message[MSGLEN];
704 int c, repeat;
706 if ((c = next_char (dtp)) == EOF)
707 goto bad_repeat;
708 switch (c)
710 CASE_DIGITS:
711 repeat = c - '0';
712 break;
714 CASE_SEPARATORS:
715 unget_char (dtp, c);
716 eat_separator (dtp);
717 return 1;
719 default:
720 unget_char (dtp, c);
721 return 0;
724 for (;;)
726 c = next_char (dtp);
727 switch (c)
729 CASE_DIGITS:
730 repeat = 10 * repeat + c - '0';
732 if (repeat > MAX_REPEAT)
734 snprintf (message, MSGLEN,
735 "Repeat count overflow in item %d of list input",
736 dtp->u.p.item_count);
738 generate_error (&dtp->common, LIBERROR_READ_VALUE, message);
739 return 1;
742 break;
744 case '*':
745 if (repeat == 0)
747 snprintf (message, MSGLEN,
748 "Zero repeat count in item %d of list input",
749 dtp->u.p.item_count);
751 generate_error (&dtp->common, LIBERROR_READ_VALUE, message);
752 return 1;
755 goto done;
757 default:
758 goto bad_repeat;
762 done:
763 dtp->u.p.repeat_count = repeat;
764 return 0;
766 bad_repeat:
768 free_saved (dtp);
769 if (c == EOF)
771 free_line (dtp);
772 hit_eof (dtp);
773 return 1;
775 else
776 eat_line (dtp);
777 snprintf (message, MSGLEN, "Bad repeat count in item %d of list input",
778 dtp->u.p.item_count);
779 generate_error (&dtp->common, LIBERROR_READ_VALUE, message);
780 return 1;
784 /* To read a logical we have to look ahead in the input stream to make sure
785 there is not an equal sign indicating a variable name. To do this we use
786 line_buffer to point to a temporary buffer, pushing characters there for
787 possible later reading. */
789 static void
790 l_push_char (st_parameter_dt *dtp, char c)
792 if (dtp->u.p.line_buffer == NULL)
793 dtp->u.p.line_buffer = xcalloc (SCRATCH_SIZE, 1);
795 dtp->u.p.line_buffer[dtp->u.p.line_buffer_pos++] = c;
799 /* Read a logical character on the input. */
801 static void
802 read_logical (st_parameter_dt *dtp, int length)
804 char message[MSGLEN];
805 int c, i, v;
807 if (parse_repeat (dtp))
808 return;
810 c = tolower (next_char (dtp));
811 l_push_char (dtp, c);
812 switch (c)
814 case 't':
815 v = 1;
816 c = next_char (dtp);
817 l_push_char (dtp, c);
819 if (!is_separator(c) && c != EOF)
820 goto possible_name;
822 unget_char (dtp, c);
823 break;
824 case 'f':
825 v = 0;
826 c = next_char (dtp);
827 l_push_char (dtp, c);
829 if (!is_separator(c) && c != EOF)
830 goto possible_name;
832 unget_char (dtp, c);
833 break;
835 case '.':
836 c = tolower (next_char (dtp));
837 switch (c)
839 case 't':
840 v = 1;
841 break;
842 case 'f':
843 v = 0;
844 break;
845 default:
846 goto bad_logical;
849 break;
851 case '!':
852 if (!dtp->u.p.namelist_mode)
853 goto bad_logical;
855 CASE_SEPARATORS:
856 case EOF:
857 unget_char (dtp, c);
858 eat_separator (dtp);
859 return; /* Null value. */
861 default:
862 /* Save the character in case it is the beginning
863 of the next object name. */
864 unget_char (dtp, c);
865 goto bad_logical;
868 dtp->u.p.saved_type = BT_LOGICAL;
869 dtp->u.p.saved_length = length;
871 /* Eat trailing garbage. */
873 c = next_char (dtp);
874 while (c != EOF && !is_separator (c));
876 unget_char (dtp, c);
877 eat_separator (dtp);
878 set_integer ((int *) dtp->u.p.value, v, length);
879 free_line (dtp);
881 return;
883 possible_name:
885 for(i = 0; i < 63; i++)
887 c = next_char (dtp);
888 if (is_separator(c))
890 /* All done if this is not a namelist read. */
891 if (!dtp->u.p.namelist_mode)
892 goto logical_done;
894 unget_char (dtp, c);
895 eat_separator (dtp);
896 c = next_char (dtp);
897 if (c != '=')
899 unget_char (dtp, c);
900 goto logical_done;
904 l_push_char (dtp, c);
905 if (c == '=')
907 dtp->u.p.nml_read_error = 1;
908 dtp->u.p.line_buffer_enabled = 1;
909 dtp->u.p.line_buffer_pos = 0;
910 return;
915 bad_logical:
917 if (nml_bad_return (dtp, c))
919 free_line (dtp);
920 return;
924 free_saved (dtp);
925 if (c == EOF)
927 free_line (dtp);
928 hit_eof (dtp);
929 return;
931 else if (c != '\n')
932 eat_line (dtp);
933 snprintf (message, MSGLEN, "Bad logical value while reading item %d",
934 dtp->u.p.item_count);
935 free_line (dtp);
936 generate_error (&dtp->common, LIBERROR_READ_VALUE, message);
937 return;
939 logical_done:
941 dtp->u.p.saved_type = BT_LOGICAL;
942 dtp->u.p.saved_length = length;
943 set_integer ((int *) dtp->u.p.value, v, length);
944 free_saved (dtp);
945 free_line (dtp);
949 /* Reading integers is tricky because we can actually be reading a
950 repeat count. We have to store the characters in a buffer because
951 we could be reading an integer that is larger than the default int
952 used for repeat counts. */
954 static void
955 read_integer (st_parameter_dt *dtp, int length)
957 char message[MSGLEN];
958 int c, negative;
960 negative = 0;
962 c = next_char (dtp);
963 switch (c)
965 case '-':
966 negative = 1;
967 /* Fall through... */
969 case '+':
970 if ((c = next_char (dtp)) == EOF)
971 goto bad_integer;
972 goto get_integer;
974 case '!':
975 if (!dtp->u.p.namelist_mode)
976 goto bad_integer;
978 CASE_SEPARATORS: /* Single null. */
979 unget_char (dtp, c);
980 eat_separator (dtp);
981 return;
983 CASE_DIGITS:
984 push_char (dtp, c);
985 break;
987 default:
988 goto bad_integer;
991 /* Take care of what may be a repeat count. */
993 for (;;)
995 c = next_char (dtp);
996 switch (c)
998 CASE_DIGITS:
999 push_char (dtp, c);
1000 break;
1002 case '*':
1003 push_char (dtp, '\0');
1004 goto repeat;
1006 case '!':
1007 if (!dtp->u.p.namelist_mode)
1008 goto bad_integer;
1010 CASE_SEPARATORS: /* Not a repeat count. */
1011 case EOF:
1012 goto done;
1014 default:
1015 goto bad_integer;
1019 repeat:
1020 if (convert_integer (dtp, -1, 0))
1021 return;
1023 /* Get the real integer. */
1025 if ((c = next_char (dtp)) == EOF)
1026 goto bad_integer;
1027 switch (c)
1029 CASE_DIGITS:
1030 break;
1032 case '!':
1033 if (!dtp->u.p.namelist_mode)
1034 goto bad_integer;
1036 CASE_SEPARATORS:
1037 unget_char (dtp, c);
1038 eat_separator (dtp);
1039 return;
1041 case '-':
1042 negative = 1;
1043 /* Fall through... */
1045 case '+':
1046 c = next_char (dtp);
1047 break;
1050 get_integer:
1051 if (!isdigit (c))
1052 goto bad_integer;
1053 push_char (dtp, c);
1055 for (;;)
1057 c = next_char (dtp);
1058 switch (c)
1060 CASE_DIGITS:
1061 push_char (dtp, c);
1062 break;
1064 case '!':
1065 if (!dtp->u.p.namelist_mode)
1066 goto bad_integer;
1068 CASE_SEPARATORS:
1069 case EOF:
1070 goto done;
1072 default:
1073 goto bad_integer;
1077 bad_integer:
1079 if (nml_bad_return (dtp, c))
1080 return;
1082 free_saved (dtp);
1083 if (c == EOF)
1085 free_line (dtp);
1086 hit_eof (dtp);
1087 return;
1089 else if (c != '\n')
1090 eat_line (dtp);
1092 snprintf (message, MSGLEN, "Bad integer for item %d in list input",
1093 dtp->u.p.item_count);
1094 free_line (dtp);
1095 generate_error (&dtp->common, LIBERROR_READ_VALUE, message);
1097 return;
1099 done:
1100 unget_char (dtp, c);
1101 eat_separator (dtp);
1103 push_char (dtp, '\0');
1104 if (convert_integer (dtp, length, negative))
1106 free_saved (dtp);
1107 return;
1110 free_saved (dtp);
1111 dtp->u.p.saved_type = BT_INTEGER;
1115 /* Read a character variable. */
1117 static void
1118 read_character (st_parameter_dt *dtp, int length __attribute__ ((unused)))
1120 char quote, message[MSGLEN];
1121 int c;
1123 quote = ' '; /* Space means no quote character. */
1125 if ((c = next_char (dtp)) == EOF)
1126 goto eof;
1127 switch (c)
1129 CASE_DIGITS:
1130 push_char (dtp, c);
1131 break;
1133 CASE_SEPARATORS:
1134 case EOF:
1135 unget_char (dtp, c); /* NULL value. */
1136 eat_separator (dtp);
1137 return;
1139 case '"':
1140 case '\'':
1141 quote = c;
1142 goto get_string;
1144 default:
1145 if (dtp->u.p.namelist_mode)
1147 unget_char (dtp, c);
1148 return;
1150 push_char (dtp, c);
1151 goto get_string;
1154 /* Deal with a possible repeat count. */
1156 for (;;)
1158 c = next_char (dtp);
1159 switch (c)
1161 CASE_DIGITS:
1162 push_char (dtp, c);
1163 break;
1165 CASE_SEPARATORS:
1166 case EOF:
1167 unget_char (dtp, c);
1168 goto done; /* String was only digits! */
1170 case '*':
1171 push_char (dtp, '\0');
1172 goto got_repeat;
1174 default:
1175 push_char (dtp, c);
1176 goto get_string; /* Not a repeat count after all. */
1180 got_repeat:
1181 if (convert_integer (dtp, -1, 0))
1182 return;
1184 /* Now get the real string. */
1186 if ((c = next_char (dtp)) == EOF)
1187 goto eof;
1188 switch (c)
1190 CASE_SEPARATORS:
1191 unget_char (dtp, c); /* Repeated NULL values. */
1192 eat_separator (dtp);
1193 return;
1195 case '"':
1196 case '\'':
1197 quote = c;
1198 break;
1200 default:
1201 push_char (dtp, c);
1202 break;
1205 get_string:
1207 for (;;)
1209 if ((c = next_char (dtp)) == EOF)
1210 goto done_eof;
1211 switch (c)
1213 case '"':
1214 case '\'':
1215 if (c != quote)
1217 push_char (dtp, c);
1218 break;
1221 /* See if we have a doubled quote character or the end of
1222 the string. */
1224 if ((c = next_char (dtp)) == EOF)
1225 goto done_eof;
1226 if (c == quote)
1228 push_char (dtp, quote);
1229 break;
1232 unget_char (dtp, c);
1233 goto done;
1235 CASE_SEPARATORS:
1236 if (quote == ' ')
1238 unget_char (dtp, c);
1239 goto done;
1242 if (c != '\n' && c != '\r')
1243 push_char (dtp, c);
1244 break;
1246 default:
1247 push_char (dtp, c);
1248 break;
1252 /* At this point, we have to have a separator, or else the string is
1253 invalid. */
1254 done:
1255 c = next_char (dtp);
1256 done_eof:
1257 if (is_separator (c) || c == EOF)
1259 unget_char (dtp, c);
1260 eat_separator (dtp);
1261 dtp->u.p.saved_type = BT_CHARACTER;
1263 else
1265 free_saved (dtp);
1266 snprintf (message, MSGLEN, "Invalid string input in item %d",
1267 dtp->u.p.item_count);
1268 generate_error (&dtp->common, LIBERROR_READ_VALUE, message);
1270 free_line (dtp);
1271 return;
1273 eof:
1274 free_saved (dtp);
1275 free_line (dtp);
1276 hit_eof (dtp);
1280 /* Parse a component of a complex constant or a real number that we
1281 are sure is already there. This is a straight real number parser. */
1283 static int
1284 parse_real (st_parameter_dt *dtp, void *buffer, int length)
1286 char message[MSGLEN];
1287 int c, m, seen_dp;
1289 if ((c = next_char (dtp)) == EOF)
1290 goto bad;
1292 if (c == '-' || c == '+')
1294 push_char (dtp, c);
1295 if ((c = next_char (dtp)) == EOF)
1296 goto bad;
1299 if (c == ',' && dtp->u.p.current_unit->decimal_status == DECIMAL_COMMA)
1300 c = '.';
1302 if (!isdigit (c) && c != '.')
1304 if (c == 'i' || c == 'I' || c == 'n' || c == 'N')
1305 goto inf_nan;
1306 else
1307 goto bad;
1310 push_char (dtp, c);
1312 seen_dp = (c == '.') ? 1 : 0;
1314 for (;;)
1316 if ((c = next_char (dtp)) == EOF)
1317 goto bad;
1318 if (c == ',' && dtp->u.p.current_unit->decimal_status == DECIMAL_COMMA)
1319 c = '.';
1320 switch (c)
1322 CASE_DIGITS:
1323 push_char (dtp, c);
1324 break;
1326 case '.':
1327 if (seen_dp)
1328 goto bad;
1330 seen_dp = 1;
1331 push_char (dtp, c);
1332 break;
1334 case 'e':
1335 case 'E':
1336 case 'd':
1337 case 'D':
1338 case 'q':
1339 case 'Q':
1340 push_char (dtp, 'e');
1341 goto exp1;
1343 case '-':
1344 case '+':
1345 push_char (dtp, 'e');
1346 push_char (dtp, c);
1347 if ((c = next_char (dtp)) == EOF)
1348 goto bad;
1349 goto exp2;
1351 case '!':
1352 if (!dtp->u.p.namelist_mode)
1353 goto bad;
1355 CASE_SEPARATORS:
1356 case EOF:
1357 goto done;
1359 default:
1360 goto done;
1364 exp1:
1365 if ((c = next_char (dtp)) == EOF)
1366 goto bad;
1367 if (c != '-' && c != '+')
1368 push_char (dtp, '+');
1369 else
1371 push_char (dtp, c);
1372 c = next_char (dtp);
1375 exp2:
1376 if (!isdigit (c))
1378 /* Extension: allow default exponent of 0 when omitted. */
1379 if (dtp->common.flags & IOPARM_DT_DEFAULT_EXP)
1381 push_char (dtp, '0');
1382 goto done;
1384 else
1385 goto bad_exponent;
1388 push_char (dtp, c);
1390 for (;;)
1392 if ((c = next_char (dtp)) == EOF)
1393 goto bad;
1394 switch (c)
1396 CASE_DIGITS:
1397 push_char (dtp, c);
1398 break;
1400 case '!':
1401 if (!dtp->u.p.namelist_mode)
1402 goto bad;
1404 CASE_SEPARATORS:
1405 case EOF:
1406 unget_char (dtp, c);
1407 goto done;
1409 default:
1410 goto done;
1414 done:
1415 unget_char (dtp, c);
1416 push_char (dtp, '\0');
1418 m = convert_real (dtp, buffer, dtp->u.p.saved_string, length);
1419 free_saved (dtp);
1421 return m;
1423 done_infnan:
1424 unget_char (dtp, c);
1425 push_char (dtp, '\0');
1427 m = convert_infnan (dtp, buffer, dtp->u.p.saved_string, length);
1428 free_saved (dtp);
1430 return m;
1432 inf_nan:
1433 /* Match INF and Infinity. */
1434 if ((c == 'i' || c == 'I')
1435 && ((c = next_char (dtp)) == 'n' || c == 'N')
1436 && ((c = next_char (dtp)) == 'f' || c == 'F'))
1438 c = next_char (dtp);
1439 if ((c != 'i' && c != 'I')
1440 || ((c == 'i' || c == 'I')
1441 && ((c = next_char (dtp)) == 'n' || c == 'N')
1442 && ((c = next_char (dtp)) == 'i' || c == 'I')
1443 && ((c = next_char (dtp)) == 't' || c == 'T')
1444 && ((c = next_char (dtp)) == 'y' || c == 'Y')
1445 && (c = next_char (dtp))))
1447 if (is_separator (c) || (c == EOF))
1448 unget_char (dtp, c);
1449 push_char (dtp, 'i');
1450 push_char (dtp, 'n');
1451 push_char (dtp, 'f');
1452 goto done_infnan;
1454 } /* Match NaN. */
1455 else if (((c = next_char (dtp)) == 'a' || c == 'A')
1456 && ((c = next_char (dtp)) == 'n' || c == 'N')
1457 && (c = next_char (dtp)))
1459 if (is_separator (c) || (c == EOF))
1460 unget_char (dtp, c);
1461 push_char (dtp, 'n');
1462 push_char (dtp, 'a');
1463 push_char (dtp, 'n');
1465 /* Match "NAN(alphanum)". */
1466 if (c == '(')
1468 for ( ; c != ')'; c = next_char (dtp))
1469 if (is_separator (c))
1470 goto bad;
1472 c = next_char (dtp);
1473 if (is_separator (c) || (c == EOF))
1474 unget_char (dtp, c);
1476 goto done_infnan;
1479 bad:
1481 if (nml_bad_return (dtp, c))
1482 return 0;
1484 bad_exponent:
1486 free_saved (dtp);
1487 if (c == EOF)
1489 free_line (dtp);
1490 hit_eof (dtp);
1491 return 1;
1493 else if (c != '\n')
1494 eat_line (dtp);
1496 snprintf (message, MSGLEN, "Bad complex floating point "
1497 "number for item %d", dtp->u.p.item_count);
1498 free_line (dtp);
1499 generate_error (&dtp->common, LIBERROR_READ_VALUE, message);
1501 return 1;
1505 /* Reading a complex number is straightforward because we can tell
1506 what it is right away. */
1508 static void
1509 read_complex (st_parameter_dt *dtp, void *dest, int kind, size_t size)
1511 char message[MSGLEN];
1512 int c;
1514 if (parse_repeat (dtp))
1515 return;
1517 c = next_char (dtp);
1518 switch (c)
1520 case '(':
1521 break;
1523 case '!':
1524 if (!dtp->u.p.namelist_mode)
1525 goto bad_complex;
1527 CASE_SEPARATORS:
1528 case EOF:
1529 unget_char (dtp, c);
1530 eat_separator (dtp);
1531 return;
1533 default:
1534 goto bad_complex;
1537 eol_1:
1538 eat_spaces (dtp);
1539 c = next_char (dtp);
1540 if (c == '\n' || c== '\r')
1541 goto eol_1;
1542 else
1543 unget_char (dtp, c);
1545 if (parse_real (dtp, dest, kind))
1546 return;
1548 eol_2:
1549 eat_spaces (dtp);
1550 c = next_char (dtp);
1551 if (c == '\n' || c== '\r')
1552 goto eol_2;
1553 else
1554 unget_char (dtp, c);
1556 if (next_char (dtp)
1557 != (dtp->u.p.current_unit->decimal_status == DECIMAL_POINT ? ',' : ';'))
1558 goto bad_complex;
1560 eol_3:
1561 eat_spaces (dtp);
1562 c = next_char (dtp);
1563 if (c == '\n' || c== '\r')
1564 goto eol_3;
1565 else
1566 unget_char (dtp, c);
1568 if (parse_real (dtp, dest + size / 2, kind))
1569 return;
1571 eol_4:
1572 eat_spaces (dtp);
1573 c = next_char (dtp);
1574 if (c == '\n' || c== '\r')
1575 goto eol_4;
1576 else
1577 unget_char (dtp, c);
1579 if (next_char (dtp) != ')')
1580 goto bad_complex;
1582 c = next_char (dtp);
1583 if (!is_separator (c) && (c != EOF))
1584 goto bad_complex;
1586 unget_char (dtp, c);
1587 eat_separator (dtp);
1589 free_saved (dtp);
1590 dtp->u.p.saved_type = BT_COMPLEX;
1591 return;
1593 bad_complex:
1595 if (nml_bad_return (dtp, c))
1596 return;
1598 free_saved (dtp);
1599 if (c == EOF)
1601 free_line (dtp);
1602 hit_eof (dtp);
1603 return;
1605 else if (c != '\n')
1606 eat_line (dtp);
1608 snprintf (message, MSGLEN, "Bad complex value in item %d of list input",
1609 dtp->u.p.item_count);
1610 free_line (dtp);
1611 generate_error (&dtp->common, LIBERROR_READ_VALUE, message);
1615 /* Parse a real number with a possible repeat count. */
1617 static void
1618 read_real (st_parameter_dt *dtp, void *dest, int length)
1620 char message[MSGLEN];
1621 int c;
1622 int seen_dp;
1623 int is_inf;
1625 seen_dp = 0;
1627 c = next_char (dtp);
1628 if (c == ',' && dtp->u.p.current_unit->decimal_status == DECIMAL_COMMA)
1629 c = '.';
1630 switch (c)
1632 CASE_DIGITS:
1633 push_char (dtp, c);
1634 break;
1636 case '.':
1637 push_char (dtp, c);
1638 seen_dp = 1;
1639 break;
1641 case '+':
1642 case '-':
1643 goto got_sign;
1645 case '!':
1646 if (!dtp->u.p.namelist_mode)
1647 goto bad_real;
1649 CASE_SEPARATORS:
1650 unget_char (dtp, c); /* Single null. */
1651 eat_separator (dtp);
1652 return;
1654 case 'i':
1655 case 'I':
1656 case 'n':
1657 case 'N':
1658 goto inf_nan;
1660 default:
1661 goto bad_real;
1664 /* Get the digit string that might be a repeat count. */
1666 for (;;)
1668 c = next_char (dtp);
1669 if (c == ',' && dtp->u.p.current_unit->decimal_status == DECIMAL_COMMA)
1670 c = '.';
1671 switch (c)
1673 CASE_DIGITS:
1674 push_char (dtp, c);
1675 break;
1677 case '.':
1678 if (seen_dp)
1679 goto bad_real;
1681 seen_dp = 1;
1682 push_char (dtp, c);
1683 goto real_loop;
1685 case 'E':
1686 case 'e':
1687 case 'D':
1688 case 'd':
1689 case 'Q':
1690 case 'q':
1691 goto exp1;
1693 case '+':
1694 case '-':
1695 push_char (dtp, 'e');
1696 push_char (dtp, c);
1697 c = next_char (dtp);
1698 goto exp2;
1700 case '*':
1701 push_char (dtp, '\0');
1702 goto got_repeat;
1704 case '!':
1705 if (!dtp->u.p.namelist_mode)
1706 goto bad_real;
1708 CASE_SEPARATORS:
1709 case EOF:
1710 if (c != '\n' && c != ',' && c != '\r' && c != ';')
1711 unget_char (dtp, c);
1712 goto done;
1714 default:
1715 goto bad_real;
1719 got_repeat:
1720 if (convert_integer (dtp, -1, 0))
1721 return;
1723 /* Now get the number itself. */
1725 if ((c = next_char (dtp)) == EOF)
1726 goto bad_real;
1727 if (is_separator (c))
1728 { /* Repeated null value. */
1729 unget_char (dtp, c);
1730 eat_separator (dtp);
1731 return;
1734 if (c != '-' && c != '+')
1735 push_char (dtp, '+');
1736 else
1738 got_sign:
1739 push_char (dtp, c);
1740 if ((c = next_char (dtp)) == EOF)
1741 goto bad_real;
1744 if (c == ',' && dtp->u.p.current_unit->decimal_status == DECIMAL_COMMA)
1745 c = '.';
1747 if (!isdigit (c) && c != '.')
1749 if (c == 'i' || c == 'I' || c == 'n' || c == 'N')
1750 goto inf_nan;
1751 else
1752 goto bad_real;
1755 if (c == '.')
1757 if (seen_dp)
1758 goto bad_real;
1759 else
1760 seen_dp = 1;
1763 push_char (dtp, c);
1765 real_loop:
1766 for (;;)
1768 c = next_char (dtp);
1769 if (c == ',' && dtp->u.p.current_unit->decimal_status == DECIMAL_COMMA)
1770 c = '.';
1771 switch (c)
1773 CASE_DIGITS:
1774 push_char (dtp, c);
1775 break;
1777 case '!':
1778 if (!dtp->u.p.namelist_mode)
1779 goto bad_real;
1781 CASE_SEPARATORS:
1782 case EOF:
1783 goto done;
1785 case '.':
1786 if (seen_dp)
1787 goto bad_real;
1789 seen_dp = 1;
1790 push_char (dtp, c);
1791 break;
1793 case 'E':
1794 case 'e':
1795 case 'D':
1796 case 'd':
1797 case 'Q':
1798 case 'q':
1799 goto exp1;
1801 case '+':
1802 case '-':
1803 push_char (dtp, 'e');
1804 push_char (dtp, c);
1805 c = next_char (dtp);
1806 goto exp2;
1808 default:
1809 goto bad_real;
1813 exp1:
1814 push_char (dtp, 'e');
1816 if ((c = next_char (dtp)) == EOF)
1817 goto bad_real;
1818 if (c != '+' && c != '-')
1819 push_char (dtp, '+');
1820 else
1822 push_char (dtp, c);
1823 c = next_char (dtp);
1826 exp2:
1827 if (!isdigit (c))
1829 /* Extension: allow default exponent of 0 when omitted. */
1830 if (dtp->common.flags & IOPARM_DT_DEFAULT_EXP)
1832 push_char (dtp, '0');
1833 goto done;
1835 else
1836 goto bad_exponent;
1839 push_char (dtp, c);
1841 for (;;)
1843 c = next_char (dtp);
1845 switch (c)
1847 CASE_DIGITS:
1848 push_char (dtp, c);
1849 break;
1851 case '!':
1852 if (!dtp->u.p.namelist_mode)
1853 goto bad_real;
1855 CASE_SEPARATORS:
1856 case EOF:
1857 goto done;
1859 default:
1860 goto bad_real;
1864 done:
1865 unget_char (dtp, c);
1866 eat_separator (dtp);
1867 push_char (dtp, '\0');
1868 if (convert_real (dtp, dest, dtp->u.p.saved_string, length))
1870 free_saved (dtp);
1871 return;
1874 free_saved (dtp);
1875 dtp->u.p.saved_type = BT_REAL;
1876 return;
1878 inf_nan:
1879 l_push_char (dtp, c);
1880 is_inf = 0;
1882 /* Match INF and Infinity. */
1883 if (c == 'i' || c == 'I')
1885 c = next_char (dtp);
1886 l_push_char (dtp, c);
1887 if (c != 'n' && c != 'N')
1888 goto unwind;
1889 c = next_char (dtp);
1890 l_push_char (dtp, c);
1891 if (c != 'f' && c != 'F')
1892 goto unwind;
1893 c = next_char (dtp);
1894 l_push_char (dtp, c);
1895 if (!is_separator (c) && (c != EOF))
1897 if (c != 'i' && c != 'I')
1898 goto unwind;
1899 c = next_char (dtp);
1900 l_push_char (dtp, c);
1901 if (c != 'n' && c != 'N')
1902 goto unwind;
1903 c = next_char (dtp);
1904 l_push_char (dtp, c);
1905 if (c != 'i' && c != 'I')
1906 goto unwind;
1907 c = next_char (dtp);
1908 l_push_char (dtp, c);
1909 if (c != 't' && c != 'T')
1910 goto unwind;
1911 c = next_char (dtp);
1912 l_push_char (dtp, c);
1913 if (c != 'y' && c != 'Y')
1914 goto unwind;
1915 c = next_char (dtp);
1916 l_push_char (dtp, c);
1918 is_inf = 1;
1919 } /* Match NaN. */
1920 else
1922 c = next_char (dtp);
1923 l_push_char (dtp, c);
1924 if (c != 'a' && c != 'A')
1925 goto unwind;
1926 c = next_char (dtp);
1927 l_push_char (dtp, c);
1928 if (c != 'n' && c != 'N')
1929 goto unwind;
1930 c = next_char (dtp);
1931 l_push_char (dtp, c);
1933 /* Match NAN(alphanum). */
1934 if (c == '(')
1936 for (c = next_char (dtp); c != ')'; c = next_char (dtp))
1937 if (is_separator (c))
1938 goto unwind;
1939 else
1940 l_push_char (dtp, c);
1942 l_push_char (dtp, ')');
1943 c = next_char (dtp);
1944 l_push_char (dtp, c);
1948 if (!is_separator (c) && (c != EOF))
1949 goto unwind;
1951 if (dtp->u.p.namelist_mode)
1953 if (c == ' ' || c =='\n' || c == '\r')
1957 if ((c = next_char (dtp)) == EOF)
1958 goto bad_real;
1960 while (c == ' ' || c =='\n' || c == '\r');
1962 l_push_char (dtp, c);
1964 if (c == '=')
1965 goto unwind;
1969 if (is_inf)
1971 push_char (dtp, 'i');
1972 push_char (dtp, 'n');
1973 push_char (dtp, 'f');
1975 else
1977 push_char (dtp, 'n');
1978 push_char (dtp, 'a');
1979 push_char (dtp, 'n');
1982 free_line (dtp);
1983 unget_char (dtp, c);
1984 eat_separator (dtp);
1985 push_char (dtp, '\0');
1986 if (convert_infnan (dtp, dest, dtp->u.p.saved_string, length))
1987 return;
1989 free_saved (dtp);
1990 dtp->u.p.saved_type = BT_REAL;
1991 return;
1993 unwind:
1994 if (dtp->u.p.namelist_mode)
1996 dtp->u.p.nml_read_error = 1;
1997 dtp->u.p.line_buffer_enabled = 1;
1998 dtp->u.p.line_buffer_pos = 0;
1999 return;
2002 bad_real:
2004 if (nml_bad_return (dtp, c))
2005 return;
2007 bad_exponent:
2009 free_saved (dtp);
2010 if (c == EOF)
2012 free_line (dtp);
2013 hit_eof (dtp);
2014 return;
2016 else if (c != '\n')
2017 eat_line (dtp);
2019 snprintf (message, MSGLEN, "Bad real number in item %d of list input",
2020 dtp->u.p.item_count);
2021 free_line (dtp);
2022 generate_error (&dtp->common, LIBERROR_READ_VALUE, message);
2026 /* Check the current type against the saved type to make sure they are
2027 compatible. Returns nonzero if incompatible. */
2029 static int
2030 check_type (st_parameter_dt *dtp, bt type, int kind)
2032 char message[MSGLEN];
2034 if (dtp->u.p.saved_type != BT_UNKNOWN && dtp->u.p.saved_type != type)
2036 snprintf (message, MSGLEN, "Read type %s where %s was expected for item %d",
2037 type_name (dtp->u.p.saved_type), type_name (type),
2038 dtp->u.p.item_count);
2039 free_line (dtp);
2040 generate_error (&dtp->common, LIBERROR_READ_VALUE, message);
2041 return 1;
2044 if (dtp->u.p.saved_type == BT_UNKNOWN || dtp->u.p.saved_type == BT_CHARACTER)
2045 return 0;
2047 if ((type != BT_COMPLEX && dtp->u.p.saved_length != kind)
2048 || (type == BT_COMPLEX && dtp->u.p.saved_length != kind*2))
2050 snprintf (message, MSGLEN,
2051 "Read kind %d %s where kind %d is required for item %d",
2052 type == BT_COMPLEX ? dtp->u.p.saved_length / 2
2053 : dtp->u.p.saved_length,
2054 type_name (dtp->u.p.saved_type), kind,
2055 dtp->u.p.item_count);
2056 free_line (dtp);
2057 generate_error (&dtp->common, LIBERROR_READ_VALUE, message);
2058 return 1;
2061 return 0;
2065 /* Initialize the function pointers to select the correct versions of
2066 next_char and push_char depending on what we are doing. */
2068 static void
2069 set_workers (st_parameter_dt *dtp)
2071 if (dtp->u.p.current_unit->flags.encoding == ENCODING_UTF8)
2073 dtp->u.p.current_unit->next_char_fn_ptr = &next_char_utf8;
2074 dtp->u.p.current_unit->push_char_fn_ptr = &push_char4;
2076 else if (is_internal_unit (dtp))
2078 dtp->u.p.current_unit->next_char_fn_ptr = &next_char_internal;
2079 dtp->u.p.current_unit->push_char_fn_ptr = &push_char_default;
2081 else
2083 dtp->u.p.current_unit->next_char_fn_ptr = &next_char_default;
2084 dtp->u.p.current_unit->push_char_fn_ptr = &push_char_default;
2089 /* Top level data transfer subroutine for list reads. Because we have
2090 to deal with repeat counts, the data item is always saved after
2091 reading, usually in the dtp->u.p.value[] array. If a repeat count is
2092 greater than one, we copy the data item multiple times. */
2094 static int
2095 list_formatted_read_scalar (st_parameter_dt *dtp, bt type, void *p,
2096 int kind, size_t size)
2098 gfc_char4_t *q, *r;
2099 int c, i, m;
2100 int err = 0;
2102 dtp->u.p.namelist_mode = 0;
2104 /* Set the next_char and push_char worker functions. */
2105 set_workers (dtp);
2107 if (dtp->u.p.first_item)
2109 dtp->u.p.first_item = 0;
2110 dtp->u.p.input_complete = 0;
2111 dtp->u.p.repeat_count = 1;
2112 dtp->u.p.at_eol = 0;
2114 if ((c = eat_spaces (dtp)) == EOF)
2116 err = LIBERROR_END;
2117 goto cleanup;
2119 if (is_separator (c))
2121 /* Found a null value. */
2122 dtp->u.p.repeat_count = 0;
2123 eat_separator (dtp);
2125 /* Set end-of-line flag. */
2126 if (c == '\n' || c == '\r')
2128 dtp->u.p.at_eol = 1;
2129 if (finish_separator (dtp) == LIBERROR_END)
2131 err = LIBERROR_END;
2132 goto cleanup;
2135 else
2136 goto cleanup;
2139 else
2141 if (dtp->u.p.repeat_count > 0)
2143 if (check_type (dtp, type, kind))
2144 return err;
2145 goto set_value;
2148 if (dtp->u.p.input_complete)
2149 goto cleanup;
2151 if (dtp->u.p.at_eol)
2152 finish_separator (dtp);
2153 else
2155 eat_spaces (dtp);
2156 /* Trailing spaces prior to end of line. */
2157 if (dtp->u.p.at_eol)
2158 finish_separator (dtp);
2161 dtp->u.p.saved_type = BT_UNKNOWN;
2162 dtp->u.p.repeat_count = 1;
2165 switch (type)
2167 case BT_INTEGER:
2168 read_integer (dtp, kind);
2169 break;
2170 case BT_LOGICAL:
2171 read_logical (dtp, kind);
2172 break;
2173 case BT_CHARACTER:
2174 read_character (dtp, kind);
2175 break;
2176 case BT_REAL:
2177 read_real (dtp, p, kind);
2178 /* Copy value back to temporary if needed. */
2179 if (dtp->u.p.repeat_count > 0)
2180 memcpy (dtp->u.p.value, p, size);
2181 break;
2182 case BT_COMPLEX:
2183 read_complex (dtp, p, kind, size);
2184 /* Copy value back to temporary if needed. */
2185 if (dtp->u.p.repeat_count > 0)
2186 memcpy (dtp->u.p.value, p, size);
2187 break;
2188 case BT_CLASS:
2190 int unit = dtp->u.p.current_unit->unit_number;
2191 char iotype[] = "LISTDIRECTED";
2192 gfc_charlen_type iotype_len = 12;
2193 char tmp_iomsg[IOMSG_LEN] = "";
2194 char *child_iomsg;
2195 gfc_charlen_type child_iomsg_len;
2196 int noiostat;
2197 int *child_iostat = NULL;
2198 gfc_array_i4 vlist;
2200 GFC_DESCRIPTOR_DATA(&vlist) = NULL;
2201 GFC_DIMENSION_SET(vlist.dim[0],1, 0, 0);
2203 /* Set iostat, intent(out). */
2204 noiostat = 0;
2205 child_iostat = (dtp->common.flags & IOPARM_HAS_IOSTAT) ?
2206 dtp->common.iostat : &noiostat;
2208 /* Set iomsge, intent(inout). */
2209 if (dtp->common.flags & IOPARM_HAS_IOMSG)
2211 child_iomsg = dtp->common.iomsg;
2212 child_iomsg_len = dtp->common.iomsg_len;
2214 else
2216 child_iomsg = tmp_iomsg;
2217 child_iomsg_len = IOMSG_LEN;
2220 /* Call the user defined formatted READ procedure. */
2221 dtp->u.p.current_unit->child_dtio++;
2222 dtp->u.p.fdtio_ptr (p, &unit, iotype, &vlist,
2223 child_iostat, child_iomsg,
2224 iotype_len, child_iomsg_len);
2225 dtp->u.p.child_saved_iostat = *child_iostat;
2226 dtp->u.p.current_unit->child_dtio--;
2228 break;
2229 default:
2230 internal_error (&dtp->common, "Bad type for list read");
2233 if (dtp->u.p.saved_type != BT_CHARACTER && dtp->u.p.saved_type != BT_UNKNOWN)
2234 dtp->u.p.saved_length = size;
2236 if ((dtp->common.flags & IOPARM_LIBRETURN_MASK) != IOPARM_LIBRETURN_OK)
2237 goto cleanup;
2239 set_value:
2240 switch (dtp->u.p.saved_type)
2242 case BT_COMPLEX:
2243 case BT_REAL:
2244 if (dtp->u.p.repeat_count > 0)
2245 memcpy (p, dtp->u.p.value, size);
2246 break;
2248 case BT_INTEGER:
2249 case BT_LOGICAL:
2250 memcpy (p, dtp->u.p.value, size);
2251 break;
2253 case BT_CHARACTER:
2254 if (dtp->u.p.saved_string)
2256 m = ((int) size < dtp->u.p.saved_used)
2257 ? (int) size : dtp->u.p.saved_used;
2259 q = (gfc_char4_t *) p;
2260 r = (gfc_char4_t *) dtp->u.p.saved_string;
2261 if (dtp->u.p.current_unit->flags.encoding == ENCODING_UTF8)
2262 for (i = 0; i < m; i++)
2263 *q++ = *r++;
2264 else
2266 if (kind == 1)
2267 memcpy (p, dtp->u.p.saved_string, m);
2268 else
2269 for (i = 0; i < m; i++)
2270 *q++ = *r++;
2273 else
2274 /* Just delimiters encountered, nothing to copy but SPACE. */
2275 m = 0;
2277 if (m < (int) size)
2279 if (kind == 1)
2280 memset (((char *) p) + m, ' ', size - m);
2281 else
2283 q = (gfc_char4_t *) p;
2284 for (i = m; i < (int) size; i++)
2285 q[i] = (unsigned char) ' ';
2288 break;
2290 case BT_UNKNOWN:
2291 break;
2293 default:
2294 internal_error (&dtp->common, "Bad type for list read");
2297 if (--dtp->u.p.repeat_count <= 0)
2298 free_saved (dtp);
2300 cleanup:
2301 if (err == LIBERROR_END)
2303 free_line (dtp);
2304 hit_eof (dtp);
2306 fbuf_flush_list (dtp->u.p.current_unit, LIST_READING);
2307 return err;
2311 void
2312 list_formatted_read (st_parameter_dt *dtp, bt type, void *p, int kind,
2313 size_t size, size_t nelems)
2315 size_t elem;
2316 char *tmp;
2317 size_t stride = type == BT_CHARACTER ?
2318 size * GFC_SIZE_OF_CHAR_KIND(kind) : size;
2319 int err;
2321 tmp = (char *) p;
2323 /* Big loop over all the elements. */
2324 for (elem = 0; elem < nelems; elem++)
2326 dtp->u.p.item_count++;
2327 err = list_formatted_read_scalar (dtp, type, tmp + stride*elem,
2328 kind, size);
2329 if (err)
2330 break;
2335 /* Finish a list read. */
2337 void
2338 finish_list_read (st_parameter_dt *dtp)
2340 free_saved (dtp);
2342 fbuf_flush (dtp->u.p.current_unit, dtp->u.p.mode);
2344 if (dtp->u.p.at_eol)
2346 dtp->u.p.at_eol = 0;
2347 return;
2350 if (!is_internal_unit (dtp))
2352 int c;
2354 /* Set the next_char and push_char worker functions. */
2355 set_workers (dtp);
2357 if (likely (dtp->u.p.child_saved_iostat == LIBERROR_OK))
2359 c = next_char (dtp);
2360 if (c == EOF)
2362 free_line (dtp);
2363 hit_eof (dtp);
2364 return;
2366 if (c != '\n')
2367 eat_line (dtp);
2371 free_line (dtp);
2375 /* NAMELIST INPUT
2377 void namelist_read (st_parameter_dt *dtp)
2378 calls:
2379 static void nml_match_name (char *name, int len)
2380 static int nml_query (st_parameter_dt *dtp)
2381 static int nml_get_obj_data (st_parameter_dt *dtp,
2382 namelist_info **prev_nl, char *, size_t)
2383 calls:
2384 static void nml_untouch_nodes (st_parameter_dt *dtp)
2385 static namelist_info *find_nml_node (st_parameter_dt *dtp,
2386 char *var_name)
2387 static int nml_parse_qualifier(descriptor_dimension *ad,
2388 array_loop_spec *ls, int rank, char *)
2389 static void nml_touch_nodes (namelist_info *nl)
2390 static int nml_read_obj (namelist_info *nl, index_type offset,
2391 namelist_info **prev_nl, char *, size_t,
2392 index_type clow, index_type chigh)
2393 calls:
2394 -itself- */
2396 /* Inputs a rank-dimensional qualifier, which can contain
2397 singlets, doublets, triplets or ':' with the standard meanings. */
2399 static bool
2400 nml_parse_qualifier (st_parameter_dt *dtp, descriptor_dimension *ad,
2401 array_loop_spec *ls, int rank, bt nml_elem_type,
2402 char *parse_err_msg, size_t parse_err_msg_size,
2403 int *parsed_rank)
2405 int dim;
2406 int indx;
2407 int neg;
2408 int null_flag;
2409 int is_array_section, is_char;
2410 int c;
2412 is_char = 0;
2413 is_array_section = 0;
2414 dtp->u.p.expanded_read = 0;
2416 /* See if this is a character substring qualifier we are looking for. */
2417 if (rank == -1)
2419 rank = 1;
2420 is_char = 1;
2423 /* The next character in the stream should be the '('. */
2425 if ((c = next_char (dtp)) == EOF)
2426 goto err_ret;
2428 /* Process the qualifier, by dimension and triplet. */
2430 for (dim=0; dim < rank; dim++ )
2432 for (indx=0; indx<3; indx++)
2434 free_saved (dtp);
2435 eat_spaces (dtp);
2436 neg = 0;
2438 /* Process a potential sign. */
2439 if ((c = next_char (dtp)) == EOF)
2440 goto err_ret;
2441 switch (c)
2443 case '-':
2444 neg = 1;
2445 break;
2447 case '+':
2448 break;
2450 default:
2451 unget_char (dtp, c);
2452 break;
2455 /* Process characters up to the next ':' , ',' or ')'. */
2456 for (;;)
2458 c = next_char (dtp);
2459 switch (c)
2461 case EOF:
2462 goto err_ret;
2464 case ':':
2465 is_array_section = 1;
2466 break;
2468 case ',': case ')':
2469 if ((c==',' && dim == rank -1)
2470 || (c==')' && dim < rank -1))
2472 if (is_char)
2473 snprintf (parse_err_msg, parse_err_msg_size,
2474 "Bad substring qualifier");
2475 else
2476 snprintf (parse_err_msg, parse_err_msg_size,
2477 "Bad number of index fields");
2478 goto err_ret;
2480 break;
2482 CASE_DIGITS:
2483 push_char (dtp, c);
2484 continue;
2486 case ' ': case '\t': case '\r': case '\n':
2487 eat_spaces (dtp);
2488 break;
2490 default:
2491 if (is_char)
2492 snprintf (parse_err_msg, parse_err_msg_size,
2493 "Bad character in substring qualifier");
2494 else
2495 snprintf (parse_err_msg, parse_err_msg_size,
2496 "Bad character in index");
2497 goto err_ret;
2500 if ((c == ',' || c == ')') && indx == 0
2501 && dtp->u.p.saved_string == 0)
2503 if (is_char)
2504 snprintf (parse_err_msg, parse_err_msg_size,
2505 "Null substring qualifier");
2506 else
2507 snprintf (parse_err_msg, parse_err_msg_size,
2508 "Null index field");
2509 goto err_ret;
2512 if ((c == ':' && indx == 1 && dtp->u.p.saved_string == 0)
2513 || (indx == 2 && dtp->u.p.saved_string == 0))
2515 if (is_char)
2516 snprintf (parse_err_msg, parse_err_msg_size,
2517 "Bad substring qualifier");
2518 else
2519 snprintf (parse_err_msg, parse_err_msg_size,
2520 "Bad index triplet");
2521 goto err_ret;
2524 if (is_char && !is_array_section)
2526 snprintf (parse_err_msg, parse_err_msg_size,
2527 "Missing colon in substring qualifier");
2528 goto err_ret;
2531 /* If '( : ? )' or '( ? : )' break and flag read failure. */
2532 null_flag = 0;
2533 if ((c == ':' && indx == 0 && dtp->u.p.saved_string == 0)
2534 || (indx==1 && dtp->u.p.saved_string == 0))
2536 null_flag = 1;
2537 break;
2540 /* Now read the index. */
2541 if (convert_integer (dtp, sizeof(index_type), neg))
2543 if (is_char)
2544 snprintf (parse_err_msg, parse_err_msg_size,
2545 "Bad integer substring qualifier");
2546 else
2547 snprintf (parse_err_msg, parse_err_msg_size,
2548 "Bad integer in index");
2549 goto err_ret;
2551 break;
2554 /* Feed the index values to the triplet arrays. */
2555 if (!null_flag)
2557 if (indx == 0)
2558 memcpy (&ls[dim].start, dtp->u.p.value, sizeof(index_type));
2559 if (indx == 1)
2560 memcpy (&ls[dim].end, dtp->u.p.value, sizeof(index_type));
2561 if (indx == 2)
2562 memcpy (&ls[dim].step, dtp->u.p.value, sizeof(index_type));
2565 /* Singlet or doublet indices. */
2566 if (c==',' || c==')')
2568 if (indx == 0)
2570 memcpy (&ls[dim].start, dtp->u.p.value, sizeof(index_type));
2572 /* If -std=f95/2003 or an array section is specified,
2573 do not allow excess data to be processed. */
2574 if (is_array_section == 1
2575 || !(compile_options.allow_std & GFC_STD_GNU)
2576 || nml_elem_type == BT_DERIVED)
2577 ls[dim].end = ls[dim].start;
2578 else
2579 dtp->u.p.expanded_read = 1;
2582 /* Check for non-zero rank. */
2583 if (is_array_section == 1 && ls[dim].start != ls[dim].end)
2584 *parsed_rank = 1;
2586 break;
2590 if (is_array_section == 1 && dtp->u.p.expanded_read == 1)
2592 int i;
2593 dtp->u.p.expanded_read = 0;
2594 for (i = 0; i < dim; i++)
2595 ls[i].end = ls[i].start;
2598 /* Check the values of the triplet indices. */
2599 if ((ls[dim].start > GFC_DIMENSION_UBOUND(ad[dim]))
2600 || (ls[dim].start < GFC_DIMENSION_LBOUND(ad[dim]))
2601 || (ls[dim].end > GFC_DIMENSION_UBOUND(ad[dim]))
2602 || (ls[dim].end < GFC_DIMENSION_LBOUND(ad[dim])))
2604 if (is_char)
2605 snprintf (parse_err_msg, parse_err_msg_size,
2606 "Substring out of range");
2607 else
2608 snprintf (parse_err_msg, parse_err_msg_size,
2609 "Index %d out of range", dim + 1);
2610 goto err_ret;
2613 if (((ls[dim].end - ls[dim].start ) * ls[dim].step < 0)
2614 || (ls[dim].step == 0))
2616 snprintf (parse_err_msg, parse_err_msg_size,
2617 "Bad range in index %d", dim + 1);
2618 goto err_ret;
2621 /* Initialise the loop index counter. */
2622 ls[dim].idx = ls[dim].start;
2624 eat_spaces (dtp);
2625 return true;
2627 err_ret:
2629 /* The EOF error message is issued by hit_eof. Return true so that the
2630 caller does not use parse_err_msg and parse_err_msg_size to generate
2631 an unrelated error message. */
2632 if (c == EOF)
2634 hit_eof (dtp);
2635 dtp->u.p.input_complete = 1;
2636 return true;
2638 return false;
2642 static bool
2643 extended_look_ahead (char *p, char *q)
2645 char *r, *s;
2647 /* Scan ahead to find a '%' in the p string. */
2648 for(r = p, s = q; *r && *s; s++)
2649 if ((*s == '%' || *s == '+') && strcmp (r + 1, s + 1) == 0)
2650 return true;
2651 return false;
2655 static bool
2656 strcmp_extended_type (char *p, char *q)
2658 char *r, *s;
2660 for (r = p, s = q; *r && *s; r++, s++)
2662 if (*r != *s)
2664 if (*r == '%' && *s == '+' && extended_look_ahead (r, s))
2665 return true;
2666 break;
2669 return false;
2673 static namelist_info *
2674 find_nml_node (st_parameter_dt *dtp, char *var_name)
2676 namelist_info *t = dtp->u.p.ionml;
2677 while (t != NULL)
2679 if (strcmp (var_name, t->var_name) == 0)
2681 t->touched = 1;
2682 return t;
2684 if (strcmp_extended_type (var_name, t->var_name))
2686 t->touched = 1;
2687 return t;
2689 t = t->next;
2691 return NULL;
2694 /* Visits all the components of a derived type that have
2695 not explicitly been identified in the namelist input.
2696 touched is set and the loop specification initialised
2697 to default values */
2699 static void
2700 nml_touch_nodes (namelist_info *nl)
2702 index_type len = strlen (nl->var_name) + 1;
2703 int dim;
2704 char *ext_name = xmalloc (len + 1);
2705 memcpy (ext_name, nl->var_name, len-1);
2706 memcpy (ext_name + len - 1, "%", 2);
2707 for (nl = nl->next; nl; nl = nl->next)
2709 if (strncmp (nl->var_name, ext_name, len) == 0)
2711 nl->touched = 1;
2712 for (dim=0; dim < nl->var_rank; dim++)
2714 nl->ls[dim].step = 1;
2715 nl->ls[dim].end = GFC_DESCRIPTOR_UBOUND(nl,dim);
2716 nl->ls[dim].start = GFC_DESCRIPTOR_LBOUND(nl,dim);
2717 nl->ls[dim].idx = nl->ls[dim].start;
2720 else
2721 break;
2723 free (ext_name);
2724 return;
2727 /* Resets touched for the entire list of nml_nodes, ready for a
2728 new object. */
2730 static void
2731 nml_untouch_nodes (st_parameter_dt *dtp)
2733 namelist_info *t;
2734 for (t = dtp->u.p.ionml; t; t = t->next)
2735 t->touched = 0;
2736 return;
2739 /* Attempts to input name to namelist name. Returns
2740 dtp->u.p.nml_read_error = 1 on no match. */
2742 static void
2743 nml_match_name (st_parameter_dt *dtp, const char *name, index_type len)
2745 index_type i;
2746 int c;
2748 dtp->u.p.nml_read_error = 0;
2749 for (i = 0; i < len; i++)
2751 c = next_char (dtp);
2752 if (c == EOF || (tolower (c) != tolower (name[i])))
2754 dtp->u.p.nml_read_error = 1;
2755 break;
2760 /* If the namelist read is from stdin, output the current state of the
2761 namelist to stdout. This is used to implement the non-standard query
2762 features, ? and =?. If c == '=' the full namelist is printed. Otherwise
2763 the names alone are printed. */
2765 static void
2766 nml_query (st_parameter_dt *dtp, char c)
2768 gfc_unit *temp_unit;
2769 namelist_info *nl;
2770 index_type len;
2771 char *p;
2772 #ifdef HAVE_CRLF
2773 static const index_type endlen = 2;
2774 static const char endl[] = "\r\n";
2775 static const char nmlend[] = "&end\r\n";
2776 #else
2777 static const index_type endlen = 1;
2778 static const char endl[] = "\n";
2779 static const char nmlend[] = "&end\n";
2780 #endif
2782 if (dtp->u.p.current_unit->unit_number != options.stdin_unit)
2783 return;
2785 /* Store the current unit and transfer to stdout. */
2787 temp_unit = dtp->u.p.current_unit;
2788 dtp->u.p.current_unit = find_unit (options.stdout_unit);
2790 if (dtp->u.p.current_unit)
2792 dtp->u.p.mode = WRITING;
2793 next_record (dtp, 0);
2795 /* Write the namelist in its entirety. */
2797 if (c == '=')
2798 namelist_write (dtp);
2800 /* Or write the list of names. */
2802 else
2804 /* "&namelist_name\n" */
2806 len = dtp->namelist_name_len;
2807 p = write_block (dtp, len - 1 + endlen);
2808 if (!p)
2809 goto query_return;
2810 memcpy (p, "&", 1);
2811 memcpy ((char*)(p + 1), dtp->namelist_name, len);
2812 memcpy ((char*)(p + len + 1), &endl, endlen);
2813 for (nl = dtp->u.p.ionml; nl; nl = nl->next)
2815 /* " var_name\n" */
2817 len = strlen (nl->var_name);
2818 p = write_block (dtp, len + endlen);
2819 if (!p)
2820 goto query_return;
2821 memcpy (p, " ", 1);
2822 memcpy ((char*)(p + 1), nl->var_name, len);
2823 memcpy ((char*)(p + len + 1), &endl, endlen);
2826 /* "&end\n" */
2828 p = write_block (dtp, endlen + 4);
2829 if (!p)
2830 goto query_return;
2831 memcpy (p, &nmlend, endlen + 4);
2834 /* Flush the stream to force immediate output. */
2836 fbuf_flush (dtp->u.p.current_unit, WRITING);
2837 sflush (dtp->u.p.current_unit->s);
2838 unlock_unit (dtp->u.p.current_unit);
2841 query_return:
2843 /* Restore the current unit. */
2845 dtp->u.p.current_unit = temp_unit;
2846 dtp->u.p.mode = READING;
2847 return;
2850 /* Reads and stores the input for the namelist object nl. For an array,
2851 the function loops over the ranges defined by the loop specification.
2852 This default to all the data or to the specification from a qualifier.
2853 nml_read_obj recursively calls itself to read derived types. It visits
2854 all its own components but only reads data for those that were touched
2855 when the name was parsed. If a read error is encountered, an attempt is
2856 made to return to read a new object name because the standard allows too
2857 little data to be available. On the other hand, too much data is an
2858 error. */
2860 static bool
2861 nml_read_obj (st_parameter_dt *dtp, namelist_info *nl, index_type offset,
2862 namelist_info **pprev_nl, char *nml_err_msg,
2863 size_t nml_err_msg_size, index_type clow, index_type chigh)
2865 namelist_info *cmp;
2866 char *obj_name;
2867 int nml_carry;
2868 int len;
2869 int dim;
2870 index_type dlen;
2871 index_type m;
2872 size_t obj_name_len;
2873 void *pdata;
2875 /* If we have encountered a previous read error or this object has not been
2876 touched in name parsing, just return. */
2877 if (dtp->u.p.nml_read_error || !nl->touched)
2878 return true;
2880 dtp->u.p.item_count++; /* Used in error messages. */
2881 dtp->u.p.repeat_count = 0;
2882 eat_spaces (dtp);
2884 len = nl->len;
2885 switch (nl->type)
2887 case BT_INTEGER:
2888 case BT_LOGICAL:
2889 dlen = len;
2890 break;
2892 case BT_REAL:
2893 dlen = size_from_real_kind (len);
2894 break;
2896 case BT_COMPLEX:
2897 dlen = size_from_complex_kind (len);
2898 break;
2900 case BT_CHARACTER:
2901 dlen = chigh ? (chigh - clow + 1) : nl->string_length;
2902 break;
2904 default:
2905 dlen = 0;
2910 /* Update the pointer to the data, using the current index vector */
2912 pdata = (void*)(nl->mem_pos + offset);
2913 for (dim = 0; dim < nl->var_rank; dim++)
2914 pdata = (void*)(pdata + (nl->ls[dim].idx
2915 - GFC_DESCRIPTOR_LBOUND(nl,dim))
2916 * GFC_DESCRIPTOR_STRIDE(nl,dim) * nl->size);
2918 /* If we are finished with the repeat count, try to read next value. */
2920 nml_carry = 0;
2921 if (--dtp->u.p.repeat_count <= 0)
2923 if (dtp->u.p.input_complete)
2924 return true;
2925 if (dtp->u.p.at_eol)
2926 finish_separator (dtp);
2927 if (dtp->u.p.input_complete)
2928 return true;
2930 dtp->u.p.saved_type = BT_UNKNOWN;
2931 free_saved (dtp);
2933 switch (nl->type)
2935 case BT_INTEGER:
2936 read_integer (dtp, len);
2937 break;
2939 case BT_LOGICAL:
2940 read_logical (dtp, len);
2941 break;
2943 case BT_CHARACTER:
2944 read_character (dtp, len);
2945 break;
2947 case BT_REAL:
2948 /* Need to copy data back from the real location to the temp in
2949 order to handle nml reads into arrays. */
2950 read_real (dtp, pdata, len);
2951 memcpy (dtp->u.p.value, pdata, dlen);
2952 break;
2954 case BT_COMPLEX:
2955 /* Same as for REAL, copy back to temp. */
2956 read_complex (dtp, pdata, len, dlen);
2957 memcpy (dtp->u.p.value, pdata, dlen);
2958 break;
2960 case BT_DERIVED:
2961 /* If this object has a User Defined procedure, call it. */
2962 if (nl->dtio_sub != NULL)
2964 int unit = dtp->u.p.current_unit->unit_number;
2965 char iotype[] = "NAMELIST";
2966 gfc_charlen_type iotype_len = 8;
2967 char tmp_iomsg[IOMSG_LEN] = "";
2968 char *child_iomsg;
2969 gfc_charlen_type child_iomsg_len;
2970 int noiostat;
2971 int *child_iostat = NULL;
2972 gfc_array_i4 vlist;
2973 gfc_class list_obj;
2974 formatted_dtio dtio_ptr = (formatted_dtio)nl->dtio_sub;
2976 GFC_DESCRIPTOR_DATA(&vlist) = NULL;
2977 GFC_DIMENSION_SET(vlist.dim[0],1, 0, 0);
2979 list_obj.data = (void *)nl->mem_pos;
2980 list_obj.vptr = nl->vtable;
2981 list_obj.len = 0;
2983 /* Set iostat, intent(out). */
2984 noiostat = 0;
2985 child_iostat = (dtp->common.flags & IOPARM_HAS_IOSTAT) ?
2986 dtp->common.iostat : &noiostat;
2988 /* Set iomsg, intent(inout). */
2989 if (dtp->common.flags & IOPARM_HAS_IOMSG)
2991 child_iomsg = dtp->common.iomsg;
2992 child_iomsg_len = dtp->common.iomsg_len;
2994 else
2996 child_iomsg = tmp_iomsg;
2997 child_iomsg_len = IOMSG_LEN;
3000 /* If reading from an internal unit, stash it to allow
3001 the child procedure to access it. */
3002 if (is_internal_unit (dtp))
3003 stash_internal_unit (dtp);
3005 /* Call the user defined formatted READ procedure. */
3006 dtp->u.p.current_unit->child_dtio++;
3007 dtio_ptr ((void *)&list_obj, &unit, iotype, &vlist,
3008 child_iostat, child_iomsg,
3009 iotype_len, child_iomsg_len);
3010 dtp->u.p.child_saved_iostat = *child_iostat;
3011 dtp->u.p.current_unit->child_dtio--;
3012 goto incr_idx;
3015 /* Must be default derived type namelist read. */
3016 obj_name_len = strlen (nl->var_name) + 1;
3017 obj_name = xmalloc (obj_name_len+1);
3018 memcpy (obj_name, nl->var_name, obj_name_len-1);
3019 memcpy (obj_name + obj_name_len - 1, "%", 2);
3021 /* If reading a derived type, disable the expanded read warning
3022 since a single object can have multiple reads. */
3023 dtp->u.p.expanded_read = 0;
3025 /* Now loop over the components. */
3027 for (cmp = nl->next;
3028 cmp &&
3029 !strncmp (cmp->var_name, obj_name, obj_name_len);
3030 cmp = cmp->next)
3032 /* Jump over nested derived type by testing if the potential
3033 component name contains '%'. */
3034 if (strchr (cmp->var_name + obj_name_len, '%'))
3035 continue;
3037 if (!nml_read_obj (dtp, cmp, (index_type)(pdata - nl->mem_pos),
3038 pprev_nl, nml_err_msg, nml_err_msg_size,
3039 clow, chigh))
3041 free (obj_name);
3042 return false;
3045 if (dtp->u.p.input_complete)
3047 free (obj_name);
3048 return true;
3052 free (obj_name);
3053 goto incr_idx;
3055 default:
3056 snprintf (nml_err_msg, nml_err_msg_size,
3057 "Bad type for namelist object %s", nl->var_name);
3058 internal_error (&dtp->common, nml_err_msg);
3059 goto nml_err_ret;
3063 /* The standard permits array data to stop short of the number of
3064 elements specified in the loop specification. In this case, we
3065 should be here with dtp->u.p.nml_read_error != 0. Control returns to
3066 nml_get_obj_data and an attempt is made to read object name. */
3068 *pprev_nl = nl;
3069 if (dtp->u.p.nml_read_error)
3071 dtp->u.p.expanded_read = 0;
3072 return true;
3075 if (dtp->u.p.saved_type == BT_UNKNOWN)
3077 dtp->u.p.expanded_read = 0;
3078 goto incr_idx;
3081 switch (dtp->u.p.saved_type)
3084 case BT_COMPLEX:
3085 case BT_REAL:
3086 case BT_INTEGER:
3087 case BT_LOGICAL:
3088 memcpy (pdata, dtp->u.p.value, dlen);
3089 break;
3091 case BT_CHARACTER:
3092 if (dlen < dtp->u.p.saved_used)
3094 if (compile_options.bounds_check)
3096 snprintf (nml_err_msg, nml_err_msg_size,
3097 "Namelist object '%s' truncated on read.",
3098 nl->var_name);
3099 generate_warning (&dtp->common, nml_err_msg);
3101 m = dlen;
3103 else
3104 m = dtp->u.p.saved_used;
3106 if (dtp->u.p.current_unit->flags.encoding == ENCODING_UTF8)
3108 gfc_char4_t *q4, *p4 = pdata;
3109 int i;
3111 q4 = (gfc_char4_t *) dtp->u.p.saved_string;
3112 p4 += clow -1;
3113 for (i = 0; i < m; i++)
3114 *p4++ = *q4++;
3115 if (m < dlen)
3116 for (i = 0; i < dlen - m; i++)
3117 *p4++ = (gfc_char4_t) ' ';
3119 else
3121 pdata = (void*)( pdata + clow - 1 );
3122 memcpy (pdata, dtp->u.p.saved_string, m);
3123 if (m < dlen)
3124 memset ((void*)( pdata + m ), ' ', dlen - m);
3126 break;
3128 default:
3129 break;
3132 /* Warn if a non-standard expanded read occurs. A single read of a
3133 single object is acceptable. If a second read occurs, issue a warning
3134 and set the flag to zero to prevent further warnings. */
3135 if (dtp->u.p.expanded_read == 2)
3137 notify_std (&dtp->common, GFC_STD_GNU, "Non-standard expanded namelist read.");
3138 dtp->u.p.expanded_read = 0;
3141 /* If the expanded read warning flag is set, increment it,
3142 indicating that a single read has occurred. */
3143 if (dtp->u.p.expanded_read >= 1)
3144 dtp->u.p.expanded_read++;
3146 /* Break out of loop if scalar. */
3147 if (!nl->var_rank)
3148 break;
3150 /* Now increment the index vector. */
3152 incr_idx:
3154 nml_carry = 1;
3155 for (dim = 0; dim < nl->var_rank; dim++)
3157 nl->ls[dim].idx += nml_carry * nl->ls[dim].step;
3158 nml_carry = 0;
3159 if (((nl->ls[dim].step > 0) && (nl->ls[dim].idx > nl->ls[dim].end))
3161 ((nl->ls[dim].step < 0) && (nl->ls[dim].idx < nl->ls[dim].end)))
3163 nl->ls[dim].idx = nl->ls[dim].start;
3164 nml_carry = 1;
3167 } while (!nml_carry);
3169 if (dtp->u.p.repeat_count > 1)
3171 snprintf (nml_err_msg, nml_err_msg_size,
3172 "Repeat count too large for namelist object %s", nl->var_name);
3173 goto nml_err_ret;
3175 return true;
3177 nml_err_ret:
3179 return false;
3182 /* Parses the object name, including array and substring qualifiers. It
3183 iterates over derived type components, touching those components and
3184 setting their loop specifications, if there is a qualifier. If the
3185 object is itself a derived type, its components and subcomponents are
3186 touched. nml_read_obj is called at the end and this reads the data in
3187 the manner specified by the object name. */
3189 static bool
3190 nml_get_obj_data (st_parameter_dt *dtp, namelist_info **pprev_nl,
3191 char *nml_err_msg, size_t nml_err_msg_size)
3193 int c;
3194 namelist_info *nl;
3195 namelist_info *first_nl = NULL;
3196 namelist_info *root_nl = NULL;
3197 int dim, parsed_rank;
3198 int component_flag, qualifier_flag;
3199 index_type clow, chigh;
3200 int non_zero_rank_count;
3202 /* Look for end of input or object name. If '?' or '=?' are encountered
3203 in stdin, print the node names or the namelist to stdout. */
3205 eat_separator (dtp);
3206 if (dtp->u.p.input_complete)
3207 return true;
3209 if (dtp->u.p.at_eol)
3210 finish_separator (dtp);
3211 if (dtp->u.p.input_complete)
3212 return true;
3214 if ((c = next_char (dtp)) == EOF)
3215 goto nml_err_ret;
3216 switch (c)
3218 case '=':
3219 if ((c = next_char (dtp)) == EOF)
3220 goto nml_err_ret;
3221 if (c != '?')
3223 snprintf (nml_err_msg, nml_err_msg_size,
3224 "namelist read: misplaced = sign");
3225 goto nml_err_ret;
3227 nml_query (dtp, '=');
3228 return true;
3230 case '?':
3231 nml_query (dtp, '?');
3232 return true;
3234 case '$':
3235 case '&':
3236 nml_match_name (dtp, "end", 3);
3237 if (dtp->u.p.nml_read_error)
3239 snprintf (nml_err_msg, nml_err_msg_size,
3240 "namelist not terminated with / or &end");
3241 goto nml_err_ret;
3243 /* Fall through. */
3244 case '/':
3245 dtp->u.p.input_complete = 1;
3246 return true;
3248 default :
3249 break;
3252 /* Untouch all nodes of the namelist and reset the flags that are set for
3253 derived type components. */
3255 nml_untouch_nodes (dtp);
3256 component_flag = 0;
3257 qualifier_flag = 0;
3258 non_zero_rank_count = 0;
3260 /* Get the object name - should '!' and '\n' be permitted separators? */
3262 get_name:
3264 free_saved (dtp);
3268 if (!is_separator (c))
3269 push_char_default (dtp, tolower(c));
3270 if ((c = next_char (dtp)) == EOF)
3271 goto nml_err_ret;
3273 while (!( c=='=' || c==' ' || c=='\t' || c =='(' || c =='%' ));
3275 unget_char (dtp, c);
3277 /* Check that the name is in the namelist and get pointer to object.
3278 Three error conditions exist: (i) An attempt is being made to
3279 identify a non-existent object, following a failed data read or
3280 (ii) The object name does not exist or (iii) Too many data items
3281 are present for an object. (iii) gives the same error message
3282 as (i) */
3284 push_char_default (dtp, '\0');
3286 if (component_flag)
3288 #define EXT_STACK_SZ 100
3289 char ext_stack[EXT_STACK_SZ];
3290 char *ext_name;
3291 size_t var_len = strlen (root_nl->var_name);
3292 size_t saved_len
3293 = dtp->u.p.saved_string ? strlen (dtp->u.p.saved_string) : 0;
3294 size_t ext_size = var_len + saved_len + 1;
3296 if (ext_size > EXT_STACK_SZ)
3297 ext_name = xmalloc (ext_size);
3298 else
3299 ext_name = ext_stack;
3301 memcpy (ext_name, root_nl->var_name, var_len);
3302 if (dtp->u.p.saved_string)
3303 memcpy (ext_name + var_len, dtp->u.p.saved_string, saved_len);
3304 ext_name[var_len + saved_len] = '\0';
3305 nl = find_nml_node (dtp, ext_name);
3307 if (ext_size > EXT_STACK_SZ)
3308 free (ext_name);
3310 else
3311 nl = find_nml_node (dtp, dtp->u.p.saved_string);
3313 if (nl == NULL)
3315 if (dtp->u.p.nml_read_error && *pprev_nl)
3316 snprintf (nml_err_msg, nml_err_msg_size,
3317 "Bad data for namelist object %s", (*pprev_nl)->var_name);
3319 else
3320 snprintf (nml_err_msg, nml_err_msg_size,
3321 "Cannot match namelist object name %s",
3322 dtp->u.p.saved_string);
3324 goto nml_err_ret;
3327 /* Get the length, data length, base pointer and rank of the variable.
3328 Set the default loop specification first. */
3330 for (dim=0; dim < nl->var_rank; dim++)
3332 nl->ls[dim].step = 1;
3333 nl->ls[dim].end = GFC_DESCRIPTOR_UBOUND(nl,dim);
3334 nl->ls[dim].start = GFC_DESCRIPTOR_LBOUND(nl,dim);
3335 nl->ls[dim].idx = nl->ls[dim].start;
3338 /* Check to see if there is a qualifier: if so, parse it.*/
3340 if (c == '(' && nl->var_rank)
3342 parsed_rank = 0;
3343 if (!nml_parse_qualifier (dtp, nl->dim, nl->ls, nl->var_rank,
3344 nl->type, nml_err_msg, nml_err_msg_size,
3345 &parsed_rank))
3347 char *nml_err_msg_end = strchr (nml_err_msg, '\0');
3348 snprintf (nml_err_msg_end,
3349 nml_err_msg_size - (nml_err_msg_end - nml_err_msg),
3350 " for namelist variable %s", nl->var_name);
3351 goto nml_err_ret;
3353 if (parsed_rank > 0)
3354 non_zero_rank_count++;
3356 qualifier_flag = 1;
3358 if ((c = next_char (dtp)) == EOF)
3359 goto nml_err_ret;
3360 unget_char (dtp, c);
3362 else if (nl->var_rank > 0)
3363 non_zero_rank_count++;
3365 /* Now parse a derived type component. The root namelist_info address
3366 is backed up, as is the previous component level. The component flag
3367 is set and the iteration is made by jumping back to get_name. */
3369 if (c == '%')
3371 if (nl->type != BT_DERIVED)
3373 snprintf (nml_err_msg, nml_err_msg_size,
3374 "Attempt to get derived component for %s", nl->var_name);
3375 goto nml_err_ret;
3378 /* Don't move first_nl further in the list if a qualifier was found. */
3379 if ((*pprev_nl == NULL && !qualifier_flag) || !component_flag)
3380 first_nl = nl;
3382 root_nl = nl;
3384 component_flag = 1;
3385 if ((c = next_char (dtp)) == EOF)
3386 goto nml_err_ret;
3387 goto get_name;
3390 /* Parse a character qualifier, if present. chigh = 0 is a default
3391 that signals that the string length = string_length. */
3393 clow = 1;
3394 chigh = 0;
3396 if (c == '(' && nl->type == BT_CHARACTER)
3398 descriptor_dimension chd[1] = { {1, clow, nl->string_length} };
3399 array_loop_spec ind[1] = { {1, clow, nl->string_length, 1} };
3401 if (!nml_parse_qualifier (dtp, chd, ind, -1, nl->type,
3402 nml_err_msg, nml_err_msg_size, &parsed_rank))
3404 char *nml_err_msg_end = strchr (nml_err_msg, '\0');
3405 snprintf (nml_err_msg_end,
3406 nml_err_msg_size - (nml_err_msg_end - nml_err_msg),
3407 " for namelist variable %s", nl->var_name);
3408 goto nml_err_ret;
3411 clow = ind[0].start;
3412 chigh = ind[0].end;
3414 if (ind[0].step != 1)
3416 snprintf (nml_err_msg, nml_err_msg_size,
3417 "Step not allowed in substring qualifier"
3418 " for namelist object %s", nl->var_name);
3419 goto nml_err_ret;
3422 if ((c = next_char (dtp)) == EOF)
3423 goto nml_err_ret;
3424 unget_char (dtp, c);
3427 /* Make sure no extraneous qualifiers are there. */
3429 if (c == '(')
3431 snprintf (nml_err_msg, nml_err_msg_size,
3432 "Qualifier for a scalar or non-character namelist object %s",
3433 nl->var_name);
3434 goto nml_err_ret;
3437 /* Make sure there is no more than one non-zero rank object. */
3438 if (non_zero_rank_count > 1)
3440 snprintf (nml_err_msg, nml_err_msg_size,
3441 "Multiple sub-objects with non-zero rank in namelist object %s",
3442 nl->var_name);
3443 non_zero_rank_count = 0;
3444 goto nml_err_ret;
3447 /* According to the standard, an equal sign MUST follow an object name. The
3448 following is possibly lax - it allows comments, blank lines and so on to
3449 intervene. eat_spaces (dtp); c = next_char (dtp); would be compliant*/
3451 free_saved (dtp);
3453 eat_separator (dtp);
3454 if (dtp->u.p.input_complete)
3455 return true;
3457 if (dtp->u.p.at_eol)
3458 finish_separator (dtp);
3459 if (dtp->u.p.input_complete)
3460 return true;
3462 if ((c = next_char (dtp)) == EOF)
3463 goto nml_err_ret;
3465 if (c != '=')
3467 snprintf (nml_err_msg, nml_err_msg_size,
3468 "Equal sign must follow namelist object name %s",
3469 nl->var_name);
3470 goto nml_err_ret;
3473 /* If a derived type, touch its components and restore the root
3474 namelist_info if we have parsed a qualified derived type
3475 component. */
3477 if (nl->type == BT_DERIVED && nl->dtio_sub == NULL)
3478 nml_touch_nodes (nl);
3480 if (first_nl)
3482 if (first_nl->var_rank == 0)
3484 if (component_flag && qualifier_flag)
3485 nl = first_nl;
3487 else
3488 nl = first_nl;
3491 dtp->u.p.nml_read_error = 0;
3492 if (!nml_read_obj (dtp, nl, 0, pprev_nl, nml_err_msg, nml_err_msg_size,
3493 clow, chigh))
3494 goto nml_err_ret;
3496 return true;
3498 nml_err_ret:
3500 /* The EOF error message is issued by hit_eof. Return true so that the
3501 caller does not use nml_err_msg and nml_err_msg_size to generate
3502 an unrelated error message. */
3503 if (c == EOF)
3505 dtp->u.p.input_complete = 1;
3506 unget_char (dtp, c);
3507 hit_eof (dtp);
3508 return true;
3510 return false;
3513 /* Entry point for namelist input. Goes through input until namelist name
3514 is matched. Then cycles through nml_get_obj_data until the input is
3515 completed or there is an error. */
3517 void
3518 namelist_read (st_parameter_dt *dtp)
3520 int c;
3521 char nml_err_msg[200];
3523 /* Initialize the error string buffer just in case we get an unexpected fail
3524 somewhere and end up at nml_err_ret. */
3525 strcpy (nml_err_msg, "Internal namelist read error");
3527 /* Pointer to the previously read object, in case attempt is made to read
3528 new object name. Should this fail, error message can give previous
3529 name. */
3530 namelist_info *prev_nl = NULL;
3532 dtp->u.p.namelist_mode = 1;
3533 dtp->u.p.input_complete = 0;
3534 dtp->u.p.expanded_read = 0;
3536 /* Set the next_char and push_char worker functions. */
3537 set_workers (dtp);
3539 /* Look for &namelist_name . Skip all characters, testing for $nmlname.
3540 Exit on success or EOF. If '?' or '=?' encountered in stdin, print
3541 node names or namelist on stdout. */
3543 find_nml_name:
3544 c = next_char (dtp);
3545 switch (c)
3547 case '$':
3548 case '&':
3549 break;
3551 case '!':
3552 eat_line (dtp);
3553 goto find_nml_name;
3555 case '=':
3556 c = next_char (dtp);
3557 if (c == '?')
3558 nml_query (dtp, '=');
3559 else
3560 unget_char (dtp, c);
3561 goto find_nml_name;
3563 case '?':
3564 nml_query (dtp, '?');
3565 goto find_nml_name;
3567 case EOF:
3568 return;
3570 default:
3571 goto find_nml_name;
3574 /* Match the name of the namelist. */
3576 nml_match_name (dtp, dtp->namelist_name, dtp->namelist_name_len);
3578 if (dtp->u.p.nml_read_error)
3579 goto find_nml_name;
3581 /* A trailing space is required, we give a little latitude here, 10.9.1. */
3582 c = next_char (dtp);
3583 if (!is_separator(c) && c != '!')
3585 unget_char (dtp, c);
3586 goto find_nml_name;
3589 unget_char (dtp, c);
3590 eat_separator (dtp);
3592 /* Ready to read namelist objects. If there is an error in input
3593 from stdin, output the error message and continue. */
3595 while (!dtp->u.p.input_complete)
3597 if (!nml_get_obj_data (dtp, &prev_nl, nml_err_msg, sizeof nml_err_msg))
3599 if (dtp->u.p.current_unit->unit_number != options.stdin_unit)
3600 goto nml_err_ret;
3601 generate_error (&dtp->common, LIBERROR_READ_VALUE, nml_err_msg);
3604 /* Reset the previous namelist pointer if we know we are not going
3605 to be doing multiple reads within a single namelist object. */
3606 if (prev_nl && prev_nl->var_rank == 0)
3607 prev_nl = NULL;
3610 free_saved (dtp);
3611 free_line (dtp);
3612 return;
3615 nml_err_ret:
3617 /* All namelist error calls return from here */
3618 free_saved (dtp);
3619 free_line (dtp);
3620 generate_error (&dtp->common, LIBERROR_READ_VALUE, nml_err_msg);
3621 return;