]> git.saurik.com Git - bison.git/blobdiff - src/scan-gram.l
* src/main.c (main): Free `infile'.
[bison.git] / src / scan-gram.l
index 95aab9853709e118bd0b34910432925eda6d7bbc..9670687305f20b31adbd8dea2dc6e5caddb01638 100644 (file)
@@ -177,6 +177,7 @@ static void handle_dollar (braced_code_t code_kind,
                           char *cp, location_t location);
 static void handle_at (braced_code_t code_kind,
                       char *cp, location_t location);
+static void handle_syncline (char *args, location_t *location);
 static int convert_ucn_to_byte (char const *hex_text);
 
 %}
@@ -254,6 +255,8 @@ splice       (\\[ \f\t\v]*\n)*
     YY_STEP;
   }
 
+  ^"#line "{int}" \""[^\"]*"\"\n"   handle_syncline (yytext + strlen ("#line "), yylloc); YY_STEP;
+
   "="                     return EQUAL;
   ":"                     rule_length = 0; return COLON;
   "|"                     rule_length = 0; return PIPE;
@@ -899,6 +902,24 @@ convert_ucn_to_byte (char const *ucn)
 }
 
 
+/*----------------------------------------------------------------.
+| Handle `#line INT "FILE"'.  ARGS has already skipped `#line '.  |
+`----------------------------------------------------------------*/
+
+static void
+handle_syncline (char *args, location_t *location)
+{
+  int lineno = strtol (args, &args, 10);
+  const char *file = NULL;
+  file = strchr (args, '"') + 1;
+  *strchr (file, '"') = 0;
+  /* FIXME: Leaking...  Can't free, as some locations are still
+     pointing to the old file name.  */
+  infile = xstrdup (file);
+  location->file = infile;
+  location->last_line = lineno;
+}
+
 /*-------------------------.
 | Initialize the scanner.  |
 `-------------------------*/