1 /* Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
2 Contributed by Andy Vaught
4 This file is part of the GNU Fortran 95 runtime library (libgfortran).
6 Libgfortran is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
11 Libgfortran is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with Libgfortran; see the file COPYING. If not, write to
18 the Free Software Foundation, 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
25 #include "libgfortran.h"
29 /* List directed input. Several parsing subroutines are practically
30 reimplemented from formatted input, the reason being that there are
31 all kinds of small differences between formatted and list directed
35 /* Subroutines for reading characters from the input. Because a
36 repeat count is ambiguous with an integer, we have to read the
37 whole digit string before seeing if there is a '*' which signals
38 the repeat count. Since we can have a lot of potential leading
39 zeros, we have to be able to back up by arbitrary amount. Because
40 the input might not be seekable, we have to buffer the data
41 ourselves. Data is buffered in scratch[] until it becomes too
42 large, after which we start allocating memory on the heap. */
44 static int repeat_count, saved_length, saved_used, input_complete, at_eol;
45 static int comma_flag, namelist_mode;
47 static char last_char, *saved_string;
52 /* Storage area for values except for strings. Must be large enough
53 to hold a complex value (two reals) of the largest kind. */
55 static char value[20];
57 #define CASE_DIGITS case '0': case '1': case '2': case '3': case '4': \
58 case '5': case '6': case '7': case '8': case '9'
60 #define CASE_SEPARATORS case ' ': case ',': case '/': case '\n': case '\t'
62 /* This macro assumes that we're operating on a variable. */
64 #define is_separator(c) (c == '/' || c == ',' || c == '\n' || c == ' ' \
67 /* Maximum repeat count. Less than ten times the maximum signed int32. */
69 #define MAX_REPEAT 200000000
72 /* Save a character to a string buffer, enlarging it as necessary. */
79 if (saved_string == NULL)
81 saved_string = scratch;
82 memset (saved_string,0,SCRATCH_SIZE);
83 saved_length = SCRATCH_SIZE;
87 if (saved_used >= saved_length)
89 saved_length = 2 * saved_length;
90 new = get_mem (2 * saved_length);
92 memset (new,0,2 * saved_length);
94 memcpy (new, saved_string, saved_used);
95 if (saved_string != scratch)
96 free_mem (saved_string);
101 saved_string[saved_used++] = c;
105 /* Free the input buffer if necessary. */
111 if (saved_string == NULL)
114 if (saved_string != scratch)
115 free_mem (saved_string);
127 if (last_char != '\0')
137 p = salloc_r (current_unit->s, &length);
140 generate_error (ERROR_OS, NULL);
145 longjmp (g.eof_jump, 1);
149 at_eol = (c == '\n');
154 /* Push a character back onto the input. */
164 /* Skip over spaces in the input. Returns the nonspace character that
165 terminated the eating and also places it back on the input. */
176 while (c == ' ' || c == '\t');
183 /* Skip over a separator. Technically, we don't always eat the whole
184 separator. This is because if we've processed the last input item,
185 then a separator is unnecessary. Plus the fact that operating
186 systems usually deliver console input on a line basis.
188 The upshot is that if we see a newline as part of reading a
189 separator, we stop reading. If there are more input items, we
190 continue reading the separator with finish_separator() which takes
191 care of the fact that we may or may not have seen a comma as part
221 { /* Eat a namelist comment. */
229 /* Fall Through... */
238 /* Finish processing a separator that was interrupted by a newline.
239 If we're here, then another data item is present, so we finish what
240 we started on the previous line. */
243 finish_separator (void)
290 /* Convert an unsigned string to an integer. The length value is -1
291 if we are working on a repeat count. Returns nonzero if we have a
292 range problem. As a side effect, frees the saved_string. */
295 convert_integer (int length, int negative)
297 char c, *buffer, message[100];
299 int64_t v, max, max10;
301 buffer = saved_string;
304 max = (length == -1) ? MAX_REPEAT : max_value (length, 1);
329 set_integer (value, v, length);
335 if (repeat_count == 0)
337 st_sprintf (message, "Zero repeat count in item %d of list input",
340 generate_error (ERROR_READ_VALUE, message);
350 st_sprintf (message, "Repeat count overflow in item %d of list input",
353 st_sprintf (message, "Integer overflow while reading item %d",
357 generate_error (ERROR_READ_VALUE, message);
363 /* Parse a repeat count for logical and complex values which cannot
364 begin with a digit. Returns nonzero if we are done, zero if we
365 should continue on. */
370 char c, message[100];
396 repeat = 10 * repeat + c - '0';
398 if (repeat > MAX_REPEAT)
401 "Repeat count overflow in item %d of list input",
404 generate_error (ERROR_READ_VALUE, message);
414 "Zero repeat count in item %d of list input",
417 generate_error (ERROR_READ_VALUE, message);
429 repeat_count = repeat;
433 st_sprintf (message, "Bad repeat count in item %d of list input",
436 generate_error (ERROR_READ_VALUE, message);
441 /* Read a logical character on the input. */
444 read_logical (int length)
446 char c, message[100];
485 return; /* Null value. */
491 saved_type = BT_LOGICAL;
492 saved_length = length;
494 /* Eat trailing garbage. */
499 while (!is_separator (c));
504 set_integer ((int *) value, v, length);
509 st_sprintf (message, "Bad logical value while reading item %d",
512 generate_error (ERROR_READ_VALUE, message);
516 /* Reading integers is tricky because we can actually be reading a
517 repeat count. We have to store the characters in a buffer because
518 we could be reading an integer that is larger than the default int
519 used for repeat counts. */
522 read_integer (int length)
524 char c, message[100];
534 /* Fall through... */
540 CASE_SEPARATORS: /* Single null. */
553 /* Take care of what may be a repeat count. */
568 CASE_SEPARATORS: /* Not a repeat count. */
577 if (convert_integer (-1, 0))
580 /* Get the real integer. */
595 /* Fall through... */
627 st_sprintf (message, "Bad integer for item %d in list input", g.item_count);
628 generate_error (ERROR_READ_VALUE, message);
637 if (convert_integer (length, negative))
644 saved_type = BT_INTEGER;
648 /* Read a character variable. */
651 read_character (int length)
653 char c, quote, message[100];
655 quote = ' '; /* Space means no quote character. */
665 unget_char (c); /* NULL value. */
679 /* Deal with a possible repeat count. */
692 goto done; /* String was only digits! */
700 goto get_string; /* Not a repeat count after all. */
705 if (convert_integer (-1, 0))
708 /* Now get the real string. */
714 unget_char (c); /* Repeated NULL values. */
742 /* See if we have a doubled quote character or the end of
772 /* At this point, we have to have a separator, or else the string is
777 if (is_separator (c))
781 saved_type = BT_CHARACTER;
786 st_sprintf (message, "Invalid string input in item %d", g.item_count);
787 generate_error (ERROR_READ_VALUE, message);
792 /* Parse a component of a complex constant or a real number that we
793 are sure is already there. This is a straight real number parser. */
796 parse_real (void *buffer, int length)
798 char c, message[100];
802 if (c == '-' || c == '+')
808 if (!isdigit (c) && c != '.')
813 seen_dp = (c == '.') ? 1 : 0;
857 if (c != '-' && c != '+')
892 m = convert_real (buffer, saved_string, length);
899 st_sprintf (message, "Bad floating point number for item %d", g.item_count);
900 generate_error (ERROR_READ_VALUE, message);
906 /* Reading a complex number is straightforward because we can tell
907 what it is right away. */
910 read_complex (int length)
934 if (parse_real (value, length))
938 if (next_char () != ',')
942 if (parse_real (value + length, length))
946 if (next_char () != ')')
950 if (!is_separator (c))
957 saved_type = BT_COMPLEX;
961 st_sprintf (message, "Bad complex value in item %d of list input",
964 generate_error (ERROR_READ_VALUE, message);
968 /* Parse a real number with a possible repeat count. */
971 read_real (int length)
973 char c, message[100];
995 unget_char (c); /* Single null. */
1003 /* Get the digit string that might be a repeat count. */
1041 unget_char (c); /* Real number that is just a digit-string. */
1050 if (convert_integer (-1, 0))
1053 /* Now get the number itself. */
1056 if (is_separator (c))
1057 { /* Repeated null value. */
1063 if (c != '-' && c != '+')
1072 if (!isdigit (c) && c != '.')
1128 if (c != '+' && c != '-')
1163 if (convert_real (value, saved_string, length))
1167 saved_type = BT_REAL;
1171 st_sprintf (message, "Bad real number in item %d of list input",
1174 generate_error (ERROR_READ_VALUE, message);
1178 /* Check the current type against the saved type to make sure they are
1179 compatible. Returns nonzero if incompatible. */
1182 check_type (bt type, int len)
1186 if (saved_type != BT_NULL && saved_type != type)
1188 st_sprintf (message, "Read type %s where %s was expected for item %d",
1189 type_name (saved_type), type_name (type), g.item_count);
1191 generate_error (ERROR_READ_VALUE, message);
1195 if (saved_type == BT_NULL || saved_type == BT_CHARACTER)
1198 if (saved_length != len)
1200 st_sprintf (message,
1201 "Read kind %d %s where kind %d is required for item %d",
1202 saved_length, type_name (saved_type), len, g.item_count);
1203 generate_error (ERROR_READ_VALUE, message);
1211 /* Top level data transfer subroutine for list reads. Because we have
1212 to deal with repeat counts, the data item is always saved after
1213 reading, usually in the value[] array. If a repeat count is
1214 greater than one, we copy the data item multiple times. */
1217 list_formatted_read (bt type, void *p, int len)
1224 if (setjmp (g.eof_jump))
1226 generate_error (ERROR_END, NULL);
1238 if (is_separator (c))
1239 { /* Found a null value. */
1243 finish_separator ();
1254 if (repeat_count > 0)
1256 if (check_type (type, len))
1262 finish_separator ();
1266 saved_type = BT_NULL;
1280 read_character (len);
1289 internal_error ("Bad type for list read");
1292 if (saved_type != BT_CHARACTER && saved_type != BT_NULL)
1295 if (ioparm.library_return != LIBRARY_OK)
1308 memcpy (p, value, len);
1314 m = (len < saved_used) ? len : saved_used;
1315 memcpy (p, saved_string, m);
1318 /* Just delimiters encountered, nothing to copy but SPACE. */
1322 memset (((char *) p) + m, ' ', len - m);
1329 if (--repeat_count <= 0)
1339 /* Finish a list read. */
1342 finish_list_read (void)
1362 static namelist_info *
1363 find_nml_node (char * var_name)
1365 namelist_info * t = ionml;
1368 if (strcmp (var_name,t->var_name) == 0)
1370 t->value_acquired = 1;
1379 match_namelist_name (char *name, int len)
1383 char * namelist_name = name;
1386 /* Match the name of the namelist. */
1388 if (tolower (next_char ()) != tolower (namelist_name[name_len++]))
1391 generate_error (ERROR_READ_VALUE, "Wrong namelist name found");
1395 while (name_len < len)
1398 if (tolower (c) != tolower (namelist_name[name_len++]))
1404 /********************************************************************
1406 ********************************************************************/
1408 /* Process a namelist read. This subroutine initializes things,
1409 positions to the first element and
1410 FIXME: was this comment ever complete? */
1413 namelist_read (void)
1416 int name_matched, next_name ;
1423 if (setjmp (g.eof_jump))
1425 generate_error (ERROR_END, NULL);
1446 generate_error (ERROR_READ_VALUE, "Invalid character in namelist");
1450 /* Match the name of the namelist. */
1451 match_namelist_name(ioparm.namelist_name, ioparm.namelist_name_len);
1453 /* Ready to read namelist elements. */
1454 while (!input_complete)
1464 match_namelist_name("end",3);
1478 nl = find_nml_node (saved_string);
1480 internal_error ("Can not match a namelist variable");
1494 read_character (len);
1503 internal_error ("Bad type for namelist read");
1510 /* Fall through... */
1515 memcpy (p, value, len);
1519 m = (len < saved_used) ? len : saved_used;
1520 memcpy (p, saved_string, m);
1523 memset (((char *) p) + m, ' ', len - m);
1533 push_char(tolower(c));