re PR fortran/48298 ([F03] User-Defined Derived-Type IO (DTIO))
[gcc.git] / libgfortran / io / list_read.c
1 /* Copyright (C) 2002-2016 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
5
6 This file is part of the GNU Fortran runtime library (libgfortran).
7
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.
12
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.
17
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.
21
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/>. */
26
27
28 #include "io.h"
29 #include "fbuf.h"
30 #include "unix.h"
31 #include <string.h>
32 #include <stdlib.h>
33 #include <ctype.h>
34
35 typedef unsigned char uchar;
36
37
38 /* List directed input. Several parsing subroutines are practically
39 reimplemented from formatted input, the reason being that there are
40 all kinds of small differences between formatted and list directed
41 parsing. */
42
43
44 /* Subroutines for reading characters from the input. Because a
45 repeat count is ambiguous with an integer, we have to read the
46 whole digit string before seeing if there is a '*' which signals
47 the repeat count. Since we can have a lot of potential leading
48 zeros, we have to be able to back up by arbitrary amount. Because
49 the input might not be seekable, we have to buffer the data
50 ourselves. */
51
52 #define CASE_DIGITS case '0': case '1': case '2': case '3': case '4': \
53 case '5': case '6': case '7': case '8': case '9'
54
55 #define CASE_SEPARATORS case ' ': case ',': case '/': case '\n': \
56 case '\t': case '\r': case ';'
57
58 /* This macro assumes that we're operating on a variable. */
59
60 #define is_separator(c) (c == '/' || c == ',' || c == '\n' || c == ' ' \
61 || c == '\t' || c == '\r' || c == ';' || \
62 (dtp->u.p.namelist_mode && c == '!'))
63
64 /* Maximum repeat count. Less than ten times the maximum signed int32. */
65
66 #define MAX_REPEAT 200000000
67
68
69 #define MSGLEN 100
70
71
72 /* Wrappers for calling the current worker functions. */
73
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))
76
77 /* Worker function to save a default KIND=1 character to a string
78 buffer, enlarging it as necessary. */
79
80 static void
81 push_char_default (st_parameter_dt *dtp, int c)
82 {
83
84
85 if (dtp->u.p.saved_string == NULL)
86 {
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;
91 }
92
93 if (dtp->u.p.saved_used >= dtp->u.p.saved_length)
94 {
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);
98 }
99
100 dtp->u.p.saved_string[dtp->u.p.saved_used++] = (char) c;
101 }
102
103
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)
108 {
109 gfc_char4_t *p = (gfc_char4_t *) dtp->u.p.saved_string;
110
111 if (p == NULL)
112 {
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;
117 }
118
119 if (dtp->u.p.saved_used >= dtp->u.p.saved_length)
120 {
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;
126 }
127
128 p[dtp->u.p.saved_used++] = c;
129 }
130
131
132 /* Free the input buffer if necessary. */
133
134 static void
135 free_saved (st_parameter_dt *dtp)
136 {
137 if (dtp->u.p.saved_string == NULL)
138 return;
139
140 free (dtp->u.p.saved_string);
141
142 dtp->u.p.saved_string = NULL;
143 dtp->u.p.saved_used = 0;
144 }
145
146
147 /* Free the line buffer if necessary. */
148
149 static void
150 free_line (st_parameter_dt *dtp)
151 {
152 dtp->u.p.line_buffer_pos = 0;
153 dtp->u.p.line_buffer_enabled = 0;
154
155 if (dtp->u.p.line_buffer == NULL)
156 return;
157
158 free (dtp->u.p.line_buffer);
159 dtp->u.p.line_buffer = NULL;
160 }
161
162
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. */
166
167 static int
168 check_buffers (st_parameter_dt *dtp)
169 {
170 int c;
171
172 c = '\0';
173 if (dtp->u.p.current_unit->last_char != EOF - 1)
174 {
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;
179 }
180
181 /* Read from line_buffer if enabled. */
182
183 if (dtp->u.p.line_buffer_enabled)
184 {
185 dtp->u.p.at_eol = 0;
186
187 c = dtp->u.p.line_buffer[dtp->u.p.line_buffer_pos];
188 if (c != '\0' && dtp->u.p.line_buffer_pos < 64)
189 {
190 dtp->u.p.line_buffer[dtp->u.p.line_buffer_pos] = '\0';
191 dtp->u.p.line_buffer_pos++;
192 goto done;
193 }
194
195 dtp->u.p.line_buffer_pos = 0;
196 dtp->u.p.line_buffer_enabled = 0;
197 }
198
199 done:
200 dtp->u.p.at_eol = (c == '\n' || c == '\r' || c == EOF);
201 return c;
202 }
203
204
205 /* Worker function for default character encoded file. */
206 static int
207 next_char_default (st_parameter_dt *dtp)
208 {
209 int c;
210
211 /* Always check the unget and line buffer first. */
212 if ((c = check_buffers (dtp)))
213 return c;
214
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++;
218
219 dtp->u.p.at_eol = (c == '\n' || c == EOF);
220 return c;
221 }
222
223
224 /* Worker function for internal and array I/O units. */
225 static int
226 next_char_internal (st_parameter_dt *dtp)
227 {
228 ssize_t length;
229 gfc_offset record;
230 int c;
231
232 /* Always check the unget and line buffer first. */
233 if ((c = check_buffers (dtp)))
234 return c;
235
236 /* Handle the end-of-record and end-of-file conditions for
237 internal array unit. */
238 if (is_array_io (dtp))
239 {
240 if (dtp->u.p.at_eof)
241 return EOF;
242
243 /* Check for "end-of-record" condition. */
244 if (dtp->u.p.current_unit->bytes_left == 0)
245 {
246 int finished;
247
248 c = '\n';
249 record = next_array_record (dtp, dtp->u.p.current_unit->ls,
250 &finished);
251
252 /* Check for "end-of-file" condition. */
253 if (finished)
254 {
255 dtp->u.p.at_eof = 1;
256 goto done;
257 }
258
259 record *= dtp->u.p.current_unit->recl;
260 if (sseek (dtp->u.p.current_unit->s, record, SEEK_SET) < 0)
261 return EOF;
262
263 dtp->u.p.current_unit->bytes_left = dtp->u.p.current_unit->recl;
264 goto done;
265 }
266 }
267
268 /* Get the next character and handle end-of-record conditions. */
269
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
273 {
274 char cc;
275 length = sread (dtp->u.p.current_unit->s, &cc, 1);
276 c = cc;
277 }
278
279 if (unlikely (length < 0))
280 {
281 generate_error (&dtp->common, LIBERROR_OS, NULL);
282 return '\0';
283 }
284
285 if (is_array_io (dtp))
286 {
287 /* Check whether we hit EOF. */
288 if (unlikely (length == 0))
289 {
290 generate_error (&dtp->common, LIBERROR_INTERNAL_UNIT, NULL);
291 return '\0';
292 }
293 dtp->u.p.current_unit->bytes_left--;
294 }
295 else
296 {
297 if (dtp->u.p.at_eof)
298 return EOF;
299 if (length == 0)
300 {
301 c = '\n';
302 dtp->u.p.at_eof = 1;
303 }
304 }
305
306 done:
307 dtp->u.p.at_eol = (c == '\n' || c == EOF);
308 return c;
309 }
310
311
312 /* Worker function for UTF encoded files. */
313 static int
314 next_char_utf8 (st_parameter_dt *dtp)
315 {
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;
320
321 /* Always check the unget and line buffer first. */
322 if (!(c = check_buffers (dtp)))
323 c = fbuf_getc (dtp->u.p.current_unit);
324
325 if (c < 0x80)
326 goto utf_done;
327
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;
334
335 found:
336 c = (c & masks[nb-1]);
337
338 /* Decode the bytes read. */
339 for (i = 1; i < nb; i++)
340 {
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));
345 }
346
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;
353
354 /* Make sure the character is valid. */
355 if (c > 0x7FFFFFFF || (c >= 0xD800 && c <= 0xDFFF))
356 goto invalid;
357
358 utf_done:
359 dtp->u.p.at_eol = (c == '\n' || c == (gfc_char4_t) EOF);
360 return (int) c;
361
362 invalid:
363 generate_error (&dtp->common, LIBERROR_READ_VALUE, "Invalid UTF-8 encoding");
364 return (gfc_char4_t) '?';
365 }
366
367 /* Push a character back onto the input. */
368
369 static void
370 unget_char (st_parameter_dt *dtp, int c)
371 {
372 dtp->u.p.current_unit->last_char = c;
373 }
374
375
376 /* Skip over spaces in the input. Returns the nonspace character that
377 terminated the eating and also places it back on the input. */
378
379 static int
380 eat_spaces (st_parameter_dt *dtp)
381 {
382 int c;
383
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))
389 {
390 gfc_offset offset = stell (dtp->u.p.current_unit->s);
391 gfc_offset i;
392
393 if (is_char4_unit(dtp)) /* kind=4 */
394 {
395 for (i = 0; i < dtp->u.p.current_unit->bytes_left; i++)
396 {
397 if (dtp->internal_unit[(offset + i) * sizeof (gfc_char4_t)]
398 != (gfc_char4_t)' ')
399 break;
400 }
401 }
402 else
403 {
404 for (i = 0; i < dtp->u.p.current_unit->bytes_left; i++)
405 {
406 if (dtp->internal_unit[offset + i] != ' ')
407 break;
408 }
409 }
410
411 if (i != 0)
412 {
413 sseek (dtp->u.p.current_unit->s, offset + i, SEEK_SET);
414 dtp->u.p.current_unit->bytes_left -= i;
415 }
416 }
417
418 /* Now skip spaces, EOF and EOL are handled in next_char. */
419 do
420 c = next_char (dtp);
421 while (c != EOF && (c == ' ' || c == '\r' || c == '\t'));
422
423 unget_char (dtp, c);
424 return c;
425 }
426
427
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. */
431
432 static int
433 eat_line (st_parameter_dt *dtp)
434 {
435 int c;
436
437 do
438 c = next_char (dtp);
439 while (c != EOF && c != '\n');
440 if (c == EOF)
441 return LIBERROR_END;
442 return 0;
443 }
444
445
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.
450
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.
456
457 Returns 0 for success, and non-zero error code otherwise. */
458
459 static int
460 eat_separator (st_parameter_dt *dtp)
461 {
462 int c, n;
463 int err = 0;
464
465 eat_spaces (dtp);
466 dtp->u.p.comma_flag = 0;
467
468 if ((c = next_char (dtp)) == EOF)
469 return LIBERROR_END;
470 switch (c)
471 {
472 case ',':
473 if (dtp->u.p.current_unit->decimal_status == DECIMAL_COMMA)
474 {
475 unget_char (dtp, c);
476 break;
477 }
478 /* Fall through. */
479 case ';':
480 dtp->u.p.comma_flag = 1;
481 eat_spaces (dtp);
482 break;
483
484 case '/':
485 dtp->u.p.input_complete = 1;
486 break;
487
488 case '\r':
489 if ((n = next_char(dtp)) == EOF)
490 return LIBERROR_END;
491 if (n != '\n')
492 {
493 unget_char (dtp, n);
494 break;
495 }
496 /* Fall through. */
497 case '\n':
498 dtp->u.p.at_eol = 1;
499 if (dtp->u.p.namelist_mode)
500 {
501 do
502 {
503 if ((c = next_char (dtp)) == EOF)
504 return LIBERROR_END;
505 if (c == '!')
506 {
507 err = eat_line (dtp);
508 if (err)
509 return err;
510 c = '\n';
511 }
512 }
513 while (c == '\n' || c == '\r' || c == ' ' || c == '\t');
514 unget_char (dtp, c);
515 }
516 break;
517
518 case '!':
519 /* Eat a namelist comment. */
520 if (dtp->u.p.namelist_mode)
521 {
522 err = eat_line (dtp);
523 if (err)
524 return err;
525
526 break;
527 }
528
529 /* Fall Through... */
530
531 default:
532 unget_char (dtp, c);
533 break;
534 }
535 return err;
536 }
537
538
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. */
543
544 static int
545 finish_separator (st_parameter_dt *dtp)
546 {
547 int c;
548 int err = LIBERROR_OK;
549
550 restart:
551 eat_spaces (dtp);
552
553 if ((c = next_char (dtp)) == EOF)
554 return LIBERROR_END;
555 switch (c)
556 {
557 case ',':
558 if (dtp->u.p.comma_flag)
559 unget_char (dtp, c);
560 else
561 {
562 if ((c = eat_spaces (dtp)) == EOF)
563 return LIBERROR_END;
564 if (c == '\n' || c == '\r')
565 goto restart;
566 }
567
568 break;
569
570 case '/':
571 dtp->u.p.input_complete = 1;
572 if (!dtp->u.p.namelist_mode)
573 return err;
574 break;
575
576 case '\n':
577 case '\r':
578 goto restart;
579
580 case '!':
581 if (dtp->u.p.namelist_mode)
582 {
583 err = eat_line (dtp);
584 if (err)
585 return err;
586 goto restart;
587 }
588 /* Fall through. */
589 default:
590 unget_char (dtp, c);
591 break;
592 }
593 return err;
594 }
595
596
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. */
600
601 static int
602 nml_bad_return (st_parameter_dt *dtp, char c)
603 {
604 if (dtp->u.p.namelist_mode)
605 {
606 dtp->u.p.nml_read_error = 1;
607 unget_char (dtp, c);
608 return 1;
609 }
610 return 0;
611 }
612
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. */
616
617 static int
618 convert_integer (st_parameter_dt *dtp, int length, int negative)
619 {
620 char c, *buffer, message[MSGLEN];
621 int m;
622 GFC_UINTEGER_LARGEST v, max, max10;
623 GFC_INTEGER_LARGEST value;
624
625 buffer = dtp->u.p.saved_string;
626 v = 0;
627
628 if (length == -1)
629 max = MAX_REPEAT;
630 else
631 {
632 max = si_max (length);
633 if (negative)
634 max++;
635 }
636 max10 = max / 10;
637
638 for (;;)
639 {
640 c = *buffer++;
641 if (c == '\0')
642 break;
643 c -= '0';
644
645 if (v > max10)
646 goto overflow;
647 v = 10 * v;
648
649 if (v > max - c)
650 goto overflow;
651 v += c;
652 }
653
654 m = 0;
655
656 if (length != -1)
657 {
658 if (negative)
659 value = -v;
660 else
661 value = v;
662 set_integer (dtp->u.p.value, value, length);
663 }
664 else
665 {
666 dtp->u.p.repeat_count = v;
667
668 if (dtp->u.p.repeat_count == 0)
669 {
670 snprintf (message, MSGLEN, "Zero repeat count in item %d of list input",
671 dtp->u.p.item_count);
672
673 generate_error (&dtp->common, LIBERROR_READ_VALUE, message);
674 m = 1;
675 }
676 }
677
678 free_saved (dtp);
679 return m;
680
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);
688
689 free_saved (dtp);
690 generate_error (&dtp->common, LIBERROR_READ_VALUE, message);
691
692 return 1;
693 }
694
695
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. */
699
700 static int
701 parse_repeat (st_parameter_dt *dtp)
702 {
703 char message[MSGLEN];
704 int c, repeat;
705
706 if ((c = next_char (dtp)) == EOF)
707 goto bad_repeat;
708 switch (c)
709 {
710 CASE_DIGITS:
711 repeat = c - '0';
712 break;
713
714 CASE_SEPARATORS:
715 unget_char (dtp, c);
716 eat_separator (dtp);
717 return 1;
718
719 default:
720 unget_char (dtp, c);
721 return 0;
722 }
723
724 for (;;)
725 {
726 c = next_char (dtp);
727 switch (c)
728 {
729 CASE_DIGITS:
730 repeat = 10 * repeat + c - '0';
731
732 if (repeat > MAX_REPEAT)
733 {
734 snprintf (message, MSGLEN,
735 "Repeat count overflow in item %d of list input",
736 dtp->u.p.item_count);
737
738 generate_error (&dtp->common, LIBERROR_READ_VALUE, message);
739 return 1;
740 }
741
742 break;
743
744 case '*':
745 if (repeat == 0)
746 {
747 snprintf (message, MSGLEN,
748 "Zero repeat count in item %d of list input",
749 dtp->u.p.item_count);
750
751 generate_error (&dtp->common, LIBERROR_READ_VALUE, message);
752 return 1;
753 }
754
755 goto done;
756
757 default:
758 goto bad_repeat;
759 }
760 }
761
762 done:
763 dtp->u.p.repeat_count = repeat;
764 return 0;
765
766 bad_repeat:
767
768 free_saved (dtp);
769 if (c == EOF)
770 {
771 free_line (dtp);
772 hit_eof (dtp);
773 return 1;
774 }
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;
781 }
782
783
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. */
788
789 static void
790 l_push_char (st_parameter_dt *dtp, char c)
791 {
792 if (dtp->u.p.line_buffer == NULL)
793 dtp->u.p.line_buffer = xcalloc (SCRATCH_SIZE, 1);
794
795 dtp->u.p.line_buffer[dtp->u.p.line_buffer_pos++] = c;
796 }
797
798
799 /* Read a logical character on the input. */
800
801 static void
802 read_logical (st_parameter_dt *dtp, int length)
803 {
804 char message[MSGLEN];
805 int c, i, v;
806
807 if (parse_repeat (dtp))
808 return;
809
810 c = tolower (next_char (dtp));
811 l_push_char (dtp, c);
812 switch (c)
813 {
814 case 't':
815 v = 1;
816 c = next_char (dtp);
817 l_push_char (dtp, c);
818
819 if (!is_separator(c) && c != EOF)
820 goto possible_name;
821
822 unget_char (dtp, c);
823 break;
824 case 'f':
825 v = 0;
826 c = next_char (dtp);
827 l_push_char (dtp, c);
828
829 if (!is_separator(c) && c != EOF)
830 goto possible_name;
831
832 unget_char (dtp, c);
833 break;
834
835 case '.':
836 c = tolower (next_char (dtp));
837 switch (c)
838 {
839 case 't':
840 v = 1;
841 break;
842 case 'f':
843 v = 0;
844 break;
845 default:
846 goto bad_logical;
847 }
848
849 break;
850
851 case '!':
852 if (!dtp->u.p.namelist_mode)
853 goto bad_logical;
854
855 CASE_SEPARATORS:
856 case EOF:
857 unget_char (dtp, c);
858 eat_separator (dtp);
859 return; /* Null value. */
860
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;
866 }
867
868 dtp->u.p.saved_type = BT_LOGICAL;
869 dtp->u.p.saved_length = length;
870
871 /* Eat trailing garbage. */
872 do
873 c = next_char (dtp);
874 while (c != EOF && !is_separator (c));
875
876 unget_char (dtp, c);
877 eat_separator (dtp);
878 set_integer ((int *) dtp->u.p.value, v, length);
879 free_line (dtp);
880
881 return;
882
883 possible_name:
884
885 for(i = 0; i < 63; i++)
886 {
887 c = next_char (dtp);
888 if (is_separator(c))
889 {
890 /* All done if this is not a namelist read. */
891 if (!dtp->u.p.namelist_mode)
892 goto logical_done;
893
894 unget_char (dtp, c);
895 eat_separator (dtp);
896 c = next_char (dtp);
897 if (c != '=')
898 {
899 unget_char (dtp, c);
900 goto logical_done;
901 }
902 }
903
904 l_push_char (dtp, c);
905 if (c == '=')
906 {
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;
911 }
912
913 }
914
915 bad_logical:
916
917 if (nml_bad_return (dtp, c))
918 {
919 free_line (dtp);
920 return;
921 }
922
923
924 free_saved (dtp);
925 if (c == EOF)
926 {
927 free_line (dtp);
928 hit_eof (dtp);
929 return;
930 }
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;
938
939 logical_done:
940
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);
946 }
947
948
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. */
953
954 static void
955 read_integer (st_parameter_dt *dtp, int length)
956 {
957 char message[MSGLEN];
958 int c, negative;
959
960 negative = 0;
961
962 c = next_char (dtp);
963 switch (c)
964 {
965 case '-':
966 negative = 1;
967 /* Fall through... */
968
969 case '+':
970 if ((c = next_char (dtp)) == EOF)
971 goto bad_integer;
972 goto get_integer;
973
974 case '!':
975 if (!dtp->u.p.namelist_mode)
976 goto bad_integer;
977
978 CASE_SEPARATORS: /* Single null. */
979 unget_char (dtp, c);
980 eat_separator (dtp);
981 return;
982
983 CASE_DIGITS:
984 push_char (dtp, c);
985 break;
986
987 default:
988 goto bad_integer;
989 }
990
991 /* Take care of what may be a repeat count. */
992
993 for (;;)
994 {
995 c = next_char (dtp);
996 switch (c)
997 {
998 CASE_DIGITS:
999 push_char (dtp, c);
1000 break;
1001
1002 case '*':
1003 push_char (dtp, '\0');
1004 goto repeat;
1005
1006 case '!':
1007 if (!dtp->u.p.namelist_mode)
1008 goto bad_integer;
1009
1010 CASE_SEPARATORS: /* Not a repeat count. */
1011 case EOF:
1012 goto done;
1013
1014 default:
1015 goto bad_integer;
1016 }
1017 }
1018
1019 repeat:
1020 if (convert_integer (dtp, -1, 0))
1021 return;
1022
1023 /* Get the real integer. */
1024
1025 if ((c = next_char (dtp)) == EOF)
1026 goto bad_integer;
1027 switch (c)
1028 {
1029 CASE_DIGITS:
1030 break;
1031
1032 case '!':
1033 if (!dtp->u.p.namelist_mode)
1034 goto bad_integer;
1035
1036 CASE_SEPARATORS:
1037 unget_char (dtp, c);
1038 eat_separator (dtp);
1039 return;
1040
1041 case '-':
1042 negative = 1;
1043 /* Fall through... */
1044
1045 case '+':
1046 c = next_char (dtp);
1047 break;
1048 }
1049
1050 get_integer:
1051 if (!isdigit (c))
1052 goto bad_integer;
1053 push_char (dtp, c);
1054
1055 for (;;)
1056 {
1057 c = next_char (dtp);
1058 switch (c)
1059 {
1060 CASE_DIGITS:
1061 push_char (dtp, c);
1062 break;
1063
1064 case '!':
1065 if (!dtp->u.p.namelist_mode)
1066 goto bad_integer;
1067
1068 CASE_SEPARATORS:
1069 case EOF:
1070 goto done;
1071
1072 default:
1073 goto bad_integer;
1074 }
1075 }
1076
1077 bad_integer:
1078
1079 if (nml_bad_return (dtp, c))
1080 return;
1081
1082 free_saved (dtp);
1083 if (c == EOF)
1084 {
1085 free_line (dtp);
1086 hit_eof (dtp);
1087 return;
1088 }
1089 else if (c != '\n')
1090 eat_line (dtp);
1091
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);
1096
1097 return;
1098
1099 done:
1100 unget_char (dtp, c);
1101 eat_separator (dtp);
1102
1103 push_char (dtp, '\0');
1104 if (convert_integer (dtp, length, negative))
1105 {
1106 free_saved (dtp);
1107 return;
1108 }
1109
1110 free_saved (dtp);
1111 dtp->u.p.saved_type = BT_INTEGER;
1112 }
1113
1114
1115 /* Read a character variable. */
1116
1117 static void
1118 read_character (st_parameter_dt *dtp, int length __attribute__ ((unused)))
1119 {
1120 char quote, message[MSGLEN];
1121 int c;
1122
1123 quote = ' '; /* Space means no quote character. */
1124
1125 if ((c = next_char (dtp)) == EOF)
1126 goto eof;
1127 switch (c)
1128 {
1129 CASE_DIGITS:
1130 push_char (dtp, c);
1131 break;
1132
1133 CASE_SEPARATORS:
1134 case EOF:
1135 unget_char (dtp, c); /* NULL value. */
1136 eat_separator (dtp);
1137 return;
1138
1139 case '"':
1140 case '\'':
1141 quote = c;
1142 goto get_string;
1143
1144 default:
1145 if (dtp->u.p.namelist_mode)
1146 {
1147 unget_char (dtp, c);
1148 return;
1149 }
1150 push_char (dtp, c);
1151 goto get_string;
1152 }
1153
1154 /* Deal with a possible repeat count. */
1155
1156 for (;;)
1157 {
1158 c = next_char (dtp);
1159 switch (c)
1160 {
1161 CASE_DIGITS:
1162 push_char (dtp, c);
1163 break;
1164
1165 CASE_SEPARATORS:
1166 case EOF:
1167 unget_char (dtp, c);
1168 goto done; /* String was only digits! */
1169
1170 case '*':
1171 push_char (dtp, '\0');
1172 goto got_repeat;
1173
1174 default:
1175 push_char (dtp, c);
1176 goto get_string; /* Not a repeat count after all. */
1177 }
1178 }
1179
1180 got_repeat:
1181 if (convert_integer (dtp, -1, 0))
1182 return;
1183
1184 /* Now get the real string. */
1185
1186 if ((c = next_char (dtp)) == EOF)
1187 goto eof;
1188 switch (c)
1189 {
1190 CASE_SEPARATORS:
1191 unget_char (dtp, c); /* Repeated NULL values. */
1192 eat_separator (dtp);
1193 return;
1194
1195 case '"':
1196 case '\'':
1197 quote = c;
1198 break;
1199
1200 default:
1201 push_char (dtp, c);
1202 break;
1203 }
1204
1205 get_string:
1206
1207 for (;;)
1208 {
1209 if ((c = next_char (dtp)) == EOF)
1210 goto done_eof;
1211 switch (c)
1212 {
1213 case '"':
1214 case '\'':
1215 if (c != quote)
1216 {
1217 push_char (dtp, c);
1218 break;
1219 }
1220
1221 /* See if we have a doubled quote character or the end of
1222 the string. */
1223
1224 if ((c = next_char (dtp)) == EOF)
1225 goto done_eof;
1226 if (c == quote)
1227 {
1228 push_char (dtp, quote);
1229 break;
1230 }
1231
1232 unget_char (dtp, c);
1233 goto done;
1234
1235 CASE_SEPARATORS:
1236 if (quote == ' ')
1237 {
1238 unget_char (dtp, c);
1239 goto done;
1240 }
1241
1242 if (c != '\n' && c != '\r')
1243 push_char (dtp, c);
1244 break;
1245
1246 default:
1247 push_char (dtp, c);
1248 break;
1249 }
1250 }
1251
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)
1258 {
1259 unget_char (dtp, c);
1260 eat_separator (dtp);
1261 dtp->u.p.saved_type = BT_CHARACTER;
1262 }
1263 else
1264 {
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);
1269 }
1270 free_line (dtp);
1271 return;
1272
1273 eof:
1274 free_saved (dtp);
1275 free_line (dtp);
1276 hit_eof (dtp);
1277 }
1278
1279
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. */
1282
1283 static int
1284 parse_real (st_parameter_dt *dtp, void *buffer, int length)
1285 {
1286 char message[MSGLEN];
1287 int c, m, seen_dp;
1288
1289 if ((c = next_char (dtp)) == EOF)
1290 goto bad;
1291
1292 if (c == '-' || c == '+')
1293 {
1294 push_char (dtp, c);
1295 if ((c = next_char (dtp)) == EOF)
1296 goto bad;
1297 }
1298
1299 if (c == ',' && dtp->u.p.current_unit->decimal_status == DECIMAL_COMMA)
1300 c = '.';
1301
1302 if (!isdigit (c) && c != '.')
1303 {
1304 if (c == 'i' || c == 'I' || c == 'n' || c == 'N')
1305 goto inf_nan;
1306 else
1307 goto bad;
1308 }
1309
1310 push_char (dtp, c);
1311
1312 seen_dp = (c == '.') ? 1 : 0;
1313
1314 for (;;)
1315 {
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)
1321 {
1322 CASE_DIGITS:
1323 push_char (dtp, c);
1324 break;
1325
1326 case '.':
1327 if (seen_dp)
1328 goto bad;
1329
1330 seen_dp = 1;
1331 push_char (dtp, c);
1332 break;
1333
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;
1342
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;
1350
1351 case '!':
1352 if (!dtp->u.p.namelist_mode)
1353 goto bad;
1354
1355 CASE_SEPARATORS:
1356 case EOF:
1357 goto done;
1358
1359 default:
1360 goto done;
1361 }
1362 }
1363
1364 exp1:
1365 if ((c = next_char (dtp)) == EOF)
1366 goto bad;
1367 if (c != '-' && c != '+')
1368 push_char (dtp, '+');
1369 else
1370 {
1371 push_char (dtp, c);
1372 c = next_char (dtp);
1373 }
1374
1375 exp2:
1376 if (!isdigit (c))
1377 goto bad_exponent;
1378
1379 push_char (dtp, c);
1380
1381 for (;;)
1382 {
1383 if ((c = next_char (dtp)) == EOF)
1384 goto bad;
1385 switch (c)
1386 {
1387 CASE_DIGITS:
1388 push_char (dtp, c);
1389 break;
1390
1391 case '!':
1392 if (!dtp->u.p.namelist_mode)
1393 goto bad;
1394
1395 CASE_SEPARATORS:
1396 case EOF:
1397 unget_char (dtp, c);
1398 goto done;
1399
1400 default:
1401 goto done;
1402 }
1403 }
1404
1405 done:
1406 unget_char (dtp, c);
1407 push_char (dtp, '\0');
1408
1409 m = convert_real (dtp, buffer, dtp->u.p.saved_string, length);
1410 free_saved (dtp);
1411
1412 return m;
1413
1414 done_infnan:
1415 unget_char (dtp, c);
1416 push_char (dtp, '\0');
1417
1418 m = convert_infnan (dtp, buffer, dtp->u.p.saved_string, length);
1419 free_saved (dtp);
1420
1421 return m;
1422
1423 inf_nan:
1424 /* Match INF and Infinity. */
1425 if ((c == 'i' || c == 'I')
1426 && ((c = next_char (dtp)) == 'n' || c == 'N')
1427 && ((c = next_char (dtp)) == 'f' || c == 'F'))
1428 {
1429 c = next_char (dtp);
1430 if ((c != 'i' && c != 'I')
1431 || ((c == 'i' || c == 'I')
1432 && ((c = next_char (dtp)) == 'n' || c == 'N')
1433 && ((c = next_char (dtp)) == 'i' || c == 'I')
1434 && ((c = next_char (dtp)) == 't' || c == 'T')
1435 && ((c = next_char (dtp)) == 'y' || c == 'Y')
1436 && (c = next_char (dtp))))
1437 {
1438 if (is_separator (c) || (c == EOF))
1439 unget_char (dtp, c);
1440 push_char (dtp, 'i');
1441 push_char (dtp, 'n');
1442 push_char (dtp, 'f');
1443 goto done_infnan;
1444 }
1445 } /* Match NaN. */
1446 else if (((c = next_char (dtp)) == 'a' || c == 'A')
1447 && ((c = next_char (dtp)) == 'n' || c == 'N')
1448 && (c = next_char (dtp)))
1449 {
1450 if (is_separator (c) || (c == EOF))
1451 unget_char (dtp, c);
1452 push_char (dtp, 'n');
1453 push_char (dtp, 'a');
1454 push_char (dtp, 'n');
1455
1456 /* Match "NAN(alphanum)". */
1457 if (c == '(')
1458 {
1459 for ( ; c != ')'; c = next_char (dtp))
1460 if (is_separator (c))
1461 goto bad;
1462
1463 c = next_char (dtp);
1464 if (is_separator (c) || (c == EOF))
1465 unget_char (dtp, c);
1466 }
1467 goto done_infnan;
1468 }
1469
1470 bad:
1471
1472 if (nml_bad_return (dtp, c))
1473 return 0;
1474
1475 bad_exponent:
1476
1477 free_saved (dtp);
1478 if (c == EOF)
1479 {
1480 free_line (dtp);
1481 hit_eof (dtp);
1482 return 1;
1483 }
1484 else if (c != '\n')
1485 eat_line (dtp);
1486
1487 snprintf (message, MSGLEN, "Bad complex floating point "
1488 "number for item %d", dtp->u.p.item_count);
1489 free_line (dtp);
1490 generate_error (&dtp->common, LIBERROR_READ_VALUE, message);
1491
1492 return 1;
1493 }
1494
1495
1496 /* Reading a complex number is straightforward because we can tell
1497 what it is right away. */
1498
1499 static void
1500 read_complex (st_parameter_dt *dtp, void * dest, int kind, size_t size)
1501 {
1502 char message[MSGLEN];
1503 int c;
1504
1505 if (parse_repeat (dtp))
1506 return;
1507
1508 c = next_char (dtp);
1509 switch (c)
1510 {
1511 case '(':
1512 break;
1513
1514 case '!':
1515 if (!dtp->u.p.namelist_mode)
1516 goto bad_complex;
1517
1518 CASE_SEPARATORS:
1519 case EOF:
1520 unget_char (dtp, c);
1521 eat_separator (dtp);
1522 return;
1523
1524 default:
1525 goto bad_complex;
1526 }
1527
1528 eol_1:
1529 eat_spaces (dtp);
1530 c = next_char (dtp);
1531 if (c == '\n' || c== '\r')
1532 goto eol_1;
1533 else
1534 unget_char (dtp, c);
1535
1536 if (parse_real (dtp, dest, kind))
1537 return;
1538
1539 eol_2:
1540 eat_spaces (dtp);
1541 c = next_char (dtp);
1542 if (c == '\n' || c== '\r')
1543 goto eol_2;
1544 else
1545 unget_char (dtp, c);
1546
1547 if (next_char (dtp)
1548 != (dtp->u.p.current_unit->decimal_status == DECIMAL_POINT ? ',' : ';'))
1549 goto bad_complex;
1550
1551 eol_3:
1552 eat_spaces (dtp);
1553 c = next_char (dtp);
1554 if (c == '\n' || c== '\r')
1555 goto eol_3;
1556 else
1557 unget_char (dtp, c);
1558
1559 if (parse_real (dtp, dest + size / 2, kind))
1560 return;
1561
1562 eol_4:
1563 eat_spaces (dtp);
1564 c = next_char (dtp);
1565 if (c == '\n' || c== '\r')
1566 goto eol_4;
1567 else
1568 unget_char (dtp, c);
1569
1570 if (next_char (dtp) != ')')
1571 goto bad_complex;
1572
1573 c = next_char (dtp);
1574 if (!is_separator (c) && (c != EOF))
1575 goto bad_complex;
1576
1577 unget_char (dtp, c);
1578 eat_separator (dtp);
1579
1580 free_saved (dtp);
1581 dtp->u.p.saved_type = BT_COMPLEX;
1582 return;
1583
1584 bad_complex:
1585
1586 if (nml_bad_return (dtp, c))
1587 return;
1588
1589 free_saved (dtp);
1590 if (c == EOF)
1591 {
1592 free_line (dtp);
1593 hit_eof (dtp);
1594 return;
1595 }
1596 else if (c != '\n')
1597 eat_line (dtp);
1598
1599 snprintf (message, MSGLEN, "Bad complex value in item %d of list input",
1600 dtp->u.p.item_count);
1601 free_line (dtp);
1602 generate_error (&dtp->common, LIBERROR_READ_VALUE, message);
1603 }
1604
1605
1606 /* Parse a real number with a possible repeat count. */
1607
1608 static void
1609 read_real (st_parameter_dt *dtp, void * dest, int length)
1610 {
1611 char message[MSGLEN];
1612 int c;
1613 int seen_dp;
1614 int is_inf;
1615
1616 seen_dp = 0;
1617
1618 c = next_char (dtp);
1619 if (c == ',' && dtp->u.p.current_unit->decimal_status == DECIMAL_COMMA)
1620 c = '.';
1621 switch (c)
1622 {
1623 CASE_DIGITS:
1624 push_char (dtp, c);
1625 break;
1626
1627 case '.':
1628 push_char (dtp, c);
1629 seen_dp = 1;
1630 break;
1631
1632 case '+':
1633 case '-':
1634 goto got_sign;
1635
1636 case '!':
1637 if (!dtp->u.p.namelist_mode)
1638 goto bad_real;
1639
1640 CASE_SEPARATORS:
1641 unget_char (dtp, c); /* Single null. */
1642 eat_separator (dtp);
1643 return;
1644
1645 case 'i':
1646 case 'I':
1647 case 'n':
1648 case 'N':
1649 goto inf_nan;
1650
1651 default:
1652 goto bad_real;
1653 }
1654
1655 /* Get the digit string that might be a repeat count. */
1656
1657 for (;;)
1658 {
1659 c = next_char (dtp);
1660 if (c == ',' && dtp->u.p.current_unit->decimal_status == DECIMAL_COMMA)
1661 c = '.';
1662 switch (c)
1663 {
1664 CASE_DIGITS:
1665 push_char (dtp, c);
1666 break;
1667
1668 case '.':
1669 if (seen_dp)
1670 goto bad_real;
1671
1672 seen_dp = 1;
1673 push_char (dtp, c);
1674 goto real_loop;
1675
1676 case 'E':
1677 case 'e':
1678 case 'D':
1679 case 'd':
1680 case 'Q':
1681 case 'q':
1682 goto exp1;
1683
1684 case '+':
1685 case '-':
1686 push_char (dtp, 'e');
1687 push_char (dtp, c);
1688 c = next_char (dtp);
1689 goto exp2;
1690
1691 case '*':
1692 push_char (dtp, '\0');
1693 goto got_repeat;
1694
1695 case '!':
1696 if (!dtp->u.p.namelist_mode)
1697 goto bad_real;
1698
1699 CASE_SEPARATORS:
1700 case EOF:
1701 if (c != '\n' && c != ',' && c != '\r' && c != ';')
1702 unget_char (dtp, c);
1703 goto done;
1704
1705 default:
1706 goto bad_real;
1707 }
1708 }
1709
1710 got_repeat:
1711 if (convert_integer (dtp, -1, 0))
1712 return;
1713
1714 /* Now get the number itself. */
1715
1716 if ((c = next_char (dtp)) == EOF)
1717 goto bad_real;
1718 if (is_separator (c))
1719 { /* Repeated null value. */
1720 unget_char (dtp, c);
1721 eat_separator (dtp);
1722 return;
1723 }
1724
1725 if (c != '-' && c != '+')
1726 push_char (dtp, '+');
1727 else
1728 {
1729 got_sign:
1730 push_char (dtp, c);
1731 if ((c = next_char (dtp)) == EOF)
1732 goto bad_real;
1733 }
1734
1735 if (c == ',' && dtp->u.p.current_unit->decimal_status == DECIMAL_COMMA)
1736 c = '.';
1737
1738 if (!isdigit (c) && c != '.')
1739 {
1740 if (c == 'i' || c == 'I' || c == 'n' || c == 'N')
1741 goto inf_nan;
1742 else
1743 goto bad_real;
1744 }
1745
1746 if (c == '.')
1747 {
1748 if (seen_dp)
1749 goto bad_real;
1750 else
1751 seen_dp = 1;
1752 }
1753
1754 push_char (dtp, c);
1755
1756 real_loop:
1757 for (;;)
1758 {
1759 c = next_char (dtp);
1760 if (c == ',' && dtp->u.p.current_unit->decimal_status == DECIMAL_COMMA)
1761 c = '.';
1762 switch (c)
1763 {
1764 CASE_DIGITS:
1765 push_char (dtp, c);
1766 break;
1767
1768 case '!':
1769 if (!dtp->u.p.namelist_mode)
1770 goto bad_real;
1771
1772 CASE_SEPARATORS:
1773 case EOF:
1774 goto done;
1775
1776 case '.':
1777 if (seen_dp)
1778 goto bad_real;
1779
1780 seen_dp = 1;
1781 push_char (dtp, c);
1782 break;
1783
1784 case 'E':
1785 case 'e':
1786 case 'D':
1787 case 'd':
1788 case 'Q':
1789 case 'q':
1790 goto exp1;
1791
1792 case '+':
1793 case '-':
1794 push_char (dtp, 'e');
1795 push_char (dtp, c);
1796 c = next_char (dtp);
1797 goto exp2;
1798
1799 default:
1800 goto bad_real;
1801 }
1802 }
1803
1804 exp1:
1805 push_char (dtp, 'e');
1806
1807 if ((c = next_char (dtp)) == EOF)
1808 goto bad_real;
1809 if (c != '+' && c != '-')
1810 push_char (dtp, '+');
1811 else
1812 {
1813 push_char (dtp, c);
1814 c = next_char (dtp);
1815 }
1816
1817 exp2:
1818 if (!isdigit (c))
1819 goto bad_exponent;
1820
1821 push_char (dtp, c);
1822
1823 for (;;)
1824 {
1825 c = next_char (dtp);
1826
1827 switch (c)
1828 {
1829 CASE_DIGITS:
1830 push_char (dtp, c);
1831 break;
1832
1833 case '!':
1834 if (!dtp->u.p.namelist_mode)
1835 goto bad_real;
1836
1837 CASE_SEPARATORS:
1838 case EOF:
1839 goto done;
1840
1841 default:
1842 goto bad_real;
1843 }
1844 }
1845
1846 done:
1847 unget_char (dtp, c);
1848 eat_separator (dtp);
1849 push_char (dtp, '\0');
1850 if (convert_real (dtp, dest, dtp->u.p.saved_string, length))
1851 {
1852 free_saved (dtp);
1853 return;
1854 }
1855
1856 free_saved (dtp);
1857 dtp->u.p.saved_type = BT_REAL;
1858 return;
1859
1860 inf_nan:
1861 l_push_char (dtp, c);
1862 is_inf = 0;
1863
1864 /* Match INF and Infinity. */
1865 if (c == 'i' || c == 'I')
1866 {
1867 c = next_char (dtp);
1868 l_push_char (dtp, c);
1869 if (c != 'n' && c != 'N')
1870 goto unwind;
1871 c = next_char (dtp);
1872 l_push_char (dtp, c);
1873 if (c != 'f' && c != 'F')
1874 goto unwind;
1875 c = next_char (dtp);
1876 l_push_char (dtp, c);
1877 if (!is_separator (c) && (c != EOF))
1878 {
1879 if (c != 'i' && c != 'I')
1880 goto unwind;
1881 c = next_char (dtp);
1882 l_push_char (dtp, c);
1883 if (c != 'n' && c != 'N')
1884 goto unwind;
1885 c = next_char (dtp);
1886 l_push_char (dtp, c);
1887 if (c != 'i' && c != 'I')
1888 goto unwind;
1889 c = next_char (dtp);
1890 l_push_char (dtp, c);
1891 if (c != 't' && c != 'T')
1892 goto unwind;
1893 c = next_char (dtp);
1894 l_push_char (dtp, c);
1895 if (c != 'y' && c != 'Y')
1896 goto unwind;
1897 c = next_char (dtp);
1898 l_push_char (dtp, c);
1899 }
1900 is_inf = 1;
1901 } /* Match NaN. */
1902 else
1903 {
1904 c = next_char (dtp);
1905 l_push_char (dtp, c);
1906 if (c != 'a' && c != 'A')
1907 goto unwind;
1908 c = next_char (dtp);
1909 l_push_char (dtp, c);
1910 if (c != 'n' && c != 'N')
1911 goto unwind;
1912 c = next_char (dtp);
1913 l_push_char (dtp, c);
1914
1915 /* Match NAN(alphanum). */
1916 if (c == '(')
1917 {
1918 for (c = next_char (dtp); c != ')'; c = next_char (dtp))
1919 if (is_separator (c))
1920 goto unwind;
1921 else
1922 l_push_char (dtp, c);
1923
1924 l_push_char (dtp, ')');
1925 c = next_char (dtp);
1926 l_push_char (dtp, c);
1927 }
1928 }
1929
1930 if (!is_separator (c) && (c != EOF))
1931 goto unwind;
1932
1933 if (dtp->u.p.namelist_mode)
1934 {
1935 if (c == ' ' || c =='\n' || c == '\r')
1936 {
1937 do
1938 {
1939 if ((c = next_char (dtp)) == EOF)
1940 goto bad_real;
1941 }
1942 while (c == ' ' || c =='\n' || c == '\r');
1943
1944 l_push_char (dtp, c);
1945
1946 if (c == '=')
1947 goto unwind;
1948 }
1949 }
1950
1951 if (is_inf)
1952 {
1953 push_char (dtp, 'i');
1954 push_char (dtp, 'n');
1955 push_char (dtp, 'f');
1956 }
1957 else
1958 {
1959 push_char (dtp, 'n');
1960 push_char (dtp, 'a');
1961 push_char (dtp, 'n');
1962 }
1963
1964 free_line (dtp);
1965 unget_char (dtp, c);
1966 eat_separator (dtp);
1967 push_char (dtp, '\0');
1968 if (convert_infnan (dtp, dest, dtp->u.p.saved_string, length))
1969 return;
1970
1971 free_saved (dtp);
1972 dtp->u.p.saved_type = BT_REAL;
1973 return;
1974
1975 unwind:
1976 if (dtp->u.p.namelist_mode)
1977 {
1978 dtp->u.p.nml_read_error = 1;
1979 dtp->u.p.line_buffer_enabled = 1;
1980 dtp->u.p.line_buffer_pos = 0;
1981 return;
1982 }
1983
1984 bad_real:
1985
1986 if (nml_bad_return (dtp, c))
1987 return;
1988
1989 bad_exponent:
1990
1991 free_saved (dtp);
1992 if (c == EOF)
1993 {
1994 free_line (dtp);
1995 hit_eof (dtp);
1996 return;
1997 }
1998 else if (c != '\n')
1999 eat_line (dtp);
2000
2001 snprintf (message, MSGLEN, "Bad real number in item %d of list input",
2002 dtp->u.p.item_count);
2003 free_line (dtp);
2004 generate_error (&dtp->common, LIBERROR_READ_VALUE, message);
2005 }
2006
2007
2008 /* Check the current type against the saved type to make sure they are
2009 compatible. Returns nonzero if incompatible. */
2010
2011 static int
2012 check_type (st_parameter_dt *dtp, bt type, int kind)
2013 {
2014 char message[MSGLEN];
2015
2016 if (dtp->u.p.saved_type != BT_UNKNOWN && dtp->u.p.saved_type != type)
2017 {
2018 snprintf (message, MSGLEN, "Read type %s where %s was expected for item %d",
2019 type_name (dtp->u.p.saved_type), type_name (type),
2020 dtp->u.p.item_count);
2021 free_line (dtp);
2022 generate_error (&dtp->common, LIBERROR_READ_VALUE, message);
2023 return 1;
2024 }
2025
2026 if (dtp->u.p.saved_type == BT_UNKNOWN || dtp->u.p.saved_type == BT_CHARACTER)
2027 return 0;
2028
2029 if ((type != BT_COMPLEX && dtp->u.p.saved_length != kind)
2030 || (type == BT_COMPLEX && dtp->u.p.saved_length != kind*2))
2031 {
2032 snprintf (message, MSGLEN,
2033 "Read kind %d %s where kind %d is required for item %d",
2034 type == BT_COMPLEX ? dtp->u.p.saved_length / 2
2035 : dtp->u.p.saved_length,
2036 type_name (dtp->u.p.saved_type), kind,
2037 dtp->u.p.item_count);
2038 free_line (dtp);
2039 generate_error (&dtp->common, LIBERROR_READ_VALUE, message);
2040 return 1;
2041 }
2042
2043 return 0;
2044 }
2045
2046
2047 /* Initialize the function pointers to select the correct versions of
2048 next_char and push_char depending on what we are doing. */
2049
2050 static void
2051 set_workers (st_parameter_dt *dtp)
2052 {
2053 if (dtp->u.p.current_unit->flags.encoding == ENCODING_UTF8)
2054 {
2055 dtp->u.p.current_unit->next_char_fn_ptr = &next_char_utf8;
2056 dtp->u.p.current_unit->push_char_fn_ptr = &push_char4;
2057 }
2058 else if (is_internal_unit (dtp))
2059 {
2060 dtp->u.p.current_unit->next_char_fn_ptr = &next_char_internal;
2061 dtp->u.p.current_unit->push_char_fn_ptr = &push_char_default;
2062 }
2063 else
2064 {
2065 dtp->u.p.current_unit->next_char_fn_ptr = &next_char_default;
2066 dtp->u.p.current_unit->push_char_fn_ptr = &push_char_default;
2067 }
2068
2069 }
2070
2071 /* Top level data transfer subroutine for list reads. Because we have
2072 to deal with repeat counts, the data item is always saved after
2073 reading, usually in the dtp->u.p.value[] array. If a repeat count is
2074 greater than one, we copy the data item multiple times. */
2075
2076 static int
2077 list_formatted_read_scalar (st_parameter_dt *dtp, bt type, void *p,
2078 int kind, size_t size)
2079 {
2080 gfc_char4_t *q, *r;
2081 int c, i, m;
2082 int err = 0;
2083
2084 dtp->u.p.namelist_mode = 0;
2085
2086 /* Set the next_char and push_char worker functions. */
2087 set_workers (dtp);
2088
2089 if (dtp->u.p.first_item)
2090 {
2091 dtp->u.p.first_item = 0;
2092 dtp->u.p.input_complete = 0;
2093 dtp->u.p.repeat_count = 1;
2094 dtp->u.p.at_eol = 0;
2095
2096 if ((c = eat_spaces (dtp)) == EOF)
2097 {
2098 err = LIBERROR_END;
2099 goto cleanup;
2100 }
2101 if (is_separator (c))
2102 {
2103 /* Found a null value. */
2104 dtp->u.p.repeat_count = 0;
2105 eat_separator (dtp);
2106
2107 /* Set end-of-line flag. */
2108 if (c == '\n' || c == '\r')
2109 {
2110 dtp->u.p.at_eol = 1;
2111 if (finish_separator (dtp) == LIBERROR_END)
2112 {
2113 err = LIBERROR_END;
2114 goto cleanup;
2115 }
2116 }
2117 else
2118 goto cleanup;
2119 }
2120 }
2121 else
2122 {
2123 if (dtp->u.p.repeat_count > 0)
2124 {
2125 if (check_type (dtp, type, kind))
2126 return err;
2127 goto set_value;
2128 }
2129
2130 if (dtp->u.p.input_complete)
2131 goto cleanup;
2132
2133 if (dtp->u.p.at_eol)
2134 finish_separator (dtp);
2135 else
2136 {
2137 eat_spaces (dtp);
2138 /* Trailing spaces prior to end of line. */
2139 if (dtp->u.p.at_eol)
2140 finish_separator (dtp);
2141 }
2142
2143 dtp->u.p.saved_type = BT_UNKNOWN;
2144 dtp->u.p.repeat_count = 1;
2145 }
2146
2147 switch (type)
2148 {
2149 case BT_INTEGER:
2150 read_integer (dtp, kind);
2151 break;
2152 case BT_LOGICAL:
2153 read_logical (dtp, kind);
2154 break;
2155 case BT_CHARACTER:
2156 read_character (dtp, kind);
2157 break;
2158 case BT_REAL:
2159 read_real (dtp, p, kind);
2160 /* Copy value back to temporary if needed. */
2161 if (dtp->u.p.repeat_count > 0)
2162 memcpy (dtp->u.p.value, p, size);
2163 break;
2164 case BT_COMPLEX:
2165 read_complex (dtp, p, kind, size);
2166 /* Copy value back to temporary if needed. */
2167 if (dtp->u.p.repeat_count > 0)
2168 memcpy (dtp->u.p.value, p, size);
2169 break;
2170 case BT_CLASS:
2171 {
2172 int unit = dtp->u.p.current_unit->unit_number;
2173 char iotype[] = "LISTDIRECTED";
2174 gfc_charlen_type iotype_len = 12;
2175 char tmp_iomsg[IOMSG_LEN] = "";
2176 char *child_iomsg;
2177 gfc_charlen_type child_iomsg_len;
2178 int noiostat;
2179 int *child_iostat = NULL;
2180 gfc_array_i4 vlist;
2181
2182 GFC_DESCRIPTOR_DATA(&vlist) = NULL;
2183 GFC_DIMENSION_SET(vlist.dim[0],1, 0, 0);
2184
2185 /* Set iostat, intent(out). */
2186 noiostat = 0;
2187 child_iostat = (dtp->common.flags & IOPARM_HAS_IOSTAT) ?
2188 dtp->common.iostat : &noiostat;
2189
2190 /* Set iomsge, intent(inout). */
2191 if (dtp->common.flags & IOPARM_HAS_IOMSG)
2192 {
2193 child_iomsg = dtp->common.iomsg;
2194 child_iomsg_len = dtp->common.iomsg_len;
2195 }
2196 else
2197 {
2198 child_iomsg = tmp_iomsg;
2199 child_iomsg_len = IOMSG_LEN;
2200 }
2201
2202 /* Call the user defined formatted READ procedure. */
2203 dtp->u.p.current_unit->child_dtio++;
2204 dtp->u.p.fdtio_ptr (p, &unit, iotype, &vlist,
2205 child_iostat, child_iomsg,
2206 iotype_len, child_iomsg_len);
2207 dtp->u.p.current_unit->child_dtio--;
2208 }
2209 break;
2210 default:
2211 internal_error (&dtp->common, "Bad type for list read");
2212 }
2213
2214 if (dtp->u.p.saved_type != BT_CHARACTER && dtp->u.p.saved_type != BT_UNKNOWN)
2215 dtp->u.p.saved_length = size;
2216
2217 if ((dtp->common.flags & IOPARM_LIBRETURN_MASK) != IOPARM_LIBRETURN_OK)
2218 goto cleanup;
2219
2220 set_value:
2221 switch (dtp->u.p.saved_type)
2222 {
2223 case BT_COMPLEX:
2224 case BT_REAL:
2225 if (dtp->u.p.repeat_count > 0)
2226 memcpy (p, dtp->u.p.value, size);
2227 break;
2228
2229 case BT_INTEGER:
2230 case BT_LOGICAL:
2231 memcpy (p, dtp->u.p.value, size);
2232 break;
2233
2234 case BT_CHARACTER:
2235 if (dtp->u.p.saved_string)
2236 {
2237 m = ((int) size < dtp->u.p.saved_used)
2238 ? (int) size : dtp->u.p.saved_used;
2239
2240 q = (gfc_char4_t *) p;
2241 r = (gfc_char4_t *) dtp->u.p.saved_string;
2242 if (dtp->u.p.current_unit->flags.encoding == ENCODING_UTF8)
2243 for (i = 0; i < m; i++)
2244 *q++ = *r++;
2245 else
2246 {
2247 if (kind == 1)
2248 memcpy (p, dtp->u.p.saved_string, m);
2249 else
2250 for (i = 0; i < m; i++)
2251 *q++ = *r++;
2252 }
2253 }
2254 else
2255 /* Just delimiters encountered, nothing to copy but SPACE. */
2256 m = 0;
2257
2258 if (m < (int) size)
2259 {
2260 if (kind == 1)
2261 memset (((char *) p) + m, ' ', size - m);
2262 else
2263 {
2264 q = (gfc_char4_t *) p;
2265 for (i = m; i < (int) size; i++)
2266 q[i] = (unsigned char) ' ';
2267 }
2268 }
2269 break;
2270
2271 case BT_UNKNOWN:
2272 break;
2273
2274 default:
2275 internal_error (&dtp->common, "Bad type for list read");
2276 }
2277
2278 if (--dtp->u.p.repeat_count <= 0)
2279 free_saved (dtp);
2280
2281 cleanup:
2282 if (err == LIBERROR_END)
2283 {
2284 free_line (dtp);
2285 hit_eof (dtp);
2286 }
2287 fbuf_flush_list (dtp->u.p.current_unit, LIST_READING);
2288 return err;
2289 }
2290
2291
2292 void
2293 list_formatted_read (st_parameter_dt *dtp, bt type, void *p, int kind,
2294 size_t size, size_t nelems)
2295 {
2296 size_t elem;
2297 char *tmp;
2298 size_t stride = type == BT_CHARACTER ?
2299 size * GFC_SIZE_OF_CHAR_KIND(kind) : size;
2300 int err;
2301
2302 tmp = (char *) p;
2303
2304 /* Big loop over all the elements. */
2305 for (elem = 0; elem < nelems; elem++)
2306 {
2307 dtp->u.p.item_count++;
2308 err = list_formatted_read_scalar (dtp, type, tmp + stride*elem,
2309 kind, size);
2310 if (err)
2311 break;
2312 }
2313 }
2314
2315
2316 /* Finish a list read. */
2317
2318 void
2319 finish_list_read (st_parameter_dt *dtp)
2320 {
2321 free_saved (dtp);
2322
2323 fbuf_flush (dtp->u.p.current_unit, dtp->u.p.mode);
2324
2325 if (dtp->u.p.at_eol)
2326 {
2327 dtp->u.p.at_eol = 0;
2328 return;
2329 }
2330
2331 if (!is_internal_unit (dtp))
2332 {
2333 int c;
2334
2335 /* Set the next_char and push_char worker functions. */
2336 set_workers (dtp);
2337
2338 c = next_char (dtp);
2339 if (c == EOF)
2340 {
2341 free_line (dtp);
2342 hit_eof (dtp);
2343 return;
2344 }
2345 if (c != '\n')
2346 eat_line (dtp);
2347 }
2348
2349 free_line (dtp);
2350
2351 }
2352
2353 /* NAMELIST INPUT
2354
2355 void namelist_read (st_parameter_dt *dtp)
2356 calls:
2357 static void nml_match_name (char *name, int len)
2358 static int nml_query (st_parameter_dt *dtp)
2359 static int nml_get_obj_data (st_parameter_dt *dtp,
2360 namelist_info **prev_nl, char *, size_t)
2361 calls:
2362 static void nml_untouch_nodes (st_parameter_dt *dtp)
2363 static namelist_info * find_nml_node (st_parameter_dt *dtp,
2364 char * var_name)
2365 static int nml_parse_qualifier(descriptor_dimension * ad,
2366 array_loop_spec * ls, int rank, char *)
2367 static void nml_touch_nodes (namelist_info * nl)
2368 static int nml_read_obj (namelist_info *nl, index_type offset,
2369 namelist_info **prev_nl, char *, size_t,
2370 index_type clow, index_type chigh)
2371 calls:
2372 -itself- */
2373
2374 /* Inputs a rank-dimensional qualifier, which can contain
2375 singlets, doublets, triplets or ':' with the standard meanings. */
2376
2377 static bool
2378 nml_parse_qualifier (st_parameter_dt *dtp, descriptor_dimension *ad,
2379 array_loop_spec *ls, int rank, bt nml_elem_type,
2380 char *parse_err_msg, size_t parse_err_msg_size,
2381 int *parsed_rank)
2382 {
2383 int dim;
2384 int indx;
2385 int neg;
2386 int null_flag;
2387 int is_array_section, is_char;
2388 int c;
2389
2390 is_char = 0;
2391 is_array_section = 0;
2392 dtp->u.p.expanded_read = 0;
2393
2394 /* See if this is a character substring qualifier we are looking for. */
2395 if (rank == -1)
2396 {
2397 rank = 1;
2398 is_char = 1;
2399 }
2400
2401 /* The next character in the stream should be the '('. */
2402
2403 if ((c = next_char (dtp)) == EOF)
2404 goto err_ret;
2405
2406 /* Process the qualifier, by dimension and triplet. */
2407
2408 for (dim=0; dim < rank; dim++ )
2409 {
2410 for (indx=0; indx<3; indx++)
2411 {
2412 free_saved (dtp);
2413 eat_spaces (dtp);
2414 neg = 0;
2415
2416 /* Process a potential sign. */
2417 if ((c = next_char (dtp)) == EOF)
2418 goto err_ret;
2419 switch (c)
2420 {
2421 case '-':
2422 neg = 1;
2423 break;
2424
2425 case '+':
2426 break;
2427
2428 default:
2429 unget_char (dtp, c);
2430 break;
2431 }
2432
2433 /* Process characters up to the next ':' , ',' or ')'. */
2434 for (;;)
2435 {
2436 c = next_char (dtp);
2437 switch (c)
2438 {
2439 case EOF:
2440 goto err_ret;
2441
2442 case ':':
2443 is_array_section = 1;
2444 break;
2445
2446 case ',': case ')':
2447 if ((c==',' && dim == rank -1)
2448 || (c==')' && dim < rank -1))
2449 {
2450 if (is_char)
2451 snprintf (parse_err_msg, parse_err_msg_size,
2452 "Bad substring qualifier");
2453 else
2454 snprintf (parse_err_msg, parse_err_msg_size,
2455 "Bad number of index fields");
2456 goto err_ret;
2457 }
2458 break;
2459
2460 CASE_DIGITS:
2461 push_char (dtp, c);
2462 continue;
2463
2464 case ' ': case '\t': case '\r': case '\n':
2465 eat_spaces (dtp);
2466 break;
2467
2468 default:
2469 if (is_char)
2470 snprintf (parse_err_msg, parse_err_msg_size,
2471 "Bad character in substring qualifier");
2472 else
2473 snprintf (parse_err_msg, parse_err_msg_size,
2474 "Bad character in index");
2475 goto err_ret;
2476 }
2477
2478 if ((c == ',' || c == ')') && indx == 0
2479 && dtp->u.p.saved_string == 0)
2480 {
2481 if (is_char)
2482 snprintf (parse_err_msg, parse_err_msg_size,
2483 "Null substring qualifier");
2484 else
2485 snprintf (parse_err_msg, parse_err_msg_size,
2486 "Null index field");
2487 goto err_ret;
2488 }
2489
2490 if ((c == ':' && indx == 1 && dtp->u.p.saved_string == 0)
2491 || (indx == 2 && dtp->u.p.saved_string == 0))
2492 {
2493 if (is_char)
2494 snprintf (parse_err_msg, parse_err_msg_size,
2495 "Bad substring qualifier");
2496 else
2497 snprintf (parse_err_msg, parse_err_msg_size,
2498 "Bad index triplet");
2499 goto err_ret;
2500 }
2501
2502 if (is_char && !is_array_section)
2503 {
2504 snprintf (parse_err_msg, parse_err_msg_size,
2505 "Missing colon in substring qualifier");
2506 goto err_ret;
2507 }
2508
2509 /* If '( : ? )' or '( ? : )' break and flag read failure. */
2510 null_flag = 0;
2511 if ((c == ':' && indx == 0 && dtp->u.p.saved_string == 0)
2512 || (indx==1 && dtp->u.p.saved_string == 0))
2513 {
2514 null_flag = 1;
2515 break;
2516 }
2517
2518 /* Now read the index. */
2519 if (convert_integer (dtp, sizeof(index_type), neg))
2520 {
2521 if (is_char)
2522 snprintf (parse_err_msg, parse_err_msg_size,
2523 "Bad integer substring qualifier");
2524 else
2525 snprintf (parse_err_msg, parse_err_msg_size,
2526 "Bad integer in index");
2527 goto err_ret;
2528 }
2529 break;
2530 }
2531
2532 /* Feed the index values to the triplet arrays. */
2533 if (!null_flag)
2534 {
2535 if (indx == 0)
2536 memcpy (&ls[dim].start, dtp->u.p.value, sizeof(index_type));
2537 if (indx == 1)
2538 memcpy (&ls[dim].end, dtp->u.p.value, sizeof(index_type));
2539 if (indx == 2)
2540 memcpy (&ls[dim].step, dtp->u.p.value, sizeof(index_type));
2541 }
2542
2543 /* Singlet or doublet indices. */
2544 if (c==',' || c==')')
2545 {
2546 if (indx == 0)
2547 {
2548 memcpy (&ls[dim].start, dtp->u.p.value, sizeof(index_type));
2549
2550 /* If -std=f95/2003 or an array section is specified,
2551 do not allow excess data to be processed. */
2552 if (is_array_section == 1
2553 || !(compile_options.allow_std & GFC_STD_GNU)
2554 || nml_elem_type == BT_DERIVED)
2555 ls[dim].end = ls[dim].start;
2556 else
2557 dtp->u.p.expanded_read = 1;
2558 }
2559
2560 /* Check for non-zero rank. */
2561 if (is_array_section == 1 && ls[dim].start != ls[dim].end)
2562 *parsed_rank = 1;
2563
2564 break;
2565 }
2566 }
2567
2568 if (is_array_section == 1 && dtp->u.p.expanded_read == 1)
2569 {
2570 int i;
2571 dtp->u.p.expanded_read = 0;
2572 for (i = 0; i < dim; i++)
2573 ls[i].end = ls[i].start;
2574 }
2575
2576 /* Check the values of the triplet indices. */
2577 if ((ls[dim].start > GFC_DIMENSION_UBOUND(ad[dim]))
2578 || (ls[dim].start < GFC_DIMENSION_LBOUND(ad[dim]))
2579 || (ls[dim].end > GFC_DIMENSION_UBOUND(ad[dim]))
2580 || (ls[dim].end < GFC_DIMENSION_LBOUND(ad[dim])))
2581 {
2582 if (is_char)
2583 snprintf (parse_err_msg, parse_err_msg_size,
2584 "Substring out of range");
2585 else
2586 snprintf (parse_err_msg, parse_err_msg_size,
2587 "Index %d out of range", dim + 1);
2588 goto err_ret;
2589 }
2590
2591 if (((ls[dim].end - ls[dim].start ) * ls[dim].step < 0)
2592 || (ls[dim].step == 0))
2593 {
2594 snprintf (parse_err_msg, parse_err_msg_size,
2595 "Bad range in index %d", dim + 1);
2596 goto err_ret;
2597 }
2598
2599 /* Initialise the loop index counter. */
2600 ls[dim].idx = ls[dim].start;
2601 }
2602 eat_spaces (dtp);
2603 return true;
2604
2605 err_ret:
2606
2607 /* The EOF error message is issued by hit_eof. Return true so that the
2608 caller does not use parse_err_msg and parse_err_msg_size to generate
2609 an unrelated error message. */
2610 if (c == EOF)
2611 {
2612 hit_eof (dtp);
2613 dtp->u.p.input_complete = 1;
2614 return true;
2615 }
2616 return false;
2617 }
2618
2619
2620 static bool
2621 extended_look_ahead (char *p, char *q)
2622 {
2623 char *r, *s;
2624
2625 /* Scan ahead to find a '%' in the p string. */
2626 for(r = p, s = q; *r && *s; s++)
2627 if ((*s == '%' || *s == '+') && strcmp (r + 1, s + 1) == 0)
2628 return true;
2629 return false;
2630 }
2631
2632
2633 static bool
2634 strcmp_extended_type (char *p, char *q)
2635 {
2636 char *r, *s;
2637
2638 for (r = p, s = q; *r && *s; r++, s++)
2639 {
2640 if (*r != *s)
2641 {
2642 if (*r == '%' && *s == '+' && extended_look_ahead (r, s))
2643 return true;
2644 break;
2645 }
2646 }
2647 return false;
2648 }
2649
2650
2651 static namelist_info *
2652 find_nml_node (st_parameter_dt *dtp, char * var_name)
2653 {
2654 namelist_info * t = dtp->u.p.ionml;
2655 while (t != NULL)
2656 {
2657 if (strcmp (var_name, t->var_name) == 0)
2658 {
2659 t->touched = 1;
2660 return t;
2661 }
2662 if (strcmp_extended_type (var_name, t->var_name))
2663 {
2664 t->touched = 1;
2665 return t;
2666 }
2667 t = t->next;
2668 }
2669 return NULL;
2670 }
2671
2672 /* Visits all the components of a derived type that have
2673 not explicitly been identified in the namelist input.
2674 touched is set and the loop specification initialised
2675 to default values */
2676
2677 static void
2678 nml_touch_nodes (namelist_info * nl)
2679 {
2680 index_type len = strlen (nl->var_name) + 1;
2681 int dim;
2682 char * ext_name = xmalloc (len + 1);
2683 memcpy (ext_name, nl->var_name, len-1);
2684 memcpy (ext_name + len - 1, "%", 2);
2685 for (nl = nl->next; nl; nl = nl->next)
2686 {
2687 if (strncmp (nl->var_name, ext_name, len) == 0)
2688 {
2689 nl->touched = 1;
2690 for (dim=0; dim < nl->var_rank; dim++)
2691 {
2692 nl->ls[dim].step = 1;
2693 nl->ls[dim].end = GFC_DESCRIPTOR_UBOUND(nl,dim);
2694 nl->ls[dim].start = GFC_DESCRIPTOR_LBOUND(nl,dim);
2695 nl->ls[dim].idx = nl->ls[dim].start;
2696 }
2697 }
2698 else
2699 break;
2700 }
2701 free (ext_name);
2702 return;
2703 }
2704
2705 /* Resets touched for the entire list of nml_nodes, ready for a
2706 new object. */
2707
2708 static void
2709 nml_untouch_nodes (st_parameter_dt *dtp)
2710 {
2711 namelist_info * t;
2712 for (t = dtp->u.p.ionml; t; t = t->next)
2713 t->touched = 0;
2714 return;
2715 }
2716
2717 /* Attempts to input name to namelist name. Returns
2718 dtp->u.p.nml_read_error = 1 on no match. */
2719
2720 static void
2721 nml_match_name (st_parameter_dt *dtp, const char *name, index_type len)
2722 {
2723 index_type i;
2724 int c;
2725
2726 dtp->u.p.nml_read_error = 0;
2727 for (i = 0; i < len; i++)
2728 {
2729 c = next_char (dtp);
2730 if (c == EOF || (tolower (c) != tolower (name[i])))
2731 {
2732 dtp->u.p.nml_read_error = 1;
2733 break;
2734 }
2735 }
2736 }
2737
2738 /* If the namelist read is from stdin, output the current state of the
2739 namelist to stdout. This is used to implement the non-standard query
2740 features, ? and =?. If c == '=' the full namelist is printed. Otherwise
2741 the names alone are printed. */
2742
2743 static void
2744 nml_query (st_parameter_dt *dtp, char c)
2745 {
2746 gfc_unit * temp_unit;
2747 namelist_info * nl;
2748 index_type len;
2749 char * p;
2750 #ifdef HAVE_CRLF
2751 static const index_type endlen = 2;
2752 static const char endl[] = "\r\n";
2753 static const char nmlend[] = "&end\r\n";
2754 #else
2755 static const index_type endlen = 1;
2756 static const char endl[] = "\n";
2757 static const char nmlend[] = "&end\n";
2758 #endif
2759
2760 if (dtp->u.p.current_unit->unit_number != options.stdin_unit)
2761 return;
2762
2763 /* Store the current unit and transfer to stdout. */
2764
2765 temp_unit = dtp->u.p.current_unit;
2766 dtp->u.p.current_unit = find_unit (options.stdout_unit);
2767
2768 if (dtp->u.p.current_unit)
2769 {
2770 dtp->u.p.mode = WRITING;
2771 next_record (dtp, 0);
2772
2773 /* Write the namelist in its entirety. */
2774
2775 if (c == '=')
2776 namelist_write (dtp);
2777
2778 /* Or write the list of names. */
2779
2780 else
2781 {
2782 /* "&namelist_name\n" */
2783
2784 len = dtp->namelist_name_len;
2785 p = write_block (dtp, len - 1 + endlen);
2786 if (!p)
2787 goto query_return;
2788 memcpy (p, "&", 1);
2789 memcpy ((char*)(p + 1), dtp->namelist_name, len);
2790 memcpy ((char*)(p + len + 1), &endl, endlen);
2791 for (nl = dtp->u.p.ionml; nl; nl = nl->next)
2792 {
2793 /* " var_name\n" */
2794
2795 len = strlen (nl->var_name);
2796 p = write_block (dtp, len + endlen);
2797 if (!p)
2798 goto query_return;
2799 memcpy (p, " ", 1);
2800 memcpy ((char*)(p + 1), nl->var_name, len);
2801 memcpy ((char*)(p + len + 1), &endl, endlen);
2802 }
2803
2804 /* "&end\n" */
2805
2806 p = write_block (dtp, endlen + 4);
2807 if (!p)
2808 goto query_return;
2809 memcpy (p, &nmlend, endlen + 4);
2810 }
2811
2812 /* Flush the stream to force immediate output. */
2813
2814 fbuf_flush (dtp->u.p.current_unit, WRITING);
2815 sflush (dtp->u.p.current_unit->s);
2816 unlock_unit (dtp->u.p.current_unit);
2817 }
2818
2819 query_return:
2820
2821 /* Restore the current unit. */
2822
2823 dtp->u.p.current_unit = temp_unit;
2824 dtp->u.p.mode = READING;
2825 return;
2826 }
2827
2828 /* Reads and stores the input for the namelist object nl. For an array,
2829 the function loops over the ranges defined by the loop specification.
2830 This default to all the data or to the specification from a qualifier.
2831 nml_read_obj recursively calls itself to read derived types. It visits
2832 all its own components but only reads data for those that were touched
2833 when the name was parsed. If a read error is encountered, an attempt is
2834 made to return to read a new object name because the standard allows too
2835 little data to be available. On the other hand, too much data is an
2836 error. */
2837
2838 static bool
2839 nml_read_obj (st_parameter_dt *dtp, namelist_info * nl, index_type offset,
2840 namelist_info **pprev_nl, char *nml_err_msg,
2841 size_t nml_err_msg_size, index_type clow, index_type chigh)
2842 {
2843 namelist_info * cmp;
2844 char * obj_name;
2845 int nml_carry;
2846 int len;
2847 int dim;
2848 index_type dlen;
2849 index_type m;
2850 size_t obj_name_len;
2851 void * pdata;
2852
2853 /* If we have encountered a previous read error or this object has not been
2854 touched in name parsing, just return. */
2855 if (dtp->u.p.nml_read_error || !nl->touched)
2856 return true;
2857
2858 dtp->u.p.item_count++; /* Used in error messages. */
2859 dtp->u.p.repeat_count = 0;
2860 eat_spaces (dtp);
2861
2862 len = nl->len;
2863 switch (nl->type)
2864 {
2865 case BT_INTEGER:
2866 case BT_LOGICAL:
2867 dlen = len;
2868 break;
2869
2870 case BT_REAL:
2871 dlen = size_from_real_kind (len);
2872 break;
2873
2874 case BT_COMPLEX:
2875 dlen = size_from_complex_kind (len);
2876 break;
2877
2878 case BT_CHARACTER:
2879 dlen = chigh ? (chigh - clow + 1) : nl->string_length;
2880 break;
2881
2882 default:
2883 dlen = 0;
2884 }
2885
2886 do
2887 {
2888 /* Update the pointer to the data, using the current index vector */
2889
2890 pdata = (void*)(nl->mem_pos + offset);
2891 for (dim = 0; dim < nl->var_rank; dim++)
2892 pdata = (void*)(pdata + (nl->ls[dim].idx
2893 - GFC_DESCRIPTOR_LBOUND(nl,dim))
2894 * GFC_DESCRIPTOR_STRIDE(nl,dim) * nl->size);
2895
2896 /* If we are finished with the repeat count, try to read next value. */
2897
2898 nml_carry = 0;
2899 if (--dtp->u.p.repeat_count <= 0)
2900 {
2901 if (dtp->u.p.input_complete)
2902 return true;
2903 if (dtp->u.p.at_eol)
2904 finish_separator (dtp);
2905 if (dtp->u.p.input_complete)
2906 return true;
2907
2908 dtp->u.p.saved_type = BT_UNKNOWN;
2909 free_saved (dtp);
2910
2911 switch (nl->type)
2912 {
2913 case BT_INTEGER:
2914 read_integer (dtp, len);
2915 break;
2916
2917 case BT_LOGICAL:
2918 read_logical (dtp, len);
2919 break;
2920
2921 case BT_CHARACTER:
2922 read_character (dtp, len);
2923 break;
2924
2925 case BT_REAL:
2926 /* Need to copy data back from the real location to the temp in
2927 order to handle nml reads into arrays. */
2928 read_real (dtp, pdata, len);
2929 memcpy (dtp->u.p.value, pdata, dlen);
2930 break;
2931
2932 case BT_COMPLEX:
2933 /* Same as for REAL, copy back to temp. */
2934 read_complex (dtp, pdata, len, dlen);
2935 memcpy (dtp->u.p.value, pdata, dlen);
2936 break;
2937
2938 case BT_DERIVED:
2939 obj_name_len = strlen (nl->var_name) + 1;
2940 obj_name = xmalloc (obj_name_len+1);
2941 memcpy (obj_name, nl->var_name, obj_name_len-1);
2942 memcpy (obj_name + obj_name_len - 1, "%", 2);
2943
2944 /* If reading a derived type, disable the expanded read warning
2945 since a single object can have multiple reads. */
2946 dtp->u.p.expanded_read = 0;
2947
2948 /* Now loop over the components. */
2949
2950 for (cmp = nl->next;
2951 cmp &&
2952 !strncmp (cmp->var_name, obj_name, obj_name_len);
2953 cmp = cmp->next)
2954 {
2955 /* Jump over nested derived type by testing if the potential
2956 component name contains '%'. */
2957 if (strchr (cmp->var_name + obj_name_len, '%'))
2958 continue;
2959
2960 if (!nml_read_obj (dtp, cmp, (index_type)(pdata - nl->mem_pos),
2961 pprev_nl, nml_err_msg, nml_err_msg_size,
2962 clow, chigh))
2963 {
2964 free (obj_name);
2965 return false;
2966 }
2967
2968 if (dtp->u.p.input_complete)
2969 {
2970 free (obj_name);
2971 return true;
2972 }
2973 }
2974
2975 free (obj_name);
2976 goto incr_idx;
2977
2978 default:
2979 snprintf (nml_err_msg, nml_err_msg_size,
2980 "Bad type for namelist object %s", nl->var_name);
2981 internal_error (&dtp->common, nml_err_msg);
2982 goto nml_err_ret;
2983 }
2984 }
2985
2986 /* The standard permits array data to stop short of the number of
2987 elements specified in the loop specification. In this case, we
2988 should be here with dtp->u.p.nml_read_error != 0. Control returns to
2989 nml_get_obj_data and an attempt is made to read object name. */
2990
2991 *pprev_nl = nl;
2992 if (dtp->u.p.nml_read_error)
2993 {
2994 dtp->u.p.expanded_read = 0;
2995 return true;
2996 }
2997
2998 if (dtp->u.p.saved_type == BT_UNKNOWN)
2999 {
3000 dtp->u.p.expanded_read = 0;
3001 goto incr_idx;
3002 }
3003
3004 switch (dtp->u.p.saved_type)
3005 {
3006
3007 case BT_COMPLEX:
3008 case BT_REAL:
3009 case BT_INTEGER:
3010 case BT_LOGICAL:
3011 memcpy (pdata, dtp->u.p.value, dlen);
3012 break;
3013
3014 case BT_CHARACTER:
3015 if (dlen < dtp->u.p.saved_used)
3016 {
3017 if (compile_options.bounds_check)
3018 {
3019 snprintf (nml_err_msg, nml_err_msg_size,
3020 "Namelist object '%s' truncated on read.",
3021 nl->var_name);
3022 generate_warning (&dtp->common, nml_err_msg);
3023 }
3024 m = dlen;
3025 }
3026 else
3027 m = dtp->u.p.saved_used;
3028
3029 if (dtp->u.p.current_unit->flags.encoding == ENCODING_UTF8)
3030 {
3031 gfc_char4_t *q4, *p4 = pdata;
3032 int i;
3033
3034 q4 = (gfc_char4_t *) dtp->u.p.saved_string;
3035 p4 += clow -1;
3036 for (i = 0; i < m; i++)
3037 *p4++ = *q4++;
3038 if (m < dlen)
3039 for (i = 0; i < dlen - m; i++)
3040 *p4++ = (gfc_char4_t) ' ';
3041 }
3042 else
3043 {
3044 pdata = (void*)( pdata + clow - 1 );
3045 memcpy (pdata, dtp->u.p.saved_string, m);
3046 if (m < dlen)
3047 memset ((void*)( pdata + m ), ' ', dlen - m);
3048 }
3049 break;
3050
3051 default:
3052 break;
3053 }
3054
3055 /* Warn if a non-standard expanded read occurs. A single read of a
3056 single object is acceptable. If a second read occurs, issue a warning
3057 and set the flag to zero to prevent further warnings. */
3058 if (dtp->u.p.expanded_read == 2)
3059 {
3060 notify_std (&dtp->common, GFC_STD_GNU, "Non-standard expanded namelist read.");
3061 dtp->u.p.expanded_read = 0;
3062 }
3063
3064 /* If the expanded read warning flag is set, increment it,
3065 indicating that a single read has occurred. */
3066 if (dtp->u.p.expanded_read >= 1)
3067 dtp->u.p.expanded_read++;
3068
3069 /* Break out of loop if scalar. */
3070 if (!nl->var_rank)
3071 break;
3072
3073 /* Now increment the index vector. */
3074
3075 incr_idx:
3076
3077 nml_carry = 1;
3078 for (dim = 0; dim < nl->var_rank; dim++)
3079 {
3080 nl->ls[dim].idx += nml_carry * nl->ls[dim].step;
3081 nml_carry = 0;
3082 if (((nl->ls[dim].step > 0) && (nl->ls[dim].idx > nl->ls[dim].end))
3083 ||
3084 ((nl->ls[dim].step < 0) && (nl->ls[dim].idx < nl->ls[dim].end)))
3085 {
3086 nl->ls[dim].idx = nl->ls[dim].start;
3087 nml_carry = 1;
3088 }
3089 }
3090 } while (!nml_carry);
3091
3092 if (dtp->u.p.repeat_count > 1)
3093 {
3094 snprintf (nml_err_msg, nml_err_msg_size,
3095 "Repeat count too large for namelist object %s", nl->var_name);
3096 goto nml_err_ret;
3097 }
3098 return true;
3099
3100 nml_err_ret:
3101
3102 return false;
3103 }
3104
3105 /* Parses the object name, including array and substring qualifiers. It
3106 iterates over derived type components, touching those components and
3107 setting their loop specifications, if there is a qualifier. If the
3108 object is itself a derived type, its components and subcomponents are
3109 touched. nml_read_obj is called at the end and this reads the data in
3110 the manner specified by the object name. */
3111
3112 static bool
3113 nml_get_obj_data (st_parameter_dt *dtp, namelist_info **pprev_nl,
3114 char *nml_err_msg, size_t nml_err_msg_size)
3115 {
3116 int c;
3117 namelist_info * nl;
3118 namelist_info * first_nl = NULL;
3119 namelist_info * root_nl = NULL;
3120 int dim, parsed_rank;
3121 int component_flag, qualifier_flag;
3122 index_type clow, chigh;
3123 int non_zero_rank_count;
3124
3125 /* Look for end of input or object name. If '?' or '=?' are encountered
3126 in stdin, print the node names or the namelist to stdout. */
3127
3128 eat_separator (dtp);
3129 if (dtp->u.p.input_complete)
3130 return true;
3131
3132 if (dtp->u.p.at_eol)
3133 finish_separator (dtp);
3134 if (dtp->u.p.input_complete)
3135 return true;
3136
3137 if ((c = next_char (dtp)) == EOF)
3138 goto nml_err_ret;
3139 switch (c)
3140 {
3141 case '=':
3142 if ((c = next_char (dtp)) == EOF)
3143 goto nml_err_ret;
3144 if (c != '?')
3145 {
3146 snprintf (nml_err_msg, nml_err_msg_size,
3147 "namelist read: misplaced = sign");
3148 goto nml_err_ret;
3149 }
3150 nml_query (dtp, '=');
3151 return true;
3152
3153 case '?':
3154 nml_query (dtp, '?');
3155 return true;
3156
3157 case '$':
3158 case '&':
3159 nml_match_name (dtp, "end", 3);
3160 if (dtp->u.p.nml_read_error)
3161 {
3162 snprintf (nml_err_msg, nml_err_msg_size,
3163 "namelist not terminated with / or &end");
3164 goto nml_err_ret;
3165 }
3166 /* Fall through. */
3167 case '/':
3168 dtp->u.p.input_complete = 1;
3169 return true;
3170
3171 default :
3172 break;
3173 }
3174
3175 /* Untouch all nodes of the namelist and reset the flags that are set for
3176 derived type components. */
3177
3178 nml_untouch_nodes (dtp);
3179 component_flag = 0;
3180 qualifier_flag = 0;
3181 non_zero_rank_count = 0;
3182
3183 /* Get the object name - should '!' and '\n' be permitted separators? */
3184
3185 get_name:
3186
3187 free_saved (dtp);
3188
3189 do
3190 {
3191 if (!is_separator (c))
3192 push_char_default (dtp, tolower(c));
3193 if ((c = next_char (dtp)) == EOF)
3194 goto nml_err_ret;
3195 }
3196 while (!( c=='=' || c==' ' || c=='\t' || c =='(' || c =='%' ));
3197
3198 unget_char (dtp, c);
3199
3200 /* Check that the name is in the namelist and get pointer to object.
3201 Three error conditions exist: (i) An attempt is being made to
3202 identify a non-existent object, following a failed data read or
3203 (ii) The object name does not exist or (iii) Too many data items
3204 are present for an object. (iii) gives the same error message
3205 as (i) */
3206
3207 push_char_default (dtp, '\0');
3208
3209 if (component_flag)
3210 {
3211 #define EXT_STACK_SZ 100
3212 char ext_stack[EXT_STACK_SZ];
3213 char *ext_name;
3214 size_t var_len = strlen (root_nl->var_name);
3215 size_t saved_len
3216 = dtp->u.p.saved_string ? strlen (dtp->u.p.saved_string) : 0;
3217 size_t ext_size = var_len + saved_len + 1;
3218
3219 if (ext_size > EXT_STACK_SZ)
3220 ext_name = xmalloc (ext_size);
3221 else
3222 ext_name = ext_stack;
3223
3224 memcpy (ext_name, root_nl->var_name, var_len);
3225 if (dtp->u.p.saved_string)
3226 memcpy (ext_name + var_len, dtp->u.p.saved_string, saved_len);
3227 ext_name[var_len + saved_len] = '\0';
3228 nl = find_nml_node (dtp, ext_name);
3229
3230 if (ext_size > EXT_STACK_SZ)
3231 free (ext_name);
3232 }
3233 else
3234 nl = find_nml_node (dtp, dtp->u.p.saved_string);
3235
3236 if (nl == NULL)
3237 {
3238 if (dtp->u.p.nml_read_error && *pprev_nl)
3239 snprintf (nml_err_msg, nml_err_msg_size,
3240 "Bad data for namelist object %s", (*pprev_nl)->var_name);
3241
3242 else
3243 snprintf (nml_err_msg, nml_err_msg_size,
3244 "Cannot match namelist object name %s",
3245 dtp->u.p.saved_string);
3246
3247 goto nml_err_ret;
3248 }
3249 else if (nl->dtio_sub != NULL)
3250 {
3251 int unit = dtp->u.p.current_unit->unit_number;
3252 char iotype[] = "NAMELIST";
3253 gfc_charlen_type iotype_len = 8;
3254 char tmp_iomsg[IOMSG_LEN] = "";
3255 char *child_iomsg;
3256 gfc_charlen_type child_iomsg_len;
3257 int noiostat;
3258 int *child_iostat = NULL;
3259 gfc_array_i4 vlist;
3260 gfc_class list_obj;
3261 formatted_dtio dtio_ptr = (formatted_dtio)nl->dtio_sub;
3262
3263 GFC_DESCRIPTOR_DATA(&vlist) = NULL;
3264 GFC_DIMENSION_SET(vlist.dim[0],1, 0, 0);
3265
3266 list_obj.data = (void *)nl->mem_pos;
3267 list_obj.vptr = nl->vtable;
3268 list_obj.len = 0;
3269
3270 /* Set iostat, intent(out). */
3271 noiostat = 0;
3272 child_iostat = (dtp->common.flags & IOPARM_HAS_IOSTAT) ?
3273 dtp->common.iostat : &noiostat;
3274
3275 /* Set iomsg, intent(inout). */
3276 if (dtp->common.flags & IOPARM_HAS_IOMSG)
3277 {
3278 child_iomsg = dtp->common.iomsg;
3279 child_iomsg_len = dtp->common.iomsg_len;
3280 }
3281 else
3282 {
3283 child_iomsg = tmp_iomsg;
3284 child_iomsg_len = IOMSG_LEN;
3285 }
3286
3287 /* Call the user defined formatted READ procedure. */
3288 dtp->u.p.current_unit->child_dtio++;
3289 dtio_ptr ((void *)&list_obj, &unit, iotype, &vlist,
3290 child_iostat, child_iomsg,
3291 iotype_len, child_iomsg_len);
3292 dtp->u.p.current_unit->child_dtio--;
3293
3294 return true;
3295 }
3296
3297 /* Get the length, data length, base pointer and rank of the variable.
3298 Set the default loop specification first. */
3299
3300 for (dim=0; dim < nl->var_rank; dim++)
3301 {
3302 nl->ls[dim].step = 1;
3303 nl->ls[dim].end = GFC_DESCRIPTOR_UBOUND(nl,dim);
3304 nl->ls[dim].start = GFC_DESCRIPTOR_LBOUND(nl,dim);
3305 nl->ls[dim].idx = nl->ls[dim].start;
3306 }
3307
3308 /* Check to see if there is a qualifier: if so, parse it.*/
3309
3310 if (c == '(' && nl->var_rank)
3311 {
3312 parsed_rank = 0;
3313 if (!nml_parse_qualifier (dtp, nl->dim, nl->ls, nl->var_rank,
3314 nl->type, nml_err_msg, nml_err_msg_size,
3315 &parsed_rank))
3316 {
3317 char *nml_err_msg_end = strchr (nml_err_msg, '\0');
3318 snprintf (nml_err_msg_end,
3319 nml_err_msg_size - (nml_err_msg_end - nml_err_msg),
3320 " for namelist variable %s", nl->var_name);
3321 goto nml_err_ret;
3322 }
3323 if (parsed_rank > 0)
3324 non_zero_rank_count++;
3325
3326 qualifier_flag = 1;
3327
3328 if ((c = next_char (dtp)) == EOF)
3329 goto nml_err_ret;
3330 unget_char (dtp, c);
3331 }
3332 else if (nl->var_rank > 0)
3333 non_zero_rank_count++;
3334
3335 /* Now parse a derived type component. The root namelist_info address
3336 is backed up, as is the previous component level. The component flag
3337 is set and the iteration is made by jumping back to get_name. */
3338
3339 if (c == '%')
3340 {
3341 if (nl->type != BT_DERIVED)
3342 {
3343 snprintf (nml_err_msg, nml_err_msg_size,
3344 "Attempt to get derived component for %s", nl->var_name);
3345 goto nml_err_ret;
3346 }
3347
3348 /* Don't move first_nl further in the list if a qualifier was found. */
3349 if ((*pprev_nl == NULL && !qualifier_flag) || !component_flag)
3350 first_nl = nl;
3351
3352 root_nl = nl;
3353
3354 component_flag = 1;
3355 if ((c = next_char (dtp)) == EOF)
3356 goto nml_err_ret;
3357 goto get_name;
3358 }
3359
3360 /* Parse a character qualifier, if present. chigh = 0 is a default
3361 that signals that the string length = string_length. */
3362
3363 clow = 1;
3364 chigh = 0;
3365
3366 if (c == '(' && nl->type == BT_CHARACTER)
3367 {
3368 descriptor_dimension chd[1] = { {1, clow, nl->string_length} };
3369 array_loop_spec ind[1] = { {1, clow, nl->string_length, 1} };
3370
3371 if (!nml_parse_qualifier (dtp, chd, ind, -1, nl->type,
3372 nml_err_msg, nml_err_msg_size, &parsed_rank))
3373 {
3374 char *nml_err_msg_end = strchr (nml_err_msg, '\0');
3375 snprintf (nml_err_msg_end,
3376 nml_err_msg_size - (nml_err_msg_end - nml_err_msg),
3377 " for namelist variable %s", nl->var_name);
3378 goto nml_err_ret;
3379 }
3380
3381 clow = ind[0].start;
3382 chigh = ind[0].end;
3383
3384 if (ind[0].step != 1)
3385 {
3386 snprintf (nml_err_msg, nml_err_msg_size,
3387 "Step not allowed in substring qualifier"
3388 " for namelist object %s", nl->var_name);
3389 goto nml_err_ret;
3390 }
3391
3392 if ((c = next_char (dtp)) == EOF)
3393 goto nml_err_ret;
3394 unget_char (dtp, c);
3395 }
3396
3397 /* Make sure no extraneous qualifiers are there. */
3398
3399 if (c == '(')
3400 {
3401 snprintf (nml_err_msg, nml_err_msg_size,
3402 "Qualifier for a scalar or non-character namelist object %s",
3403 nl->var_name);
3404 goto nml_err_ret;
3405 }
3406
3407 /* Make sure there is no more than one non-zero rank object. */
3408 if (non_zero_rank_count > 1)
3409 {
3410 snprintf (nml_err_msg, nml_err_msg_size,
3411 "Multiple sub-objects with non-zero rank in namelist object %s",
3412 nl->var_name);
3413 non_zero_rank_count = 0;
3414 goto nml_err_ret;
3415 }
3416
3417 /* According to the standard, an equal sign MUST follow an object name. The
3418 following is possibly lax - it allows comments, blank lines and so on to
3419 intervene. eat_spaces (dtp); c = next_char (dtp); would be compliant*/
3420
3421 free_saved (dtp);
3422
3423 eat_separator (dtp);
3424 if (dtp->u.p.input_complete)
3425 return true;
3426
3427 if (dtp->u.p.at_eol)
3428 finish_separator (dtp);
3429 if (dtp->u.p.input_complete)
3430 return true;
3431
3432 if ((c = next_char (dtp)) == EOF)
3433 goto nml_err_ret;
3434
3435 if (c != '=')
3436 {
3437 snprintf (nml_err_msg, nml_err_msg_size,
3438 "Equal sign must follow namelist object name %s",
3439 nl->var_name);
3440 goto nml_err_ret;
3441 }
3442 /* If a derived type, touch its components and restore the root
3443 namelist_info if we have parsed a qualified derived type
3444 component. */
3445
3446 if (nl->type == BT_DERIVED)
3447 nml_touch_nodes (nl);
3448
3449 if (first_nl)
3450 {
3451 if (first_nl->var_rank == 0)
3452 {
3453 if (component_flag && qualifier_flag)
3454 nl = first_nl;
3455 }
3456 else
3457 nl = first_nl;
3458 }
3459
3460 dtp->u.p.nml_read_error = 0;
3461 if (!nml_read_obj (dtp, nl, 0, pprev_nl, nml_err_msg, nml_err_msg_size,
3462 clow, chigh))
3463 goto nml_err_ret;
3464
3465 return true;
3466
3467 nml_err_ret:
3468
3469 /* The EOF error message is issued by hit_eof. Return true so that the
3470 caller does not use nml_err_msg and nml_err_msg_size to generate
3471 an unrelated error message. */
3472 if (c == EOF)
3473 {
3474 dtp->u.p.input_complete = 1;
3475 unget_char (dtp, c);
3476 hit_eof (dtp);
3477 return true;
3478 }
3479 return false;
3480 }
3481
3482 /* Entry point for namelist input. Goes through input until namelist name
3483 is matched. Then cycles through nml_get_obj_data until the input is
3484 completed or there is an error. */
3485
3486 void
3487 namelist_read (st_parameter_dt *dtp)
3488 {
3489 int c;
3490 char nml_err_msg[200];
3491
3492 /* Initialize the error string buffer just in case we get an unexpected fail
3493 somewhere and end up at nml_err_ret. */
3494 strcpy (nml_err_msg, "Internal namelist read error");
3495
3496 /* Pointer to the previously read object, in case attempt is made to read
3497 new object name. Should this fail, error message can give previous
3498 name. */
3499 namelist_info *prev_nl = NULL;
3500
3501 dtp->u.p.namelist_mode = 1;
3502 dtp->u.p.input_complete = 0;
3503 dtp->u.p.expanded_read = 0;
3504
3505 /* Set the next_char and push_char worker functions. */
3506 set_workers (dtp);
3507
3508 /* Look for &namelist_name . Skip all characters, testing for $nmlname.
3509 Exit on success or EOF. If '?' or '=?' encountered in stdin, print
3510 node names or namelist on stdout. */
3511
3512 find_nml_name:
3513 c = next_char (dtp);
3514 switch (c)
3515 {
3516 case '$':
3517 case '&':
3518 break;
3519
3520 case '!':
3521 eat_line (dtp);
3522 goto find_nml_name;
3523
3524 case '=':
3525 c = next_char (dtp);
3526 if (c == '?')
3527 nml_query (dtp, '=');
3528 else
3529 unget_char (dtp, c);
3530 goto find_nml_name;
3531
3532 case '?':
3533 nml_query (dtp, '?');
3534 goto find_nml_name;
3535
3536 case EOF:
3537 return;
3538
3539 default:
3540 goto find_nml_name;
3541 }
3542
3543 /* Match the name of the namelist. */
3544
3545 nml_match_name (dtp, dtp->namelist_name, dtp->namelist_name_len);
3546
3547 if (dtp->u.p.nml_read_error)
3548 goto find_nml_name;
3549
3550 /* A trailing space is required, we give a little latitude here, 10.9.1. */
3551 c = next_char (dtp);
3552 if (!is_separator(c) && c != '!')
3553 {
3554 unget_char (dtp, c);
3555 goto find_nml_name;
3556 }
3557
3558 unget_char (dtp, c);
3559 eat_separator (dtp);
3560
3561 /* Ready to read namelist objects. If there is an error in input
3562 from stdin, output the error message and continue. */
3563
3564 while (!dtp->u.p.input_complete)
3565 {
3566 if (!nml_get_obj_data (dtp, &prev_nl, nml_err_msg, sizeof nml_err_msg))
3567 {
3568 if (dtp->u.p.current_unit->unit_number != options.stdin_unit)
3569 goto nml_err_ret;
3570 generate_error (&dtp->common, LIBERROR_READ_VALUE, nml_err_msg);
3571 }
3572
3573 /* Reset the previous namelist pointer if we know we are not going
3574 to be doing multiple reads within a single namelist object. */
3575 if (prev_nl && prev_nl->var_rank == 0)
3576 prev_nl = NULL;
3577 }
3578
3579 free_saved (dtp);
3580 free_line (dtp);
3581 return;
3582
3583
3584 nml_err_ret:
3585
3586 /* All namelist error calls return from here */
3587 free_saved (dtp);
3588 free_line (dtp);
3589 generate_error (&dtp->common, LIBERROR_READ_VALUE, nml_err_msg);
3590 return;
3591 }