From d7d528c8c811a4d3f12a95905fe56ff6bf2d433f Mon Sep 17 00:00:00 2001 From: Erik Schnetter Date: Mon, 4 Oct 2004 15:47:16 +0000 Subject: [PATCH] scanner.c (preprocessor_line): Accept preprocessor lines without file names. 2004-10-04 Erik Schnetter * scanner.c (preprocessor_line): Accept preprocessor lines without file names. Check file names for closing quotes. Handle escaped quotes in file names. From-SVN: r88514 --- gcc/fortran/ChangeLog | 6 ++++++ gcc/fortran/scanner.c | 40 +++++++++++++++++++++++++++++++++------- 2 files changed, 39 insertions(+), 7 deletions(-) diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index f99c54f989cb..d1bc71d73c01 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2004-10-04 Erik Schnetter + + * scanner.c (preprocessor_line): Accept preprocessor lines without + file names. Check file names for closing quotes. Handle escaped + quotes in file names. + 2004-10-04 Tobias Schlueter Paul Brook diff --git a/gcc/fortran/scanner.c b/gcc/fortran/scanner.c index 3c6ca19abd9d..734afa04d9f6 100644 --- a/gcc/fortran/scanner.c +++ b/gcc/fortran/scanner.c @@ -834,6 +834,7 @@ preprocessor_line (char *c) int i, line; char *filename; gfc_file *f; + int escaped; c++; while (*c == ' ' || *c == '\t') @@ -844,19 +845,46 @@ preprocessor_line (char *c) line = atoi (c); + /* Set new line number. */ + current_file->line = line; + c = strchr (c, ' '); if (c == NULL) - /* Something we don't understand has happened. */ + /* No file name given. */ + return; + + + + /* Skip spaces. */ + while (*c == ' ' || *c == '\t') + c++; + + /* Skip quote. */ + if (*c != '"') goto bad_cpp_line; - c += 2; /* Skip space and quote. */ + ++c; + filename = c; - c = strchr (c, '"'); /* Make filename end at quote. */ - if (c == NULL) + /* Make filename end at quote. */ + escaped = false; + while (*c && ! (! escaped && *c == '"')) + { + if (escaped) + escaped = false; + else + escaped = *c == '\\'; + ++c; + } + + if (! *c) /* Preprocessor line has no closing quote. */ goto bad_cpp_line; + *c++ = '\0'; + + /* Get flags. */ flag[1] = flag[2] = flag[3] = flag[4] = flag[5] = false; @@ -888,8 +916,6 @@ preprocessor_line (char *c) current_file = current_file->up; } - current_file->line = line; - /* The name of the file can be a temporary file produced by cpp. Replace the name if it is different. */ @@ -903,7 +929,7 @@ preprocessor_line (char *c) return; bad_cpp_line: - gfc_warning_now ("%s:%d: Unknown preprocessor directive", + gfc_warning_now ("%s:%d: Illegal preprocessor directive", current_file->filename, current_file->line); current_file->line++; } -- 2.43.5