From 88c9491f515f7ba479b5334ef834743fed539730 Mon Sep 17 00:00:00 2001 From: Peter Kuemmel Date: Sun, 29 Jan 2012 12:28:52 +0100 Subject: add colon escaping Needed for Windows drive names. For instance configure with gtest: python configure.py --with-gtest=c$:\gtest-1.6.0 --- src/lexer.cc | 52 +++++++++++++++++++++++++++++++--------------------- src/lexer.in.cc | 4 ++++ src/lexer_test.cc | 4 ++-- 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()); } -- cgit v0.12