From a6d91770b85016a68653f0d1655868e39319b065 Mon Sep 17 00:00:00 2001 From: jvdelisle Date: Thu, 4 Oct 2007 15:57:28 +0000 Subject: [PATCH] 2007-10-04 Jerry DeLisle 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@129016 138bc75d-0d04-0410-961f-82ee72b054a4 --- libgfortran/ChangeLog | 9 ++++++++ libgfortran/io/list_read.c | 52 ++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 55 insertions(+), 6 deletions(-) diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index a5a67310928..8e4140eb065 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,11 @@ +<<<<<<< .mine +2007-10-04 Jerry DeLisle + + 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 PR libfortran/32021 @@ -10,6 +18,7 @@ fpu_precision, sighup, sigint, allocate_init_flag and allocate_init_value. +>>>>>>> .r129015 2007-10-02 Jerry DeLisle PR libfortran/33253 diff --git a/libgfortran/io/list_read.c b/libgfortran/io/list_read.c index 42c534a1c2f..88b83443bbd 100644 --- a/libgfortran/io/list_read.c +++ b/libgfortran/io/list_read.c @@ -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 { -- 2.11.0