summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaciej Pawlowski <mpawlowski@opera.com>2018-11-07 10:42:07 +0100
committerMaciej Pawlowski <mpawlowski@opera.com>2018-11-07 11:22:37 +0100
commit3edc4d4110c327cf81f2d87214b707ced5b22cd2 (patch)
tree46ba850601d8739ec3932bcc6ad3c0512fadf663
parentedb848dd6c0a2c0a12eb9e8676c3012fc94e80ca (diff)
downloadninja-3edc4d4110c327cf81f2d87214b707ced5b22cd2.tar.gz
Fix parsing some special chars in depfiles
This allows paths with "[", "]" and "%" to appear in depfiles. Previously, only "[" would be handled properly. Fixes #1227.
-rw-r--r--src/depfile_parser.cc4
-rw-r--r--src/depfile_parser.in.cc4
-rw-r--r--src/depfile_parser_test.cc7
3 files changed, 9 insertions, 6 deletions
diff --git a/src/depfile_parser.cc b/src/depfile_parser.cc
index 6c0379e..345fa15 100644
--- a/src/depfile_parser.cc
+++ b/src/depfile_parser.cc
@@ -53,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, 0, 0, 0,
+ 0, 128, 0, 0, 0, 128, 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,
@@ -144,7 +144,7 @@ yy10:
if (yych == '*') goto yy15;
goto yy13;
} else {
- if (yych <= '\\') goto yy15;
+ if (yych <= ']') goto yy15;
if (yych == '|') goto yy15;
goto yy13;
}
diff --git a/src/depfile_parser.in.cc b/src/depfile_parser.in.cc
index 98c1621..464efda 100644
--- a/src/depfile_parser.in.cc
+++ b/src/depfile_parser.in.cc
@@ -55,7 +55,7 @@ bool DepfileParser::Parse(string* content, string* err) {
re2c:indent:string = " ";
nul = "\000";
- escape = [ \\#*[|];
+ escape = [ \\#*[|\]];
'\\' escape {
// De-escape backslashed character.
@@ -73,7 +73,7 @@ bool DepfileParser::Parse(string* content, string* err) {
*out++ = yych;
continue;
}
- [a-zA-Z0-9+,/_:.~()}{@=!\x80-\xFF-]+ {
+ [a-zA-Z0-9+,/_:.~()}{%@=!\x80-\xFF-]+ {
// Got a span of plain text.
int len = (int)(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 ee798f8..824073f 100644
--- a/src/depfile_parser_test.cc
+++ b/src/depfile_parser_test.cc
@@ -122,12 +122,13 @@ TEST_F(DepfileParserTest, SpecialChars) {
"C:/Program\\ Files\\ (x86)/Microsoft\\ crtdefs.h: \n"
" en@quot.header~ t+t-x!=1 \n"
" openldap/slapd.d/cn=config/cn=schema/cn={0}core.ldif\n"
-" Fu\303\244ball",
+" Fu\303\244ball\n"
+" a\\[1\\]b@2%c",
&err));
ASSERT_EQ("", err);
EXPECT_EQ("C:/Program Files (x86)/Microsoft crtdefs.h",
parser_.out_.AsString());
- ASSERT_EQ(4u, parser_.ins_.size());
+ ASSERT_EQ(5u, parser_.ins_.size());
EXPECT_EQ("en@quot.header~",
parser_.ins_[0].AsString());
EXPECT_EQ("t+t-x!=1",
@@ -136,6 +137,8 @@ TEST_F(DepfileParserTest, SpecialChars) {
parser_.ins_[2].AsString());
EXPECT_EQ("Fu\303\244ball",
parser_.ins_[3].AsString());
+ EXPECT_EQ("a[1]b@2%c",
+ parser_.ins_[4].AsString());
}
TEST_F(DepfileParserTest, UnifyMultipleOutputs) {