summaryrefslogtreecommitdiff
path: root/gcc/fortran/scanner.c
diff options
context:
space:
mode:
authorpbrook <pbrook@138bc75d-0d04-0410-961f-82ee72b054a4>2004-10-04 15:47:16 +0000
committerpbrook <pbrook@138bc75d-0d04-0410-961f-82ee72b054a4>2004-10-04 15:47:16 +0000
commita746b83d8397f5fe32dce13e59868d5638343e57 (patch)
tree1b9f00596752c29180d2621c391e9761cf68c13a /gcc/fortran/scanner.c
parentd56c27620b8f2d33c6ee38ccbf771ab5de0b3c12 (diff)
downloadgcc-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.c40
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++;
}