summaryrefslogtreecommitdiffstats
path: root/ninja/src/depfile_parser.cc
diff options
context:
space:
mode:
Diffstat (limited to 'ninja/src/depfile_parser.cc')
-rw-r--r--ninja/src/depfile_parser.cc222
1 files changed, 97 insertions, 125 deletions
diff --git a/ninja/src/depfile_parser.cc b/ninja/src/depfile_parser.cc
index 405289ff9dc..7cee8921092 100644
--- a/ninja/src/depfile_parser.cc
+++ b/ninja/src/depfile_parser.cc
@@ -1,4 +1,4 @@
-/* Generated by re2c 1.1.1 */
+/* Generated by re2c 0.13.5 */
// Copyright 2011 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
@@ -14,12 +14,6 @@
// limitations under the License.
#include "depfile_parser.h"
-#include "util.h"
-
-DepfileParser::DepfileParser(DepfileParserOptions options)
- : options_(options)
-{
-}
// A note on backslashes in Makefiles, from reading the docs:
// Backslash-newline is the line continuation character.
@@ -41,13 +35,8 @@ bool DepfileParser::Parse(string* content, string* err) {
// parsing_targets: whether we are parsing targets or dependencies.
char* in = &(*content)[0];
char* end = in + content->size();
- bool have_target = false;
- bool have_secondary_target_on_this_rule = false;
- bool have_newline_since_primary_target = false;
- bool warned_distinct_target_lines = false;
bool parsing_targets = true;
while (in < end) {
- bool have_newline = false;
// out: current output point (typically same as in, but can fall behind
// as we de-escape backslashes).
char* out = in;
@@ -56,7 +45,6 @@ bool DepfileParser::Parse(string* content, string* err) {
for (;;) {
// start: beginning of the current parsed span.
const char* start = in;
- char* yymarker = NULL;
{
unsigned char yych;
@@ -65,7 +53,7 @@ bool DepfileParser::Parse(string* content, string* err) {
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
- 0, 128, 0, 0, 0, 128, 0, 0,
+ 0, 128, 0, 0, 0, 0, 0, 0,
128, 128, 0, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 0, 0, 128, 0, 0,
@@ -94,55 +82,88 @@ bool DepfileParser::Parse(string* content, string* err) {
128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128,
};
+
yych = *in;
- if (yybm[0+yych] & 128) {
- goto yy9;
- }
- if (yych <= '\r') {
- if (yych <= '\t') {
- if (yych >= 0x01) goto yy4;
+ if (yych <= '=') {
+ if (yych <= '$') {
+ if (yych <= ' ') {
+ if (yych <= 0x00) goto yy7;
+ goto yy9;
+ } else {
+ if (yych <= '!') goto yy5;
+ if (yych <= '#') goto yy9;
+ goto yy4;
+ }
} else {
- if (yych <= '\n') goto yy6;
- if (yych <= '\f') goto yy4;
- goto yy8;
+ if (yych <= '*') {
+ if (yych <= '\'') goto yy9;
+ if (yych <= ')') goto yy5;
+ goto yy9;
+ } else {
+ if (yych <= ':') goto yy5;
+ if (yych <= '<') goto yy9;
+ goto yy5;
+ }
}
} else {
- if (yych <= '$') {
- if (yych <= '#') goto yy4;
- goto yy12;
+ if (yych <= '_') {
+ if (yych <= '[') {
+ if (yych <= '?') goto yy9;
+ if (yych <= 'Z') goto yy5;
+ goto yy9;
+ } else {
+ if (yych <= '\\') goto yy2;
+ if (yych <= '^') goto yy9;
+ goto yy5;
+ }
} else {
- if (yych == '\\') goto yy13;
- goto yy4;
+ if (yych <= '|') {
+ if (yych <= '`') goto yy9;
+ if (yych <= '{') goto yy5;
+ goto yy9;
+ } else {
+ if (yych == 0x7F) goto yy9;
+ goto yy5;
+ }
}
}
+yy2:
++in;
- {
- break;
+ if ((yych = *in) <= '"') {
+ if (yych <= '\f') {
+ if (yych <= 0x00) goto yy3;
+ if (yych != '\n') goto yy14;
+ } else {
+ if (yych <= '\r') goto yy3;
+ if (yych == ' ') goto yy16;
+ goto yy14;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '#') goto yy16;
+ if (yych == '*') goto yy16;
+ goto yy14;
+ } else {
+ if (yych <= '\\') goto yy16;
+ if (yych == '|') goto yy16;
+ goto yy14;
+ }
}
-yy4:
- ++in;
-yy5:
+yy3:
{
// For any other character (e.g. whitespace), swallow it here,
// allowing the outer logic to loop around again.
break;
}
-yy6:
- ++in;
- {
- // A newline ends the current file name and the current rule.
- have_newline = true;
- break;
- }
-yy8:
- yych = *++in;
- if (yych == '\n') goto yy6;
- goto yy5;
-yy9:
+yy4:
yych = *++in;
- if (yybm[0+yych] & 128) {
- goto yy9;
- }
+ if (yych == '$') goto yy12;
+ goto yy3;
+yy5:
+ ++in;
+ yych = *in;
+ goto yy11;
+yy6:
{
// Got a span of plain text.
int len = (int)(in - start);
@@ -152,41 +173,30 @@ yy9:
out += len;
continue;
}
-yy12:
+yy7:
+ ++in;
+ {
+ break;
+ }
+yy9:
yych = *++in;
- if (yych == '$') goto yy14;
- goto yy5;
-yy13:
- yych = *(yymarker = ++in);
- if (yych <= '"') {
- if (yych <= '\f') {
- if (yych <= 0x00) goto yy5;
- if (yych == '\n') goto yy18;
- goto yy16;
- } else {
- if (yych <= '\r') goto yy20;
- if (yych == ' ') goto yy22;
- goto yy16;
- }
- } else {
- if (yych <= 'Z') {
- if (yych <= '#') goto yy22;
- if (yych == '*') goto yy22;
- goto yy16;
- } else {
- if (yych <= ']') goto yy22;
- if (yych == '|') goto yy22;
- goto yy16;
- }
+ goto yy3;
+yy10:
+ ++in;
+ yych = *in;
+yy11:
+ if (yybm[0+yych] & 128) {
+ goto yy10;
}
-yy14:
+ goto yy6;
+yy12:
++in;
{
// De-escape dollar character.
*out++ = '$';
continue;
}
-yy16:
+yy14:
++in;
{
// Let backslash before other characters through verbatim.
@@ -194,18 +204,7 @@ yy16:
*out++ = yych;
continue;
}
-yy18:
- ++in;
- {
- // A line continuation ends the current file name.
- break;
- }
-yy20:
- yych = *++in;
- if (yych == '\n') goto yy18;
- in = yymarker;
- goto yy5;
-yy22:
+yy16:
++in;
{
// De-escape backslashed character.
@@ -217,52 +216,25 @@ yy22:
}
int len = (int)(out - filename);
- const bool is_dependency = !parsing_targets;
+ const bool is_target = parsing_targets;
if (len > 0 && filename[len - 1] == ':') {
len--; // Strip off trailing colon, if any.
parsing_targets = false;
- have_target = true;
}
- if (len > 0) {
- if (is_dependency) {
- if (have_secondary_target_on_this_rule) {
- if (!have_newline_since_primary_target) {
- *err = "depfile has multiple output paths";
- return false;
- } else if (options_.depfile_distinct_target_lines_action_ ==
- kDepfileDistinctTargetLinesActionError) {
- *err =
- "depfile has multiple output paths (on separate lines)"
- " [-w depfilemulti=err]";
- return false;
- } else {
- if (!warned_distinct_target_lines) {
- warned_distinct_target_lines = true;
- Warning("depfile has multiple output paths (on separate lines); "
- "continuing anyway [-w depfilemulti=warn]");
- }
- continue;
- }
- }
- ins_.push_back(StringPiece(filename, len));
- } else if (!out_.str_) {
- out_ = StringPiece(filename, len);
- } else if (out_ != StringPiece(filename, len)) {
- have_secondary_target_on_this_rule = true;
- }
- }
+ if (len == 0)
+ continue;
- if (have_newline) {
- // A newline ends a rule so the next filename will be a new target.
- parsing_targets = true;
- have_secondary_target_on_this_rule = false;
- if (have_target) {
- have_newline_since_primary_target = true;
- }
+ if (!is_target) {
+ ins_.push_back(StringPiece(filename, len));
+ } else if (!out_.str_) {
+ out_ = StringPiece(filename, len);
+ } else if (out_ != StringPiece(filename, len)) {
+ *err = "depfile has multiple output paths";
+ return false;
}
}
- if (!have_target) {
+ if (parsing_targets) {
*err = "expected ':' in depfile";
return false;
}