summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPeter Kuemmel <syntheticpp@gmx.net>2012-01-29 11:28:52 (GMT)
committerPeter Kuemmel <syntheticpp@gmx.net>2012-01-29 11:28:52 (GMT)
commit88c9491f515f7ba479b5334ef834743fed539730 (patch)
treeb039b3f4f94b616735d93b1df78a6accba806e33 /src
parentc8faeaa5a1c5e2f5e75d0f1be19c70479475c5ce (diff)
downloadNinja-88c9491f515f7ba479b5334ef834743fed539730.zip
Ninja-88c9491f515f7ba479b5334ef834743fed539730.tar.gz
Ninja-88c9491f515f7ba479b5334ef834743fed539730.tar.bz2
add colon escaping
Needed for Windows drive names. For instance configure with gtest: python configure.py --with-gtest=c$:\gtest-1.6.0
Diffstat (limited to 'src')
-rw-r--r--src/lexer.cc52
-rw-r--r--src/lexer.in.cc4
-rw-r--r--src/lexer_test.cc4
3 files changed, 37 insertions, 23 deletions
diff --git a/src/lexer.cc b/src/lexer.cc
index 5bc467b..a1bedf5 100644
--- a/src/lexer.cc
+++ b/src/lexer.cc
@@ -606,7 +606,7 @@ bool Lexer::ReadEvalString(EvalString* eval, bool path, string* err) {
}
++p;
yych = *p;
- goto yy118;
+ goto yy120;
yy91:
{
eval->AddText(StringPiece(start, p - start));
@@ -629,7 +629,7 @@ yy94:
++p;
if ((yych = *p) <= '/') {
if (yych <= ' ') {
- if (yych == '\n') goto yy107;
+ if (yych == '\n') goto yy109;
if (yych <= 0x1F) goto yy98;
goto yy100;
} else {
@@ -643,17 +643,21 @@ yy94:
}
} else {
if (yych <= '^') {
- if (yych <= '9') goto yy104;
- if (yych <= '@') goto yy98;
- if (yych <= 'Z') goto yy104;
- goto yy98;
+ if (yych <= ':') {
+ if (yych <= '9') goto yy104;
+ goto yy106;
+ } else {
+ if (yych <= '@') goto yy98;
+ if (yych <= 'Z') goto yy104;
+ goto yy98;
+ }
} else {
if (yych <= '`') {
if (yych <= '_') goto yy104;
goto yy98;
} else {
if (yych <= 'z') goto yy104;
- if (yych <= '{') goto yy106;
+ if (yych <= '{') goto yy108;
goto yy98;
}
}
@@ -690,56 +694,62 @@ yy102:
yy104:
++p;
yych = *p;
- goto yy116;
+ goto yy118;
yy105:
{
eval->AddSpecial(StringPiece(start + 1, p - start - 1));
continue;
}
yy106:
+ ++p;
+ {
+ eval->AddText(StringPiece(":", 1));
+ continue;
+ }
+yy108:
yych = *(q = ++p);
if (yybm[0+yych] & 32) {
- goto yy110;
+ goto yy112;
}
goto yy99;
-yy107:
+yy109:
++p;
yych = *p;
if (yybm[0+yych] & 16) {
- goto yy107;
+ goto yy109;
}
{
continue;
}
-yy110:
+yy112:
++p;
yych = *p;
if (yybm[0+yych] & 32) {
- goto yy110;
+ goto yy112;
}
- if (yych == '}') goto yy113;
+ if (yych == '}') goto yy115;
p = q;
goto yy99;
-yy113:
+yy115:
++p;
{
eval->AddSpecial(StringPiece(start + 2, p - start - 3));
continue;
}
-yy115:
+yy117:
++p;
yych = *p;
-yy116:
+yy118:
if (yybm[0+yych] & 64) {
- goto yy115;
+ goto yy117;
}
goto yy105;
-yy117:
+yy119:
++p;
yych = *p;
-yy118:
+yy120:
if (yybm[0+yych] & 128) {
- goto yy117;
+ goto yy119;
}
goto yy91;
}
diff --git a/src/lexer.in.cc b/src/lexer.in.cc
index 6c00dbd..9caaa36 100644
--- a/src/lexer.in.cc
+++ b/src/lexer.in.cc
@@ -214,6 +214,10 @@ bool Lexer::ReadEvalString(EvalString* eval, bool path, string* err) {
eval->AddSpecial(StringPiece(start + 1, p - start - 1));
continue;
}
+ "$:" {
+ eval->AddText(StringPiece(":", 1));
+ continue;
+ }
"$". {
last_token_ = start;
return Error("bad $-escape (literal $ must be written as $$)", err);
diff --git a/src/lexer_test.cc b/src/lexer_test.cc
index 1c5894e..5795e5e 100644
--- a/src/lexer_test.cc
+++ b/src/lexer_test.cc
@@ -29,12 +29,12 @@ TEST(Lexer, ReadVarValue) {
}
TEST(Lexer, ReadEvalStringEscapes) {
- Lexer lexer("$ $$ab $\ncde\n");
+ Lexer lexer("$ $$ab c$: $\ncde\n");
EvalString eval;
string err;
EXPECT_TRUE(lexer.ReadVarValue(&eval, &err));
EXPECT_EQ("", err);
- EXPECT_EQ("[ $ab cde]",
+ EXPECT_EQ("[ $ab c: cde]",
eval.Serialize());
}