summaryrefslogtreecommitdiffstats
path: root/src/depfile_parser.in.cc
diff options
context:
space:
mode:
authorEvan Martin <martine@danga.com>2011-12-07 20:08:00 (GMT)
committerEvan Martin <martine@danga.com>2011-12-07 20:10:10 (GMT)
commitbf72e45180e1dd80d9efea8d2acebcac15ea12a4 (patch)
tree60610967b673187c0fe53694308db3eedf6e5d69 /src/depfile_parser.in.cc
parentab3e8c868b81a391fb713c449b6fac9720d25249 (diff)
downloadNinja-bf72e45180e1dd80d9efea8d2acebcac15ea12a4.zip
Ninja-bf72e45180e1dd80d9efea8d2acebcac15ea12a4.tar.gz
Ninja-bf72e45180e1dd80d9efea8d2acebcac15ea12a4.tar.bz2
use re2c to parse depfiles
Diffstat (limited to 'src/depfile_parser.in.cc')
-rw-r--r--src/depfile_parser.in.cc55
1 files changed, 55 insertions, 0 deletions
diff --git a/src/depfile_parser.in.cc b/src/depfile_parser.in.cc
new file mode 100644
index 0000000..1e22ca9
--- /dev/null
+++ b/src/depfile_parser.in.cc
@@ -0,0 +1,55 @@
+// Copyright 2011 Google Inc. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "depfile_parser.h"
+
+bool DepfileParser::Parse(const string& content, string* err) {
+ const char* p = content.data();
+ const char* end = content.data() + content.size();
+ for (;;) {
+ const char* start = p;
+ char yych;
+ /*!re2c
+ re2c:define:YYCTYPE = "const char";
+ re2c:define:YYCURSOR = p;
+ re2c:define:YYMARKER = q;
+ re2c:define:YYLIMIT = end;
+
+ re2c:yyfill:parameter = 0;
+ re2c:define:YYFILL = break;
+
+ re2c:indent:top = 2;
+ re2c:indent:string = " ";
+
+ re2c:yych:emit = 0;
+
+ '\\\n' { continue; }
+ [ \n]* { continue; }
+ [a-zA-Z0-9+,/_:.-]+ {
+ // Got a filename.
+ if (p[-1] == ':') {
+ out_ = StringPiece(start, p - start - 1);
+ } else {
+ ins_.push_back(StringPiece(start, p - start));
+ }
+ continue;
+ }
+ [^] {
+ *err = "BUG: depfile lexer encountered unknown state";
+ return false;
+ }
+ */
+ }
+ return true;
+}