+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.
+
 2004-10-04  Tobias Schlueter  <tobias.schlueter@physik.uni-muenchen.de>
        Paul Brook  <paul@codesourcery.com>
 
 
   int i, line;
   char *filename;
   gfc_file *f;
+  int escaped;
 
   c++;
   while (*c == ' ' || *c == '\t')
 
   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;
       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.  */
   
   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++;
 }