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