summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEvan Martin <martine@danga.com>2013-07-18 20:36:58 (GMT)
committerEvan Martin <martine@danga.com>2013-07-18 20:36:58 (GMT)
commit1f357a79984d9cae226ea73269ccabb500be2a31 (patch)
treef67699c705c65c38a7c909d68a70970f074d75ca
parent699d678774bfae538f3f555abd6ac3d91e968f52 (diff)
parentcce4807703a0595fd8db8c57db61184b0d00a187 (diff)
downloadNinja-1f357a79984d9cae226ea73269ccabb500be2a31.zip
Ninja-1f357a79984d9cae226ea73269ccabb500be2a31.tar.gz
Ninja-1f357a79984d9cae226ea73269ccabb500be2a31.tar.bz2
Merge pull request #621 from nico/ninjaload
Reuse ManifestParser::Load() in ManifestParser::ParseFileInclude().
-rw-r--r--src/manifest_parser.cc22
1 files changed, 12 insertions, 10 deletions
diff --git a/src/manifest_parser.cc b/src/manifest_parser.cc
index d4f0007..a1bb904 100644
--- a/src/manifest_parser.cc
+++ b/src/manifest_parser.cc
@@ -28,20 +28,28 @@ ManifestParser::ManifestParser(State* state, FileReader* file_reader)
: state_(state), file_reader_(file_reader) {
env_ = &state->bindings_;
}
+
bool ManifestParser::Load(const string& filename, string* err) {
+ METRIC_RECORD(".ninja parse");
string contents;
string read_err;
if (!file_reader_->ReadFile(filename, &contents, &read_err)) {
*err = "loading '" + filename + "': " + read_err;
return false;
}
- contents.resize(contents.size() + 10);
+
+ // The lexer needs a nul byte at the end of its input, to know when it's done.
+ // It takes a StringPiece, and StringPiece's string constructor uses
+ // string::data(). data()'s return value isn't guaranteed to be
+ // null-terminated (although in practice - libc++, libstdc++, msvc's stl --
+ // it is, and C++11 demands that too), so add an explicit nul byte.
+ contents.resize(contents.size() + 1);
+
return Parse(filename, contents, err);
}
bool ManifestParser::Parse(const string& filename, const string& input,
string* err) {
- METRIC_RECORD(".ninja parse");
lexer_.Start(filename, input);
for (;;) {
@@ -338,17 +346,11 @@ bool ManifestParser::ParseEdge(string* err) {
}
bool ManifestParser::ParseFileInclude(bool new_scope, string* err) {
- // XXX this should use ReadPath!
EvalString eval;
if (!lexer_.ReadPath(&eval, err))
return false;
string path = eval.Evaluate(env_);
- string contents;
- string read_err;
- if (!file_reader_->ReadFile(path, &contents, &read_err))
- return lexer_.Error("loading '" + path + "': " + read_err, err);
-
ManifestParser subparser(state_, file_reader_);
if (new_scope) {
subparser.env_ = new BindingEnv(env_);
@@ -356,8 +358,8 @@ bool ManifestParser::ParseFileInclude(bool new_scope, string* err) {
subparser.env_ = env_;
}
- if (!subparser.Parse(path, contents, err))
- return false;
+ if (!subparser.Load(path, err))
+ return lexer_.Error(string(*err), err);
if (!ExpectToken(Lexer::NEWLINE, err))
return false;