summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMaxim Kalaev <maximk@il.ibm.com>2012-07-19 05:49:34 (GMT)
committerMaxim Kalaev <maximk@il.ibm.com>2012-07-19 06:05:59 (GMT)
commit73b8aa33f295aa64a8c115d886048a0a06ceee81 (patch)
treef3e7ab852ea83a1577ce0f5117ed2324cbad6f63 /src
parent8a37bfffcbea27ffbb9168b2740476336cd4963a (diff)
downloadNinja-73b8aa33f295aa64a8c115d886048a0a06ceee81.zip
Ninja-73b8aa33f295aa64a8c115d886048a0a06ceee81.tar.gz
Ninja-73b8aa33f295aa64a8c115d886048a0a06ceee81.tar.bz2
dep file parsing: allow '@' and '=' in paths
Diffstat (limited to 'src')
-rw-r--r--src/depfile_parser.cc36
-rw-r--r--src/depfile_parser.in.cc2
-rw-r--r--src/depfile_parser_test.cc9
3 files changed, 30 insertions, 17 deletions
diff --git a/src/depfile_parser.cc b/src/depfile_parser.cc
index 54b934c..03dad92 100644
--- a/src/depfile_parser.cc
+++ b/src/depfile_parser.cc
@@ -56,8 +56,8 @@ bool DepfileParser::Parse(string* content, string* err) {
0, 0, 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, 0, 0, 0,
- 0, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 0, 0, 128, 0, 0,
+ 128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 0, 0, 0, 0, 128,
@@ -84,27 +84,35 @@ bool DepfileParser::Parse(string* content, string* err) {
};
yych = *in;
- if (yych <= '[') {
+ if (yych <= 'Z') {
if (yych <= '*') {
if (yych <= 0x00) goto yy6;
if (yych <= '\'') goto yy8;
if (yych <= ')') goto yy4;
goto yy8;
} else {
- if (yych <= ':') goto yy4;
- if (yych <= '@') goto yy8;
- if (yych <= 'Z') goto yy4;
- goto yy8;
+ if (yych <= '<') {
+ if (yych <= ':') goto yy4;
+ goto yy8;
+ } else {
+ if (yych <= '=') goto yy4;
+ if (yych <= '?') goto yy8;
+ goto yy4;
+ }
}
} else {
- if (yych <= '`') {
- if (yych <= '\\') goto yy2;
- if (yych == '_') goto yy4;
- goto yy8;
+ if (yych <= '_') {
+ if (yych == '\\') goto yy2;
+ if (yych <= '^') goto yy8;
+ goto yy4;
} else {
- if (yych <= 'z') goto yy4;
- if (yych == '~') goto yy4;
- goto yy8;
+ if (yych <= 'z') {
+ if (yych <= '`') goto yy8;
+ goto yy4;
+ } else {
+ if (yych == '~') goto yy4;
+ goto yy8;
+ }
}
}
yy2:
diff --git a/src/depfile_parser.in.cc b/src/depfile_parser.in.cc
index 8c415b9..68b6a95 100644
--- a/src/depfile_parser.in.cc
+++ b/src/depfile_parser.in.cc
@@ -68,7 +68,7 @@ bool DepfileParser::Parse(string* content, string* err) {
*out++ = yych;
continue;
}
- [a-zA-Z0-9+,/_:.~()-]+ {
+ [a-zA-Z0-9+,/_:.~()@=-]+ {
// Got a span of plain text.
int len = in - start;
// Need to shift it over if we're overwriting backslashes.
diff --git a/src/depfile_parser_test.cc b/src/depfile_parser_test.cc
index fd76ae7..2bb9105 100644
--- a/src/depfile_parser_test.cc
+++ b/src/depfile_parser_test.cc
@@ -106,12 +106,17 @@ TEST_F(DepfileParserTest, Escapes) {
TEST_F(DepfileParserTest, SpecialChars) {
string err;
EXPECT_TRUE(Parse(
-"C:/Program\\ Files\\ (x86)/Microsoft\\ crtdefs.h:",
+"C:/Program\\ Files\\ (x86)/Microsoft\\ crtdefs.h: \n"
+" en@quot.header~ t+t-x=1",
&err));
ASSERT_EQ("", err);
EXPECT_EQ("C:/Program Files (x86)/Microsoft crtdefs.h",
parser_.out_.AsString());
- ASSERT_EQ(0u, parser_.ins_.size());
+ ASSERT_EQ(2u, parser_.ins_.size());
+ EXPECT_EQ("en@quot.header~",
+ parser_.ins_[0].AsString());
+ EXPECT_EQ("t+t-x=1",
+ parser_.ins_[1].AsString());
}
TEST_F(DepfileParserTest, UnifyMultipleOutputs) {