re PR libfortran/33253 (namelist: reading back a string with apostrophe)

2007-10-04  Jerry DeLisle  <jvdelisle@gcc.gnu.org>

	PR libfortran/33253
	* io/list_read.c (read_character): Use line_buffer to scan ahead for
	object name or string when no delimiter is found.

From-SVN: r129016
This commit is contained in:
Jerry DeLisle 2007-10-04 15:57:28 +00:00
parent d17cd69f66
commit 808a2225f9
2 changed files with 55 additions and 6 deletions

View File

@ -1,3 +1,11 @@
<<<<<<< .mine
2007-10-04 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR libfortran/33253
* io/list_read.c (read_character): Use line_buffer to scan ahead for
object name or string when no delimiter is found.
=======
2007-10-04 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
PR libfortran/32021
@ -10,6 +18,7 @@
fpu_precision, sighup, sigint, allocate_init_flag and
allocate_init_value.
>>>>>>> .r129015
2007-10-02 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR libfortran/33253

View File

@ -893,14 +893,53 @@ read_character (st_parameter_dt *dtp, int length __attribute__ ((unused)))
goto get_string;
default:
if (dtp->u.p.namelist_mode
&& (dtp->u.p.current_unit->flags.delim == DELIM_APOSTROPHE
|| dtp->u.p.current_unit->flags.delim == DELIM_QUOTE
|| quote == ' '))
if (dtp->u.p.namelist_mode)
{
unget_char (dtp,c);
return;
if (dtp->u.p.current_unit->flags.delim == DELIM_APOSTROPHE
|| dtp->u.p.current_unit->flags.delim == DELIM_QUOTE)
{
unget_char (dtp, c);
return;
}
/* Check to see if we are seeing a namelist object name by using the
line buffer and looking ahead for an '=' or '('. */
l_push_char (dtp, c);
int i;
for(i = 0; i < 63; i++)
{
c = next_char (dtp);
if (is_separator(c))
{
unget_char (dtp, c);
eat_separator (dtp);
c = next_char (dtp);
if (c != '=')
{
l_push_char (dtp, c);
dtp->u.p.item_count = 0;
dtp->u.p.line_buffer_enabled = 1;
goto get_string;
}
}
l_push_char (dtp, c);
if (c == '=' || c == '(')
{
dtp->u.p.item_count = 0;
dtp->u.p.nml_read_error = 1;
dtp->u.p.line_buffer_enabled = 1;
return;
}
}
/* The string is too long to be a valid object name so assume that it
is a string to be read in as a value. */
dtp->u.p.line_buffer_enabled = 1;
goto get_string;
}
push_char (dtp, c);
goto get_string;
}
@ -1007,6 +1046,7 @@ read_character (st_parameter_dt *dtp, int length __attribute__ ((unused)))
unget_char (dtp, c);
eat_separator (dtp);
dtp->u.p.saved_type = BT_CHARACTER;
free_line (dtp);
}
else
{