]> git.ipfire.org Git - thirdparty/gcc.git/blob - libgfortran/io/list_read.c
re PR fortran/83191 (Writing a namelist with repeated complex numbers)
[thirdparty/gcc.git] / libgfortran / io / list_read.c
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
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 <ctype.h>
33
34 typedef unsigned char uchar;
35
36
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. */
41
42
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. */
50
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'
53
54 #define CASE_SEPARATORS /* Fall through. */ \
55 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 {
1378 /* Extension: allow default exponent of 0 when omitted. */
1379 if (dtp->common.flags & IOPARM_DT_DEFAULT_EXP)
1380 {
1381 push_char (dtp, '0');
1382 goto done;
1383 }
1384 else
1385 goto bad_exponent;
1386 }
1387
1388 push_char (dtp, c);
1389
1390 for (;;)
1391 {
1392 if ((c = next_char (dtp)) == EOF)
1393 goto bad;
1394 switch (c)
1395 {
1396 CASE_DIGITS:
1397 push_char (dtp, c);
1398 break;
1399
1400 case '!':
1401 if (!dtp->u.p.namelist_mode)
1402 goto bad;
1403
1404 CASE_SEPARATORS:
1405 case EOF:
1406 unget_char (dtp, c);
1407 goto done;
1408
1409 default:
1410 goto done;
1411 }
1412 }
1413
1414 done:
1415 unget_char (dtp, c);
1416 push_char (dtp, '\0');
1417
1418 m = convert_real (dtp, buffer, dtp->u.p.saved_string, length);
1419 free_saved (dtp);
1420
1421 return m;
1422
1423 done_infnan:
1424 unget_char (dtp, c);
1425 push_char (dtp, '\0');
1426
1427 m = convert_infnan (dtp, buffer, dtp->u.p.saved_string, length);
1428 free_saved (dtp);
1429
1430 return m;
1431
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'))
1437 {
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))))
1446 {
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;
1453 }
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)))
1458 {
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');
1464
1465 /* Match "NAN(alphanum)". */
1466 if (c == '(')
1467 {
1468 for ( ; c != ')'; c = next_char (dtp))
1469 if (is_separator (c))
1470 goto bad;
1471
1472 c = next_char (dtp);
1473 if (is_separator (c) || (c == EOF))
1474 unget_char (dtp, c);
1475 }
1476 goto done_infnan;
1477 }
1478
1479 bad:
1480
1481 if (nml_bad_return (dtp, c))
1482 return 0;
1483
1484 bad_exponent:
1485
1486 free_saved (dtp);
1487 if (c == EOF)
1488 {
1489 free_line (dtp);
1490 hit_eof (dtp);
1491 return 1;
1492 }
1493 else if (c != '\n')
1494 eat_line (dtp);
1495
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);
1500
1501 return 1;
1502 }
1503
1504
1505 /* Reading a complex number is straightforward because we can tell
1506 what it is right away. */
1507
1508 static void
1509 read_complex (st_parameter_dt *dtp, void *dest, int kind, size_t size)
1510 {
1511 char message[MSGLEN];
1512 int c;
1513
1514 if (parse_repeat (dtp))
1515 return;
1516
1517 c = next_char (dtp);
1518 switch (c)
1519 {
1520 case '(':
1521 break;
1522
1523 case '!':
1524 if (!dtp->u.p.namelist_mode)
1525 goto bad_complex;
1526
1527 CASE_SEPARATORS:
1528 case EOF:
1529 unget_char (dtp, c);
1530 eat_separator (dtp);
1531 return;
1532
1533 default:
1534 goto bad_complex;
1535 }
1536
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);
1544
1545 if (parse_real (dtp, dest, kind))
1546 return;
1547
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);
1555
1556 if (next_char (dtp)
1557 != (dtp->u.p.current_unit->decimal_status == DECIMAL_POINT ? ',' : ';'))
1558 goto bad_complex;
1559
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);
1567
1568 if (parse_real (dtp, dest + size / 2, kind))
1569 return;
1570
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);
1578
1579 if (next_char (dtp) != ')')
1580 goto bad_complex;
1581
1582 c = next_char (dtp);
1583 if (!is_separator (c) && (c != EOF))
1584 goto bad_complex;
1585
1586 unget_char (dtp, c);
1587 eat_separator (dtp);
1588
1589 free_saved (dtp);
1590 dtp->u.p.saved_type = BT_COMPLEX;
1591 return;
1592
1593 bad_complex:
1594
1595 if (nml_bad_return (dtp, c))
1596 return;
1597
1598 free_saved (dtp);
1599 if (c == EOF)
1600 {
1601 free_line (dtp);
1602 hit_eof (dtp);
1603 return;
1604 }
1605 else if (c != '\n')
1606 eat_line (dtp);
1607
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);
1612 }
1613
1614
1615 /* Parse a real number with a possible repeat count. */
1616
1617 static void
1618 read_real (st_parameter_dt *dtp, void *dest, int length)
1619 {
1620 char message[MSGLEN];
1621 int c;
1622 int seen_dp;
1623 int is_inf;
1624
1625 seen_dp = 0;
1626
1627 c = next_char (dtp);
1628 if (c == ',' && dtp->u.p.current_unit->decimal_status == DECIMAL_COMMA)
1629 c = '.';
1630 switch (c)
1631 {
1632 CASE_DIGITS:
1633 push_char (dtp, c);
1634 break;
1635
1636 case '.':
1637 push_char (dtp, c);
1638 seen_dp = 1;
1639 break;
1640
1641 case '+':
1642 case '-':
1643 goto got_sign;
1644
1645 case '!':
1646 if (!dtp->u.p.namelist_mode)
1647 goto bad_real;
1648
1649 CASE_SEPARATORS:
1650 unget_char (dtp, c); /* Single null. */
1651 eat_separator (dtp);
1652 return;
1653
1654 case 'i':
1655 case 'I':
1656 case 'n':
1657 case 'N':
1658 goto inf_nan;
1659
1660 default:
1661 goto bad_real;
1662 }
1663
1664 /* Get the digit string that might be a repeat count. */
1665
1666 for (;;)
1667 {
1668 c = next_char (dtp);
1669 if (c == ',' && dtp->u.p.current_unit->decimal_status == DECIMAL_COMMA)
1670 c = '.';
1671 switch (c)
1672 {
1673 CASE_DIGITS:
1674 push_char (dtp, c);
1675 break;
1676
1677 case '.':
1678 if (seen_dp)
1679 goto bad_real;
1680
1681 seen_dp = 1;
1682 push_char (dtp, c);
1683 goto real_loop;
1684
1685 case 'E':
1686 case 'e':
1687 case 'D':
1688 case 'd':
1689 case 'Q':
1690 case 'q':
1691 goto exp1;
1692
1693 case '+':
1694 case '-':
1695 push_char (dtp, 'e');
1696 push_char (dtp, c);
1697 c = next_char (dtp);
1698 goto exp2;
1699
1700 case '*':
1701 push_char (dtp, '\0');
1702 goto got_repeat;
1703
1704 case '!':
1705 if (!dtp->u.p.namelist_mode)
1706 goto bad_real;
1707
1708 CASE_SEPARATORS:
1709 case EOF:
1710 if (c != '\n' && c != ',' && c != '\r' && c != ';')
1711 unget_char (dtp, c);
1712 goto done;
1713
1714 default:
1715 goto bad_real;
1716 }
1717 }
1718
1719 got_repeat:
1720 if (convert_integer (dtp, -1, 0))
1721 return;
1722
1723 /* Now get the number itself. */
1724
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;
1732 }
1733
1734 if (c != '-' && c != '+')
1735 push_char (dtp, '+');
1736 else
1737 {
1738 got_sign:
1739 push_char (dtp, c);
1740 if ((c = next_char (dtp)) == EOF)
1741 goto bad_real;
1742 }
1743
1744 if (c == ',' && dtp->u.p.current_unit->decimal_status == DECIMAL_COMMA)
1745 c = '.';
1746
1747 if (!isdigit (c) && c != '.')
1748 {
1749 if (c == 'i' || c == 'I' || c == 'n' || c == 'N')
1750 goto inf_nan;
1751 else
1752 goto bad_real;
1753 }
1754
1755 if (c == '.')
1756 {
1757 if (seen_dp)
1758 goto bad_real;
1759 else
1760 seen_dp = 1;
1761 }
1762
1763 push_char (dtp, c);
1764
1765 real_loop:
1766 for (;;)
1767 {
1768 c = next_char (dtp);
1769 if (c == ',' && dtp->u.p.current_unit->decimal_status == DECIMAL_COMMA)
1770 c = '.';
1771 switch (c)
1772 {
1773 CASE_DIGITS:
1774 push_char (dtp, c);
1775 break;
1776
1777 case '!':
1778 if (!dtp->u.p.namelist_mode)
1779 goto bad_real;
1780
1781 CASE_SEPARATORS:
1782 case EOF:
1783 goto done;
1784
1785 case '.':
1786 if (seen_dp)
1787 goto bad_real;
1788
1789 seen_dp = 1;
1790 push_char (dtp, c);
1791 break;
1792
1793 case 'E':
1794 case 'e':
1795 case 'D':
1796 case 'd':
1797 case 'Q':
1798 case 'q':
1799 goto exp1;
1800
1801 case '+':
1802 case '-':
1803 push_char (dtp, 'e');
1804 push_char (dtp, c);
1805 c = next_char (dtp);
1806 goto exp2;
1807
1808 default:
1809 goto bad_real;
1810 }
1811 }
1812
1813 exp1:
1814 push_char (dtp, 'e');
1815
1816 if ((c = next_char (dtp)) == EOF)
1817 goto bad_real;
1818 if (c != '+' && c != '-')
1819 push_char (dtp, '+');
1820 else
1821 {
1822 push_char (dtp, c);
1823 c = next_char (dtp);
1824 }
1825
1826 exp2:
1827 if (!isdigit (c))
1828 {
1829 /* Extension: allow default exponent of 0 when omitted. */
1830 if (dtp->common.flags & IOPARM_DT_DEFAULT_EXP)
1831 {
1832 push_char (dtp, '0');
1833 goto done;
1834 }
1835 else
1836 goto bad_exponent;
1837 }
1838
1839 push_char (dtp, c);
1840
1841 for (;;)
1842 {
1843 c = next_char (dtp);
1844
1845 switch (c)
1846 {
1847 CASE_DIGITS:
1848 push_char (dtp, c);
1849 break;
1850
1851 case '!':
1852 if (!dtp->u.p.namelist_mode)
1853 goto bad_real;
1854
1855 CASE_SEPARATORS:
1856 case EOF:
1857 goto done;
1858
1859 default:
1860 goto bad_real;
1861 }
1862 }
1863
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))
1869 {
1870 free_saved (dtp);
1871 return;
1872 }
1873
1874 free_saved (dtp);
1875 dtp->u.p.saved_type = BT_REAL;
1876 return;
1877
1878 inf_nan:
1879 l_push_char (dtp, c);
1880 is_inf = 0;
1881
1882 /* Match INF and Infinity. */
1883 if (c == 'i' || c == 'I')
1884 {
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))
1896 {
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);
1917 }
1918 is_inf = 1;
1919 } /* Match NaN. */
1920 else
1921 {
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);
1932
1933 /* Match NAN(alphanum). */
1934 if (c == '(')
1935 {
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);
1941
1942 l_push_char (dtp, ')');
1943 c = next_char (dtp);
1944 l_push_char (dtp, c);
1945 }
1946 }
1947
1948 if (!is_separator (c) && (c != EOF))
1949 goto unwind;
1950
1951 if (dtp->u.p.namelist_mode)
1952 {
1953 if (c == ' ' || c =='\n' || c == '\r')
1954 {
1955 do
1956 {
1957 if ((c = next_char (dtp)) == EOF)
1958 goto bad_real;
1959 }
1960 while (c == ' ' || c =='\n' || c == '\r');
1961
1962 l_push_char (dtp, c);
1963
1964 if (c == '=')
1965 goto unwind;
1966 }
1967 }
1968
1969 if (is_inf)
1970 {
1971 push_char (dtp, 'i');
1972 push_char (dtp, 'n');
1973 push_char (dtp, 'f');
1974 }
1975 else
1976 {
1977 push_char (dtp, 'n');
1978 push_char (dtp, 'a');
1979 push_char (dtp, 'n');
1980 }
1981
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;
1988
1989 free_saved (dtp);
1990 dtp->u.p.saved_type = BT_REAL;
1991 return;
1992
1993 unwind:
1994 if (dtp->u.p.namelist_mode)
1995 {
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;
2000 }
2001
2002 bad_real:
2003
2004 if (nml_bad_return (dtp, c))
2005 return;
2006
2007 bad_exponent:
2008
2009 free_saved (dtp);
2010 if (c == EOF)
2011 {
2012 free_line (dtp);
2013 hit_eof (dtp);
2014 return;
2015 }
2016 else if (c != '\n')
2017 eat_line (dtp);
2018
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);
2023 }
2024
2025
2026 /* Check the current type against the saved type to make sure they are
2027 compatible. Returns nonzero if incompatible. */
2028
2029 static int
2030 check_type (st_parameter_dt *dtp, bt type, int kind)
2031 {
2032 char message[MSGLEN];
2033
2034 if (dtp->u.p.saved_type != BT_UNKNOWN && dtp->u.p.saved_type != type)
2035 {
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;
2042 }
2043
2044 if (dtp->u.p.saved_type == BT_UNKNOWN || dtp->u.p.saved_type == BT_CHARACTER)
2045 return 0;
2046
2047 if ((type != BT_COMPLEX && dtp->u.p.saved_length != kind)
2048 || (type == BT_COMPLEX && dtp->u.p.saved_length != kind*2))
2049 {
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;
2059 }
2060
2061 return 0;
2062 }
2063
2064
2065 /* Initialize the function pointers to select the correct versions of
2066 next_char and push_char depending on what we are doing. */
2067
2068 static void
2069 set_workers (st_parameter_dt *dtp)
2070 {
2071 if (dtp->u.p.current_unit->flags.encoding == ENCODING_UTF8)
2072 {
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;
2075 }
2076 else if (is_internal_unit (dtp))
2077 {
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;
2080 }
2081 else
2082 {
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;
2085 }
2086
2087 }
2088
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. */
2093
2094 static int
2095 list_formatted_read_scalar (st_parameter_dt *dtp, bt type, void *p,
2096 int kind, size_t size)
2097 {
2098 gfc_char4_t *q, *r;
2099 int c, i, m;
2100 int err = 0;
2101
2102 /* Set the next_char and push_char worker functions. */
2103 set_workers (dtp);
2104
2105 if (dtp->u.p.first_item)
2106 {
2107 dtp->u.p.first_item = 0;
2108 dtp->u.p.input_complete = 0;
2109 dtp->u.p.repeat_count = 1;
2110 dtp->u.p.at_eol = 0;
2111
2112 if ((c = eat_spaces (dtp)) == EOF)
2113 {
2114 err = LIBERROR_END;
2115 goto cleanup;
2116 }
2117 if (is_separator (c))
2118 {
2119 /* Found a null value. */
2120 dtp->u.p.repeat_count = 0;
2121 eat_separator (dtp);
2122
2123 /* Set end-of-line flag. */
2124 if (c == '\n' || c == '\r')
2125 {
2126 dtp->u.p.at_eol = 1;
2127 if (finish_separator (dtp) == LIBERROR_END)
2128 {
2129 err = LIBERROR_END;
2130 goto cleanup;
2131 }
2132 }
2133 else
2134 goto cleanup;
2135 }
2136 }
2137 else
2138 {
2139 if (dtp->u.p.repeat_count > 0)
2140 {
2141 if (check_type (dtp, type, kind))
2142 return err;
2143 goto set_value;
2144 }
2145
2146 if (dtp->u.p.input_complete)
2147 goto cleanup;
2148
2149 if (dtp->u.p.at_eol)
2150 finish_separator (dtp);
2151 else
2152 {
2153 eat_spaces (dtp);
2154 /* Trailing spaces prior to end of line. */
2155 if (dtp->u.p.at_eol)
2156 finish_separator (dtp);
2157 }
2158
2159 dtp->u.p.saved_type = BT_UNKNOWN;
2160 dtp->u.p.repeat_count = 1;
2161 }
2162
2163 switch (type)
2164 {
2165 case BT_INTEGER:
2166 read_integer (dtp, kind);
2167 break;
2168 case BT_LOGICAL:
2169 read_logical (dtp, kind);
2170 break;
2171 case BT_CHARACTER:
2172 read_character (dtp, kind);
2173 break;
2174 case BT_REAL:
2175 read_real (dtp, p, kind);
2176 /* Copy value back to temporary if needed. */
2177 if (dtp->u.p.repeat_count > 0)
2178 memcpy (dtp->u.p.value, p, size);
2179 break;
2180 case BT_COMPLEX:
2181 read_complex (dtp, p, kind, size);
2182 /* Copy value back to temporary if needed. */
2183 if (dtp->u.p.repeat_count > 0)
2184 memcpy (dtp->u.p.value, p, size);
2185 break;
2186 case BT_CLASS:
2187 {
2188 int unit = dtp->u.p.current_unit->unit_number;
2189 char iotype[] = "LISTDIRECTED";
2190 gfc_charlen_type iotype_len = 12;
2191 char tmp_iomsg[IOMSG_LEN] = "";
2192 char *child_iomsg;
2193 gfc_charlen_type child_iomsg_len;
2194 int noiostat;
2195 int *child_iostat = NULL;
2196 gfc_array_i4 vlist;
2197
2198 GFC_DESCRIPTOR_DATA(&vlist) = NULL;
2199 GFC_DIMENSION_SET(vlist.dim[0],1, 0, 0);
2200
2201 /* Set iostat, intent(out). */
2202 noiostat = 0;
2203 child_iostat = (dtp->common.flags & IOPARM_HAS_IOSTAT) ?
2204 dtp->common.iostat : &noiostat;
2205
2206 /* Set iomsge, intent(inout). */
2207 if (dtp->common.flags & IOPARM_HAS_IOMSG)
2208 {
2209 child_iomsg = dtp->common.iomsg;
2210 child_iomsg_len = dtp->common.iomsg_len;
2211 }
2212 else
2213 {
2214 child_iomsg = tmp_iomsg;
2215 child_iomsg_len = IOMSG_LEN;
2216 }
2217
2218 /* Call the user defined formatted READ procedure. */
2219 dtp->u.p.current_unit->child_dtio++;
2220 dtp->u.p.fdtio_ptr (p, &unit, iotype, &vlist,
2221 child_iostat, child_iomsg,
2222 iotype_len, child_iomsg_len);
2223 dtp->u.p.child_saved_iostat = *child_iostat;
2224 dtp->u.p.current_unit->child_dtio--;
2225 }
2226 break;
2227 default:
2228 internal_error (&dtp->common, "Bad type for list read");
2229 }
2230
2231 if (dtp->u.p.saved_type != BT_CHARACTER && dtp->u.p.saved_type != BT_UNKNOWN)
2232 dtp->u.p.saved_length = size;
2233
2234 if ((dtp->common.flags & IOPARM_LIBRETURN_MASK) != IOPARM_LIBRETURN_OK)
2235 goto cleanup;
2236
2237 set_value:
2238 switch (dtp->u.p.saved_type)
2239 {
2240 case BT_COMPLEX:
2241 case BT_REAL:
2242 if (dtp->u.p.repeat_count > 0)
2243 memcpy (p, dtp->u.p.value, size);
2244 break;
2245
2246 case BT_INTEGER:
2247 case BT_LOGICAL:
2248 memcpy (p, dtp->u.p.value, size);
2249 break;
2250
2251 case BT_CHARACTER:
2252 if (dtp->u.p.saved_string)
2253 {
2254 m = ((int) size < dtp->u.p.saved_used)
2255 ? (int) size : dtp->u.p.saved_used;
2256
2257 q = (gfc_char4_t *) p;
2258 r = (gfc_char4_t *) dtp->u.p.saved_string;
2259 if (dtp->u.p.current_unit->flags.encoding == ENCODING_UTF8)
2260 for (i = 0; i < m; i++)
2261 *q++ = *r++;
2262 else
2263 {
2264 if (kind == 1)
2265 memcpy (p, dtp->u.p.saved_string, m);
2266 else
2267 for (i = 0; i < m; i++)
2268 *q++ = *r++;
2269 }
2270 }
2271 else
2272 /* Just delimiters encountered, nothing to copy but SPACE. */
2273 m = 0;
2274
2275 if (m < (int) size)
2276 {
2277 if (kind == 1)
2278 memset (((char *) p) + m, ' ', size - m);
2279 else
2280 {
2281 q = (gfc_char4_t *) p;
2282 for (i = m; i < (int) size; i++)
2283 q[i] = (unsigned char) ' ';
2284 }
2285 }
2286 break;
2287
2288 case BT_UNKNOWN:
2289 break;
2290
2291 default:
2292 internal_error (&dtp->common, "Bad type for list read");
2293 }
2294
2295 if (--dtp->u.p.repeat_count <= 0)
2296 free_saved (dtp);
2297
2298 cleanup:
2299 /* err may have been set above from finish_separator, so if it is set
2300 trigger the hit_eof. The hit_eof will set bits in common.flags. */
2301 if (err == LIBERROR_END)
2302 {
2303 free_line (dtp);
2304 hit_eof (dtp);
2305 }
2306 /* Now we check common.flags for any errors that could have occurred in
2307 a READ elsewhere such as in read_integer. */
2308 err = dtp->common.flags & IOPARM_LIBRETURN_MASK;
2309 fbuf_flush_list (dtp->u.p.current_unit, LIST_READING);
2310 return err;
2311 }
2312
2313
2314 void
2315 list_formatted_read (st_parameter_dt *dtp, bt type, void *p, int kind,
2316 size_t size, size_t nelems)
2317 {
2318 size_t elem;
2319 char *tmp;
2320 size_t stride = type == BT_CHARACTER ?
2321 size * GFC_SIZE_OF_CHAR_KIND(kind) : size;
2322 int err;
2323
2324 tmp = (char *) p;
2325
2326 /* Big loop over all the elements. */
2327 for (elem = 0; elem < nelems; elem++)
2328 {
2329 dtp->u.p.item_count++;
2330 err = list_formatted_read_scalar (dtp, type, tmp + stride*elem,
2331 kind, size);
2332 if (err)
2333 break;
2334 }
2335 }
2336
2337
2338 /* Finish a list read. */
2339
2340 void
2341 finish_list_read (st_parameter_dt *dtp)
2342 {
2343 free_saved (dtp);
2344
2345 fbuf_flush (dtp->u.p.current_unit, dtp->u.p.mode);
2346
2347 if (dtp->u.p.at_eol)
2348 {
2349 dtp->u.p.at_eol = 0;
2350 return;
2351 }
2352
2353 if (!is_internal_unit (dtp))
2354 {
2355 int c;
2356
2357 /* Set the next_char and push_char worker functions. */
2358 set_workers (dtp);
2359
2360 if (likely (dtp->u.p.child_saved_iostat == LIBERROR_OK))
2361 {
2362 c = next_char (dtp);
2363 if (c == EOF)
2364 {
2365 free_line (dtp);
2366 hit_eof (dtp);
2367 return;
2368 }
2369 if (c != '\n')
2370 eat_line (dtp);
2371 }
2372 }
2373
2374 free_line (dtp);
2375
2376 }
2377
2378 /* NAMELIST INPUT
2379
2380 void namelist_read (st_parameter_dt *dtp)
2381 calls:
2382 static void nml_match_name (char *name, int len)
2383 static int nml_query (st_parameter_dt *dtp)
2384 static int nml_get_obj_data (st_parameter_dt *dtp,
2385 namelist_info **prev_nl, char *, size_t)
2386 calls:
2387 static void nml_untouch_nodes (st_parameter_dt *dtp)
2388 static namelist_info *find_nml_node (st_parameter_dt *dtp,
2389 char *var_name)
2390 static int nml_parse_qualifier(descriptor_dimension *ad,
2391 array_loop_spec *ls, int rank, char *)
2392 static void nml_touch_nodes (namelist_info *nl)
2393 static int nml_read_obj (namelist_info *nl, index_type offset,
2394 namelist_info **prev_nl, char *, size_t,
2395 index_type clow, index_type chigh)
2396 calls:
2397 -itself- */
2398
2399 /* Inputs a rank-dimensional qualifier, which can contain
2400 singlets, doublets, triplets or ':' with the standard meanings. */
2401
2402 static bool
2403 nml_parse_qualifier (st_parameter_dt *dtp, descriptor_dimension *ad,
2404 array_loop_spec *ls, int rank, bt nml_elem_type,
2405 char *parse_err_msg, size_t parse_err_msg_size,
2406 int *parsed_rank)
2407 {
2408 int dim;
2409 int indx;
2410 int neg;
2411 int null_flag;
2412 int is_array_section, is_char;
2413 int c;
2414
2415 is_char = 0;
2416 is_array_section = 0;
2417 dtp->u.p.expanded_read = 0;
2418
2419 /* See if this is a character substring qualifier we are looking for. */
2420 if (rank == -1)
2421 {
2422 rank = 1;
2423 is_char = 1;
2424 }
2425
2426 /* The next character in the stream should be the '('. */
2427
2428 if ((c = next_char (dtp)) == EOF)
2429 goto err_ret;
2430
2431 /* Process the qualifier, by dimension and triplet. */
2432
2433 for (dim=0; dim < rank; dim++ )
2434 {
2435 for (indx=0; indx<3; indx++)
2436 {
2437 free_saved (dtp);
2438 eat_spaces (dtp);
2439 neg = 0;
2440
2441 /* Process a potential sign. */
2442 if ((c = next_char (dtp)) == EOF)
2443 goto err_ret;
2444 switch (c)
2445 {
2446 case '-':
2447 neg = 1;
2448 break;
2449
2450 case '+':
2451 break;
2452
2453 default:
2454 unget_char (dtp, c);
2455 break;
2456 }
2457
2458 /* Process characters up to the next ':' , ',' or ')'. */
2459 for (;;)
2460 {
2461 c = next_char (dtp);
2462 switch (c)
2463 {
2464 case EOF:
2465 goto err_ret;
2466
2467 case ':':
2468 is_array_section = 1;
2469 break;
2470
2471 case ',': case ')':
2472 if ((c==',' && dim == rank -1)
2473 || (c==')' && dim < rank -1))
2474 {
2475 if (is_char)
2476 snprintf (parse_err_msg, parse_err_msg_size,
2477 "Bad substring qualifier");
2478 else
2479 snprintf (parse_err_msg, parse_err_msg_size,
2480 "Bad number of index fields");
2481 goto err_ret;
2482 }
2483 break;
2484
2485 CASE_DIGITS:
2486 push_char (dtp, c);
2487 continue;
2488
2489 case ' ': case '\t': case '\r': case '\n':
2490 eat_spaces (dtp);
2491 break;
2492
2493 default:
2494 if (is_char)
2495 snprintf (parse_err_msg, parse_err_msg_size,
2496 "Bad character in substring qualifier");
2497 else
2498 snprintf (parse_err_msg, parse_err_msg_size,
2499 "Bad character in index");
2500 goto err_ret;
2501 }
2502
2503 if ((c == ',' || c == ')') && indx == 0
2504 && dtp->u.p.saved_string == 0)
2505 {
2506 if (is_char)
2507 snprintf (parse_err_msg, parse_err_msg_size,
2508 "Null substring qualifier");
2509 else
2510 snprintf (parse_err_msg, parse_err_msg_size,
2511 "Null index field");
2512 goto err_ret;
2513 }
2514
2515 if ((c == ':' && indx == 1 && dtp->u.p.saved_string == 0)
2516 || (indx == 2 && dtp->u.p.saved_string == 0))
2517 {
2518 if (is_char)
2519 snprintf (parse_err_msg, parse_err_msg_size,
2520 "Bad substring qualifier");
2521 else
2522 snprintf (parse_err_msg, parse_err_msg_size,
2523 "Bad index triplet");
2524 goto err_ret;
2525 }
2526
2527 if (is_char && !is_array_section)
2528 {
2529 snprintf (parse_err_msg, parse_err_msg_size,
2530 "Missing colon in substring qualifier");
2531 goto err_ret;
2532 }
2533
2534 /* If '( : ? )' or '( ? : )' break and flag read failure. */
2535 null_flag = 0;
2536 if ((c == ':' && indx == 0 && dtp->u.p.saved_string == 0)
2537 || (indx==1 && dtp->u.p.saved_string == 0))
2538 {
2539 null_flag = 1;
2540 break;
2541 }
2542
2543 /* Now read the index. */
2544 if (convert_integer (dtp, sizeof(index_type), neg))
2545 {
2546 if (is_char)
2547 snprintf (parse_err_msg, parse_err_msg_size,
2548 "Bad integer substring qualifier");
2549 else
2550 snprintf (parse_err_msg, parse_err_msg_size,
2551 "Bad integer in index");
2552 goto err_ret;
2553 }
2554 break;
2555 }
2556
2557 /* Feed the index values to the triplet arrays. */
2558 if (!null_flag)
2559 {
2560 if (indx == 0)
2561 memcpy (&ls[dim].start, dtp->u.p.value, sizeof(index_type));
2562 if (indx == 1)
2563 memcpy (&ls[dim].end, dtp->u.p.value, sizeof(index_type));
2564 if (indx == 2)
2565 memcpy (&ls[dim].step, dtp->u.p.value, sizeof(index_type));
2566 }
2567
2568 /* Singlet or doublet indices. */
2569 if (c==',' || c==')')
2570 {
2571 if (indx == 0)
2572 {
2573 memcpy (&ls[dim].start, dtp->u.p.value, sizeof(index_type));
2574
2575 /* If -std=f95/2003 or an array section is specified,
2576 do not allow excess data to be processed. */
2577 if (is_array_section == 1
2578 || !(compile_options.allow_std & GFC_STD_GNU)
2579 || nml_elem_type == BT_DERIVED)
2580 ls[dim].end = ls[dim].start;
2581 else
2582 dtp->u.p.expanded_read = 1;
2583 }
2584
2585 /* Check for non-zero rank. */
2586 if (is_array_section == 1 && ls[dim].start != ls[dim].end)
2587 *parsed_rank = 1;
2588
2589 break;
2590 }
2591 }
2592
2593 if (is_array_section == 1 && dtp->u.p.expanded_read == 1)
2594 {
2595 int i;
2596 dtp->u.p.expanded_read = 0;
2597 for (i = 0; i < dim; i++)
2598 ls[i].end = ls[i].start;
2599 }
2600
2601 /* Check the values of the triplet indices. */
2602 if ((ls[dim].start > GFC_DIMENSION_UBOUND(ad[dim]))
2603 || (ls[dim].start < GFC_DIMENSION_LBOUND(ad[dim]))
2604 || (ls[dim].end > GFC_DIMENSION_UBOUND(ad[dim]))
2605 || (ls[dim].end < GFC_DIMENSION_LBOUND(ad[dim])))
2606 {
2607 if (is_char)
2608 snprintf (parse_err_msg, parse_err_msg_size,
2609 "Substring out of range");
2610 else
2611 snprintf (parse_err_msg, parse_err_msg_size,
2612 "Index %d out of range", dim + 1);
2613 goto err_ret;
2614 }
2615
2616 if (((ls[dim].end - ls[dim].start ) * ls[dim].step < 0)
2617 || (ls[dim].step == 0))
2618 {
2619 snprintf (parse_err_msg, parse_err_msg_size,
2620 "Bad range in index %d", dim + 1);
2621 goto err_ret;
2622 }
2623
2624 /* Initialise the loop index counter. */
2625 ls[dim].idx = ls[dim].start;
2626 }
2627 eat_spaces (dtp);
2628 return true;
2629
2630 err_ret:
2631
2632 /* The EOF error message is issued by hit_eof. Return true so that the
2633 caller does not use parse_err_msg and parse_err_msg_size to generate
2634 an unrelated error message. */
2635 if (c == EOF)
2636 {
2637 hit_eof (dtp);
2638 dtp->u.p.input_complete = 1;
2639 return true;
2640 }
2641 return false;
2642 }
2643
2644
2645 static bool
2646 extended_look_ahead (char *p, char *q)
2647 {
2648 char *r, *s;
2649
2650 /* Scan ahead to find a '%' in the p string. */
2651 for(r = p, s = q; *r && *s; s++)
2652 if ((*s == '%' || *s == '+') && strcmp (r + 1, s + 1) == 0)
2653 return true;
2654 return false;
2655 }
2656
2657
2658 static bool
2659 strcmp_extended_type (char *p, char *q)
2660 {
2661 char *r, *s;
2662
2663 for (r = p, s = q; *r && *s; r++, s++)
2664 {
2665 if (*r != *s)
2666 {
2667 if (*r == '%' && *s == '+' && extended_look_ahead (r, s))
2668 return true;
2669 break;
2670 }
2671 }
2672 return false;
2673 }
2674
2675
2676 static namelist_info *
2677 find_nml_node (st_parameter_dt *dtp, char *var_name)
2678 {
2679 namelist_info *t = dtp->u.p.ionml;
2680 while (t != NULL)
2681 {
2682 if (strcmp (var_name, t->var_name) == 0)
2683 {
2684 t->touched = 1;
2685 return t;
2686 }
2687 if (strcmp_extended_type (var_name, t->var_name))
2688 {
2689 t->touched = 1;
2690 return t;
2691 }
2692 t = t->next;
2693 }
2694 return NULL;
2695 }
2696
2697 /* Visits all the components of a derived type that have
2698 not explicitly been identified in the namelist input.
2699 touched is set and the loop specification initialised
2700 to default values */
2701
2702 static void
2703 nml_touch_nodes (namelist_info *nl)
2704 {
2705 index_type len = strlen (nl->var_name) + 1;
2706 int dim;
2707 char *ext_name = xmalloc (len + 1);
2708 memcpy (ext_name, nl->var_name, len-1);
2709 memcpy (ext_name + len - 1, "%", 2);
2710 for (nl = nl->next; nl; nl = nl->next)
2711 {
2712 if (strncmp (nl->var_name, ext_name, len) == 0)
2713 {
2714 nl->touched = 1;
2715 for (dim=0; dim < nl->var_rank; dim++)
2716 {
2717 nl->ls[dim].step = 1;
2718 nl->ls[dim].end = GFC_DESCRIPTOR_UBOUND(nl,dim);
2719 nl->ls[dim].start = GFC_DESCRIPTOR_LBOUND(nl,dim);
2720 nl->ls[dim].idx = nl->ls[dim].start;
2721 }
2722 }
2723 else
2724 break;
2725 }
2726 free (ext_name);
2727 return;
2728 }
2729
2730 /* Resets touched for the entire list of nml_nodes, ready for a
2731 new object. */
2732
2733 static void
2734 nml_untouch_nodes (st_parameter_dt *dtp)
2735 {
2736 namelist_info *t;
2737 for (t = dtp->u.p.ionml; t; t = t->next)
2738 t->touched = 0;
2739 return;
2740 }
2741
2742 /* Attempts to input name to namelist name. Returns
2743 dtp->u.p.nml_read_error = 1 on no match. */
2744
2745 static void
2746 nml_match_name (st_parameter_dt *dtp, const char *name, index_type len)
2747 {
2748 index_type i;
2749 int c;
2750
2751 dtp->u.p.nml_read_error = 0;
2752 for (i = 0; i < len; i++)
2753 {
2754 c = next_char (dtp);
2755 if (c == EOF || (tolower (c) != tolower (name[i])))
2756 {
2757 dtp->u.p.nml_read_error = 1;
2758 break;
2759 }
2760 }
2761 }
2762
2763 /* If the namelist read is from stdin, output the current state of the
2764 namelist to stdout. This is used to implement the non-standard query
2765 features, ? and =?. If c == '=' the full namelist is printed. Otherwise
2766 the names alone are printed. */
2767
2768 static void
2769 nml_query (st_parameter_dt *dtp, char c)
2770 {
2771 gfc_unit *temp_unit;
2772 namelist_info *nl;
2773 index_type len;
2774 char *p;
2775 #ifdef HAVE_CRLF
2776 static const index_type endlen = 2;
2777 static const char endl[] = "\r\n";
2778 static const char nmlend[] = "&end\r\n";
2779 #else
2780 static const index_type endlen = 1;
2781 static const char endl[] = "\n";
2782 static const char nmlend[] = "&end\n";
2783 #endif
2784
2785 if (dtp->u.p.current_unit->unit_number != options.stdin_unit)
2786 return;
2787
2788 /* Store the current unit and transfer to stdout. */
2789
2790 temp_unit = dtp->u.p.current_unit;
2791 dtp->u.p.current_unit = find_unit (options.stdout_unit);
2792
2793 if (dtp->u.p.current_unit)
2794 {
2795 dtp->u.p.mode = WRITING;
2796 next_record (dtp, 0);
2797
2798 /* Write the namelist in its entirety. */
2799
2800 if (c == '=')
2801 namelist_write (dtp);
2802
2803 /* Or write the list of names. */
2804
2805 else
2806 {
2807 /* "&namelist_name\n" */
2808
2809 len = dtp->namelist_name_len;
2810 p = write_block (dtp, len - 1 + endlen);
2811 if (!p)
2812 goto query_return;
2813 memcpy (p, "&", 1);
2814 memcpy ((char*)(p + 1), dtp->namelist_name, len);
2815 memcpy ((char*)(p + len + 1), &endl, endlen);
2816 for (nl = dtp->u.p.ionml; nl; nl = nl->next)
2817 {
2818 /* " var_name\n" */
2819
2820 len = strlen (nl->var_name);
2821 p = write_block (dtp, len + endlen);
2822 if (!p)
2823 goto query_return;
2824 memcpy (p, " ", 1);
2825 memcpy ((char*)(p + 1), nl->var_name, len);
2826 memcpy ((char*)(p + len + 1), &endl, endlen);
2827 }
2828
2829 /* "&end\n" */
2830
2831 p = write_block (dtp, endlen + 4);
2832 if (!p)
2833 goto query_return;
2834 memcpy (p, &nmlend, endlen + 4);
2835 }
2836
2837 /* Flush the stream to force immediate output. */
2838
2839 fbuf_flush (dtp->u.p.current_unit, WRITING);
2840 sflush (dtp->u.p.current_unit->s);
2841 unlock_unit (dtp->u.p.current_unit);
2842 }
2843
2844 query_return:
2845
2846 /* Restore the current unit. */
2847
2848 dtp->u.p.current_unit = temp_unit;
2849 dtp->u.p.mode = READING;
2850 return;
2851 }
2852
2853 /* Reads and stores the input for the namelist object nl. For an array,
2854 the function loops over the ranges defined by the loop specification.
2855 This default to all the data or to the specification from a qualifier.
2856 nml_read_obj recursively calls itself to read derived types. It visits
2857 all its own components but only reads data for those that were touched
2858 when the name was parsed. If a read error is encountered, an attempt is
2859 made to return to read a new object name because the standard allows too
2860 little data to be available. On the other hand, too much data is an
2861 error. */
2862
2863 static bool
2864 nml_read_obj (st_parameter_dt *dtp, namelist_info *nl, index_type offset,
2865 namelist_info **pprev_nl, char *nml_err_msg,
2866 size_t nml_err_msg_size, index_type clow, index_type chigh)
2867 {
2868 namelist_info *cmp;
2869 char *obj_name;
2870 int nml_carry;
2871 int len;
2872 int dim;
2873 index_type dlen;
2874 index_type m;
2875 size_t obj_name_len;
2876 void *pdata;
2877 gfc_class list_obj;
2878
2879 /* If we have encountered a previous read error or this object has not been
2880 touched in name parsing, just return. */
2881 if (dtp->u.p.nml_read_error || !nl->touched)
2882 return true;
2883
2884 dtp->u.p.item_count++; /* Used in error messages. */
2885 dtp->u.p.repeat_count = 0;
2886 eat_spaces (dtp);
2887
2888 len = nl->len;
2889 switch (nl->type)
2890 {
2891 case BT_INTEGER:
2892 case BT_LOGICAL:
2893 dlen = len;
2894 break;
2895
2896 case BT_REAL:
2897 dlen = size_from_real_kind (len);
2898 break;
2899
2900 case BT_COMPLEX:
2901 dlen = size_from_complex_kind (len);
2902 break;
2903
2904 case BT_CHARACTER:
2905 dlen = chigh ? (chigh - clow + 1) : nl->string_length;
2906 break;
2907
2908 default:
2909 dlen = 0;
2910 }
2911
2912 do
2913 {
2914 /* Update the pointer to the data, using the current index vector */
2915
2916 if ((nl->type == BT_DERIVED || nl->type == BT_CLASS)
2917 && nl->dtio_sub != NULL)
2918 {
2919 pdata = NULL; /* Not used under these conidtions. */
2920 if (nl->type == BT_CLASS)
2921 list_obj.data = ((gfc_class*)nl->mem_pos)->data;
2922 else
2923 list_obj.data = (void *)nl->mem_pos;
2924
2925 for (dim = 0; dim < nl->var_rank; dim++)
2926 list_obj.data = list_obj.data + (nl->ls[dim].idx
2927 - GFC_DESCRIPTOR_LBOUND(nl,dim))
2928 * GFC_DESCRIPTOR_STRIDE(nl,dim) * nl->size;
2929 }
2930 else
2931 {
2932 pdata = (void*)(nl->mem_pos + offset);
2933 for (dim = 0; dim < nl->var_rank; dim++)
2934 pdata = (void*)(pdata + (nl->ls[dim].idx
2935 - GFC_DESCRIPTOR_LBOUND(nl,dim))
2936 * GFC_DESCRIPTOR_STRIDE(nl,dim) * nl->size);
2937 }
2938
2939 /* If we are finished with the repeat count, try to read next value. */
2940
2941 nml_carry = 0;
2942 if (--dtp->u.p.repeat_count <= 0)
2943 {
2944 if (dtp->u.p.input_complete)
2945 return true;
2946 if (dtp->u.p.at_eol)
2947 finish_separator (dtp);
2948 if (dtp->u.p.input_complete)
2949 return true;
2950
2951 dtp->u.p.saved_type = BT_UNKNOWN;
2952 free_saved (dtp);
2953
2954 switch (nl->type)
2955 {
2956 case BT_INTEGER:
2957 read_integer (dtp, len);
2958 break;
2959
2960 case BT_LOGICAL:
2961 read_logical (dtp, len);
2962 break;
2963
2964 case BT_CHARACTER:
2965 read_character (dtp, len);
2966 break;
2967
2968 case BT_REAL:
2969 /* Need to copy data back from the real location to the temp in
2970 order to handle nml reads into arrays. */
2971 read_real (dtp, pdata, len);
2972 memcpy (dtp->u.p.value, pdata, dlen);
2973 break;
2974
2975 case BT_COMPLEX:
2976 /* Same as for REAL, copy back to temp. */
2977 read_complex (dtp, pdata, len, dlen);
2978 memcpy (dtp->u.p.value, pdata, dlen);
2979 break;
2980
2981 case BT_DERIVED:
2982 case BT_CLASS:
2983 /* If this object has a User Defined procedure, call it. */
2984 if (nl->dtio_sub != NULL)
2985 {
2986 int unit = dtp->u.p.current_unit->unit_number;
2987 char iotype[] = "NAMELIST";
2988 gfc_charlen_type iotype_len = 8;
2989 char tmp_iomsg[IOMSG_LEN] = "";
2990 char *child_iomsg;
2991 gfc_charlen_type child_iomsg_len;
2992 int noiostat;
2993 int *child_iostat = NULL;
2994 gfc_array_i4 vlist;
2995 formatted_dtio dtio_ptr = (formatted_dtio)nl->dtio_sub;
2996
2997 GFC_DESCRIPTOR_DATA(&vlist) = NULL;
2998 GFC_DIMENSION_SET(vlist.dim[0],1, 0, 0);
2999
3000 list_obj.vptr = nl->vtable;
3001 list_obj.len = 0;
3002
3003 /* Set iostat, intent(out). */
3004 noiostat = 0;
3005 child_iostat = (dtp->common.flags & IOPARM_HAS_IOSTAT) ?
3006 dtp->common.iostat : &noiostat;
3007
3008 /* Set iomsg, intent(inout). */
3009 if (dtp->common.flags & IOPARM_HAS_IOMSG)
3010 {
3011 child_iomsg = dtp->common.iomsg;
3012 child_iomsg_len = dtp->common.iomsg_len;
3013 }
3014 else
3015 {
3016 child_iomsg = tmp_iomsg;
3017 child_iomsg_len = IOMSG_LEN;
3018 }
3019
3020 /* Call the user defined formatted READ procedure. */
3021 dtp->u.p.current_unit->child_dtio++;
3022 dtio_ptr ((void *)&list_obj, &unit, iotype, &vlist,
3023 child_iostat, child_iomsg,
3024 iotype_len, child_iomsg_len);
3025 dtp->u.p.child_saved_iostat = *child_iostat;
3026 dtp->u.p.current_unit->child_dtio--;
3027 goto incr_idx;
3028 }
3029
3030 /* Must be default derived type namelist read. */
3031 obj_name_len = strlen (nl->var_name) + 1;
3032 obj_name = xmalloc (obj_name_len+1);
3033 memcpy (obj_name, nl->var_name, obj_name_len-1);
3034 memcpy (obj_name + obj_name_len - 1, "%", 2);
3035
3036 /* If reading a derived type, disable the expanded read warning
3037 since a single object can have multiple reads. */
3038 dtp->u.p.expanded_read = 0;
3039
3040 /* Now loop over the components. */
3041
3042 for (cmp = nl->next;
3043 cmp &&
3044 !strncmp (cmp->var_name, obj_name, obj_name_len);
3045 cmp = cmp->next)
3046 {
3047 /* Jump over nested derived type by testing if the potential
3048 component name contains '%'. */
3049 if (strchr (cmp->var_name + obj_name_len, '%'))
3050 continue;
3051
3052 if (!nml_read_obj (dtp, cmp, (index_type)(pdata - nl->mem_pos),
3053 pprev_nl, nml_err_msg, nml_err_msg_size,
3054 clow, chigh))
3055 {
3056 free (obj_name);
3057 return false;
3058 }
3059
3060 if (dtp->u.p.input_complete)
3061 {
3062 free (obj_name);
3063 return true;
3064 }
3065 }
3066
3067 free (obj_name);
3068 goto incr_idx;
3069
3070 default:
3071 snprintf (nml_err_msg, nml_err_msg_size,
3072 "Bad type for namelist object %s", nl->var_name);
3073 internal_error (&dtp->common, nml_err_msg);
3074 goto nml_err_ret;
3075 }
3076 }
3077
3078 /* The standard permits array data to stop short of the number of
3079 elements specified in the loop specification. In this case, we
3080 should be here with dtp->u.p.nml_read_error != 0. Control returns to
3081 nml_get_obj_data and an attempt is made to read object name. */
3082
3083 *pprev_nl = nl;
3084 if (dtp->u.p.nml_read_error)
3085 {
3086 dtp->u.p.expanded_read = 0;
3087 return true;
3088 }
3089
3090 if (dtp->u.p.saved_type == BT_UNKNOWN)
3091 {
3092 dtp->u.p.expanded_read = 0;
3093 goto incr_idx;
3094 }
3095
3096 switch (dtp->u.p.saved_type)
3097 {
3098
3099 case BT_COMPLEX:
3100 case BT_REAL:
3101 case BT_INTEGER:
3102 case BT_LOGICAL:
3103 memcpy (pdata, dtp->u.p.value, dlen);
3104 break;
3105
3106 case BT_CHARACTER:
3107 if (dlen < dtp->u.p.saved_used)
3108 {
3109 if (compile_options.bounds_check)
3110 {
3111 snprintf (nml_err_msg, nml_err_msg_size,
3112 "Namelist object '%s' truncated on read.",
3113 nl->var_name);
3114 generate_warning (&dtp->common, nml_err_msg);
3115 }
3116 m = dlen;
3117 }
3118 else
3119 m = dtp->u.p.saved_used;
3120
3121 if (dtp->u.p.current_unit->flags.encoding == ENCODING_UTF8)
3122 {
3123 gfc_char4_t *q4, *p4 = pdata;
3124 int i;
3125
3126 q4 = (gfc_char4_t *) dtp->u.p.saved_string;
3127 p4 += clow -1;
3128 for (i = 0; i < m; i++)
3129 *p4++ = *q4++;
3130 if (m < dlen)
3131 for (i = 0; i < dlen - m; i++)
3132 *p4++ = (gfc_char4_t) ' ';
3133 }
3134 else
3135 {
3136 pdata = (void*)( pdata + clow - 1 );
3137 memcpy (pdata, dtp->u.p.saved_string, m);
3138 if (m < dlen)
3139 memset ((void*)( pdata + m ), ' ', dlen - m);
3140 }
3141 break;
3142
3143 default:
3144 break;
3145 }
3146
3147 /* Warn if a non-standard expanded read occurs. A single read of a
3148 single object is acceptable. If a second read occurs, issue a warning
3149 and set the flag to zero to prevent further warnings. */
3150 if (dtp->u.p.expanded_read == 2)
3151 {
3152 notify_std (&dtp->common, GFC_STD_GNU, "Non-standard expanded namelist read.");
3153 dtp->u.p.expanded_read = 0;
3154 }
3155
3156 /* If the expanded read warning flag is set, increment it,
3157 indicating that a single read has occurred. */
3158 if (dtp->u.p.expanded_read >= 1)
3159 dtp->u.p.expanded_read++;
3160
3161 /* Break out of loop if scalar. */
3162 if (!nl->var_rank)
3163 break;
3164
3165 /* Now increment the index vector. */
3166
3167 incr_idx:
3168
3169 nml_carry = 1;
3170 for (dim = 0; dim < nl->var_rank; dim++)
3171 {
3172 nl->ls[dim].idx += nml_carry * nl->ls[dim].step;
3173 nml_carry = 0;
3174 if (((nl->ls[dim].step > 0) && (nl->ls[dim].idx > nl->ls[dim].end))
3175 ||
3176 ((nl->ls[dim].step < 0) && (nl->ls[dim].idx < nl->ls[dim].end)))
3177 {
3178 nl->ls[dim].idx = nl->ls[dim].start;
3179 nml_carry = 1;
3180 }
3181 }
3182 } while (!nml_carry);
3183
3184 if (dtp->u.p.repeat_count > 1)
3185 {
3186 snprintf (nml_err_msg, nml_err_msg_size,
3187 "Repeat count too large for namelist object %s", nl->var_name);
3188 goto nml_err_ret;
3189 }
3190 return true;
3191
3192 nml_err_ret:
3193
3194 return false;
3195 }
3196
3197 /* Parses the object name, including array and substring qualifiers. It
3198 iterates over derived type components, touching those components and
3199 setting their loop specifications, if there is a qualifier. If the
3200 object is itself a derived type, its components and subcomponents are
3201 touched. nml_read_obj is called at the end and this reads the data in
3202 the manner specified by the object name. */
3203
3204 static bool
3205 nml_get_obj_data (st_parameter_dt *dtp, namelist_info **pprev_nl,
3206 char *nml_err_msg, size_t nml_err_msg_size)
3207 {
3208 int c;
3209 namelist_info *nl;
3210 namelist_info *first_nl = NULL;
3211 namelist_info *root_nl = NULL;
3212 int dim, parsed_rank;
3213 int component_flag, qualifier_flag;
3214 index_type clow, chigh;
3215 int non_zero_rank_count;
3216
3217 /* Look for end of input or object name. If '?' or '=?' are encountered
3218 in stdin, print the node names or the namelist to stdout. */
3219
3220 eat_separator (dtp);
3221 if (dtp->u.p.input_complete)
3222 return true;
3223
3224 if (dtp->u.p.at_eol)
3225 finish_separator (dtp);
3226 if (dtp->u.p.input_complete)
3227 return true;
3228
3229 if ((c = next_char (dtp)) == EOF)
3230 goto nml_err_ret;
3231 switch (c)
3232 {
3233 case '=':
3234 if ((c = next_char (dtp)) == EOF)
3235 goto nml_err_ret;
3236 if (c != '?')
3237 {
3238 snprintf (nml_err_msg, nml_err_msg_size,
3239 "namelist read: misplaced = sign");
3240 goto nml_err_ret;
3241 }
3242 nml_query (dtp, '=');
3243 return true;
3244
3245 case '?':
3246 nml_query (dtp, '?');
3247 return true;
3248
3249 case '$':
3250 case '&':
3251 nml_match_name (dtp, "end", 3);
3252 if (dtp->u.p.nml_read_error)
3253 {
3254 snprintf (nml_err_msg, nml_err_msg_size,
3255 "namelist not terminated with / or &end");
3256 goto nml_err_ret;
3257 }
3258 /* Fall through. */
3259 case '/':
3260 dtp->u.p.input_complete = 1;
3261 return true;
3262
3263 default :
3264 break;
3265 }
3266
3267 /* Untouch all nodes of the namelist and reset the flags that are set for
3268 derived type components. */
3269
3270 nml_untouch_nodes (dtp);
3271 component_flag = 0;
3272 qualifier_flag = 0;
3273 non_zero_rank_count = 0;
3274
3275 /* Get the object name - should '!' and '\n' be permitted separators? */
3276
3277 get_name:
3278
3279 free_saved (dtp);
3280
3281 do
3282 {
3283 if (!is_separator (c))
3284 push_char_default (dtp, tolower(c));
3285 if ((c = next_char (dtp)) == EOF)
3286 goto nml_err_ret;
3287 }
3288 while (!( c=='=' || c==' ' || c=='\t' || c =='(' || c =='%' ));
3289
3290 unget_char (dtp, c);
3291
3292 /* Check that the name is in the namelist and get pointer to object.
3293 Three error conditions exist: (i) An attempt is being made to
3294 identify a non-existent object, following a failed data read or
3295 (ii) The object name does not exist or (iii) Too many data items
3296 are present for an object. (iii) gives the same error message
3297 as (i) */
3298
3299 push_char_default (dtp, '\0');
3300
3301 if (component_flag)
3302 {
3303 #define EXT_STACK_SZ 100
3304 char ext_stack[EXT_STACK_SZ];
3305 char *ext_name;
3306 size_t var_len = strlen (root_nl->var_name);
3307 size_t saved_len
3308 = dtp->u.p.saved_string ? strlen (dtp->u.p.saved_string) : 0;
3309 size_t ext_size = var_len + saved_len + 1;
3310
3311 if (ext_size > EXT_STACK_SZ)
3312 ext_name = xmalloc (ext_size);
3313 else
3314 ext_name = ext_stack;
3315
3316 memcpy (ext_name, root_nl->var_name, var_len);
3317 if (dtp->u.p.saved_string)
3318 memcpy (ext_name + var_len, dtp->u.p.saved_string, saved_len);
3319 ext_name[var_len + saved_len] = '\0';
3320 nl = find_nml_node (dtp, ext_name);
3321
3322 if (ext_size > EXT_STACK_SZ)
3323 free (ext_name);
3324 }
3325 else
3326 nl = find_nml_node (dtp, dtp->u.p.saved_string);
3327
3328 if (nl == NULL)
3329 {
3330 if (dtp->u.p.nml_read_error && *pprev_nl)
3331 snprintf (nml_err_msg, nml_err_msg_size,
3332 "Bad data for namelist object %s", (*pprev_nl)->var_name);
3333
3334 else
3335 snprintf (nml_err_msg, nml_err_msg_size,
3336 "Cannot match namelist object name %s",
3337 dtp->u.p.saved_string);
3338
3339 goto nml_err_ret;
3340 }
3341
3342 /* Get the length, data length, base pointer and rank of the variable.
3343 Set the default loop specification first. */
3344
3345 for (dim=0; dim < nl->var_rank; dim++)
3346 {
3347 nl->ls[dim].step = 1;
3348 nl->ls[dim].end = GFC_DESCRIPTOR_UBOUND(nl,dim);
3349 nl->ls[dim].start = GFC_DESCRIPTOR_LBOUND(nl,dim);
3350 nl->ls[dim].idx = nl->ls[dim].start;
3351 }
3352
3353 /* Check to see if there is a qualifier: if so, parse it.*/
3354
3355 if (c == '(' && nl->var_rank)
3356 {
3357 parsed_rank = 0;
3358 if (!nml_parse_qualifier (dtp, nl->dim, nl->ls, nl->var_rank,
3359 nl->type, nml_err_msg, nml_err_msg_size,
3360 &parsed_rank))
3361 {
3362 char *nml_err_msg_end = strchr (nml_err_msg, '\0');
3363 snprintf (nml_err_msg_end,
3364 nml_err_msg_size - (nml_err_msg_end - nml_err_msg),
3365 " for namelist variable %s", nl->var_name);
3366 goto nml_err_ret;
3367 }
3368 if (parsed_rank > 0)
3369 non_zero_rank_count++;
3370
3371 qualifier_flag = 1;
3372
3373 if ((c = next_char (dtp)) == EOF)
3374 goto nml_err_ret;
3375 unget_char (dtp, c);
3376 }
3377 else if (nl->var_rank > 0)
3378 non_zero_rank_count++;
3379
3380 /* Now parse a derived type component. The root namelist_info address
3381 is backed up, as is the previous component level. The component flag
3382 is set and the iteration is made by jumping back to get_name. */
3383
3384 if (c == '%')
3385 {
3386 if (nl->type != BT_DERIVED)
3387 {
3388 snprintf (nml_err_msg, nml_err_msg_size,
3389 "Attempt to get derived component for %s", nl->var_name);
3390 goto nml_err_ret;
3391 }
3392
3393 /* Don't move first_nl further in the list if a qualifier was found. */
3394 if ((*pprev_nl == NULL && !qualifier_flag) || !component_flag)
3395 first_nl = nl;
3396
3397 root_nl = nl;
3398
3399 component_flag = 1;
3400 if ((c = next_char (dtp)) == EOF)
3401 goto nml_err_ret;
3402 goto get_name;
3403 }
3404
3405 /* Parse a character qualifier, if present. chigh = 0 is a default
3406 that signals that the string length = string_length. */
3407
3408 clow = 1;
3409 chigh = 0;
3410
3411 if (c == '(' && nl->type == BT_CHARACTER)
3412 {
3413 descriptor_dimension chd[1] = { {1, clow, nl->string_length} };
3414 array_loop_spec ind[1] = { {1, clow, nl->string_length, 1} };
3415
3416 if (!nml_parse_qualifier (dtp, chd, ind, -1, nl->type,
3417 nml_err_msg, nml_err_msg_size, &parsed_rank))
3418 {
3419 char *nml_err_msg_end = strchr (nml_err_msg, '\0');
3420 snprintf (nml_err_msg_end,
3421 nml_err_msg_size - (nml_err_msg_end - nml_err_msg),
3422 " for namelist variable %s", nl->var_name);
3423 goto nml_err_ret;
3424 }
3425
3426 clow = ind[0].start;
3427 chigh = ind[0].end;
3428
3429 if (ind[0].step != 1)
3430 {
3431 snprintf (nml_err_msg, nml_err_msg_size,
3432 "Step not allowed in substring qualifier"
3433 " for namelist object %s", nl->var_name);
3434 goto nml_err_ret;
3435 }
3436
3437 if ((c = next_char (dtp)) == EOF)
3438 goto nml_err_ret;
3439 unget_char (dtp, c);
3440 }
3441
3442 /* Make sure no extraneous qualifiers are there. */
3443
3444 if (c == '(')
3445 {
3446 snprintf (nml_err_msg, nml_err_msg_size,
3447 "Qualifier for a scalar or non-character namelist object %s",
3448 nl->var_name);
3449 goto nml_err_ret;
3450 }
3451
3452 /* Make sure there is no more than one non-zero rank object. */
3453 if (non_zero_rank_count > 1)
3454 {
3455 snprintf (nml_err_msg, nml_err_msg_size,
3456 "Multiple sub-objects with non-zero rank in namelist object %s",
3457 nl->var_name);
3458 non_zero_rank_count = 0;
3459 goto nml_err_ret;
3460 }
3461
3462 /* According to the standard, an equal sign MUST follow an object name. The
3463 following is possibly lax - it allows comments, blank lines and so on to
3464 intervene. eat_spaces (dtp); c = next_char (dtp); would be compliant*/
3465
3466 free_saved (dtp);
3467
3468 eat_separator (dtp);
3469 if (dtp->u.p.input_complete)
3470 return true;
3471
3472 if (dtp->u.p.at_eol)
3473 finish_separator (dtp);
3474 if (dtp->u.p.input_complete)
3475 return true;
3476
3477 if ((c = next_char (dtp)) == EOF)
3478 goto nml_err_ret;
3479
3480 if (c != '=')
3481 {
3482 snprintf (nml_err_msg, nml_err_msg_size,
3483 "Equal sign must follow namelist object name %s",
3484 nl->var_name);
3485 goto nml_err_ret;
3486 }
3487
3488 /* If a derived type, touch its components and restore the root
3489 namelist_info if we have parsed a qualified derived type
3490 component. */
3491
3492 if (nl->type == BT_DERIVED && nl->dtio_sub == NULL)
3493 nml_touch_nodes (nl);
3494
3495 if (first_nl)
3496 {
3497 if (first_nl->var_rank == 0)
3498 {
3499 if (component_flag && qualifier_flag)
3500 nl = first_nl;
3501 }
3502 else
3503 nl = first_nl;
3504 }
3505
3506 dtp->u.p.nml_read_error = 0;
3507 if (!nml_read_obj (dtp, nl, 0, pprev_nl, nml_err_msg, nml_err_msg_size,
3508 clow, chigh))
3509 goto nml_err_ret;
3510
3511 return true;
3512
3513 nml_err_ret:
3514
3515 /* The EOF error message is issued by hit_eof. Return true so that the
3516 caller does not use nml_err_msg and nml_err_msg_size to generate
3517 an unrelated error message. */
3518 if (c == EOF)
3519 {
3520 dtp->u.p.input_complete = 1;
3521 unget_char (dtp, c);
3522 hit_eof (dtp);
3523 return true;
3524 }
3525 return false;
3526 }
3527
3528 /* Entry point for namelist input. Goes through input until namelist name
3529 is matched. Then cycles through nml_get_obj_data until the input is
3530 completed or there is an error. */
3531
3532 void
3533 namelist_read (st_parameter_dt *dtp)
3534 {
3535 int c;
3536 char nml_err_msg[200];
3537
3538 /* Initialize the error string buffer just in case we get an unexpected fail
3539 somewhere and end up at nml_err_ret. */
3540 strcpy (nml_err_msg, "Internal namelist read error");
3541
3542 /* Pointer to the previously read object, in case attempt is made to read
3543 new object name. Should this fail, error message can give previous
3544 name. */
3545 namelist_info *prev_nl = NULL;
3546
3547 dtp->u.p.input_complete = 0;
3548 dtp->u.p.expanded_read = 0;
3549
3550 /* Set the next_char and push_char worker functions. */
3551 set_workers (dtp);
3552
3553 /* Look for &namelist_name . Skip all characters, testing for $nmlname.
3554 Exit on success or EOF. If '?' or '=?' encountered in stdin, print
3555 node names or namelist on stdout. */
3556
3557 find_nml_name:
3558 c = next_char (dtp);
3559 switch (c)
3560 {
3561 case '$':
3562 case '&':
3563 break;
3564
3565 case '!':
3566 eat_line (dtp);
3567 goto find_nml_name;
3568
3569 case '=':
3570 c = next_char (dtp);
3571 if (c == '?')
3572 nml_query (dtp, '=');
3573 else
3574 unget_char (dtp, c);
3575 goto find_nml_name;
3576
3577 case '?':
3578 nml_query (dtp, '?');
3579 goto find_nml_name;
3580
3581 case EOF:
3582 return;
3583
3584 default:
3585 goto find_nml_name;
3586 }
3587
3588 /* Match the name of the namelist. */
3589
3590 nml_match_name (dtp, dtp->namelist_name, dtp->namelist_name_len);
3591
3592 if (dtp->u.p.nml_read_error)
3593 goto find_nml_name;
3594
3595 /* A trailing space is required, we give a little latitude here, 10.9.1. */
3596 c = next_char (dtp);
3597 if (!is_separator(c) && c != '!')
3598 {
3599 unget_char (dtp, c);
3600 goto find_nml_name;
3601 }
3602
3603 unget_char (dtp, c);
3604 eat_separator (dtp);
3605
3606 /* Ready to read namelist objects. If there is an error in input
3607 from stdin, output the error message and continue. */
3608
3609 while (!dtp->u.p.input_complete)
3610 {
3611 if (!nml_get_obj_data (dtp, &prev_nl, nml_err_msg, sizeof nml_err_msg))
3612 {
3613 if (dtp->u.p.current_unit->unit_number != options.stdin_unit)
3614 goto nml_err_ret;
3615 generate_error (&dtp->common, LIBERROR_READ_VALUE, nml_err_msg);
3616 }
3617
3618 /* Reset the previous namelist pointer if we know we are not going
3619 to be doing multiple reads within a single namelist object. */
3620 if (prev_nl && prev_nl->var_rank == 0)
3621 prev_nl = NULL;
3622 }
3623
3624 free_saved (dtp);
3625 free_line (dtp);
3626 return;
3627
3628
3629 nml_err_ret:
3630
3631 /* All namelist error calls return from here */
3632 free_saved (dtp);
3633 free_line (dtp);
3634 generate_error (&dtp->common, LIBERROR_READ_VALUE, nml_err_msg);
3635 return;
3636 }