1 /* Copyright (C) 2002-2022 Free Software Foundation, Inc.
2 Contributed by Andy Vaught
3 Namelist input contributed by Paul Thomas
4 F2003 I/O support contributed by Jerry DeLisle
6 This file is part of the GNU Fortran runtime library (libgfortran).
8 Libgfortran is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3, or (at your option)
13 Libgfortran is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 Under Section 7 of GPL version 3, you are granted additional
19 permissions described in the GCC Runtime Library Exception, version
20 3.1, as published by the Free Software Foundation.
22 You should have received a copy of the GNU General Public License and
23 a copy of the GCC Runtime Library Exception along with this program;
24 see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
25 <http://www.gnu.org/licenses/>. */
33 typedef unsigned char uchar
;
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
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
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'
53 #define CASE_SEPARATORS /* Fall through. */ \
54 case ' ': case ',': case '/': case '\n': \
55 case '\t': case '\r': case ';'
57 /* This macro assumes that we're operating on a variable. */
59 #define is_separator(c) (c == '/' || c == ',' || c == '\n' || c == ' ' \
60 || c == '\t' || c == '\r' || c == ';' || \
61 (dtp->u.p.namelist_mode && c == '!'))
63 /* Maximum repeat count. Less than ten times the maximum signed int32. */
65 #define MAX_REPEAT 200000000
71 /* Wrappers for calling the current worker functions. */
73 #define next_char(dtp) ((dtp)->u.p.current_unit->next_char_fn_ptr (dtp))
74 #define push_char(dtp, c) ((dtp)->u.p.current_unit->push_char_fn_ptr (dtp, c))
76 /* Worker function to save a default KIND=1 character to a string
77 buffer, enlarging it as necessary. */
80 push_char_default (st_parameter_dt
*dtp
, int c
)
84 if (dtp
->u
.p
.saved_string
== NULL
)
86 /* Plain malloc should suffice here, zeroing not needed? */
87 dtp
->u
.p
.saved_string
= xcalloc (SCRATCH_SIZE
, 1);
88 dtp
->u
.p
.saved_length
= SCRATCH_SIZE
;
89 dtp
->u
.p
.saved_used
= 0;
92 if (dtp
->u
.p
.saved_used
>= dtp
->u
.p
.saved_length
)
94 dtp
->u
.p
.saved_length
= 2 * dtp
->u
.p
.saved_length
;
95 dtp
->u
.p
.saved_string
=
96 xrealloc (dtp
->u
.p
.saved_string
, dtp
->u
.p
.saved_length
);
99 dtp
->u
.p
.saved_string
[dtp
->u
.p
.saved_used
++] = (char) c
;
103 /* Worker function to save a KIND=4 character to a string buffer,
104 enlarging the buffer as necessary. */
106 push_char4 (st_parameter_dt
*dtp
, int c
)
108 gfc_char4_t
*p
= (gfc_char4_t
*) dtp
->u
.p
.saved_string
;
112 dtp
->u
.p
.saved_string
= xcalloc (SCRATCH_SIZE
, sizeof (gfc_char4_t
));
113 dtp
->u
.p
.saved_length
= SCRATCH_SIZE
;
114 dtp
->u
.p
.saved_used
= 0;
115 p
= (gfc_char4_t
*) dtp
->u
.p
.saved_string
;
118 if (dtp
->u
.p
.saved_used
>= dtp
->u
.p
.saved_length
)
120 dtp
->u
.p
.saved_length
= 2 * dtp
->u
.p
.saved_length
;
121 dtp
->u
.p
.saved_string
=
122 xrealloc (dtp
->u
.p
.saved_string
,
123 dtp
->u
.p
.saved_length
* sizeof (gfc_char4_t
));
124 p
= (gfc_char4_t
*) dtp
->u
.p
.saved_string
;
127 p
[dtp
->u
.p
.saved_used
++] = c
;
131 /* Free the input buffer if necessary. */
134 free_saved (st_parameter_dt
*dtp
)
136 if (dtp
->u
.p
.saved_string
== NULL
)
139 free (dtp
->u
.p
.saved_string
);
141 dtp
->u
.p
.saved_string
= NULL
;
142 dtp
->u
.p
.saved_used
= 0;
146 /* Free the line buffer if necessary. */
149 free_line (st_parameter_dt
*dtp
)
151 dtp
->u
.p
.line_buffer_pos
= 0;
152 dtp
->u
.p
.line_buffer_enabled
= 0;
154 if (dtp
->u
.p
.line_buffer
== NULL
)
157 free (dtp
->u
.p
.line_buffer
);
158 dtp
->u
.p
.line_buffer
= NULL
;
162 /* Unget saves the last character so when reading the next character,
163 we need to check to see if there is a character waiting. Similar,
164 if the line buffer is being used to read_logical, check it too. */
167 check_buffers (st_parameter_dt
*dtp
)
172 if (dtp
->u
.p
.current_unit
->last_char
!= EOF
- 1)
175 c
= dtp
->u
.p
.current_unit
->last_char
;
176 dtp
->u
.p
.current_unit
->last_char
= EOF
- 1;
180 /* Read from line_buffer if enabled. */
182 if (dtp
->u
.p
.line_buffer_enabled
)
186 c
= dtp
->u
.p
.line_buffer
[dtp
->u
.p
.line_buffer_pos
];
187 if (c
!= '\0' && dtp
->u
.p
.line_buffer_pos
< 64)
189 dtp
->u
.p
.line_buffer
[dtp
->u
.p
.line_buffer_pos
] = '\0';
190 dtp
->u
.p
.line_buffer_pos
++;
194 dtp
->u
.p
.line_buffer_pos
= 0;
195 dtp
->u
.p
.line_buffer_enabled
= 0;
199 dtp
->u
.p
.at_eol
= (c
== '\n' || c
== '\r' || c
== EOF
);
204 /* Worker function for default character encoded file. */
206 next_char_default (st_parameter_dt
*dtp
)
210 /* Always check the unget and line buffer first. */
211 if ((c
= check_buffers (dtp
)))
214 c
= fbuf_getc (dtp
->u
.p
.current_unit
);
215 if (c
!= EOF
&& is_stream_io (dtp
))
216 dtp
->u
.p
.current_unit
->strm_pos
++;
218 dtp
->u
.p
.at_eol
= (c
== '\n' || c
== EOF
);
223 /* Worker function for internal and array I/O units. */
225 next_char_internal (st_parameter_dt
*dtp
)
231 /* Always check the unget and line buffer first. */
232 if ((c
= check_buffers (dtp
)))
235 /* Handle the end-of-record and end-of-file conditions for
236 internal array unit. */
237 if (is_array_io (dtp
))
242 /* Check for "end-of-record" condition. */
243 if (dtp
->u
.p
.current_unit
->bytes_left
== 0)
248 record
= next_array_record (dtp
, dtp
->u
.p
.current_unit
->ls
,
251 /* Check for "end-of-file" condition. */
258 record
*= dtp
->u
.p
.current_unit
->recl
;
259 if (sseek (dtp
->u
.p
.current_unit
->s
, record
, SEEK_SET
) < 0)
262 dtp
->u
.p
.current_unit
->bytes_left
= dtp
->u
.p
.current_unit
->recl
;
267 /* Get the next character and handle end-of-record conditions. */
268 if (likely (dtp
->u
.p
.current_unit
->bytes_left
> 0))
270 if (unlikely (is_char4_unit(dtp
))) /* Check for kind=4 internal unit. */
271 length
= sread (dtp
->u
.p
.current_unit
->s
, &c
, 1);
275 length
= sread (dtp
->u
.p
.current_unit
->s
, &cc
, 1);
282 if (unlikely (length
< 0))
284 generate_error (&dtp
->common
, LIBERROR_OS
, NULL
);
288 if (is_array_io (dtp
))
290 /* Check whether we hit EOF. */
291 if (unlikely (length
== 0))
293 generate_error (&dtp
->common
, LIBERROR_INTERNAL_UNIT
, NULL
);
307 dtp
->u
.p
.current_unit
->bytes_left
--;
310 dtp
->u
.p
.at_eol
= (c
== '\n' || c
== EOF
);
315 /* Worker function for UTF encoded files. */
317 next_char_utf8 (st_parameter_dt
*dtp
)
319 static const uchar masks
[6] = { 0x7F, 0x1F, 0x0F, 0x07, 0x02, 0x01 };
320 static const uchar patns
[6] = { 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC };
324 /* Always check the unget and line buffer first. */
325 if (!(c
= check_buffers (dtp
)))
326 c
= fbuf_getc (dtp
->u
.p
.current_unit
);
331 /* The number of leading 1-bits in the first byte indicates how many
333 for (nb
= 2; nb
< 7; nb
++)
334 if ((c
& ~masks
[nb
-1]) == patns
[nb
-1])
339 c
= (c
& masks
[nb
-1]);
341 /* Decode the bytes read. */
342 for (i
= 1; i
< nb
; i
++)
344 gfc_char4_t n
= fbuf_getc (dtp
->u
.p
.current_unit
);
345 if ((n
& 0xC0) != 0x80)
347 c
= ((c
<< 6) + (n
& 0x3F));
350 /* Make sure the shortest possible encoding was used. */
351 if (c
<= 0x7F && nb
> 1) goto invalid
;
352 if (c
<= 0x7FF && nb
> 2) goto invalid
;
353 if (c
<= 0xFFFF && nb
> 3) goto invalid
;
354 if (c
<= 0x1FFFFF && nb
> 4) goto invalid
;
355 if (c
<= 0x3FFFFFF && nb
> 5) goto invalid
;
357 /* Make sure the character is valid. */
358 if (c
> 0x7FFFFFFF || (c
>= 0xD800 && c
<= 0xDFFF))
362 dtp
->u
.p
.at_eol
= (c
== '\n' || c
== (gfc_char4_t
) EOF
);
366 generate_error (&dtp
->common
, LIBERROR_READ_VALUE
, "Invalid UTF-8 encoding");
367 return (gfc_char4_t
) '?';
370 /* Push a character back onto the input. */
373 unget_char (st_parameter_dt
*dtp
, int c
)
375 dtp
->u
.p
.current_unit
->last_char
= c
;
379 /* Skip over spaces in the input. Returns the nonspace character that
380 terminated the eating and also places it back on the input. */
383 eat_spaces (st_parameter_dt
*dtp
)
387 /* If internal character array IO, peak ahead and seek past spaces.
388 This is an optimization unique to character arrays with large
389 character lengths (PR38199). This code eliminates numerous calls
390 to next_character. */
391 if (is_array_io (dtp
) && (dtp
->u
.p
.current_unit
->last_char
== EOF
- 1))
393 gfc_offset offset
= stell (dtp
->u
.p
.current_unit
->s
);
396 if (is_char4_unit(dtp
)) /* kind=4 */
398 for (i
= 0; i
< dtp
->u
.p
.current_unit
->bytes_left
; i
++)
400 if (dtp
->internal_unit
[(offset
+ i
) * sizeof (gfc_char4_t
)]
407 for (i
= 0; i
< dtp
->u
.p
.current_unit
->bytes_left
; i
++)
409 if (dtp
->internal_unit
[offset
+ i
] != ' ')
416 sseek (dtp
->u
.p
.current_unit
->s
, offset
+ i
, SEEK_SET
);
417 dtp
->u
.p
.current_unit
->bytes_left
-= i
;
421 /* Now skip spaces, EOF and EOL are handled in next_char. */
424 while (c
!= EOF
&& (c
== ' ' || c
== '\r' || c
== '\t'));
431 /* This function reads characters through to the end of the current
432 line and just ignores them. Returns 0 for success and LIBERROR_END
436 eat_line (st_parameter_dt
*dtp
)
442 while (c
!= EOF
&& c
!= '\n');
449 /* Skip over a separator. Technically, we don't always eat the whole
450 separator. This is because if we've processed the last input item,
451 then a separator is unnecessary. Plus the fact that operating
452 systems usually deliver console input on a line basis.
454 The upshot is that if we see a newline as part of reading a
455 separator, we stop reading. If there are more input items, we
456 continue reading the separator with finish_separator() which takes
457 care of the fact that we may or may not have seen a comma as part
460 Returns 0 for success, and non-zero error code otherwise. */
463 eat_separator (st_parameter_dt
*dtp
)
469 dtp
->u
.p
.comma_flag
= 0;
471 if ((c
= next_char (dtp
)) == EOF
)
476 if (dtp
->u
.p
.current_unit
->decimal_status
== DECIMAL_COMMA
)
483 dtp
->u
.p
.comma_flag
= 1;
488 dtp
->u
.p
.input_complete
= 1;
492 if ((n
= next_char(dtp
)) == EOF
)
502 if (dtp
->u
.p
.namelist_mode
)
506 if ((c
= next_char (dtp
)) == EOF
)
510 err
= eat_line (dtp
);
516 while (c
== '\n' || c
== '\r' || c
== ' ' || c
== '\t');
522 /* Eat a namelist comment. */
523 if (dtp
->u
.p
.namelist_mode
)
525 err
= eat_line (dtp
);
532 /* Fall Through... */
542 /* Finish processing a separator that was interrupted by a newline.
543 If we're here, then another data item is present, so we finish what
544 we started on the previous line. Return 0 on success, error code
548 finish_separator (st_parameter_dt
*dtp
)
551 int err
= LIBERROR_OK
;
556 if ((c
= next_char (dtp
)) == EOF
)
561 if (dtp
->u
.p
.comma_flag
)
565 if ((c
= eat_spaces (dtp
)) == EOF
)
567 if (c
== '\n' || c
== '\r')
574 dtp
->u
.p
.input_complete
= 1;
575 if (!dtp
->u
.p
.namelist_mode
)
584 if (dtp
->u
.p
.namelist_mode
)
586 err
= eat_line (dtp
);
600 /* This function is needed to catch bad conversions so that namelist can
601 attempt to see if dtp->u.p.saved_string contains a new object name rather
605 nml_bad_return (st_parameter_dt
*dtp
, char c
)
607 if (dtp
->u
.p
.namelist_mode
)
609 dtp
->u
.p
.nml_read_error
= 1;
616 /* Convert an unsigned string to an integer. The length value is -1
617 if we are working on a repeat count. Returns nonzero if we have a
618 range problem. As a side effect, frees the dtp->u.p.saved_string. */
621 convert_integer (st_parameter_dt
*dtp
, int length
, int negative
)
623 char c
, *buffer
, message
[MSGLEN
];
625 GFC_UINTEGER_LARGEST v
, max
, max10
;
626 GFC_INTEGER_LARGEST value
;
628 buffer
= dtp
->u
.p
.saved_string
;
635 max
= si_max (length
);
665 set_integer (dtp
->u
.p
.value
, value
, length
);
669 dtp
->u
.p
.repeat_count
= v
;
671 if (dtp
->u
.p
.repeat_count
== 0)
673 snprintf (message
, MSGLEN
, "Zero repeat count in item %d of list input",
674 dtp
->u
.p
.item_count
);
676 generate_error (&dtp
->common
, LIBERROR_READ_VALUE
, message
);
686 snprintf (message
, MSGLEN
, "Repeat count overflow in item %d of list input",
687 dtp
->u
.p
.item_count
);
689 snprintf (message
, MSGLEN
, "Integer overflow while reading item %d",
690 dtp
->u
.p
.item_count
);
693 generate_error (&dtp
->common
, LIBERROR_READ_VALUE
, message
);
699 /* Parse a repeat count for logical and complex values which cannot
700 begin with a digit. Returns nonzero if we are done, zero if we
701 should continue on. */
704 parse_repeat (st_parameter_dt
*dtp
)
706 char message
[MSGLEN
];
709 if ((c
= next_char (dtp
)) == EOF
)
733 repeat
= 10 * repeat
+ c
- '0';
735 if (repeat
> MAX_REPEAT
)
737 snprintf (message
, MSGLEN
,
738 "Repeat count overflow in item %d of list input",
739 dtp
->u
.p
.item_count
);
741 generate_error (&dtp
->common
, LIBERROR_READ_VALUE
, message
);
750 snprintf (message
, MSGLEN
,
751 "Zero repeat count in item %d of list input",
752 dtp
->u
.p
.item_count
);
754 generate_error (&dtp
->common
, LIBERROR_READ_VALUE
, message
);
766 dtp
->u
.p
.repeat_count
= repeat
;
780 snprintf (message
, MSGLEN
, "Bad repeat count in item %d of list input",
781 dtp
->u
.p
.item_count
);
782 generate_error (&dtp
->common
, LIBERROR_READ_VALUE
, message
);
787 /* To read a logical we have to look ahead in the input stream to make sure
788 there is not an equal sign indicating a variable name. To do this we use
789 line_buffer to point to a temporary buffer, pushing characters there for
790 possible later reading. */
793 l_push_char (st_parameter_dt
*dtp
, char c
)
795 if (dtp
->u
.p
.line_buffer
== NULL
)
796 dtp
->u
.p
.line_buffer
= xcalloc (SCRATCH_SIZE
, 1);
798 dtp
->u
.p
.line_buffer
[dtp
->u
.p
.line_buffer_pos
++] = c
;
802 /* Read a logical character on the input. */
805 read_logical (st_parameter_dt
*dtp
, int length
)
807 char message
[MSGLEN
];
810 if (parse_repeat (dtp
))
813 c
= safe_tolower (next_char (dtp
));
814 l_push_char (dtp
, c
);
820 l_push_char (dtp
, c
);
822 if (!is_separator(c
) && c
!= EOF
)
830 l_push_char (dtp
, c
);
832 if (!is_separator(c
) && c
!= EOF
)
839 c
= safe_tolower (next_char (dtp
));
855 if (!dtp
->u
.p
.namelist_mode
)
862 return; /* Null value. */
865 /* Save the character in case it is the beginning
866 of the next object name. */
871 dtp
->u
.p
.saved_type
= BT_LOGICAL
;
872 dtp
->u
.p
.saved_length
= length
;
874 /* Eat trailing garbage. */
877 while (c
!= EOF
&& !is_separator (c
));
881 set_integer ((int *) dtp
->u
.p
.value
, v
, length
);
888 for(i
= 0; i
< 63; i
++)
893 /* All done if this is not a namelist read. */
894 if (!dtp
->u
.p
.namelist_mode
)
907 l_push_char (dtp
, c
);
910 dtp
->u
.p
.nml_read_error
= 1;
911 dtp
->u
.p
.line_buffer_enabled
= 1;
912 dtp
->u
.p
.line_buffer_pos
= 0;
920 if (nml_bad_return (dtp
, c
))
936 snprintf (message
, MSGLEN
, "Bad logical value while reading item %d",
937 dtp
->u
.p
.item_count
);
939 generate_error (&dtp
->common
, LIBERROR_READ_VALUE
, message
);
944 dtp
->u
.p
.saved_type
= BT_LOGICAL
;
945 dtp
->u
.p
.saved_length
= length
;
946 set_integer ((int *) dtp
->u
.p
.value
, v
, length
);
952 /* Reading integers is tricky because we can actually be reading a
953 repeat count. We have to store the characters in a buffer because
954 we could be reading an integer that is larger than the default int
955 used for repeat counts. */
958 read_integer (st_parameter_dt
*dtp
, int length
)
960 char message
[MSGLEN
];
970 /* Fall through... */
973 if ((c
= next_char (dtp
)) == EOF
)
978 if (!dtp
->u
.p
.namelist_mode
)
981 CASE_SEPARATORS
: /* Single null. */
994 /* Take care of what may be a repeat count. */
1006 push_char (dtp
, '\0');
1010 if (!dtp
->u
.p
.namelist_mode
)
1013 CASE_SEPARATORS
: /* Not a repeat count. */
1023 if (convert_integer (dtp
, -1, 0))
1026 /* Get the real integer. */
1028 if ((c
= next_char (dtp
)) == EOF
)
1036 if (!dtp
->u
.p
.namelist_mode
)
1040 unget_char (dtp
, c
);
1041 eat_separator (dtp
);
1046 /* Fall through... */
1049 c
= next_char (dtp
);
1054 if (!safe_isdigit (c
))
1060 c
= next_char (dtp
);
1068 if (!dtp
->u
.p
.namelist_mode
)
1082 if (nml_bad_return (dtp
, c
))
1095 snprintf (message
, MSGLEN
, "Bad integer for item %d in list input",
1096 dtp
->u
.p
.item_count
);
1098 generate_error (&dtp
->common
, LIBERROR_READ_VALUE
, message
);
1103 unget_char (dtp
, c
);
1104 eat_separator (dtp
);
1106 push_char (dtp
, '\0');
1107 if (convert_integer (dtp
, length
, negative
))
1114 dtp
->u
.p
.saved_type
= BT_INTEGER
;
1118 /* Read a character variable. */
1121 read_character (st_parameter_dt
*dtp
, int length
__attribute__ ((unused
)))
1123 char quote
, message
[MSGLEN
];
1126 quote
= ' '; /* Space means no quote character. */
1128 if ((c
= next_char (dtp
)) == EOF
)
1138 unget_char (dtp
, c
); /* NULL value. */
1139 eat_separator (dtp
);
1148 if (dtp
->u
.p
.namelist_mode
)
1150 unget_char (dtp
, c
);
1157 /* Deal with a possible repeat count. */
1161 c
= next_char (dtp
);
1170 unget_char (dtp
, c
);
1171 goto done
; /* String was only digits! */
1174 push_char (dtp
, '\0');
1179 goto get_string
; /* Not a repeat count after all. */
1184 if (convert_integer (dtp
, -1, 0))
1187 /* Now get the real string. */
1189 if ((c
= next_char (dtp
)) == EOF
)
1194 unget_char (dtp
, c
); /* Repeated NULL values. */
1195 eat_separator (dtp
);
1212 if ((c
= next_char (dtp
)) == EOF
)
1224 /* See if we have a doubled quote character or the end of
1227 if ((c
= next_char (dtp
)) == EOF
)
1231 push_char (dtp
, quote
);
1235 unget_char (dtp
, c
);
1241 unget_char (dtp
, c
);
1245 if (c
!= '\n' && c
!= '\r')
1255 /* At this point, we have to have a separator, or else the string is
1258 c
= next_char (dtp
);
1260 if (is_separator (c
) || c
== EOF
)
1262 unget_char (dtp
, c
);
1263 eat_separator (dtp
);
1264 dtp
->u
.p
.saved_type
= BT_CHARACTER
;
1269 snprintf (message
, MSGLEN
, "Invalid string input in item %d",
1270 dtp
->u
.p
.item_count
);
1271 generate_error (&dtp
->common
, LIBERROR_READ_VALUE
, message
);
1283 /* Parse a component of a complex constant or a real number that we
1284 are sure is already there. This is a straight real number parser. */
1287 parse_real (st_parameter_dt
*dtp
, void *buffer
, int length
)
1289 char message
[MSGLEN
];
1292 if ((c
= next_char (dtp
)) == EOF
)
1295 if (c
== '-' || c
== '+')
1298 if ((c
= next_char (dtp
)) == EOF
)
1302 if (c
== ',' && dtp
->u
.p
.current_unit
->decimal_status
== DECIMAL_COMMA
)
1305 if (!safe_isdigit (c
) && c
!= '.')
1307 if (c
== 'i' || c
== 'I' || c
== 'n' || c
== 'N')
1315 seen_dp
= (c
== '.') ? 1 : 0;
1319 if ((c
= next_char (dtp
)) == EOF
)
1321 if (c
== ',' && dtp
->u
.p
.current_unit
->decimal_status
== DECIMAL_COMMA
)
1343 push_char (dtp
, 'e');
1348 push_char (dtp
, 'e');
1350 if ((c
= next_char (dtp
)) == EOF
)
1355 if (!dtp
->u
.p
.namelist_mode
)
1368 if ((c
= next_char (dtp
)) == EOF
)
1370 if (c
!= '-' && c
!= '+')
1371 push_char (dtp
, '+');
1375 c
= next_char (dtp
);
1379 if (!safe_isdigit (c
))
1381 /* Extension: allow default exponent of 0 when omitted. */
1382 if (dtp
->common
.flags
& IOPARM_DT_DEC_EXT
)
1384 push_char (dtp
, '0');
1395 if ((c
= next_char (dtp
)) == EOF
)
1404 if (!dtp
->u
.p
.namelist_mode
)
1409 unget_char (dtp
, c
);
1418 unget_char (dtp
, c
);
1419 push_char (dtp
, '\0');
1421 m
= convert_real (dtp
, buffer
, dtp
->u
.p
.saved_string
, length
);
1427 unget_char (dtp
, c
);
1428 push_char (dtp
, '\0');
1430 m
= convert_infnan (dtp
, buffer
, dtp
->u
.p
.saved_string
, length
);
1436 /* Match INF and Infinity. */
1437 if ((c
== 'i' || c
== 'I')
1438 && ((c
= next_char (dtp
)) == 'n' || c
== 'N')
1439 && ((c
= next_char (dtp
)) == 'f' || c
== 'F'))
1441 c
= next_char (dtp
);
1442 if ((c
!= 'i' && c
!= 'I')
1443 || ((c
== 'i' || c
== 'I')
1444 && ((c
= next_char (dtp
)) == 'n' || c
== 'N')
1445 && ((c
= next_char (dtp
)) == 'i' || c
== 'I')
1446 && ((c
= next_char (dtp
)) == 't' || c
== 'T')
1447 && ((c
= next_char (dtp
)) == 'y' || c
== 'Y')
1448 && (c
= next_char (dtp
))))
1450 if (is_separator (c
) || (c
== EOF
))
1451 unget_char (dtp
, c
);
1452 push_char (dtp
, 'i');
1453 push_char (dtp
, 'n');
1454 push_char (dtp
, 'f');
1458 else if (((c
= next_char (dtp
)) == 'a' || c
== 'A')
1459 && ((c
= next_char (dtp
)) == 'n' || c
== 'N')
1460 && (c
= next_char (dtp
)))
1462 if (is_separator (c
) || (c
== EOF
))
1463 unget_char (dtp
, c
);
1464 push_char (dtp
, 'n');
1465 push_char (dtp
, 'a');
1466 push_char (dtp
, 'n');
1468 /* Match "NAN(alphanum)". */
1471 for ( ; c
!= ')'; c
= next_char (dtp
))
1472 if (is_separator (c
))
1475 c
= next_char (dtp
);
1476 if (is_separator (c
) || (c
== EOF
))
1477 unget_char (dtp
, c
);
1484 if (nml_bad_return (dtp
, c
))
1499 snprintf (message
, MSGLEN
, "Bad complex floating point "
1500 "number for item %d", dtp
->u
.p
.item_count
);
1502 generate_error (&dtp
->common
, LIBERROR_READ_VALUE
, message
);
1508 /* Reading a complex number is straightforward because we can tell
1509 what it is right away. */
1512 read_complex (st_parameter_dt
*dtp
, void *dest
, int kind
, size_t size
)
1514 char message
[MSGLEN
];
1517 if (parse_repeat (dtp
))
1520 c
= next_char (dtp
);
1527 if (!dtp
->u
.p
.namelist_mode
)
1532 unget_char (dtp
, c
);
1533 eat_separator (dtp
);
1542 c
= next_char (dtp
);
1543 if (c
== '\n' || c
== '\r')
1546 unget_char (dtp
, c
);
1548 if (parse_real (dtp
, dest
, kind
))
1553 c
= next_char (dtp
);
1554 if (c
== '\n' || c
== '\r')
1557 unget_char (dtp
, c
);
1560 != (dtp
->u
.p
.current_unit
->decimal_status
== DECIMAL_POINT
? ',' : ';'))
1565 c
= next_char (dtp
);
1566 if (c
== '\n' || c
== '\r')
1569 unget_char (dtp
, c
);
1571 if (parse_real (dtp
, dest
+ size
/ 2, kind
))
1576 c
= next_char (dtp
);
1577 if (c
== '\n' || c
== '\r')
1580 unget_char (dtp
, c
);
1582 if (next_char (dtp
) != ')')
1585 c
= next_char (dtp
);
1586 if (!is_separator (c
) && (c
!= EOF
))
1589 unget_char (dtp
, c
);
1590 eat_separator (dtp
);
1593 dtp
->u
.p
.saved_type
= BT_COMPLEX
;
1598 if (nml_bad_return (dtp
, c
))
1611 snprintf (message
, MSGLEN
, "Bad complex value in item %d of list input",
1612 dtp
->u
.p
.item_count
);
1614 generate_error (&dtp
->common
, LIBERROR_READ_VALUE
, message
);
1618 /* Parse a real number with a possible repeat count. */
1621 read_real (st_parameter_dt
*dtp
, void *dest
, int length
)
1623 char message
[MSGLEN
];
1630 c
= next_char (dtp
);
1631 if (c
== ',' && dtp
->u
.p
.current_unit
->decimal_status
== DECIMAL_COMMA
)
1649 if (!dtp
->u
.p
.namelist_mode
)
1653 unget_char (dtp
, c
); /* Single null. */
1654 eat_separator (dtp
);
1667 /* Get the digit string that might be a repeat count. */
1671 c
= next_char (dtp
);
1672 if (c
== ',' && dtp
->u
.p
.current_unit
->decimal_status
== DECIMAL_COMMA
)
1698 push_char (dtp
, 'e');
1700 c
= next_char (dtp
);
1704 push_char (dtp
, '\0');
1708 if (!dtp
->u
.p
.namelist_mode
)
1713 if (c
!= '\n' && c
!= ',' && c
!= '\r' && c
!= ';')
1714 unget_char (dtp
, c
);
1723 if (convert_integer (dtp
, -1, 0))
1726 /* Now get the number itself. */
1728 if ((c
= next_char (dtp
)) == EOF
)
1730 if (is_separator (c
))
1731 { /* Repeated null value. */
1732 unget_char (dtp
, c
);
1733 eat_separator (dtp
);
1737 if (c
!= '-' && c
!= '+')
1738 push_char (dtp
, '+');
1743 if ((c
= next_char (dtp
)) == EOF
)
1747 if (c
== ',' && dtp
->u
.p
.current_unit
->decimal_status
== DECIMAL_COMMA
)
1750 if (!safe_isdigit (c
) && c
!= '.')
1752 if (c
== 'i' || c
== 'I' || c
== 'n' || c
== 'N')
1771 c
= next_char (dtp
);
1772 if (c
== ',' && dtp
->u
.p
.current_unit
->decimal_status
== DECIMAL_COMMA
)
1781 if (!dtp
->u
.p
.namelist_mode
)
1806 push_char (dtp
, 'e');
1808 c
= next_char (dtp
);
1817 push_char (dtp
, 'e');
1819 if ((c
= next_char (dtp
)) == EOF
)
1821 if (c
!= '+' && c
!= '-')
1822 push_char (dtp
, '+');
1826 c
= next_char (dtp
);
1830 if (!safe_isdigit (c
))
1832 /* Extension: allow default exponent of 0 when omitted. */
1833 if (dtp
->common
.flags
& IOPARM_DT_DEC_EXT
)
1835 push_char (dtp
, '0');
1846 c
= next_char (dtp
);
1855 if (!dtp
->u
.p
.namelist_mode
)
1868 unget_char (dtp
, c
);
1869 eat_separator (dtp
);
1870 push_char (dtp
, '\0');
1871 if (convert_real (dtp
, dest
, dtp
->u
.p
.saved_string
, length
))
1878 dtp
->u
.p
.saved_type
= BT_REAL
;
1882 l_push_char (dtp
, c
);
1885 /* Match INF and Infinity. */
1886 if (c
== 'i' || c
== 'I')
1888 c
= next_char (dtp
);
1889 l_push_char (dtp
, c
);
1890 if (c
!= 'n' && c
!= 'N')
1892 c
= next_char (dtp
);
1893 l_push_char (dtp
, c
);
1894 if (c
!= 'f' && c
!= 'F')
1896 c
= next_char (dtp
);
1897 l_push_char (dtp
, c
);
1898 if (!is_separator (c
) && (c
!= EOF
))
1900 if (c
!= 'i' && c
!= 'I')
1902 c
= next_char (dtp
);
1903 l_push_char (dtp
, c
);
1904 if (c
!= 'n' && c
!= 'N')
1906 c
= next_char (dtp
);
1907 l_push_char (dtp
, c
);
1908 if (c
!= 'i' && c
!= 'I')
1910 c
= next_char (dtp
);
1911 l_push_char (dtp
, c
);
1912 if (c
!= 't' && c
!= 'T')
1914 c
= next_char (dtp
);
1915 l_push_char (dtp
, c
);
1916 if (c
!= 'y' && c
!= 'Y')
1918 c
= next_char (dtp
);
1919 l_push_char (dtp
, c
);
1925 c
= next_char (dtp
);
1926 l_push_char (dtp
, c
);
1927 if (c
!= 'a' && c
!= 'A')
1929 c
= next_char (dtp
);
1930 l_push_char (dtp
, c
);
1931 if (c
!= 'n' && c
!= 'N')
1933 c
= next_char (dtp
);
1934 l_push_char (dtp
, c
);
1936 /* Match NAN(alphanum). */
1939 for (c
= next_char (dtp
); c
!= ')'; c
= next_char (dtp
))
1940 if (is_separator (c
))
1943 l_push_char (dtp
, c
);
1945 l_push_char (dtp
, ')');
1946 c
= next_char (dtp
);
1947 l_push_char (dtp
, c
);
1951 if (!is_separator (c
) && (c
!= EOF
))
1954 if (dtp
->u
.p
.namelist_mode
)
1956 if (c
== ' ' || c
=='\n' || c
== '\r')
1960 if ((c
= next_char (dtp
)) == EOF
)
1963 while (c
== ' ' || c
=='\n' || c
== '\r');
1965 l_push_char (dtp
, c
);
1974 push_char (dtp
, 'i');
1975 push_char (dtp
, 'n');
1976 push_char (dtp
, 'f');
1980 push_char (dtp
, 'n');
1981 push_char (dtp
, 'a');
1982 push_char (dtp
, 'n');
1986 unget_char (dtp
, c
);
1987 eat_separator (dtp
);
1988 push_char (dtp
, '\0');
1989 if (convert_infnan (dtp
, dest
, dtp
->u
.p
.saved_string
, length
))
1993 dtp
->u
.p
.saved_type
= BT_REAL
;
1997 if (dtp
->u
.p
.namelist_mode
)
1999 dtp
->u
.p
.nml_read_error
= 1;
2000 dtp
->u
.p
.line_buffer_enabled
= 1;
2001 dtp
->u
.p
.line_buffer_pos
= 0;
2007 if (nml_bad_return (dtp
, c
))
2022 snprintf (message
, MSGLEN
, "Bad real number in item %d of list input",
2023 dtp
->u
.p
.item_count
);
2025 generate_error (&dtp
->common
, LIBERROR_READ_VALUE
, message
);
2029 /* Check the current type against the saved type to make sure they are
2030 compatible. Returns nonzero if incompatible. */
2033 check_type (st_parameter_dt
*dtp
, bt type
, int kind
)
2035 char message
[MSGLEN
];
2037 if (dtp
->u
.p
.saved_type
!= BT_UNKNOWN
&& dtp
->u
.p
.saved_type
!= type
)
2039 snprintf (message
, MSGLEN
, "Read type %s where %s was expected for item %d",
2040 type_name (dtp
->u
.p
.saved_type
), type_name (type
),
2041 dtp
->u
.p
.item_count
);
2043 generate_error (&dtp
->common
, LIBERROR_READ_VALUE
, message
);
2047 if (dtp
->u
.p
.saved_type
== BT_UNKNOWN
|| dtp
->u
.p
.saved_type
== BT_CHARACTER
)
2050 if ((type
!= BT_COMPLEX
&& dtp
->u
.p
.saved_length
!= kind
)
2051 || (type
== BT_COMPLEX
&& dtp
->u
.p
.saved_length
!= kind
*2))
2053 snprintf (message
, MSGLEN
,
2054 "Read kind %d %s where kind %d is required for item %d",
2055 type
== BT_COMPLEX
? dtp
->u
.p
.saved_length
/ 2
2056 : dtp
->u
.p
.saved_length
,
2057 type_name (dtp
->u
.p
.saved_type
), kind
,
2058 dtp
->u
.p
.item_count
);
2060 generate_error (&dtp
->common
, LIBERROR_READ_VALUE
, message
);
2068 /* Initialize the function pointers to select the correct versions of
2069 next_char and push_char depending on what we are doing. */
2072 set_workers (st_parameter_dt
*dtp
)
2074 if (dtp
->u
.p
.current_unit
->flags
.encoding
== ENCODING_UTF8
)
2076 dtp
->u
.p
.current_unit
->next_char_fn_ptr
= &next_char_utf8
;
2077 dtp
->u
.p
.current_unit
->push_char_fn_ptr
= &push_char4
;
2079 else if (is_internal_unit (dtp
))
2081 dtp
->u
.p
.current_unit
->next_char_fn_ptr
= &next_char_internal
;
2082 dtp
->u
.p
.current_unit
->push_char_fn_ptr
= &push_char_default
;
2086 dtp
->u
.p
.current_unit
->next_char_fn_ptr
= &next_char_default
;
2087 dtp
->u
.p
.current_unit
->push_char_fn_ptr
= &push_char_default
;
2092 /* Top level data transfer subroutine for list reads. Because we have
2093 to deal with repeat counts, the data item is always saved after
2094 reading, usually in the dtp->u.p.value[] array. If a repeat count is
2095 greater than one, we copy the data item multiple times. */
2098 list_formatted_read_scalar (st_parameter_dt
*dtp
, bt type
, void *p
,
2099 int kind
, size_t size
)
2106 /* Set the next_char and push_char worker functions. */
2109 if (dtp
->u
.p
.first_item
)
2111 dtp
->u
.p
.first_item
= 0;
2112 dtp
->u
.p
.input_complete
= 0;
2113 dtp
->u
.p
.repeat_count
= 1;
2114 dtp
->u
.p
.at_eol
= 0;
2116 if ((c
= eat_spaces (dtp
)) == EOF
)
2121 if (is_separator (c
))
2123 /* Found a null value. */
2124 dtp
->u
.p
.repeat_count
= 0;
2125 eat_separator (dtp
);
2127 /* Set end-of-line flag. */
2128 if (c
== '\n' || c
== '\r')
2130 dtp
->u
.p
.at_eol
= 1;
2131 if (finish_separator (dtp
) == LIBERROR_END
)
2143 if (dtp
->u
.p
.repeat_count
> 0)
2145 if (check_type (dtp
, type
, kind
))
2150 if (dtp
->u
.p
.input_complete
)
2153 if (dtp
->u
.p
.at_eol
)
2154 finish_separator (dtp
);
2158 /* Trailing spaces prior to end of line. */
2159 if (dtp
->u
.p
.at_eol
)
2160 finish_separator (dtp
);
2163 dtp
->u
.p
.saved_type
= BT_UNKNOWN
;
2164 dtp
->u
.p
.repeat_count
= 1;
2170 read_integer (dtp
, kind
);
2173 read_logical (dtp
, kind
);
2176 read_character (dtp
, kind
);
2179 read_real (dtp
, p
, kind
);
2180 /* Copy value back to temporary if needed. */
2181 if (dtp
->u
.p
.repeat_count
> 0)
2182 memcpy (dtp
->u
.p
.value
, p
, size
);
2185 read_complex (dtp
, p
, kind
, size
);
2186 /* Copy value back to temporary if needed. */
2187 if (dtp
->u
.p
.repeat_count
> 0)
2188 memcpy (dtp
->u
.p
.value
, p
, size
);
2192 int unit
= dtp
->u
.p
.current_unit
->unit_number
;
2193 char iotype
[] = "LISTDIRECTED";
2194 gfc_charlen_type iotype_len
= 12;
2195 char tmp_iomsg
[IOMSG_LEN
] = "";
2197 gfc_charlen_type child_iomsg_len
;
2199 int *child_iostat
= NULL
;
2200 gfc_full_array_i4 vlist
;
2202 GFC_DESCRIPTOR_DATA(&vlist
) = NULL
;
2203 GFC_DIMENSION_SET(vlist
.dim
[0],1, 0, 0);
2205 /* Set iostat, intent(out). */
2207 child_iostat
= (dtp
->common
.flags
& IOPARM_HAS_IOSTAT
) ?
2208 dtp
->common
.iostat
: &noiostat
;
2210 /* Set iomsge, intent(inout). */
2211 if (dtp
->common
.flags
& IOPARM_HAS_IOMSG
)
2213 child_iomsg
= dtp
->common
.iomsg
;
2214 child_iomsg_len
= dtp
->common
.iomsg_len
;
2218 child_iomsg
= tmp_iomsg
;
2219 child_iomsg_len
= IOMSG_LEN
;
2222 /* Call the user defined formatted READ procedure. */
2223 dtp
->u
.p
.current_unit
->child_dtio
++;
2224 dtp
->u
.p
.fdtio_ptr (p
, &unit
, iotype
, &vlist
,
2225 child_iostat
, child_iomsg
,
2226 iotype_len
, child_iomsg_len
);
2227 dtp
->u
.p
.child_saved_iostat
= *child_iostat
;
2228 dtp
->u
.p
.current_unit
->child_dtio
--;
2232 internal_error (&dtp
->common
, "Bad type for list read");
2235 if (dtp
->u
.p
.saved_type
!= BT_CHARACTER
&& dtp
->u
.p
.saved_type
!= BT_UNKNOWN
)
2236 dtp
->u
.p
.saved_length
= size
;
2238 if ((dtp
->common
.flags
& IOPARM_LIBRETURN_MASK
) != IOPARM_LIBRETURN_OK
)
2242 switch (dtp
->u
.p
.saved_type
)
2246 if (dtp
->u
.p
.repeat_count
> 0)
2247 memcpy (p
, dtp
->u
.p
.value
, size
);
2252 memcpy (p
, dtp
->u
.p
.value
, size
);
2256 if (dtp
->u
.p
.saved_string
)
2258 m
= (size
< (size_t) dtp
->u
.p
.saved_used
)
2259 ? size
: (size_t) dtp
->u
.p
.saved_used
;
2261 q
= (gfc_char4_t
*) p
;
2262 r
= (gfc_char4_t
*) dtp
->u
.p
.saved_string
;
2263 if (dtp
->u
.p
.current_unit
->flags
.encoding
== ENCODING_UTF8
)
2264 for (size_t i
= 0; i
< m
; i
++)
2269 memcpy (p
, dtp
->u
.p
.saved_string
, m
);
2271 for (size_t i
= 0; i
< m
; i
++)
2276 /* Just delimiters encountered, nothing to copy but SPACE. */
2282 memset (((char *) p
) + m
, ' ', size
- m
);
2285 q
= (gfc_char4_t
*) p
;
2286 for (size_t i
= m
; i
< size
; i
++)
2287 q
[i
] = (unsigned char) ' ';
2296 internal_error (&dtp
->common
, "Bad type for list read");
2299 if (--dtp
->u
.p
.repeat_count
<= 0)
2303 /* err may have been set above from finish_separator, so if it is set
2304 trigger the hit_eof. The hit_eof will set bits in common.flags. */
2305 if (err
== LIBERROR_END
)
2310 /* Now we check common.flags for any errors that could have occurred in
2311 a READ elsewhere such as in read_integer. */
2312 err
= dtp
->common
.flags
& IOPARM_LIBRETURN_MASK
;
2313 fbuf_flush_list (dtp
->u
.p
.current_unit
, LIST_READING
);
2319 list_formatted_read (st_parameter_dt
*dtp
, bt type
, void *p
, int kind
,
2320 size_t size
, size_t nelems
)
2324 size_t stride
= type
== BT_CHARACTER
?
2325 size
* GFC_SIZE_OF_CHAR_KIND(kind
) : size
;
2330 /* Big loop over all the elements. */
2331 for (elem
= 0; elem
< nelems
; elem
++)
2333 dtp
->u
.p
.item_count
++;
2334 err
= list_formatted_read_scalar (dtp
, type
, tmp
+ stride
*elem
,
2342 /* Finish a list read. */
2345 finish_list_read (st_parameter_dt
*dtp
)
2349 fbuf_flush (dtp
->u
.p
.current_unit
, dtp
->u
.p
.mode
);
2351 if (dtp
->u
.p
.at_eol
)
2353 dtp
->u
.p
.at_eol
= 0;
2357 if (!is_internal_unit (dtp
))
2361 /* Set the next_char and push_char worker functions. */
2364 if (likely (dtp
->u
.p
.child_saved_iostat
== LIBERROR_OK
))
2366 c
= next_char (dtp
);
2384 void namelist_read (st_parameter_dt *dtp)
2386 static void nml_match_name (char *name, int len)
2387 static int nml_query (st_parameter_dt *dtp)
2388 static int nml_get_obj_data (st_parameter_dt *dtp,
2389 namelist_info **prev_nl, char *, size_t)
2391 static void nml_untouch_nodes (st_parameter_dt *dtp)
2392 static namelist_info *find_nml_node (st_parameter_dt *dtp,
2394 static int nml_parse_qualifier(descriptor_dimension *ad,
2395 array_loop_spec *ls, int rank, char *)
2396 static void nml_touch_nodes (namelist_info *nl)
2397 static int nml_read_obj (namelist_info *nl, index_type offset,
2398 namelist_info **prev_nl, char *, size_t,
2399 index_type clow, index_type chigh)
2403 /* Inputs a rank-dimensional qualifier, which can contain
2404 singlets, doublets, triplets or ':' with the standard meanings. */
2407 nml_parse_qualifier (st_parameter_dt
*dtp
, descriptor_dimension
*ad
,
2408 array_loop_spec
*ls
, int rank
, bt nml_elem_type
,
2409 char *parse_err_msg
, size_t parse_err_msg_size
,
2416 int is_array_section
, is_char
;
2420 is_array_section
= 0;
2421 dtp
->u
.p
.expanded_read
= 0;
2423 /* See if this is a character substring qualifier we are looking for. */
2430 /* The next character in the stream should be the '('. */
2432 if ((c
= next_char (dtp
)) == EOF
)
2435 /* Process the qualifier, by dimension and triplet. */
2437 for (dim
=0; dim
< rank
; dim
++ )
2439 for (indx
=0; indx
<3; indx
++)
2445 /* Process a potential sign. */
2446 if ((c
= next_char (dtp
)) == EOF
)
2458 unget_char (dtp
, c
);
2462 /* Process characters up to the next ':' , ',' or ')'. */
2465 c
= next_char (dtp
);
2472 is_array_section
= 1;
2476 if ((c
==',' && dim
== rank
-1)
2477 || (c
==')' && dim
< rank
-1))
2480 snprintf (parse_err_msg
, parse_err_msg_size
,
2481 "Bad substring qualifier");
2483 snprintf (parse_err_msg
, parse_err_msg_size
,
2484 "Bad number of index fields");
2493 case ' ': case '\t': case '\r': case '\n':
2499 snprintf (parse_err_msg
, parse_err_msg_size
,
2500 "Bad character in substring qualifier");
2502 snprintf (parse_err_msg
, parse_err_msg_size
,
2503 "Bad character in index");
2507 if ((c
== ',' || c
== ')') && indx
== 0
2508 && dtp
->u
.p
.saved_string
== 0)
2511 snprintf (parse_err_msg
, parse_err_msg_size
,
2512 "Null substring qualifier");
2514 snprintf (parse_err_msg
, parse_err_msg_size
,
2515 "Null index field");
2519 if ((c
== ':' && indx
== 1 && dtp
->u
.p
.saved_string
== 0)
2520 || (indx
== 2 && dtp
->u
.p
.saved_string
== 0))
2523 snprintf (parse_err_msg
, parse_err_msg_size
,
2524 "Bad substring qualifier");
2526 snprintf (parse_err_msg
, parse_err_msg_size
,
2527 "Bad index triplet");
2531 if (is_char
&& !is_array_section
)
2533 snprintf (parse_err_msg
, parse_err_msg_size
,
2534 "Missing colon in substring qualifier");
2538 /* If '( : ? )' or '( ? : )' break and flag read failure. */
2540 if ((c
== ':' && indx
== 0 && dtp
->u
.p
.saved_string
== 0)
2541 || (indx
==1 && dtp
->u
.p
.saved_string
== 0))
2547 /* Now read the index. */
2548 if (convert_integer (dtp
, sizeof(index_type
), neg
))
2551 snprintf (parse_err_msg
, parse_err_msg_size
,
2552 "Bad integer substring qualifier");
2554 snprintf (parse_err_msg
, parse_err_msg_size
,
2555 "Bad integer in index");
2561 /* Feed the index values to the triplet arrays. */
2565 memcpy (&ls
[dim
].start
, dtp
->u
.p
.value
, sizeof(index_type
));
2567 memcpy (&ls
[dim
].end
, dtp
->u
.p
.value
, sizeof(index_type
));
2569 memcpy (&ls
[dim
].step
, dtp
->u
.p
.value
, sizeof(index_type
));
2572 /* Singlet or doublet indices. */
2573 if (c
==',' || c
==')')
2577 memcpy (&ls
[dim
].start
, dtp
->u
.p
.value
, sizeof(index_type
));
2579 /* If -std=f95/2003 or an array section is specified,
2580 do not allow excess data to be processed. */
2581 if (is_array_section
== 1
2582 || !(compile_options
.allow_std
& GFC_STD_GNU
)
2583 || nml_elem_type
== BT_DERIVED
)
2584 ls
[dim
].end
= ls
[dim
].start
;
2586 dtp
->u
.p
.expanded_read
= 1;
2589 /* Check for non-zero rank. */
2590 if (is_array_section
== 1 && ls
[dim
].start
!= ls
[dim
].end
)
2597 if (is_array_section
== 1 && dtp
->u
.p
.expanded_read
== 1)
2600 dtp
->u
.p
.expanded_read
= 0;
2601 for (i
= 0; i
< dim
; i
++)
2602 ls
[i
].end
= ls
[i
].start
;
2605 /* Check the values of the triplet indices. */
2606 if ((ls
[dim
].start
> GFC_DIMENSION_UBOUND(ad
[dim
]))
2607 || (ls
[dim
].start
< GFC_DIMENSION_LBOUND(ad
[dim
]))
2608 || (ls
[dim
].end
> GFC_DIMENSION_UBOUND(ad
[dim
]))
2609 || (ls
[dim
].end
< GFC_DIMENSION_LBOUND(ad
[dim
])))
2612 snprintf (parse_err_msg
, parse_err_msg_size
,
2613 "Substring out of range");
2615 snprintf (parse_err_msg
, parse_err_msg_size
,
2616 "Index %d out of range", dim
+ 1);
2620 if (((ls
[dim
].end
- ls
[dim
].start
) * ls
[dim
].step
< 0)
2621 || (ls
[dim
].step
== 0))
2623 snprintf (parse_err_msg
, parse_err_msg_size
,
2624 "Bad range in index %d", dim
+ 1);
2628 /* Initialise the loop index counter. */
2629 ls
[dim
].idx
= ls
[dim
].start
;
2636 /* The EOF error message is issued by hit_eof. Return true so that the
2637 caller does not use parse_err_msg and parse_err_msg_size to generate
2638 an unrelated error message. */
2642 dtp
->u
.p
.input_complete
= 1;
2650 extended_look_ahead (char *p
, char *q
)
2654 /* Scan ahead to find a '%' in the p string. */
2655 for(r
= p
, s
= q
; *r
&& *s
; s
++)
2656 if ((*s
== '%' || *s
== '+') && strcmp (r
+ 1, s
+ 1) == 0)
2663 strcmp_extended_type (char *p
, char *q
)
2667 for (r
= p
, s
= q
; *r
&& *s
; r
++, s
++)
2671 if (*r
== '%' && *s
== '+' && extended_look_ahead (r
, s
))
2680 static namelist_info
*
2681 find_nml_node (st_parameter_dt
*dtp
, char *var_name
)
2683 namelist_info
*t
= dtp
->u
.p
.ionml
;
2686 if (strcmp (var_name
, t
->var_name
) == 0)
2691 if (strcmp_extended_type (var_name
, t
->var_name
))
2701 /* Visits all the components of a derived type that have
2702 not explicitly been identified in the namelist input.
2703 touched is set and the loop specification initialised
2704 to default values */
2707 nml_touch_nodes (namelist_info
*nl
)
2709 index_type len
= strlen (nl
->var_name
) + 1;
2711 char *ext_name
= xmalloc (len
+ 1);
2712 memcpy (ext_name
, nl
->var_name
, len
-1);
2713 memcpy (ext_name
+ len
- 1, "%", 2);
2714 for (nl
= nl
->next
; nl
; nl
= nl
->next
)
2716 if (strncmp (nl
->var_name
, ext_name
, len
) == 0)
2719 for (dim
=0; dim
< nl
->var_rank
; dim
++)
2721 nl
->ls
[dim
].step
= 1;
2722 nl
->ls
[dim
].end
= GFC_DESCRIPTOR_UBOUND(nl
,dim
);
2723 nl
->ls
[dim
].start
= GFC_DESCRIPTOR_LBOUND(nl
,dim
);
2724 nl
->ls
[dim
].idx
= nl
->ls
[dim
].start
;
2734 /* Resets touched for the entire list of nml_nodes, ready for a
2738 nml_untouch_nodes (st_parameter_dt
*dtp
)
2741 for (t
= dtp
->u
.p
.ionml
; t
; t
= t
->next
)
2746 /* Attempts to input name to namelist name. Returns
2747 dtp->u.p.nml_read_error = 1 on no match. */
2750 nml_match_name (st_parameter_dt
*dtp
, const char *name
, index_type len
)
2755 dtp
->u
.p
.nml_read_error
= 0;
2756 for (i
= 0; i
< len
; i
++)
2758 c
= next_char (dtp
);
2759 if (c
== EOF
|| (safe_tolower (c
) != safe_tolower (name
[i
])))
2761 dtp
->u
.p
.nml_read_error
= 1;
2767 /* If the namelist read is from stdin, output the current state of the
2768 namelist to stdout. This is used to implement the non-standard query
2769 features, ? and =?. If c == '=' the full namelist is printed. Otherwise
2770 the names alone are printed. */
2773 nml_query (st_parameter_dt
*dtp
, char c
)
2775 gfc_unit
*temp_unit
;
2780 static const index_type endlen
= 2;
2781 static const char endl
[] = "\r\n";
2782 static const char nmlend
[] = "&end\r\n";
2784 static const index_type endlen
= 1;
2785 static const char endl
[] = "\n";
2786 static const char nmlend
[] = "&end\n";
2789 if (dtp
->u
.p
.current_unit
->unit_number
!= options
.stdin_unit
)
2792 /* Store the current unit and transfer to stdout. */
2794 temp_unit
= dtp
->u
.p
.current_unit
;
2795 dtp
->u
.p
.current_unit
= find_unit (options
.stdout_unit
);
2797 if (dtp
->u
.p
.current_unit
)
2799 dtp
->u
.p
.mode
= WRITING
;
2800 next_record (dtp
, 0);
2802 /* Write the namelist in its entirety. */
2805 namelist_write (dtp
);
2807 /* Or write the list of names. */
2811 /* "&namelist_name\n" */
2813 len
= dtp
->namelist_name_len
;
2814 p
= write_block (dtp
, len
- 1 + endlen
);
2818 memcpy ((char*)(p
+ 1), dtp
->namelist_name
, len
);
2819 memcpy ((char*)(p
+ len
+ 1), &endl
, endlen
);
2820 for (nl
= dtp
->u
.p
.ionml
; nl
; nl
= nl
->next
)
2824 len
= strlen (nl
->var_name
);
2825 p
= write_block (dtp
, len
+ endlen
);
2829 memcpy ((char*)(p
+ 1), nl
->var_name
, len
);
2830 memcpy ((char*)(p
+ len
+ 1), &endl
, endlen
);
2835 p
= write_block (dtp
, endlen
+ 4);
2838 memcpy (p
, &nmlend
, endlen
+ 4);
2841 /* Flush the stream to force immediate output. */
2843 fbuf_flush (dtp
->u
.p
.current_unit
, WRITING
);
2844 sflush (dtp
->u
.p
.current_unit
->s
);
2845 unlock_unit (dtp
->u
.p
.current_unit
);
2850 /* Restore the current unit. */
2852 dtp
->u
.p
.current_unit
= temp_unit
;
2853 dtp
->u
.p
.mode
= READING
;
2857 /* Reads and stores the input for the namelist object nl. For an array,
2858 the function loops over the ranges defined by the loop specification.
2859 This default to all the data or to the specification from a qualifier.
2860 nml_read_obj recursively calls itself to read derived types. It visits
2861 all its own components but only reads data for those that were touched
2862 when the name was parsed. If a read error is encountered, an attempt is
2863 made to return to read a new object name because the standard allows too
2864 little data to be available. On the other hand, too much data is an
2868 nml_read_obj (st_parameter_dt
*dtp
, namelist_info
*nl
, index_type offset
,
2869 namelist_info
**pprev_nl
, char *nml_err_msg
,
2870 size_t nml_err_msg_size
, index_type clow
, index_type chigh
)
2879 size_t obj_name_len
;
2883 /* If we have encountered a previous read error or this object has not been
2884 touched in name parsing, just return. */
2885 if (dtp
->u
.p
.nml_read_error
|| !nl
->touched
)
2888 dtp
->u
.p
.item_count
++; /* Used in error messages. */
2889 dtp
->u
.p
.repeat_count
= 0;
2901 dlen
= size_from_real_kind (len
);
2905 dlen
= size_from_complex_kind (len
);
2909 dlen
= chigh
? (chigh
- clow
+ 1) : nl
->string_length
;
2918 /* Update the pointer to the data, using the current index vector */
2920 if ((nl
->type
== BT_DERIVED
|| nl
->type
== BT_CLASS
)
2921 && nl
->dtio_sub
!= NULL
)
2923 pdata
= NULL
; /* Not used under these conidtions. */
2924 if (nl
->type
== BT_CLASS
)
2925 list_obj
.data
= ((gfc_class
*)nl
->mem_pos
)->data
;
2927 list_obj
.data
= (void *)nl
->mem_pos
;
2929 for (dim
= 0; dim
< nl
->var_rank
; dim
++)
2930 list_obj
.data
= list_obj
.data
+ (nl
->ls
[dim
].idx
2931 - GFC_DESCRIPTOR_LBOUND(nl
,dim
))
2932 * GFC_DESCRIPTOR_STRIDE(nl
,dim
) * nl
->size
;
2936 pdata
= (void*)(nl
->mem_pos
+ offset
);
2937 for (dim
= 0; dim
< nl
->var_rank
; dim
++)
2938 pdata
= (void*)(pdata
+ (nl
->ls
[dim
].idx
2939 - GFC_DESCRIPTOR_LBOUND(nl
,dim
))
2940 * GFC_DESCRIPTOR_STRIDE(nl
,dim
) * nl
->size
);
2943 /* If we are finished with the repeat count, try to read next value. */
2946 if (--dtp
->u
.p
.repeat_count
<= 0)
2948 if (dtp
->u
.p
.input_complete
)
2950 if (dtp
->u
.p
.at_eol
)
2951 finish_separator (dtp
);
2952 if (dtp
->u
.p
.input_complete
)
2955 dtp
->u
.p
.saved_type
= BT_UNKNOWN
;
2961 read_integer (dtp
, len
);
2965 read_logical (dtp
, len
);
2969 read_character (dtp
, len
);
2973 /* Need to copy data back from the real location to the temp in
2974 order to handle nml reads into arrays. */
2975 read_real (dtp
, pdata
, len
);
2976 memcpy (dtp
->u
.p
.value
, pdata
, dlen
);
2980 /* Same as for REAL, copy back to temp. */
2981 read_complex (dtp
, pdata
, len
, dlen
);
2982 memcpy (dtp
->u
.p
.value
, pdata
, dlen
);
2987 /* If this object has a User Defined procedure, call it. */
2988 if (nl
->dtio_sub
!= NULL
)
2990 int unit
= dtp
->u
.p
.current_unit
->unit_number
;
2991 char iotype
[] = "NAMELIST";
2992 gfc_charlen_type iotype_len
= 8;
2993 char tmp_iomsg
[IOMSG_LEN
] = "";
2995 gfc_charlen_type child_iomsg_len
;
2997 int *child_iostat
= NULL
;
2998 gfc_full_array_i4 vlist
;
2999 formatted_dtio dtio_ptr
= (formatted_dtio
)nl
->dtio_sub
;
3001 GFC_DESCRIPTOR_DATA(&vlist
) = NULL
;
3002 GFC_DIMENSION_SET(vlist
.dim
[0],1, 0, 0);
3004 list_obj
.vptr
= nl
->vtable
;
3007 /* Set iostat, intent(out). */
3009 child_iostat
= (dtp
->common
.flags
& IOPARM_HAS_IOSTAT
) ?
3010 dtp
->common
.iostat
: &noiostat
;
3012 /* Set iomsg, intent(inout). */
3013 if (dtp
->common
.flags
& IOPARM_HAS_IOMSG
)
3015 child_iomsg
= dtp
->common
.iomsg
;
3016 child_iomsg_len
= dtp
->common
.iomsg_len
;
3020 child_iomsg
= tmp_iomsg
;
3021 child_iomsg_len
= IOMSG_LEN
;
3024 /* Call the user defined formatted READ procedure. */
3025 dtp
->u
.p
.current_unit
->child_dtio
++;
3026 dtio_ptr ((void *)&list_obj
, &unit
, iotype
, &vlist
,
3027 child_iostat
, child_iomsg
,
3028 iotype_len
, child_iomsg_len
);
3029 dtp
->u
.p
.child_saved_iostat
= *child_iostat
;
3030 dtp
->u
.p
.current_unit
->child_dtio
--;
3034 /* Must be default derived type namelist read. */
3035 obj_name_len
= strlen (nl
->var_name
) + 1;
3036 obj_name
= xmalloc (obj_name_len
+1);
3037 memcpy (obj_name
, nl
->var_name
, obj_name_len
-1);
3038 memcpy (obj_name
+ obj_name_len
- 1, "%", 2);
3040 /* If reading a derived type, disable the expanded read warning
3041 since a single object can have multiple reads. */
3042 dtp
->u
.p
.expanded_read
= 0;
3044 /* Now loop over the components. */
3046 for (cmp
= nl
->next
;
3048 !strncmp (cmp
->var_name
, obj_name
, obj_name_len
);
3051 /* Jump over nested derived type by testing if the potential
3052 component name contains '%'. */
3053 if (strchr (cmp
->var_name
+ obj_name_len
, '%'))
3056 if (!nml_read_obj (dtp
, cmp
, (index_type
)(pdata
- nl
->mem_pos
),
3057 pprev_nl
, nml_err_msg
, nml_err_msg_size
,
3064 if (dtp
->u
.p
.input_complete
)
3075 snprintf (nml_err_msg
, nml_err_msg_size
,
3076 "Bad type for namelist object %s", nl
->var_name
);
3077 internal_error (&dtp
->common
, nml_err_msg
);
3082 /* The standard permits array data to stop short of the number of
3083 elements specified in the loop specification. In this case, we
3084 should be here with dtp->u.p.nml_read_error != 0. Control returns to
3085 nml_get_obj_data and an attempt is made to read object name. */
3088 if (dtp
->u
.p
.nml_read_error
)
3090 dtp
->u
.p
.expanded_read
= 0;
3094 if (dtp
->u
.p
.saved_type
== BT_UNKNOWN
)
3096 dtp
->u
.p
.expanded_read
= 0;
3100 switch (dtp
->u
.p
.saved_type
)
3107 memcpy (pdata
, dtp
->u
.p
.value
, dlen
);
3111 if (dlen
< dtp
->u
.p
.saved_used
)
3113 if (compile_options
.bounds_check
)
3115 snprintf (nml_err_msg
, nml_err_msg_size
,
3116 "Namelist object '%s' truncated on read.",
3118 generate_warning (&dtp
->common
, nml_err_msg
);
3123 m
= dtp
->u
.p
.saved_used
;
3125 if (dtp
->u
.p
.current_unit
->flags
.encoding
== ENCODING_UTF8
)
3127 gfc_char4_t
*q4
, *p4
= pdata
;
3130 q4
= (gfc_char4_t
*) dtp
->u
.p
.saved_string
;
3132 for (i
= 0; i
< m
; i
++)
3135 for (i
= 0; i
< dlen
- m
; i
++)
3136 *p4
++ = (gfc_char4_t
) ' ';
3140 pdata
= (void*)( pdata
+ clow
- 1 );
3141 memcpy (pdata
, dtp
->u
.p
.saved_string
, m
);
3143 memset ((void*)( pdata
+ m
), ' ', dlen
- m
);
3151 /* Warn if a non-standard expanded read occurs. A single read of a
3152 single object is acceptable. If a second read occurs, issue a warning
3153 and set the flag to zero to prevent further warnings. */
3154 if (dtp
->u
.p
.expanded_read
== 2)
3156 notify_std (&dtp
->common
, GFC_STD_GNU
, "Non-standard expanded namelist read.");
3157 dtp
->u
.p
.expanded_read
= 0;
3160 /* If the expanded read warning flag is set, increment it,
3161 indicating that a single read has occurred. */
3162 if (dtp
->u
.p
.expanded_read
>= 1)
3163 dtp
->u
.p
.expanded_read
++;
3165 /* Break out of loop if scalar. */
3169 /* Now increment the index vector. */
3174 for (dim
= 0; dim
< nl
->var_rank
; dim
++)
3176 nl
->ls
[dim
].idx
+= nml_carry
* nl
->ls
[dim
].step
;
3178 if (((nl
->ls
[dim
].step
> 0) && (nl
->ls
[dim
].idx
> nl
->ls
[dim
].end
))
3180 ((nl
->ls
[dim
].step
< 0) && (nl
->ls
[dim
].idx
< nl
->ls
[dim
].end
)))
3182 nl
->ls
[dim
].idx
= nl
->ls
[dim
].start
;
3186 } while (!nml_carry
);
3188 if (dtp
->u
.p
.repeat_count
> 1)
3190 snprintf (nml_err_msg
, nml_err_msg_size
,
3191 "Repeat count too large for namelist object %s", nl
->var_name
);
3201 /* Parses the object name, including array and substring qualifiers. It
3202 iterates over derived type components, touching those components and
3203 setting their loop specifications, if there is a qualifier. If the
3204 object is itself a derived type, its components and subcomponents are
3205 touched. nml_read_obj is called at the end and this reads the data in
3206 the manner specified by the object name. */
3209 nml_get_obj_data (st_parameter_dt
*dtp
, namelist_info
**pprev_nl
,
3210 char *nml_err_msg
, size_t nml_err_msg_size
)
3214 namelist_info
*first_nl
= NULL
;
3215 namelist_info
*root_nl
= NULL
;
3216 int dim
, parsed_rank
;
3217 int component_flag
, qualifier_flag
;
3218 index_type clow
, chigh
;
3219 int non_zero_rank_count
;
3221 /* Look for end of input or object name. If '?' or '=?' are encountered
3222 in stdin, print the node names or the namelist to stdout. */
3224 eat_separator (dtp
);
3225 if (dtp
->u
.p
.input_complete
)
3228 if (dtp
->u
.p
.at_eol
)
3229 finish_separator (dtp
);
3230 if (dtp
->u
.p
.input_complete
)
3233 if ((c
= next_char (dtp
)) == EOF
)
3238 if ((c
= next_char (dtp
)) == EOF
)
3242 snprintf (nml_err_msg
, nml_err_msg_size
,
3243 "namelist read: misplaced = sign");
3246 nml_query (dtp
, '=');
3250 nml_query (dtp
, '?');
3255 nml_match_name (dtp
, "end", 3);
3256 if (dtp
->u
.p
.nml_read_error
)
3258 snprintf (nml_err_msg
, nml_err_msg_size
,
3259 "namelist not terminated with / or &end");
3264 dtp
->u
.p
.input_complete
= 1;
3271 /* Untouch all nodes of the namelist and reset the flags that are set for
3272 derived type components. */
3274 nml_untouch_nodes (dtp
);
3277 non_zero_rank_count
= 0;
3279 /* Get the object name - should '!' and '\n' be permitted separators? */
3287 if (!is_separator (c
))
3288 push_char_default (dtp
, safe_tolower(c
));
3289 if ((c
= next_char (dtp
)) == EOF
)
3292 while (!( c
=='=' || c
==' ' || c
=='\t' || c
=='(' || c
=='%' ));
3294 unget_char (dtp
, c
);
3296 /* Check that the name is in the namelist and get pointer to object.
3297 Three error conditions exist: (i) An attempt is being made to
3298 identify a non-existent object, following a failed data read or
3299 (ii) The object name does not exist or (iii) Too many data items
3300 are present for an object. (iii) gives the same error message
3303 push_char_default (dtp
, '\0');
3307 #define EXT_STACK_SZ 100
3308 char ext_stack
[EXT_STACK_SZ
];
3310 size_t var_len
= strlen (root_nl
->var_name
);
3312 = dtp
->u
.p
.saved_string
? strlen (dtp
->u
.p
.saved_string
) : 0;
3313 size_t ext_size
= var_len
+ saved_len
+ 1;
3315 if (ext_size
> EXT_STACK_SZ
)
3316 ext_name
= xmalloc (ext_size
);
3318 ext_name
= ext_stack
;
3320 memcpy (ext_name
, root_nl
->var_name
, var_len
);
3321 if (dtp
->u
.p
.saved_string
)
3322 memcpy (ext_name
+ var_len
, dtp
->u
.p
.saved_string
, saved_len
);
3323 ext_name
[var_len
+ saved_len
] = '\0';
3324 nl
= find_nml_node (dtp
, ext_name
);
3326 if (ext_size
> EXT_STACK_SZ
)
3330 nl
= find_nml_node (dtp
, dtp
->u
.p
.saved_string
);
3334 if (dtp
->u
.p
.nml_read_error
&& *pprev_nl
)
3335 snprintf (nml_err_msg
, nml_err_msg_size
,
3336 "Bad data for namelist object %s", (*pprev_nl
)->var_name
);
3339 snprintf (nml_err_msg
, nml_err_msg_size
,
3340 "Cannot match namelist object name %s",
3341 dtp
->u
.p
.saved_string
);
3346 /* Get the length, data length, base pointer and rank of the variable.
3347 Set the default loop specification first. */
3349 for (dim
=0; dim
< nl
->var_rank
; dim
++)
3351 nl
->ls
[dim
].step
= 1;
3352 nl
->ls
[dim
].end
= GFC_DESCRIPTOR_UBOUND(nl
,dim
);
3353 nl
->ls
[dim
].start
= GFC_DESCRIPTOR_LBOUND(nl
,dim
);
3354 nl
->ls
[dim
].idx
= nl
->ls
[dim
].start
;
3357 /* Check to see if there is a qualifier: if so, parse it.*/
3359 if (c
== '(' && nl
->var_rank
)
3362 if (!nml_parse_qualifier (dtp
, nl
->dim
, nl
->ls
, nl
->var_rank
,
3363 nl
->type
, nml_err_msg
, nml_err_msg_size
,
3366 char *nml_err_msg_end
= strchr (nml_err_msg
, '\0');
3367 snprintf (nml_err_msg_end
,
3368 nml_err_msg_size
- (nml_err_msg_end
- nml_err_msg
),
3369 " for namelist variable %s", nl
->var_name
);
3372 if (parsed_rank
> 0)
3373 non_zero_rank_count
++;
3377 if ((c
= next_char (dtp
)) == EOF
)
3379 unget_char (dtp
, c
);
3381 else if (nl
->var_rank
> 0)
3382 non_zero_rank_count
++;
3384 /* Now parse a derived type component. The root namelist_info address
3385 is backed up, as is the previous component level. The component flag
3386 is set and the iteration is made by jumping back to get_name. */
3390 if (nl
->type
!= BT_DERIVED
)
3392 snprintf (nml_err_msg
, nml_err_msg_size
,
3393 "Attempt to get derived component for %s", nl
->var_name
);
3397 /* Don't move first_nl further in the list if a qualifier was found. */
3398 if ((*pprev_nl
== NULL
&& !qualifier_flag
) || !component_flag
)
3404 if ((c
= next_char (dtp
)) == EOF
)
3409 /* Parse a character qualifier, if present. chigh = 0 is a default
3410 that signals that the string length = string_length. */
3415 if (c
== '(' && nl
->type
== BT_CHARACTER
)
3417 descriptor_dimension chd
[1] = { {1, clow
, nl
->string_length
} };
3418 array_loop_spec ind
[1] = { {1, clow
, nl
->string_length
, 1} };
3420 if (!nml_parse_qualifier (dtp
, chd
, ind
, -1, nl
->type
,
3421 nml_err_msg
, nml_err_msg_size
, &parsed_rank
))
3423 char *nml_err_msg_end
= strchr (nml_err_msg
, '\0');
3424 snprintf (nml_err_msg_end
,
3425 nml_err_msg_size
- (nml_err_msg_end
- nml_err_msg
),
3426 " for namelist variable %s", nl
->var_name
);
3430 clow
= ind
[0].start
;
3433 if (ind
[0].step
!= 1)
3435 snprintf (nml_err_msg
, nml_err_msg_size
,
3436 "Step not allowed in substring qualifier"
3437 " for namelist object %s", nl
->var_name
);
3441 if ((c
= next_char (dtp
)) == EOF
)
3443 unget_char (dtp
, c
);
3446 /* Make sure no extraneous qualifiers are there. */
3450 snprintf (nml_err_msg
, nml_err_msg_size
,
3451 "Qualifier for a scalar or non-character namelist object %s",
3456 /* Make sure there is no more than one non-zero rank object. */
3457 if (non_zero_rank_count
> 1)
3459 snprintf (nml_err_msg
, nml_err_msg_size
,
3460 "Multiple sub-objects with non-zero rank in namelist object %s",
3462 non_zero_rank_count
= 0;
3466 /* According to the standard, an equal sign MUST follow an object name. The
3467 following is possibly lax - it allows comments, blank lines and so on to
3468 intervene. eat_spaces (dtp); c = next_char (dtp); would be compliant*/
3472 eat_separator (dtp
);
3473 if (dtp
->u
.p
.input_complete
)
3476 if (dtp
->u
.p
.at_eol
)
3477 finish_separator (dtp
);
3478 if (dtp
->u
.p
.input_complete
)
3481 if ((c
= next_char (dtp
)) == EOF
)
3486 snprintf (nml_err_msg
, nml_err_msg_size
,
3487 "Equal sign must follow namelist object name %s",
3492 /* If a derived type, touch its components and restore the root
3493 namelist_info if we have parsed a qualified derived type
3496 if (nl
->type
== BT_DERIVED
&& nl
->dtio_sub
== NULL
)
3497 nml_touch_nodes (nl
);
3501 if (first_nl
->var_rank
== 0)
3503 if (component_flag
&& qualifier_flag
)
3510 dtp
->u
.p
.nml_read_error
= 0;
3511 if (!nml_read_obj (dtp
, nl
, 0, pprev_nl
, nml_err_msg
, nml_err_msg_size
,
3519 /* The EOF error message is issued by hit_eof. Return true so that the
3520 caller does not use nml_err_msg and nml_err_msg_size to generate
3521 an unrelated error message. */
3524 dtp
->u
.p
.input_complete
= 1;
3525 unget_char (dtp
, c
);
3532 /* Entry point for namelist input. Goes through input until namelist name
3533 is matched. Then cycles through nml_get_obj_data until the input is
3534 completed or there is an error. */
3537 namelist_read (st_parameter_dt
*dtp
)
3540 char nml_err_msg
[200];
3542 /* Initialize the error string buffer just in case we get an unexpected fail
3543 somewhere and end up at nml_err_ret. */
3544 strcpy (nml_err_msg
, "Internal namelist read error");
3546 /* Pointer to the previously read object, in case attempt is made to read
3547 new object name. Should this fail, error message can give previous
3549 namelist_info
*prev_nl
= NULL
;
3551 dtp
->u
.p
.input_complete
= 0;
3552 dtp
->u
.p
.expanded_read
= 0;
3554 /* Set the next_char and push_char worker functions. */
3557 /* Look for &namelist_name . Skip all characters, testing for $nmlname.
3558 Exit on success or EOF. If '?' or '=?' encountered in stdin, print
3559 node names or namelist on stdout. */
3562 c
= next_char (dtp
);
3574 c
= next_char (dtp
);
3576 nml_query (dtp
, '=');
3578 unget_char (dtp
, c
);
3582 nml_query (dtp
, '?');
3592 /* Match the name of the namelist. */
3594 nml_match_name (dtp
, dtp
->namelist_name
, dtp
->namelist_name_len
);
3596 if (dtp
->u
.p
.nml_read_error
)
3599 /* A trailing space is required, we give a little latitude here, 10.9.1. */
3600 c
= next_char (dtp
);
3601 if (!is_separator(c
) && c
!= '!')
3603 unget_char (dtp
, c
);
3607 unget_char (dtp
, c
);
3608 eat_separator (dtp
);
3610 /* Ready to read namelist objects. If there is an error in input
3611 from stdin, output the error message and continue. */
3613 while (!dtp
->u
.p
.input_complete
)
3615 if (!nml_get_obj_data (dtp
, &prev_nl
, nml_err_msg
, sizeof nml_err_msg
))
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)
3631 /* All namelist error calls return from here */
3634 generate_error (&dtp
->common
, LIBERROR_READ_VALUE
, nml_err_msg
);