diff options
author | pbrook <pbrook@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-10-04 15:47:16 +0000 |
---|---|---|
committer | pbrook <pbrook@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-10-04 15:47:16 +0000 |
commit | a746b83d8397f5fe32dce13e59868d5638343e57 (patch) | |
tree | 1b9f00596752c29180d2621c391e9761cf68c13a /gcc/fortran/scanner.c | |
parent | d56c27620b8f2d33c6ee38ccbf771ab5de0b3c12 (diff) | |
download | gcc-a746b83d8397f5fe32dce13e59868d5638343e57.tar.gz |
2004-10-04 Erik Schnetter <schnetter@aei.mpg.de>
* scanner.c (preprocessor_line): Accept preprocessor lines without
file names. Check file names for closing quotes. Handle escaped
quotes in file names.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@88514 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/fortran/scanner.c')
-rw-r--r-- | gcc/fortran/scanner.c | 40 |
1 files changed, 33 insertions, 7 deletions
diff --git a/gcc/fortran/scanner.c b/gcc/fortran/scanner.c index 3c6ca19abd9..734afa04d9f 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++; } |