1 /* Copyright (C) 2002-2015 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/>. */
35 typedef unsigned char uchar
;
38 /* List directed input. Several parsing subroutines are practically
39 reimplemented from formatted input, the reason being that there are
40 all kinds of small differences between formatted and list directed
44 /* Subroutines for reading characters from the input. Because a
45 repeat count is ambiguous with an integer, we have to read the
46 whole digit string before seeing if there is a '*' which signals
47 the repeat count. Since we can have a lot of potential leading
48 zeros, we have to be able to back up by arbitrary amount. Because
49 the input might not be seekable, we have to buffer the data
52 #define CASE_DIGITS case '0': case '1': case '2': case '3': case '4': \
53 case '5': case '6': case '7': case '8': case '9'
55 #define CASE_SEPARATORS case ' ': case ',': case '/': case '\n': case '\t': \
56 case '\r': case ';': case '!'
58 /* This macro assumes that we're operating on a variable. */
60 #define is_separator(c) (c == '/' || c == ',' || c == '\n' || c == ' ' \
61 || c == '\t' || c == '\r' || c == ';' || 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
);
98 // Also this should not be necessary.
99 memset (dtp
->u
.p
.saved_string
+ dtp
->u
.p
.saved_used
, 0,
100 dtp
->u
.p
.saved_length
- dtp
->u
.p
.saved_used
);
104 dtp
->u
.p
.saved_string
[dtp
->u
.p
.saved_used
++] = (char) c
;
108 /* Worker function to save a KIND=4 character to a string buffer,
109 enlarging the buffer as necessary. */
112 push_char4 (st_parameter_dt
*dtp
, int c
)
114 gfc_char4_t
*new, *p
= (gfc_char4_t
*) dtp
->u
.p
.saved_string
;
118 dtp
->u
.p
.saved_string
= xcalloc (SCRATCH_SIZE
, sizeof (gfc_char4_t
));
119 dtp
->u
.p
.saved_length
= SCRATCH_SIZE
;
120 dtp
->u
.p
.saved_used
= 0;
121 p
= (gfc_char4_t
*) dtp
->u
.p
.saved_string
;
124 if (dtp
->u
.p
.saved_used
>= dtp
->u
.p
.saved_length
)
126 dtp
->u
.p
.saved_length
= 2 * dtp
->u
.p
.saved_length
;
127 p
= xrealloc (p
, dtp
->u
.p
.saved_length
* sizeof (gfc_char4_t
));
129 memset4 (new + dtp
->u
.p
.saved_used
, 0,
130 dtp
->u
.p
.saved_length
- dtp
->u
.p
.saved_used
);
133 p
[dtp
->u
.p
.saved_used
++] = c
;
137 /* Free the input buffer if necessary. */
140 free_saved (st_parameter_dt
*dtp
)
142 if (dtp
->u
.p
.saved_string
== NULL
)
145 free (dtp
->u
.p
.saved_string
);
147 dtp
->u
.p
.saved_string
= NULL
;
148 dtp
->u
.p
.saved_used
= 0;
152 /* Free the line buffer if necessary. */
155 free_line (st_parameter_dt
*dtp
)
157 dtp
->u
.p
.line_buffer_pos
= 0;
158 dtp
->u
.p
.line_buffer_enabled
= 0;
160 if (dtp
->u
.p
.line_buffer
== NULL
)
163 free (dtp
->u
.p
.line_buffer
);
164 dtp
->u
.p
.line_buffer
= NULL
;
168 /* Unget saves the last character so when reading the next character,
169 we need to check to see if there is a character waiting. Similar,
170 if the line buffer is being used to read_logical, check it too. */
173 check_buffers (st_parameter_dt
*dtp
)
178 if (dtp
->u
.p
.last_char
!= EOF
- 1)
181 c
= dtp
->u
.p
.last_char
;
182 dtp
->u
.p
.last_char
= EOF
- 1;
186 /* Read from line_buffer if enabled. */
188 if (dtp
->u
.p
.line_buffer_enabled
)
192 c
= dtp
->u
.p
.line_buffer
[dtp
->u
.p
.line_buffer_pos
];
193 if (c
!= '\0' && dtp
->u
.p
.line_buffer_pos
< 64)
195 dtp
->u
.p
.line_buffer
[dtp
->u
.p
.line_buffer_pos
] = '\0';
196 dtp
->u
.p
.line_buffer_pos
++;
200 dtp
->u
.p
.line_buffer_pos
= 0;
201 dtp
->u
.p
.line_buffer_enabled
= 0;
205 dtp
->u
.p
.at_eol
= (c
== '\n' || c
== EOF
);
210 /* Worker function for default character encoded file. */
212 next_char_default (st_parameter_dt
*dtp
)
216 /* Always check the unget and line buffer first. */
217 if ((c
= check_buffers (dtp
)))
220 c
= fbuf_getc (dtp
->u
.p
.current_unit
);
221 if (c
!= EOF
&& is_stream_io (dtp
))
222 dtp
->u
.p
.current_unit
->strm_pos
++;
224 dtp
->u
.p
.at_eol
= (c
== '\n' || c
== EOF
);
229 /* Worker function for internal and array I/O units. */
231 next_char_internal (st_parameter_dt
*dtp
)
237 /* Always check the unget and line buffer first. */
238 if ((c
= check_buffers (dtp
)))
241 /* Handle the end-of-record and end-of-file conditions for
242 internal array unit. */
243 if (is_array_io (dtp
))
248 /* Check for "end-of-record" condition. */
249 if (dtp
->u
.p
.current_unit
->bytes_left
== 0)
254 record
= next_array_record (dtp
, dtp
->u
.p
.current_unit
->ls
,
257 /* Check for "end-of-file" condition. */
264 record
*= dtp
->u
.p
.current_unit
->recl
;
265 if (sseek (dtp
->u
.p
.current_unit
->s
, record
, SEEK_SET
) < 0)
268 dtp
->u
.p
.current_unit
->bytes_left
= dtp
->u
.p
.current_unit
->recl
;
273 /* Get the next character and handle end-of-record conditions. */
275 if (dtp
->common
.unit
) /* Check for kind=4 internal unit. */
276 length
= sread (dtp
->u
.p
.current_unit
->s
, &c
, 1);
280 length
= sread (dtp
->u
.p
.current_unit
->s
, &cc
, 1);
284 if (unlikely (length
< 0))
286 generate_error (&dtp
->common
, LIBERROR_OS
, NULL
);
290 if (is_array_io (dtp
))
292 /* Check whether we hit EOF. */
293 if (unlikely (length
== 0))
295 generate_error (&dtp
->common
, LIBERROR_INTERNAL_UNIT
, NULL
);
298 dtp
->u
.p
.current_unit
->bytes_left
--;
312 dtp
->u
.p
.at_eol
= (c
== '\n' || c
== EOF
);
317 /* Worker function for UTF encoded files. */
319 next_char_utf8 (st_parameter_dt
*dtp
)
321 static const uchar masks
[6] = { 0x7F, 0x1F, 0x0F, 0x07, 0x02, 0x01 };
322 static const uchar patns
[6] = { 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC };
326 /* Always check the unget and line buffer first. */
327 if (!(c
= check_buffers (dtp
)))
328 c
= fbuf_getc (dtp
->u
.p
.current_unit
);
333 /* The number of leading 1-bits in the first byte indicates how many
335 for (nb
= 2; nb
< 7; nb
++)
336 if ((c
& ~masks
[nb
-1]) == patns
[nb
-1])
341 c
= (c
& masks
[nb
-1]);
343 /* Decode the bytes read. */
344 for (i
= 1; i
< nb
; i
++)
346 gfc_char4_t n
= fbuf_getc (dtp
->u
.p
.current_unit
);
347 if ((n
& 0xC0) != 0x80)
349 c
= ((c
<< 6) + (n
& 0x3F));
352 /* Make sure the shortest possible encoding was used. */
353 if (c
<= 0x7F && nb
> 1) goto invalid
;
354 if (c
<= 0x7FF && nb
> 2) goto invalid
;
355 if (c
<= 0xFFFF && nb
> 3) goto invalid
;
356 if (c
<= 0x1FFFFF && nb
> 4) goto invalid
;
357 if (c
<= 0x3FFFFFF && nb
> 5) goto invalid
;
359 /* Make sure the character is valid. */
360 if (c
> 0x7FFFFFFF || (c
>= 0xD800 && c
<= 0xDFFF))
364 dtp
->u
.p
.at_eol
= (c
== '\n' || c
== (gfc_char4_t
) EOF
);
368 generate_error (&dtp
->common
, LIBERROR_READ_VALUE
, "Invalid UTF-8 encoding");
369 return (gfc_char4_t
) '?';
372 /* Push a character back onto the input. */
375 unget_char (st_parameter_dt
*dtp
, int c
)
377 dtp
->u
.p
.last_char
= c
;
381 /* Skip over spaces in the input. Returns the nonspace character that
382 terminated the eating and also places it back on the input. */
385 eat_spaces (st_parameter_dt
*dtp
)
389 /* If internal character array IO, peak ahead and seek past spaces.
390 This is an optimization unique to character arrays with large
391 character lengths (PR38199). This code eliminates numerous calls
392 to next_character. */
393 if (is_array_io (dtp
) && (dtp
->u
.p
.last_char
== EOF
- 1))
395 gfc_offset offset
= stell (dtp
->u
.p
.current_unit
->s
);
398 if (dtp
->common
.unit
) /* kind=4 */
400 for (i
= 0; i
< dtp
->u
.p
.current_unit
->bytes_left
; i
++)
402 if (dtp
->internal_unit
[(offset
+ i
) * sizeof (gfc_char4_t
)]
409 for (i
= 0; i
< dtp
->u
.p
.current_unit
->bytes_left
; i
++)
411 if (dtp
->internal_unit
[offset
+ i
] != ' ')
418 sseek (dtp
->u
.p
.current_unit
->s
, offset
+ i
, SEEK_SET
);
419 dtp
->u
.p
.current_unit
->bytes_left
-= i
;
423 /* Now skip spaces, EOF and EOL are handled in next_char. */
426 while (c
!= EOF
&& (c
== ' ' || c
== '\t'));
433 /* This function reads characters through to the end of the current
434 line and just ignores them. Returns 0 for success and LIBERROR_END
438 eat_line (st_parameter_dt
*dtp
)
444 while (c
!= EOF
&& c
!= '\n');
451 /* Skip over a separator. Technically, we don't always eat the whole
452 separator. This is because if we've processed the last input item,
453 then a separator is unnecessary. Plus the fact that operating
454 systems usually deliver console input on a line basis.
456 The upshot is that if we see a newline as part of reading a
457 separator, we stop reading. If there are more input items, we
458 continue reading the separator with finish_separator() which takes
459 care of the fact that we may or may not have seen a comma as part
462 Returns 0 for success, and non-zero error code otherwise. */
465 eat_separator (st_parameter_dt
*dtp
)
471 dtp
->u
.p
.comma_flag
= 0;
473 if ((c
= next_char (dtp
)) == EOF
)
478 if (dtp
->u
.p
.current_unit
->decimal_status
== DECIMAL_COMMA
)
485 dtp
->u
.p
.comma_flag
= 1;
490 dtp
->u
.p
.input_complete
= 1;
494 if ((n
= next_char(dtp
)) == EOF
)
504 if (dtp
->u
.p
.namelist_mode
)
508 if ((c
= next_char (dtp
)) == EOF
)
512 err
= eat_line (dtp
);
518 while (c
== '\n' || c
== '\r' || c
== ' ' || c
== '\t');
524 if (dtp
->u
.p
.namelist_mode
)
525 { /* Eat a namelist comment. */
526 notify_std (&dtp
->common
, GFC_STD_GNU
,
527 "'!' in namelist is not a valid separator,"
528 " try inserting a space");
529 err
= eat_line (dtp
);
536 /* Fall Through... */
546 /* Finish processing a separator that was interrupted by a newline.
547 If we're here, then another data item is present, so we finish what
548 we started on the previous line. Return 0 on success, error code
552 finish_separator (st_parameter_dt
*dtp
)
555 int err
= LIBERROR_OK
;
560 if ((c
= next_char (dtp
)) == EOF
)
565 if (dtp
->u
.p
.comma_flag
)
569 if ((c
= eat_spaces (dtp
)) == EOF
)
571 if (c
== '\n' || c
== '\r')
578 dtp
->u
.p
.input_complete
= 1;
579 if (!dtp
->u
.p
.namelist_mode
)
588 if (dtp
->u
.p
.namelist_mode
)
590 err
= eat_line (dtp
);
604 /* This function is needed to catch bad conversions so that namelist can
605 attempt to see if dtp->u.p.saved_string contains a new object name rather
609 nml_bad_return (st_parameter_dt
*dtp
, char c
)
611 if (dtp
->u
.p
.namelist_mode
)
613 dtp
->u
.p
.nml_read_error
= 1;
620 /* Convert an unsigned string to an integer. The length value is -1
621 if we are working on a repeat count. Returns nonzero if we have a
622 range problem. As a side effect, frees the dtp->u.p.saved_string. */
625 convert_integer (st_parameter_dt
*dtp
, int length
, int negative
)
627 char c
, *buffer
, message
[MSGLEN
];
629 GFC_UINTEGER_LARGEST v
, max
, max10
;
630 GFC_INTEGER_LARGEST value
;
632 buffer
= dtp
->u
.p
.saved_string
;
639 max
= si_max (length
);
669 set_integer (dtp
->u
.p
.value
, value
, length
);
673 dtp
->u
.p
.repeat_count
= v
;
675 if (dtp
->u
.p
.repeat_count
== 0)
677 snprintf (message
, MSGLEN
, "Zero repeat count in item %d of list input",
678 dtp
->u
.p
.item_count
);
680 generate_error (&dtp
->common
, LIBERROR_READ_VALUE
, message
);
690 snprintf (message
, MSGLEN
, "Repeat count overflow in item %d of list input",
691 dtp
->u
.p
.item_count
);
693 snprintf (message
, MSGLEN
, "Integer overflow while reading item %d",
694 dtp
->u
.p
.item_count
);
697 generate_error (&dtp
->common
, LIBERROR_READ_VALUE
, message
);
703 /* Parse a repeat count for logical and complex values which cannot
704 begin with a digit. Returns nonzero if we are done, zero if we
705 should continue on. */
708 parse_repeat (st_parameter_dt
*dtp
)
710 char message
[MSGLEN
];
713 if ((c
= next_char (dtp
)) == EOF
)
737 repeat
= 10 * repeat
+ c
- '0';
739 if (repeat
> MAX_REPEAT
)
741 snprintf (message
, MSGLEN
,
742 "Repeat count overflow in item %d of list input",
743 dtp
->u
.p
.item_count
);
745 generate_error (&dtp
->common
, LIBERROR_READ_VALUE
, message
);
754 snprintf (message
, MSGLEN
,
755 "Zero repeat count in item %d of list input",
756 dtp
->u
.p
.item_count
);
758 generate_error (&dtp
->common
, LIBERROR_READ_VALUE
, message
);
770 dtp
->u
.p
.repeat_count
= repeat
;
784 snprintf (message
, MSGLEN
, "Bad repeat count in item %d of list input",
785 dtp
->u
.p
.item_count
);
786 generate_error (&dtp
->common
, LIBERROR_READ_VALUE
, message
);
791 /* To read a logical we have to look ahead in the input stream to make sure
792 there is not an equal sign indicating a variable name. To do this we use
793 line_buffer to point to a temporary buffer, pushing characters there for
794 possible later reading. */
797 l_push_char (st_parameter_dt
*dtp
, char c
)
799 if (dtp
->u
.p
.line_buffer
== NULL
)
800 dtp
->u
.p
.line_buffer
= xcalloc (SCRATCH_SIZE
, 1);
802 dtp
->u
.p
.line_buffer
[dtp
->u
.p
.line_buffer_pos
++] = c
;
806 /* Read a logical character on the input. */
809 read_logical (st_parameter_dt
*dtp
, int length
)
811 char message
[MSGLEN
];
814 if (parse_repeat (dtp
))
817 c
= tolower (next_char (dtp
));
818 l_push_char (dtp
, c
);
824 l_push_char (dtp
, c
);
826 if (!is_separator(c
) && c
!= EOF
)
834 l_push_char (dtp
, c
);
836 if (!is_separator(c
) && c
!= EOF
)
843 c
= tolower (next_char (dtp
));
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
)
977 CASE_SEPARATORS
: /* Single null. */
990 /* Take care of what may be a repeat count. */
1002 push_char (dtp
, '\0');
1005 CASE_SEPARATORS
: /* Not a repeat count. */
1015 if (convert_integer (dtp
, -1, 0))
1018 /* Get the real integer. */
1020 if ((c
= next_char (dtp
)) == EOF
)
1028 unget_char (dtp
, c
);
1029 eat_separator (dtp
);
1034 /* Fall through... */
1037 c
= next_char (dtp
);
1048 c
= next_char (dtp
);
1066 if (nml_bad_return (dtp
, c
))
1079 snprintf (message
, MSGLEN
, "Bad integer for item %d in list input",
1080 dtp
->u
.p
.item_count
);
1082 generate_error (&dtp
->common
, LIBERROR_READ_VALUE
, message
);
1087 unget_char (dtp
, c
);
1088 eat_separator (dtp
);
1090 push_char (dtp
, '\0');
1091 if (convert_integer (dtp
, length
, negative
))
1098 dtp
->u
.p
.saved_type
= BT_INTEGER
;
1102 /* Read a character variable. */
1105 read_character (st_parameter_dt
*dtp
, int length
__attribute__ ((unused
)))
1107 char quote
, message
[MSGLEN
];
1110 quote
= ' '; /* Space means no quote character. */
1112 if ((c
= next_char (dtp
)) == EOF
)
1122 unget_char (dtp
, c
); /* NULL value. */
1123 eat_separator (dtp
);
1132 if (dtp
->u
.p
.namelist_mode
)
1134 if (dtp
->u
.p
.current_unit
->delim_status
== DELIM_NONE
)
1136 /* No delimiters so finish reading the string now. */
1139 for (i
= dtp
->u
.p
.ionml
->string_length
; i
> 1; i
--)
1141 if ((c
= next_char (dtp
)) == EOF
)
1145 dtp
->u
.p
.saved_type
= BT_CHARACTER
;
1149 unget_char (dtp
, c
);
1156 /* Deal with a possible repeat count. */
1160 c
= next_char (dtp
);
1169 unget_char (dtp
, c
);
1170 goto done
; /* String was only digits! */
1173 push_char (dtp
, '\0');
1178 goto get_string
; /* Not a repeat count after all. */
1183 if (convert_integer (dtp
, -1, 0))
1186 /* Now get the real string. */
1188 if ((c
= next_char (dtp
)) == EOF
)
1193 unget_char (dtp
, c
); /* Repeated NULL values. */
1194 eat_separator (dtp
);
1211 if ((c
= next_char (dtp
)) == EOF
)
1223 /* See if we have a doubled quote character or the end of
1226 if ((c
= next_char (dtp
)) == EOF
)
1230 push_char (dtp
, quote
);
1234 unget_char (dtp
, c
);
1240 unget_char (dtp
, c
);
1244 if (c
!= '\n' && c
!= '\r')
1254 /* At this point, we have to have a separator, or else the string is
1257 c
= next_char (dtp
);
1259 if (is_separator (c
) || c
== '!' || c
== EOF
)
1261 unget_char (dtp
, c
);
1262 eat_separator (dtp
);
1263 dtp
->u
.p
.saved_type
= BT_CHARACTER
;
1268 snprintf (message
, MSGLEN
, "Invalid string input in item %d",
1269 dtp
->u
.p
.item_count
);
1270 generate_error (&dtp
->common
, LIBERROR_READ_VALUE
, message
);
1282 /* Parse a component of a complex constant or a real number that we
1283 are sure is already there. This is a straight real number parser. */
1286 parse_real (st_parameter_dt
*dtp
, void *buffer
, int length
)
1288 char message
[MSGLEN
];
1291 if ((c
= next_char (dtp
)) == EOF
)
1294 if (c
== '-' || c
== '+')
1297 if ((c
= next_char (dtp
)) == EOF
)
1301 if (c
== ',' && dtp
->u
.p
.current_unit
->decimal_status
== DECIMAL_COMMA
)
1304 if (!isdigit (c
) && c
!= '.')
1306 if (c
== 'i' || c
== 'I' || c
== 'n' || c
== 'N')
1314 seen_dp
= (c
== '.') ? 1 : 0;
1318 if ((c
= next_char (dtp
)) == EOF
)
1320 if (c
== ',' && dtp
->u
.p
.current_unit
->decimal_status
== DECIMAL_COMMA
)
1342 push_char (dtp
, 'e');
1347 push_char (dtp
, 'e');
1349 if ((c
= next_char (dtp
)) == EOF
)
1363 if ((c
= next_char (dtp
)) == EOF
)
1365 if (c
!= '-' && c
!= '+')
1366 push_char (dtp
, '+');
1370 c
= next_char (dtp
);
1381 if ((c
= next_char (dtp
)) == EOF
)
1391 unget_char (dtp
, c
);
1400 unget_char (dtp
, c
);
1401 push_char (dtp
, '\0');
1403 m
= convert_real (dtp
, buffer
, dtp
->u
.p
.saved_string
, length
);
1409 unget_char (dtp
, c
);
1410 push_char (dtp
, '\0');
1412 m
= convert_infnan (dtp
, buffer
, dtp
->u
.p
.saved_string
, length
);
1418 /* Match INF and Infinity. */
1419 if ((c
== 'i' || c
== 'I')
1420 && ((c
= next_char (dtp
)) == 'n' || c
== 'N')
1421 && ((c
= next_char (dtp
)) == 'f' || c
== 'F'))
1423 c
= next_char (dtp
);
1424 if ((c
!= 'i' && c
!= 'I')
1425 || ((c
== 'i' || c
== 'I')
1426 && ((c
= next_char (dtp
)) == 'n' || c
== 'N')
1427 && ((c
= next_char (dtp
)) == 'i' || c
== 'I')
1428 && ((c
= next_char (dtp
)) == 't' || c
== 'T')
1429 && ((c
= next_char (dtp
)) == 'y' || c
== 'Y')
1430 && (c
= next_char (dtp
))))
1432 if (is_separator (c
) || (c
== EOF
))
1433 unget_char (dtp
, c
);
1434 push_char (dtp
, 'i');
1435 push_char (dtp
, 'n');
1436 push_char (dtp
, 'f');
1440 else if (((c
= next_char (dtp
)) == 'a' || c
== 'A')
1441 && ((c
= next_char (dtp
)) == 'n' || c
== 'N')
1442 && (c
= next_char (dtp
)))
1444 if (is_separator (c
) || (c
== EOF
))
1445 unget_char (dtp
, c
);
1446 push_char (dtp
, 'n');
1447 push_char (dtp
, 'a');
1448 push_char (dtp
, 'n');
1450 /* Match "NAN(alphanum)". */
1453 for ( ; c
!= ')'; c
= next_char (dtp
))
1454 if (is_separator (c
))
1457 c
= next_char (dtp
);
1458 if (is_separator (c
) || (c
== EOF
))
1459 unget_char (dtp
, c
);
1466 if (nml_bad_return (dtp
, c
))
1479 snprintf (message
, MSGLEN
, "Bad floating point number for item %d",
1480 dtp
->u
.p
.item_count
);
1482 generate_error (&dtp
->common
, LIBERROR_READ_VALUE
, message
);
1488 /* Reading a complex number is straightforward because we can tell
1489 what it is right away. */
1492 read_complex (st_parameter_dt
*dtp
, void * dest
, int kind
, size_t size
)
1494 char message
[MSGLEN
];
1497 if (parse_repeat (dtp
))
1500 c
= next_char (dtp
);
1508 unget_char (dtp
, c
);
1509 eat_separator (dtp
);
1518 c
= next_char (dtp
);
1519 if (c
== '\n' || c
== '\r')
1522 unget_char (dtp
, c
);
1524 if (parse_real (dtp
, dest
, kind
))
1529 c
= next_char (dtp
);
1530 if (c
== '\n' || c
== '\r')
1533 unget_char (dtp
, c
);
1536 != (dtp
->u
.p
.current_unit
->decimal_status
== DECIMAL_POINT
? ',' : ';'))
1541 c
= next_char (dtp
);
1542 if (c
== '\n' || c
== '\r')
1545 unget_char (dtp
, c
);
1547 if (parse_real (dtp
, dest
+ size
/ 2, kind
))
1552 c
= next_char (dtp
);
1553 if (c
== '\n' || c
== '\r')
1556 unget_char (dtp
, c
);
1558 if (next_char (dtp
) != ')')
1561 c
= next_char (dtp
);
1562 if (!is_separator (c
) && (c
!= EOF
))
1565 unget_char (dtp
, c
);
1566 eat_separator (dtp
);
1569 dtp
->u
.p
.saved_type
= BT_COMPLEX
;
1574 if (nml_bad_return (dtp
, c
))
1587 snprintf (message
, MSGLEN
, "Bad complex value in item %d of list input",
1588 dtp
->u
.p
.item_count
);
1590 generate_error (&dtp
->common
, LIBERROR_READ_VALUE
, message
);
1594 /* Parse a real number with a possible repeat count. */
1597 read_real (st_parameter_dt
*dtp
, void * dest
, int length
)
1599 char message
[MSGLEN
];
1606 c
= next_char (dtp
);
1607 if (c
== ',' && dtp
->u
.p
.current_unit
->decimal_status
== DECIMAL_COMMA
)
1625 unget_char (dtp
, c
); /* Single null. */
1626 eat_separator (dtp
);
1639 /* Get the digit string that might be a repeat count. */
1643 c
= next_char (dtp
);
1644 if (c
== ',' && dtp
->u
.p
.current_unit
->decimal_status
== DECIMAL_COMMA
)
1670 push_char (dtp
, 'e');
1672 c
= next_char (dtp
);
1676 push_char (dtp
, '\0');
1681 if (c
!= '\n' && c
!= ',' && c
!= '\r' && c
!= ';')
1682 unget_char (dtp
, c
);
1691 if (convert_integer (dtp
, -1, 0))
1694 /* Now get the number itself. */
1696 if ((c
= next_char (dtp
)) == EOF
)
1698 if (is_separator (c
))
1699 { /* Repeated null value. */
1700 unget_char (dtp
, c
);
1701 eat_separator (dtp
);
1705 if (c
!= '-' && c
!= '+')
1706 push_char (dtp
, '+');
1711 if ((c
= next_char (dtp
)) == EOF
)
1715 if (c
== ',' && dtp
->u
.p
.current_unit
->decimal_status
== DECIMAL_COMMA
)
1718 if (!isdigit (c
) && c
!= '.')
1720 if (c
== 'i' || c
== 'I' || c
== 'n' || c
== 'N')
1739 c
= next_char (dtp
);
1740 if (c
== ',' && dtp
->u
.p
.current_unit
->decimal_status
== DECIMAL_COMMA
)
1770 push_char (dtp
, 'e');
1772 c
= next_char (dtp
);
1781 push_char (dtp
, 'e');
1783 if ((c
= next_char (dtp
)) == EOF
)
1785 if (c
!= '+' && c
!= '-')
1786 push_char (dtp
, '+');
1790 c
= next_char (dtp
);
1800 c
= next_char (dtp
);
1818 unget_char (dtp
, c
);
1819 eat_separator (dtp
);
1820 push_char (dtp
, '\0');
1821 if (convert_real (dtp
, dest
, dtp
->u
.p
.saved_string
, length
))
1828 dtp
->u
.p
.saved_type
= BT_REAL
;
1832 l_push_char (dtp
, c
);
1835 /* Match INF and Infinity. */
1836 if (c
== 'i' || c
== 'I')
1838 c
= next_char (dtp
);
1839 l_push_char (dtp
, c
);
1840 if (c
!= 'n' && c
!= 'N')
1842 c
= next_char (dtp
);
1843 l_push_char (dtp
, c
);
1844 if (c
!= 'f' && c
!= 'F')
1846 c
= next_char (dtp
);
1847 l_push_char (dtp
, c
);
1848 if (!is_separator (c
) && (c
!= EOF
))
1850 if (c
!= 'i' && c
!= 'I')
1852 c
= next_char (dtp
);
1853 l_push_char (dtp
, c
);
1854 if (c
!= 'n' && c
!= 'N')
1856 c
= next_char (dtp
);
1857 l_push_char (dtp
, c
);
1858 if (c
!= 'i' && c
!= 'I')
1860 c
= next_char (dtp
);
1861 l_push_char (dtp
, c
);
1862 if (c
!= 't' && c
!= 'T')
1864 c
= next_char (dtp
);
1865 l_push_char (dtp
, c
);
1866 if (c
!= 'y' && c
!= 'Y')
1868 c
= next_char (dtp
);
1869 l_push_char (dtp
, c
);
1875 c
= next_char (dtp
);
1876 l_push_char (dtp
, c
);
1877 if (c
!= 'a' && c
!= 'A')
1879 c
= next_char (dtp
);
1880 l_push_char (dtp
, c
);
1881 if (c
!= 'n' && c
!= 'N')
1883 c
= next_char (dtp
);
1884 l_push_char (dtp
, c
);
1886 /* Match NAN(alphanum). */
1889 for (c
= next_char (dtp
); c
!= ')'; c
= next_char (dtp
))
1890 if (is_separator (c
))
1893 l_push_char (dtp
, c
);
1895 l_push_char (dtp
, ')');
1896 c
= next_char (dtp
);
1897 l_push_char (dtp
, c
);
1901 if (!is_separator (c
) && (c
!= EOF
))
1904 if (dtp
->u
.p
.namelist_mode
)
1906 if (c
== ' ' || c
=='\n' || c
== '\r')
1910 if ((c
= next_char (dtp
)) == EOF
)
1913 while (c
== ' ' || c
=='\n' || c
== '\r');
1915 l_push_char (dtp
, c
);
1924 push_char (dtp
, 'i');
1925 push_char (dtp
, 'n');
1926 push_char (dtp
, 'f');
1930 push_char (dtp
, 'n');
1931 push_char (dtp
, 'a');
1932 push_char (dtp
, 'n');
1936 unget_char (dtp
, c
);
1937 eat_separator (dtp
);
1938 push_char (dtp
, '\0');
1939 if (convert_infnan (dtp
, dest
, dtp
->u
.p
.saved_string
, length
))
1943 dtp
->u
.p
.saved_type
= BT_REAL
;
1947 if (dtp
->u
.p
.namelist_mode
)
1949 dtp
->u
.p
.nml_read_error
= 1;
1950 dtp
->u
.p
.line_buffer_enabled
= 1;
1951 dtp
->u
.p
.line_buffer_pos
= 0;
1957 if (nml_bad_return (dtp
, c
))
1970 snprintf (message
, MSGLEN
, "Bad real number in item %d of list input",
1971 dtp
->u
.p
.item_count
);
1973 generate_error (&dtp
->common
, LIBERROR_READ_VALUE
, message
);
1977 /* Check the current type against the saved type to make sure they are
1978 compatible. Returns nonzero if incompatible. */
1981 check_type (st_parameter_dt
*dtp
, bt type
, int kind
)
1983 char message
[MSGLEN
];
1985 if (dtp
->u
.p
.saved_type
!= BT_UNKNOWN
&& dtp
->u
.p
.saved_type
!= type
)
1987 snprintf (message
, MSGLEN
, "Read type %s where %s was expected for item %d",
1988 type_name (dtp
->u
.p
.saved_type
), type_name (type
),
1989 dtp
->u
.p
.item_count
);
1991 generate_error (&dtp
->common
, LIBERROR_READ_VALUE
, message
);
1995 if (dtp
->u
.p
.saved_type
== BT_UNKNOWN
|| dtp
->u
.p
.saved_type
== BT_CHARACTER
)
1998 if ((type
!= BT_COMPLEX
&& dtp
->u
.p
.saved_length
!= kind
)
1999 || (type
== BT_COMPLEX
&& dtp
->u
.p
.saved_length
!= kind
*2))
2001 snprintf (message
, MSGLEN
,
2002 "Read kind %d %s where kind %d is required for item %d",
2003 type
== BT_COMPLEX
? dtp
->u
.p
.saved_length
/ 2
2004 : dtp
->u
.p
.saved_length
,
2005 type_name (dtp
->u
.p
.saved_type
), kind
,
2006 dtp
->u
.p
.item_count
);
2008 generate_error (&dtp
->common
, LIBERROR_READ_VALUE
, message
);
2016 /* Initialize the function pointers to select the correct versions of
2017 next_char and push_char depending on what we are doing. */
2020 set_workers (st_parameter_dt
*dtp
)
2022 if (dtp
->u
.p
.current_unit
->flags
.encoding
== ENCODING_UTF8
)
2024 dtp
->u
.p
.current_unit
->next_char_fn_ptr
= &next_char_utf8
;
2025 dtp
->u
.p
.current_unit
->push_char_fn_ptr
= &push_char4
;
2027 else if (is_internal_unit (dtp
))
2029 dtp
->u
.p
.current_unit
->next_char_fn_ptr
= &next_char_internal
;
2030 dtp
->u
.p
.current_unit
->push_char_fn_ptr
= &push_char_default
;
2034 dtp
->u
.p
.current_unit
->next_char_fn_ptr
= &next_char_default
;
2035 dtp
->u
.p
.current_unit
->push_char_fn_ptr
= &push_char_default
;
2040 /* Top level data transfer subroutine for list reads. Because we have
2041 to deal with repeat counts, the data item is always saved after
2042 reading, usually in the dtp->u.p.value[] array. If a repeat count is
2043 greater than one, we copy the data item multiple times. */
2046 list_formatted_read_scalar (st_parameter_dt
*dtp
, bt type
, void *p
,
2047 int kind
, size_t size
)
2053 dtp
->u
.p
.namelist_mode
= 0;
2055 /* Set the next_char and push_char worker functions. */
2058 if (dtp
->u
.p
.first_item
)
2060 dtp
->u
.p
.first_item
= 0;
2061 dtp
->u
.p
.input_complete
= 0;
2062 dtp
->u
.p
.repeat_count
= 1;
2063 dtp
->u
.p
.at_eol
= 0;
2065 if ((c
= eat_spaces (dtp
)) == EOF
)
2070 if (is_separator (c
))
2072 /* Found a null value. */
2073 dtp
->u
.p
.repeat_count
= 0;
2074 eat_separator (dtp
);
2076 /* Set end-of-line flag. */
2077 if (c
== '\n' || c
== '\r')
2079 dtp
->u
.p
.at_eol
= 1;
2080 if (finish_separator (dtp
) == LIBERROR_END
)
2092 if (dtp
->u
.p
.repeat_count
> 0)
2094 if (check_type (dtp
, type
, kind
))
2099 if (dtp
->u
.p
.input_complete
)
2102 if (dtp
->u
.p
.at_eol
)
2103 finish_separator (dtp
);
2107 /* Trailing spaces prior to end of line. */
2108 if (dtp
->u
.p
.at_eol
)
2109 finish_separator (dtp
);
2112 dtp
->u
.p
.saved_type
= BT_UNKNOWN
;
2113 dtp
->u
.p
.repeat_count
= 1;
2119 read_integer (dtp
, kind
);
2122 read_logical (dtp
, kind
);
2125 read_character (dtp
, kind
);
2128 read_real (dtp
, p
, kind
);
2129 /* Copy value back to temporary if needed. */
2130 if (dtp
->u
.p
.repeat_count
> 0)
2131 memcpy (dtp
->u
.p
.value
, p
, size
);
2134 read_complex (dtp
, p
, kind
, size
);
2135 /* Copy value back to temporary if needed. */
2136 if (dtp
->u
.p
.repeat_count
> 0)
2137 memcpy (dtp
->u
.p
.value
, p
, size
);
2140 internal_error (&dtp
->common
, "Bad type for list read");
2143 if (dtp
->u
.p
.saved_type
!= BT_CHARACTER
&& dtp
->u
.p
.saved_type
!= BT_UNKNOWN
)
2144 dtp
->u
.p
.saved_length
= size
;
2146 if ((dtp
->common
.flags
& IOPARM_LIBRETURN_MASK
) != IOPARM_LIBRETURN_OK
)
2150 switch (dtp
->u
.p
.saved_type
)
2154 if (dtp
->u
.p
.repeat_count
> 0)
2155 memcpy (p
, dtp
->u
.p
.value
, size
);
2160 memcpy (p
, dtp
->u
.p
.value
, size
);
2164 if (dtp
->u
.p
.saved_string
)
2166 m
= ((int) size
< dtp
->u
.p
.saved_used
)
2167 ? (int) size
: dtp
->u
.p
.saved_used
;
2169 q
= (gfc_char4_t
*) p
;
2170 r
= (gfc_char4_t
*) dtp
->u
.p
.saved_string
;
2171 if (dtp
->u
.p
.current_unit
->flags
.encoding
== ENCODING_UTF8
)
2172 for (i
= 0; i
< m
; i
++)
2177 memcpy (p
, dtp
->u
.p
.saved_string
, m
);
2179 for (i
= 0; i
< m
; i
++)
2184 /* Just delimiters encountered, nothing to copy but SPACE. */
2190 memset (((char *) p
) + m
, ' ', size
- m
);
2193 q
= (gfc_char4_t
*) p
;
2194 for (i
= m
; i
< (int) size
; i
++)
2195 q
[i
] = (unsigned char) ' ';
2204 internal_error (&dtp
->common
, "Bad type for list read");
2207 if (--dtp
->u
.p
.repeat_count
<= 0)
2211 if (err
== LIBERROR_END
)
2216 fbuf_flush_list (dtp
->u
.p
.current_unit
, LIST_READING
);
2222 list_formatted_read (st_parameter_dt
*dtp
, bt type
, void *p
, int kind
,
2223 size_t size
, size_t nelems
)
2227 size_t stride
= type
== BT_CHARACTER
?
2228 size
* GFC_SIZE_OF_CHAR_KIND(kind
) : size
;
2233 /* Big loop over all the elements. */
2234 for (elem
= 0; elem
< nelems
; elem
++)
2236 dtp
->u
.p
.item_count
++;
2237 err
= list_formatted_read_scalar (dtp
, type
, tmp
+ stride
*elem
,
2245 /* Finish a list read. */
2248 finish_list_read (st_parameter_dt
*dtp
)
2252 fbuf_flush (dtp
->u
.p
.current_unit
, dtp
->u
.p
.mode
);
2254 if (dtp
->u
.p
.at_eol
)
2256 dtp
->u
.p
.at_eol
= 0;
2260 if (!is_internal_unit (dtp
))
2264 /* Set the next_char and push_char worker functions. */
2267 c
= next_char (dtp
);
2284 void namelist_read (st_parameter_dt *dtp)
2286 static void nml_match_name (char *name, int len)
2287 static int nml_query (st_parameter_dt *dtp)
2288 static int nml_get_obj_data (st_parameter_dt *dtp,
2289 namelist_info **prev_nl, char *, size_t)
2291 static void nml_untouch_nodes (st_parameter_dt *dtp)
2292 static namelist_info * find_nml_node (st_parameter_dt *dtp,
2294 static int nml_parse_qualifier(descriptor_dimension * ad,
2295 array_loop_spec * ls, int rank, char *)
2296 static void nml_touch_nodes (namelist_info * nl)
2297 static int nml_read_obj (namelist_info *nl, index_type offset,
2298 namelist_info **prev_nl, char *, size_t,
2299 index_type clow, index_type chigh)
2303 /* Inputs a rank-dimensional qualifier, which can contain
2304 singlets, doublets, triplets or ':' with the standard meanings. */
2307 nml_parse_qualifier (st_parameter_dt
*dtp
, descriptor_dimension
*ad
,
2308 array_loop_spec
*ls
, int rank
, bt nml_elem_type
,
2309 char *parse_err_msg
, size_t parse_err_msg_size
,
2316 int is_array_section
, is_char
;
2320 is_array_section
= 0;
2321 dtp
->u
.p
.expanded_read
= 0;
2323 /* See if this is a character substring qualifier we are looking for. */
2330 /* The next character in the stream should be the '('. */
2332 if ((c
= next_char (dtp
)) == EOF
)
2335 /* Process the qualifier, by dimension and triplet. */
2337 for (dim
=0; dim
< rank
; dim
++ )
2339 for (indx
=0; indx
<3; indx
++)
2345 /* Process a potential sign. */
2346 if ((c
= next_char (dtp
)) == EOF
)
2358 unget_char (dtp
, c
);
2362 /* Process characters up to the next ':' , ',' or ')'. */
2365 c
= next_char (dtp
);
2372 is_array_section
= 1;
2376 if ((c
==',' && dim
== rank
-1)
2377 || (c
==')' && dim
< rank
-1))
2380 snprintf (parse_err_msg
, parse_err_msg_size
,
2381 "Bad substring qualifier");
2383 snprintf (parse_err_msg
, parse_err_msg_size
,
2384 "Bad number of index fields");
2393 case ' ': case '\t': case '\r': case '\n':
2399 snprintf (parse_err_msg
, parse_err_msg_size
,
2400 "Bad character in substring qualifier");
2402 snprintf (parse_err_msg
, parse_err_msg_size
,
2403 "Bad character in index");
2407 if ((c
== ',' || c
== ')') && indx
== 0
2408 && dtp
->u
.p
.saved_string
== 0)
2411 snprintf (parse_err_msg
, parse_err_msg_size
,
2412 "Null substring qualifier");
2414 snprintf (parse_err_msg
, parse_err_msg_size
,
2415 "Null index field");
2419 if ((c
== ':' && indx
== 1 && dtp
->u
.p
.saved_string
== 0)
2420 || (indx
== 2 && dtp
->u
.p
.saved_string
== 0))
2423 snprintf (parse_err_msg
, parse_err_msg_size
,
2424 "Bad substring qualifier");
2426 snprintf (parse_err_msg
, parse_err_msg_size
,
2427 "Bad index triplet");
2431 if (is_char
&& !is_array_section
)
2433 snprintf (parse_err_msg
, parse_err_msg_size
,
2434 "Missing colon in substring qualifier");
2438 /* If '( : ? )' or '( ? : )' break and flag read failure. */
2440 if ((c
== ':' && indx
== 0 && dtp
->u
.p
.saved_string
== 0)
2441 || (indx
==1 && dtp
->u
.p
.saved_string
== 0))
2447 /* Now read the index. */
2448 if (convert_integer (dtp
, sizeof(index_type
), neg
))
2451 snprintf (parse_err_msg
, parse_err_msg_size
,
2452 "Bad integer substring qualifier");
2454 snprintf (parse_err_msg
, parse_err_msg_size
,
2455 "Bad integer in index");
2461 /* Feed the index values to the triplet arrays. */
2465 memcpy (&ls
[dim
].start
, dtp
->u
.p
.value
, sizeof(index_type
));
2467 memcpy (&ls
[dim
].end
, dtp
->u
.p
.value
, sizeof(index_type
));
2469 memcpy (&ls
[dim
].step
, dtp
->u
.p
.value
, sizeof(index_type
));
2472 /* Singlet or doublet indices. */
2473 if (c
==',' || c
==')')
2477 memcpy (&ls
[dim
].start
, dtp
->u
.p
.value
, sizeof(index_type
));
2479 /* If -std=f95/2003 or an array section is specified,
2480 do not allow excess data to be processed. */
2481 if (is_array_section
== 1
2482 || !(compile_options
.allow_std
& GFC_STD_GNU
)
2483 || nml_elem_type
== BT_DERIVED
)
2484 ls
[dim
].end
= ls
[dim
].start
;
2486 dtp
->u
.p
.expanded_read
= 1;
2489 /* Check for non-zero rank. */
2490 if (is_array_section
== 1 && ls
[dim
].start
!= ls
[dim
].end
)
2497 if (is_array_section
== 1 && dtp
->u
.p
.expanded_read
== 1)
2500 dtp
->u
.p
.expanded_read
= 0;
2501 for (i
= 0; i
< dim
; i
++)
2502 ls
[i
].end
= ls
[i
].start
;
2505 /* Check the values of the triplet indices. */
2506 if ((ls
[dim
].start
> GFC_DIMENSION_UBOUND(ad
[dim
]))
2507 || (ls
[dim
].start
< GFC_DIMENSION_LBOUND(ad
[dim
]))
2508 || (ls
[dim
].end
> GFC_DIMENSION_UBOUND(ad
[dim
]))
2509 || (ls
[dim
].end
< GFC_DIMENSION_LBOUND(ad
[dim
])))
2512 snprintf (parse_err_msg
, parse_err_msg_size
,
2513 "Substring out of range");
2515 snprintf (parse_err_msg
, parse_err_msg_size
,
2516 "Index %d out of range", dim
+ 1);
2520 if (((ls
[dim
].end
- ls
[dim
].start
) * ls
[dim
].step
< 0)
2521 || (ls
[dim
].step
== 0))
2523 snprintf (parse_err_msg
, parse_err_msg_size
,
2524 "Bad range in index %d", dim
+ 1);
2528 /* Initialise the loop index counter. */
2529 ls
[dim
].idx
= ls
[dim
].start
;
2536 /* The EOF error message is issued by hit_eof. Return true so that the
2537 caller does not use parse_err_msg and parse_err_msg_size to generate
2538 an unrelated error message. */
2542 dtp
->u
.p
.input_complete
= 1;
2550 extended_look_ahead (char *p
, char *q
)
2554 /* Scan ahead to find a '%' in the p string. */
2555 for(r
= p
, s
= q
; *r
&& *s
; s
++)
2556 if ((*s
== '%' || *s
== '+') && strcmp (r
+ 1, s
+ 1) == 0)
2563 strcmp_extended_type (char *p
, char *q
)
2567 for (r
= p
, s
= q
; *r
&& *s
; r
++, s
++)
2571 if (*r
== '%' && *s
== '+' && extended_look_ahead (r
, s
))
2580 static namelist_info
*
2581 find_nml_node (st_parameter_dt
*dtp
, char * var_name
)
2583 namelist_info
* t
= dtp
->u
.p
.ionml
;
2586 if (strcmp (var_name
, t
->var_name
) == 0)
2591 if (strcmp_extended_type (var_name
, t
->var_name
))
2601 /* Visits all the components of a derived type that have
2602 not explicitly been identified in the namelist input.
2603 touched is set and the loop specification initialised
2604 to default values */
2607 nml_touch_nodes (namelist_info
* nl
)
2609 index_type len
= strlen (nl
->var_name
) + 1;
2611 char * ext_name
= xmalloc (len
+ 1);
2612 memcpy (ext_name
, nl
->var_name
, len
-1);
2613 memcpy (ext_name
+ len
- 1, "%", 2);
2614 for (nl
= nl
->next
; nl
; nl
= nl
->next
)
2616 if (strncmp (nl
->var_name
, ext_name
, len
) == 0)
2619 for (dim
=0; dim
< nl
->var_rank
; dim
++)
2621 nl
->ls
[dim
].step
= 1;
2622 nl
->ls
[dim
].end
= GFC_DESCRIPTOR_UBOUND(nl
,dim
);
2623 nl
->ls
[dim
].start
= GFC_DESCRIPTOR_LBOUND(nl
,dim
);
2624 nl
->ls
[dim
].idx
= nl
->ls
[dim
].start
;
2634 /* Resets touched for the entire list of nml_nodes, ready for a
2638 nml_untouch_nodes (st_parameter_dt
*dtp
)
2641 for (t
= dtp
->u
.p
.ionml
; t
; t
= t
->next
)
2646 /* Attempts to input name to namelist name. Returns
2647 dtp->u.p.nml_read_error = 1 on no match. */
2650 nml_match_name (st_parameter_dt
*dtp
, const char *name
, index_type len
)
2655 dtp
->u
.p
.nml_read_error
= 0;
2656 for (i
= 0; i
< len
; i
++)
2658 c
= next_char (dtp
);
2659 if (c
== EOF
|| (tolower (c
) != tolower (name
[i
])))
2661 dtp
->u
.p
.nml_read_error
= 1;
2667 /* If the namelist read is from stdin, output the current state of the
2668 namelist to stdout. This is used to implement the non-standard query
2669 features, ? and =?. If c == '=' the full namelist is printed. Otherwise
2670 the names alone are printed. */
2673 nml_query (st_parameter_dt
*dtp
, char c
)
2675 gfc_unit
* temp_unit
;
2680 static const index_type endlen
= 2;
2681 static const char endl
[] = "\r\n";
2682 static const char nmlend
[] = "&end\r\n";
2684 static const index_type endlen
= 1;
2685 static const char endl
[] = "\n";
2686 static const char nmlend
[] = "&end\n";
2689 if (dtp
->u
.p
.current_unit
->unit_number
!= options
.stdin_unit
)
2692 /* Store the current unit and transfer to stdout. */
2694 temp_unit
= dtp
->u
.p
.current_unit
;
2695 dtp
->u
.p
.current_unit
= find_unit (options
.stdout_unit
);
2697 if (dtp
->u
.p
.current_unit
)
2699 dtp
->u
.p
.mode
= WRITING
;
2700 next_record (dtp
, 0);
2702 /* Write the namelist in its entirety. */
2705 namelist_write (dtp
);
2707 /* Or write the list of names. */
2711 /* "&namelist_name\n" */
2713 len
= dtp
->namelist_name_len
;
2714 p
= write_block (dtp
, len
- 1 + endlen
);
2718 memcpy ((char*)(p
+ 1), dtp
->namelist_name
, len
);
2719 memcpy ((char*)(p
+ len
+ 1), &endl
, endlen
);
2720 for (nl
= dtp
->u
.p
.ionml
; nl
; nl
= nl
->next
)
2724 len
= strlen (nl
->var_name
);
2725 p
= write_block (dtp
, len
+ endlen
);
2729 memcpy ((char*)(p
+ 1), nl
->var_name
, len
);
2730 memcpy ((char*)(p
+ len
+ 1), &endl
, endlen
);
2735 p
= write_block (dtp
, endlen
+ 4);
2738 memcpy (p
, &nmlend
, endlen
+ 4);
2741 /* Flush the stream to force immediate output. */
2743 fbuf_flush (dtp
->u
.p
.current_unit
, WRITING
);
2744 sflush (dtp
->u
.p
.current_unit
->s
);
2745 unlock_unit (dtp
->u
.p
.current_unit
);
2750 /* Restore the current unit. */
2752 dtp
->u
.p
.current_unit
= temp_unit
;
2753 dtp
->u
.p
.mode
= READING
;
2757 /* Reads and stores the input for the namelist object nl. For an array,
2758 the function loops over the ranges defined by the loop specification.
2759 This default to all the data or to the specification from a qualifier.
2760 nml_read_obj recursively calls itself to read derived types. It visits
2761 all its own components but only reads data for those that were touched
2762 when the name was parsed. If a read error is encountered, an attempt is
2763 made to return to read a new object name because the standard allows too
2764 little data to be available. On the other hand, too much data is an
2768 nml_read_obj (st_parameter_dt
*dtp
, namelist_info
* nl
, index_type offset
,
2769 namelist_info
**pprev_nl
, char *nml_err_msg
,
2770 size_t nml_err_msg_size
, index_type clow
, index_type chigh
)
2772 namelist_info
* cmp
;
2779 size_t obj_name_len
;
2782 /* If we have encountered a previous read error or this object has not been
2783 touched in name parsing, just return. */
2784 if (dtp
->u
.p
.nml_read_error
|| !nl
->touched
)
2787 dtp
->u
.p
.repeat_count
= 0;
2799 dlen
= size_from_real_kind (len
);
2803 dlen
= size_from_complex_kind (len
);
2807 dlen
= chigh
? (chigh
- clow
+ 1) : nl
->string_length
;
2816 /* Update the pointer to the data, using the current index vector */
2818 pdata
= (void*)(nl
->mem_pos
+ offset
);
2819 for (dim
= 0; dim
< nl
->var_rank
; dim
++)
2820 pdata
= (void*)(pdata
+ (nl
->ls
[dim
].idx
2821 - GFC_DESCRIPTOR_LBOUND(nl
,dim
))
2822 * GFC_DESCRIPTOR_STRIDE(nl
,dim
) * nl
->size
);
2824 /* If we are finished with the repeat count, try to read next value. */
2827 if (--dtp
->u
.p
.repeat_count
<= 0)
2829 if (dtp
->u
.p
.input_complete
)
2831 if (dtp
->u
.p
.at_eol
)
2832 finish_separator (dtp
);
2833 if (dtp
->u
.p
.input_complete
)
2836 dtp
->u
.p
.saved_type
= BT_UNKNOWN
;
2842 read_integer (dtp
, len
);
2846 read_logical (dtp
, len
);
2850 read_character (dtp
, len
);
2854 /* Need to copy data back from the real location to the temp in
2855 order to handle nml reads into arrays. */
2856 read_real (dtp
, pdata
, len
);
2857 memcpy (dtp
->u
.p
.value
, pdata
, dlen
);
2861 /* Same as for REAL, copy back to temp. */
2862 read_complex (dtp
, pdata
, len
, dlen
);
2863 memcpy (dtp
->u
.p
.value
, pdata
, dlen
);
2867 obj_name_len
= strlen (nl
->var_name
) + 1;
2868 obj_name
= xmalloc (obj_name_len
+1);
2869 memcpy (obj_name
, nl
->var_name
, obj_name_len
-1);
2870 memcpy (obj_name
+ obj_name_len
- 1, "%", 2);
2872 /* If reading a derived type, disable the expanded read warning
2873 since a single object can have multiple reads. */
2874 dtp
->u
.p
.expanded_read
= 0;
2876 /* Now loop over the components. */
2878 for (cmp
= nl
->next
;
2880 !strncmp (cmp
->var_name
, obj_name
, obj_name_len
);
2883 /* Jump over nested derived type by testing if the potential
2884 component name contains '%'. */
2885 if (strchr (cmp
->var_name
+ obj_name_len
, '%'))
2888 if (!nml_read_obj (dtp
, cmp
, (index_type
)(pdata
- nl
->mem_pos
),
2889 pprev_nl
, nml_err_msg
, nml_err_msg_size
,
2896 if (dtp
->u
.p
.input_complete
)
2907 snprintf (nml_err_msg
, nml_err_msg_size
,
2908 "Bad type for namelist object %s", nl
->var_name
);
2909 internal_error (&dtp
->common
, nml_err_msg
);
2914 /* The standard permits array data to stop short of the number of
2915 elements specified in the loop specification. In this case, we
2916 should be here with dtp->u.p.nml_read_error != 0. Control returns to
2917 nml_get_obj_data and an attempt is made to read object name. */
2920 if (dtp
->u
.p
.nml_read_error
)
2922 dtp
->u
.p
.expanded_read
= 0;
2926 if (dtp
->u
.p
.saved_type
== BT_UNKNOWN
)
2928 dtp
->u
.p
.expanded_read
= 0;
2932 switch (dtp
->u
.p
.saved_type
)
2939 memcpy (pdata
, dtp
->u
.p
.value
, dlen
);
2943 if (dlen
< dtp
->u
.p
.saved_used
)
2945 if (compile_options
.bounds_check
)
2947 snprintf (nml_err_msg
, nml_err_msg_size
,
2948 "Namelist object '%s' truncated on read.",
2950 generate_warning (&dtp
->common
, nml_err_msg
);
2955 m
= dtp
->u
.p
.saved_used
;
2957 if (dtp
->u
.p
.current_unit
->flags
.encoding
== ENCODING_UTF8
)
2959 gfc_char4_t
*q4
, *p4
= pdata
;
2962 q4
= (gfc_char4_t
*) dtp
->u
.p
.saved_string
;
2964 for (i
= 0; i
< m
; i
++)
2967 for (i
= 0; i
< dlen
- m
; i
++)
2968 *p4
++ = (gfc_char4_t
) ' ';
2972 pdata
= (void*)( pdata
+ clow
- 1 );
2973 memcpy (pdata
, dtp
->u
.p
.saved_string
, m
);
2975 memset ((void*)( pdata
+ m
), ' ', dlen
- m
);
2983 /* Warn if a non-standard expanded read occurs. A single read of a
2984 single object is acceptable. If a second read occurs, issue a warning
2985 and set the flag to zero to prevent further warnings. */
2986 if (dtp
->u
.p
.expanded_read
== 2)
2988 notify_std (&dtp
->common
, GFC_STD_GNU
, "Non-standard expanded namelist read.");
2989 dtp
->u
.p
.expanded_read
= 0;
2992 /* If the expanded read warning flag is set, increment it,
2993 indicating that a single read has occurred. */
2994 if (dtp
->u
.p
.expanded_read
>= 1)
2995 dtp
->u
.p
.expanded_read
++;
2997 /* Break out of loop if scalar. */
3001 /* Now increment the index vector. */
3006 for (dim
= 0; dim
< nl
->var_rank
; dim
++)
3008 nl
->ls
[dim
].idx
+= nml_carry
* nl
->ls
[dim
].step
;
3010 if (((nl
->ls
[dim
].step
> 0) && (nl
->ls
[dim
].idx
> nl
->ls
[dim
].end
))
3012 ((nl
->ls
[dim
].step
< 0) && (nl
->ls
[dim
].idx
< nl
->ls
[dim
].end
)))
3014 nl
->ls
[dim
].idx
= nl
->ls
[dim
].start
;
3018 } while (!nml_carry
);
3020 if (dtp
->u
.p
.repeat_count
> 1)
3022 snprintf (nml_err_msg
, nml_err_msg_size
,
3023 "Repeat count too large for namelist object %s", nl
->var_name
);
3033 /* Parses the object name, including array and substring qualifiers. It
3034 iterates over derived type components, touching those components and
3035 setting their loop specifications, if there is a qualifier. If the
3036 object is itself a derived type, its components and subcomponents are
3037 touched. nml_read_obj is called at the end and this reads the data in
3038 the manner specified by the object name. */
3041 nml_get_obj_data (st_parameter_dt
*dtp
, namelist_info
**pprev_nl
,
3042 char *nml_err_msg
, size_t nml_err_msg_size
)
3046 namelist_info
* first_nl
= NULL
;
3047 namelist_info
* root_nl
= NULL
;
3048 int dim
, parsed_rank
;
3049 int component_flag
, qualifier_flag
;
3050 index_type clow
, chigh
;
3051 int non_zero_rank_count
;
3053 /* Look for end of input or object name. If '?' or '=?' are encountered
3054 in stdin, print the node names or the namelist to stdout. */
3056 eat_separator (dtp
);
3057 if (dtp
->u
.p
.input_complete
)
3060 if (dtp
->u
.p
.at_eol
)
3061 finish_separator (dtp
);
3062 if (dtp
->u
.p
.input_complete
)
3065 if ((c
= next_char (dtp
)) == EOF
)
3070 if ((c
= next_char (dtp
)) == EOF
)
3074 snprintf (nml_err_msg
, nml_err_msg_size
,
3075 "namelist read: misplaced = sign");
3078 nml_query (dtp
, '=');
3082 nml_query (dtp
, '?');
3087 nml_match_name (dtp
, "end", 3);
3088 if (dtp
->u
.p
.nml_read_error
)
3090 snprintf (nml_err_msg
, nml_err_msg_size
,
3091 "namelist not terminated with / or &end");
3096 dtp
->u
.p
.input_complete
= 1;
3103 /* Untouch all nodes of the namelist and reset the flags that are set for
3104 derived type components. */
3106 nml_untouch_nodes (dtp
);
3109 non_zero_rank_count
= 0;
3111 /* Get the object name - should '!' and '\n' be permitted separators? */
3119 if (!is_separator (c
))
3120 push_char_default (dtp
, tolower(c
));
3121 if ((c
= next_char (dtp
)) == EOF
)
3124 while (!( c
=='=' || c
==' ' || c
=='\t' || c
=='(' || c
=='%' ));
3126 unget_char (dtp
, c
);
3128 /* Check that the name is in the namelist and get pointer to object.
3129 Three error conditions exist: (i) An attempt is being made to
3130 identify a non-existent object, following a failed data read or
3131 (ii) The object name does not exist or (iii) Too many data items
3132 are present for an object. (iii) gives the same error message
3135 push_char_default (dtp
, '\0');
3139 #define EXT_STACK_SZ 100
3140 char ext_stack
[EXT_STACK_SZ
];
3142 size_t var_len
= strlen (root_nl
->var_name
);
3144 = dtp
->u
.p
.saved_string
? strlen (dtp
->u
.p
.saved_string
) : 0;
3145 size_t ext_size
= var_len
+ saved_len
+ 1;
3147 if (ext_size
> EXT_STACK_SZ
)
3148 ext_name
= xmalloc (ext_size
);
3150 ext_name
= ext_stack
;
3152 memcpy (ext_name
, root_nl
->var_name
, var_len
);
3153 if (dtp
->u
.p
.saved_string
)
3154 memcpy (ext_name
+ var_len
, dtp
->u
.p
.saved_string
, saved_len
);
3155 ext_name
[var_len
+ saved_len
] = '\0';
3156 nl
= find_nml_node (dtp
, ext_name
);
3158 if (ext_size
> EXT_STACK_SZ
)
3162 nl
= find_nml_node (dtp
, dtp
->u
.p
.saved_string
);
3166 if (dtp
->u
.p
.nml_read_error
&& *pprev_nl
)
3167 snprintf (nml_err_msg
, nml_err_msg_size
,
3168 "Bad data for namelist object %s", (*pprev_nl
)->var_name
);
3171 snprintf (nml_err_msg
, nml_err_msg_size
,
3172 "Cannot match namelist object name %s",
3173 dtp
->u
.p
.saved_string
);
3178 /* Get the length, data length, base pointer and rank of the variable.
3179 Set the default loop specification first. */
3181 for (dim
=0; dim
< nl
->var_rank
; dim
++)
3183 nl
->ls
[dim
].step
= 1;
3184 nl
->ls
[dim
].end
= GFC_DESCRIPTOR_UBOUND(nl
,dim
);
3185 nl
->ls
[dim
].start
= GFC_DESCRIPTOR_LBOUND(nl
,dim
);
3186 nl
->ls
[dim
].idx
= nl
->ls
[dim
].start
;
3189 /* Check to see if there is a qualifier: if so, parse it.*/
3191 if (c
== '(' && nl
->var_rank
)
3194 if (!nml_parse_qualifier (dtp
, nl
->dim
, nl
->ls
, nl
->var_rank
,
3195 nl
->type
, nml_err_msg
, nml_err_msg_size
,
3198 char *nml_err_msg_end
= strchr (nml_err_msg
, '\0');
3199 snprintf (nml_err_msg_end
,
3200 nml_err_msg_size
- (nml_err_msg_end
- nml_err_msg
),
3201 " for namelist variable %s", nl
->var_name
);
3204 if (parsed_rank
> 0)
3205 non_zero_rank_count
++;
3209 if ((c
= next_char (dtp
)) == EOF
)
3211 unget_char (dtp
, c
);
3213 else if (nl
->var_rank
> 0)
3214 non_zero_rank_count
++;
3216 /* Now parse a derived type component. The root namelist_info address
3217 is backed up, as is the previous component level. The component flag
3218 is set and the iteration is made by jumping back to get_name. */
3222 if (nl
->type
!= BT_DERIVED
)
3224 snprintf (nml_err_msg
, nml_err_msg_size
,
3225 "Attempt to get derived component for %s", nl
->var_name
);
3229 /* Don't move first_nl further in the list if a qualifier was found. */
3230 if ((*pprev_nl
== NULL
&& !qualifier_flag
) || !component_flag
)
3236 if ((c
= next_char (dtp
)) == EOF
)
3241 /* Parse a character qualifier, if present. chigh = 0 is a default
3242 that signals that the string length = string_length. */
3247 if (c
== '(' && nl
->type
== BT_CHARACTER
)
3249 descriptor_dimension chd
[1] = { {1, clow
, nl
->string_length
} };
3250 array_loop_spec ind
[1] = { {1, clow
, nl
->string_length
, 1} };
3252 if (!nml_parse_qualifier (dtp
, chd
, ind
, -1, nl
->type
,
3253 nml_err_msg
, nml_err_msg_size
, &parsed_rank
))
3255 char *nml_err_msg_end
= strchr (nml_err_msg
, '\0');
3256 snprintf (nml_err_msg_end
,
3257 nml_err_msg_size
- (nml_err_msg_end
- nml_err_msg
),
3258 " for namelist variable %s", nl
->var_name
);
3262 clow
= ind
[0].start
;
3265 if (ind
[0].step
!= 1)
3267 snprintf (nml_err_msg
, nml_err_msg_size
,
3268 "Step not allowed in substring qualifier"
3269 " for namelist object %s", nl
->var_name
);
3273 if ((c
= next_char (dtp
)) == EOF
)
3275 unget_char (dtp
, c
);
3278 /* Make sure no extraneous qualifiers are there. */
3282 snprintf (nml_err_msg
, nml_err_msg_size
,
3283 "Qualifier for a scalar or non-character namelist object %s",
3288 /* Make sure there is no more than one non-zero rank object. */
3289 if (non_zero_rank_count
> 1)
3291 snprintf (nml_err_msg
, nml_err_msg_size
,
3292 "Multiple sub-objects with non-zero rank in namelist object %s",
3294 non_zero_rank_count
= 0;
3298 /* According to the standard, an equal sign MUST follow an object name. The
3299 following is possibly lax - it allows comments, blank lines and so on to
3300 intervene. eat_spaces (dtp); c = next_char (dtp); would be compliant*/
3304 eat_separator (dtp
);
3305 if (dtp
->u
.p
.input_complete
)
3308 if (dtp
->u
.p
.at_eol
)
3309 finish_separator (dtp
);
3310 if (dtp
->u
.p
.input_complete
)
3313 if ((c
= next_char (dtp
)) == EOF
)
3318 snprintf (nml_err_msg
, nml_err_msg_size
,
3319 "Equal sign must follow namelist object name %s",
3323 /* If a derived type, touch its components and restore the root
3324 namelist_info if we have parsed a qualified derived type
3327 if (nl
->type
== BT_DERIVED
)
3328 nml_touch_nodes (nl
);
3332 if (first_nl
->var_rank
== 0)
3334 if (component_flag
&& qualifier_flag
)
3341 dtp
->u
.p
.nml_read_error
= 0;
3342 if (!nml_read_obj (dtp
, nl
, 0, pprev_nl
, nml_err_msg
, nml_err_msg_size
,
3350 /* The EOF error message is issued by hit_eof. Return true so that the
3351 caller does not use nml_err_msg and nml_err_msg_size to generate
3352 an unrelated error message. */
3355 dtp
->u
.p
.input_complete
= 1;
3356 unget_char (dtp
, c
);
3363 /* Entry point for namelist input. Goes through input until namelist name
3364 is matched. Then cycles through nml_get_obj_data until the input is
3365 completed or there is an error. */
3368 namelist_read (st_parameter_dt
*dtp
)
3371 char nml_err_msg
[200];
3373 /* Initialize the error string buffer just in case we get an unexpected fail
3374 somewhere and end up at nml_err_ret. */
3375 strcpy (nml_err_msg
, "Internal namelist read error");
3377 /* Pointer to the previously read object, in case attempt is made to read
3378 new object name. Should this fail, error message can give previous
3380 namelist_info
*prev_nl
= NULL
;
3382 dtp
->u
.p
.namelist_mode
= 1;
3383 dtp
->u
.p
.input_complete
= 0;
3384 dtp
->u
.p
.expanded_read
= 0;
3386 /* Set the next_char and push_char worker functions. */
3389 /* Look for &namelist_name . Skip all characters, testing for $nmlname.
3390 Exit on success or EOF. If '?' or '=?' encountered in stdin, print
3391 node names or namelist on stdout. */
3394 c
= next_char (dtp
);
3406 c
= next_char (dtp
);
3408 nml_query (dtp
, '=');
3410 unget_char (dtp
, c
);
3414 nml_query (dtp
, '?');
3424 /* Match the name of the namelist. */
3426 nml_match_name (dtp
, dtp
->namelist_name
, dtp
->namelist_name_len
);
3428 if (dtp
->u
.p
.nml_read_error
)
3431 /* A trailing space is required, we give a little latitude here, 10.9.1. */
3432 c
= next_char (dtp
);
3433 if (!is_separator(c
) && c
!= '!')
3435 unget_char (dtp
, c
);
3439 unget_char (dtp
, c
);
3440 eat_separator (dtp
);
3442 /* Ready to read namelist objects. If there is an error in input
3443 from stdin, output the error message and continue. */
3445 while (!dtp
->u
.p
.input_complete
)
3447 if (!nml_get_obj_data (dtp
, &prev_nl
, nml_err_msg
, sizeof nml_err_msg
))
3449 if (dtp
->u
.p
.current_unit
->unit_number
!= options
.stdin_unit
)
3451 generate_error (&dtp
->common
, LIBERROR_READ_VALUE
, nml_err_msg
);
3454 /* Reset the previous namelist pointer if we know we are not going
3455 to be doing multiple reads within a single namelist object. */
3456 if (prev_nl
&& prev_nl
->var_rank
== 0)
3467 /* All namelist error calls return from here */
3470 generate_error (&dtp
->common
, LIBERROR_READ_VALUE
, nml_err_msg
);