From 94887ef4788e211ffcae25f17018099bf75dbab3 Mon Sep 17 00:00:00 2001 From: Francois-Xavier Coudert Date: Fri, 25 Mar 2005 14:35:29 +0100 Subject: re PR libfortran/19678 (DOS files don't work for list directed input) PR libfortran/19678 PR libfortran/19679 * gfortran.dg/dos_eol.f: New test. PR libfortran/19678 * list_read.c (next_char, eat_separator, finish_separator, read_real) (namelist_read): Add support for '\r' as well as '\n' as EOL character. PR libfortran/19679 * list_read.c (read_sf): Add a '\r' in a test to support DOS line-endings when line length is exceeded. From-SVN: r97041 --- libgfortran/ChangeLog | 11 +++++++++++ libgfortran/io/list_read.c | 12 +++++++++--- libgfortran/io/transfer.c | 2 +- 3 files changed, 21 insertions(+), 4 deletions(-) (limited to 'libgfortran') diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index 6517e03..32b5454 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,5 +1,16 @@ 2005-03-25 Francois-Xavier Coudert + PR libfortran/19678 + * list_read.c (next_char, eat_separator, finish_separator, read_real) + (namelist_read): Add support for '\r' as well as '\n' as EOL + character. + + PR libfortran/19679 + * list_read.c (read_sf): Add a '\r' in a test to support DOS + line-endings when line length is exceeded. + +2005-03-25 Francois-Xavier Coudert + PR libfortran/15332 * io/format.c (parse_format_list): format node for colon edit descriptor needs a repeat counter set to 1. diff --git a/libgfortran/io/list_read.c b/libgfortran/io/list_read.c index 74a6688..384df36 100644 --- a/libgfortran/io/list_read.c +++ b/libgfortran/io/list_read.c @@ -66,12 +66,13 @@ static char value[20]; #define CASE_DIGITS case '0': case '1': case '2': case '3': case '4': \ case '5': case '6': case '7': case '8': case '9' -#define CASE_SEPARATORS case ' ': case ',': case '/': case '\n': case '\t' +#define CASE_SEPARATORS case ' ': case ',': case '/': case '\n': case '\t': \ + case '\r' /* This macro assumes that we're operating on a variable. */ #define is_separator(c) (c == '/' || c == ',' || c == '\n' || c == ' ' \ - || c == '\t') + || c == '\t' || c == '\r') /* Maximum repeat count. Less than ten times the maximum signed int32. */ @@ -163,7 +164,7 @@ next_char (void) c = *p; done: - at_eol = (c == '\n'); + at_eol = (c == '\n' || c == '\r'); return c; } @@ -230,6 +231,7 @@ eat_separator (void) break; case '\n': + case '\r': break; case '!': @@ -284,6 +286,7 @@ finish_separator (void) break; case '\n': + case '\r': goto restart; case '!': @@ -1052,6 +1055,8 @@ read_real (int length) goto got_repeat; CASE_SEPARATORS: + if (c != '\n' && c != ',' && c != '\r') + unget_char (c); goto done; default: @@ -1483,6 +1488,7 @@ namelist_read (void) return; case ' ': case '\n': + case '\r': case '\t': break; case ',': diff --git a/libgfortran/io/transfer.c b/libgfortran/io/transfer.c index 0e4c619..aed0aa9 100644 --- a/libgfortran/io/transfer.c +++ b/libgfortran/io/transfer.c @@ -177,7 +177,7 @@ read_sf (int *length) return NULL; } - if (readlen < 1 || *q == '\n') + if (readlen < 1 || *q == '\n' || *q == '\r') { /* ??? What is this for? */ if (current_unit->unit_number == options.stdin_unit) -- cgit v1.1