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
220 { /* Eat a namelist comment. */
228 /* Fall Through... */
237 /* Finish processing a separator that was interrupted by a newline.
238 If we're here, then another data item is present, so we finish what
239 we started on the previous line. */
242 finish_separator (void)
289 /* Convert an unsigned string to an integer. The length value is -1
290 if we are working on a repeat count. Returns nonzero if we have a
291 range problem. As a side effect, frees the saved_string. */
294 convert_integer (int length, int negative)
296 char c, *buffer, message[100];
298 int64_t v, max, max10;
300 buffer = saved_string;
303 max = (length == -1) ? MAX_REPEAT : max_value (length, 1);
328 set_integer (value, v, length);
334 if (repeat_count == 0)
336 st_sprintf (message, "Zero repeat count in item %d of list input",
339 generate_error (ERROR_READ_VALUE, message);
349 st_sprintf (message, "Repeat count overflow in item %d of list input",
352 st_sprintf (message, "Integer overflow while reading item %d",
356 generate_error (ERROR_READ_VALUE, message);
362 /* Parse a repeat count for logical and complex values which cannot
363 begin with a digit. Returns nonzero if we are done, zero if we
364 should continue on. */
369 char c, message[100];
395 repeat = 10 * repeat + c - '0';
397 if (repeat > MAX_REPEAT)
400 "Repeat count overflow in item %d of list input",
403 generate_error (ERROR_READ_VALUE, message);
413 "Zero repeat count in item %d of list input",
416 generate_error (ERROR_READ_VALUE, message);
428 repeat_count = repeat;
432 st_sprintf (message, "Bad repeat count in item %d of list input",
435 generate_error (ERROR_READ_VALUE, message);
440 /* Read a logical character on the input. */
443 read_logical (int length)
445 char c, message[100];
484 return; /* Null value. */
490 saved_type = BT_LOGICAL;
491 saved_length = length;
493 /* Eat trailing garbage. */
498 while (!is_separator (c));
503 set_integer ((int *) value, v, length);
508 st_sprintf (message, "Bad logical value while reading item %d",
511 generate_error (ERROR_READ_VALUE, message);
515 /* Reading integers is tricky because we can actually be reading a
516 repeat count. We have to store the characters in a buffer because
517 we could be reading an integer that is larger than the default int
518 used for repeat counts. */
521 read_integer (int length)
523 char c, message[100];
533 /* Fall through... */
539 CASE_SEPARATORS: /* Single null. */
552 /* Take care of what may be a repeat count. */
567 CASE_SEPARATORS: /* Not a repeat count. */
576 if (convert_integer (-1, 0))
579 /* Get the real integer. */
594 /* Fall through... */
626 st_sprintf (message, "Bad integer for item %d in list input", g.item_count);
627 generate_error (ERROR_READ_VALUE, message);
636 if (convert_integer (length, negative))
643 saved_type = BT_INTEGER;
647 /* Read a character variable. */
650 read_character (int length)
652 char c, quote, message[100];
654 quote = ' '; /* Space means no quote character. */
664 unget_char (c); /* NULL value. */
678 /* Deal with a possible repeat count. */
691 goto done; /* String was only digits! */
699 goto get_string; /* Not a repeat count after all. */
704 if (convert_integer (-1, 0))
707 /* Now get the real string. */
713 unget_char (c); /* Repeated NULL values. */
741 /* See if we have a doubled quote character or the end of
771 /* At this point, we have to have a separator, or else the string is
776 if (is_separator (c))
780 saved_type = BT_CHARACTER;
785 st_sprintf (message, "Invalid string input in item %d", g.item_count);
786 generate_error (ERROR_READ_VALUE, message);
791 /* Parse a component of a complex constant or a real number that we
792 are sure is already there. This is a straight real number parser. */
795 parse_real (void *buffer, int length)
797 char c, message[100];
801 if (c == '-' || c == '+')
807 if (!isdigit (c) && c != '.')
812 seen_dp = (c == '.') ? 1 : 0;
856 if (c != '-' && c != '+')
891 m = convert_real (buffer, saved_string, length);
898 st_sprintf (message, "Bad floating point number for item %d", g.item_count);
899 generate_error (ERROR_READ_VALUE, message);
905 /* Reading a complex number is straightforward because we can tell
906 what it is right away. */
909 read_complex (int length)
933 if (parse_real (value, length))
937 if (next_char () != ',')
941 if (parse_real (value + length, length))
945 if (next_char () != ')')
949 if (!is_separator (c))
956 saved_type = BT_COMPLEX;
960 st_sprintf (message, "Bad complex value in item %d of list input",
963 generate_error (ERROR_READ_VALUE, message);
967 /* Parse a real number with a possible repeat count. */
970 read_real (int length)
972 char c, message[100];
994 unget_char (c); /* Single null. */
1002 /* Get the digit string that might be a repeat count. */
1040 unget_char (c); /* Real number that is just a digit-string. */
1049 if (convert_integer (-1, 0))
1052 /* Now get the number itself. */
1055 if (is_separator (c))
1056 { /* Repeated null value. */
1062 if (c != '-' && c != '+')
1071 if (!isdigit (c) && c != '.')
1127 if (c != '+' && c != '-')
1162 if (convert_real (value, saved_string, length))
1166 saved_type = BT_REAL;
1170 st_sprintf (message, "Bad real number in item %d of list input",
1173 generate_error (ERROR_READ_VALUE, message);
1177 /* Check the current type against the saved type to make sure they are
1178 compatible. Returns nonzero if incompatible. */
1181 check_type (bt type, int len)
1185 if (saved_type != BT_NULL && saved_type != type)
1187 st_sprintf (message, "Read type %s where %s was expected for item %d",
1188 type_name (saved_type), type_name (type), g.item_count);
1190 generate_error (ERROR_READ_VALUE, message);
1194 if (saved_type == BT_NULL || saved_type == BT_CHARACTER)
1197 if (saved_length != len)
1199 st_sprintf (message,
1200 "Read kind %d %s where kind %d is required for item %d",
1201 saved_length, type_name (saved_type), len, g.item_count);
1202 generate_error (ERROR_READ_VALUE, message);
1210 /* Top level data transfer subroutine for list reads. Because we have
1211 to deal with repeat counts, the data item is always saved after
1212 reading, usually in the value[] array. If a repeat count is
1213 greater than one, we copy the data item multiple times. */
1216 list_formatted_read (bt type, void *p, int len)
1223 if (setjmp (g.eof_jump))
1225 generate_error (ERROR_END, NULL);
1237 if (is_separator (c))
1238 { /* Found a null value. */
1242 finish_separator ();
1253 if (repeat_count > 0)
1255 if (check_type (type, len))
1261 finish_separator ();
1265 saved_type = BT_NULL;
1279 read_character (len);
1288 internal_error ("Bad type for list read");
1291 if (saved_type != BT_CHARACTER && saved_type != BT_NULL)
1294 if (ioparm.library_return != LIBRARY_OK)
1307 memcpy (p, value, len);
1313 m = (len < saved_used) ? len : saved_used;
1314 memcpy (p, saved_string, m);
1317 /* Just delimiters encountered, nothing to copy but SPACE. */
1321 memset (((char *) p) + m, ' ', len - m);
1328 if (--repeat_count <= 0)
1338 /* Finish a list read. */
1341 finish_list_read (void)
1361 static namelist_info *
1362 find_nml_node (char * var_name)
1364 namelist_info * t = ionml;
1367 if (strcmp (var_name,t->var_name) == 0)
1369 t->value_acquired = 1;
1378 match_namelist_name (char *name, int len)
1382 char * namelist_name = name;
1385 /* Match the name of the namelist. */
1387 if (tolower (next_char ()) != tolower (namelist_name[name_len++]))
1390 generate_error (ERROR_READ_VALUE, "Wrong namelist name found");
1394 while (name_len < len)
1397 if (tolower (c) != tolower (namelist_name[name_len++]))
1403 /********************************************************************
1405 ********************************************************************/
1407 /* Process a namelist read. This subroutine initializes things,
1408 positions to the first element and
1409 FIXME: was this comment ever complete? */
1412 namelist_read (void)
1415 int name_matched, next_name ;
1422 if (setjmp (g.eof_jump))
1424 generate_error (ERROR_END, NULL);
1445 generate_error (ERROR_READ_VALUE, "Invalid character in namelist");
1449 /* Match the name of the namelist. */
1450 match_namelist_name(ioparm.namelist_name, ioparm.namelist_name_len);
1452 /* Ready to read namelist elements. */
1453 while (!input_complete)
1463 match_namelist_name("end",3);
1477 nl = find_nml_node (saved_string);
1479 internal_error ("Can not match a namelist variable");
1493 read_character (len);
1502 internal_error ("Bad type for namelist read");
1509 /* Fall through... */
1514 memcpy (p, value, len);
1518 m = (len < saved_used) ? len : saved_used;
1519 memcpy (p, saved_string, m);
1522 memset (((char *) p) + m, ' ', len - m);
1532 push_char(tolower(c));