From 7db7fe686658ed8cdd405a9fcc33626b64ba5eff Mon Sep 17 00:00:00 2001 From: Evan Martin Date: Tue, 18 Jan 2011 21:12:13 -0800 Subject: [PATCH] split some of jumble out --- build.ninja | 5 ++-- src/eval_env.cc | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++ src/eval_env.h | 15 +++-------- src/ninja_jumble.cc | 57 ------------------------------------------ 4 files changed, 78 insertions(+), 70 deletions(-) create mode 100644 src/eval_env.cc diff --git a/build.ninja b/build.ninja index 683c94b..1a3c6b3 100644 --- a/build.ninja +++ b/build.ninja @@ -41,14 +41,15 @@ rule link # and build that "ninja.o" by compiling "ninja.cc". build $builddir/build.o: cxx src/build.cc build $builddir/build_log.o: cxx src/build_log.cc +build $builddir/eval_env.o: cxx src/eval_env.cc build $builddir/graph.o: cxx src/graph.cc build $builddir/parsers.o: cxx src/parsers.cc build $builddir/subprocess.o: cxx src/subprocess.cc build $builddir/util.o: cxx src/util.cc build $builddir/ninja_jumble.o: cxx src/ninja_jumble.cc build $builddir/ninja.a: ar $builddir/build.o $builddir/build_log.o \ - $builddir/graph.o $builddir/parsers.o $builddir/subprocess.o \ - $builddir/util.o $builddir/ninja_jumble.o + $builddir/eval_env.o $builddir/graph.o $builddir/parsers.o \ + $builddir/subprocess.o $builddir/util.o $builddir/ninja_jumble.o build $builddir/ninja.o: cxx src/ninja.cc build ninja: link $builddir/ninja.o $builddir/ninja.a diff --git a/src/eval_env.cc b/src/eval_env.cc new file mode 100644 index 0000000..172544c --- /dev/null +++ b/src/eval_env.cc @@ -0,0 +1,71 @@ +#include "eval_env.h" + +string BindingEnv::LookupVariable(const string& var) { + map::iterator i = bindings_.find(var); + if (i != bindings_.end()) + return i->second; + if (parent_) + return parent_->LookupVariable(var); + return ""; +} + +void BindingEnv::AddBinding(const string& key, const string& val) { + bindings_[key] = val; +} + +bool EvalString::Parse(const string& input, string* err) { + unparsed_ = input; + + string::size_type start, end; + start = 0; + do { + end = input.find('$', start); + if (end == string::npos) { + end = input.size(); + break; + } + if (end > start) + parsed_.push_back(make_pair(input.substr(start, end - start), RAW)); + start = end + 1; + if (start < input.size() && input[start] == '{') { + ++start; + for (end = start + 1; end < input.size(); ++end) { + if (input[end] == '}') + break; + } + if (end >= input.size()) { + *err = "expected closing curly after ${"; + return false; + } + parsed_.push_back(make_pair(input.substr(start, end - start), SPECIAL)); + ++end; + } else { + for (end = start; end < input.size(); ++end) { + char c = input[end]; + if (!(('a' <= c && c <= 'z') || ('0' <= c && c <= '9') || c == '_')) + break; + } + if (end == start) { + *err = "expected variable after $"; + return false; + } + parsed_.push_back(make_pair(input.substr(start, end - start), SPECIAL)); + } + start = end; + } while (end < input.size()); + if (end > start) + parsed_.push_back(make_pair(input.substr(start, end - start), RAW)); + + return true; +} + +string EvalString::Evaluate(Env* env) const { + string result; + for (TokenList::const_iterator i = parsed_.begin(); i != parsed_.end(); ++i) { + if (i->second == RAW) + result.append(i->first); + else + result.append(env->LookupVariable(i->first)); + } + return result; +} diff --git a/src/eval_env.h b/src/eval_env.h index 517066d..46fb1f1 100644 --- a/src/eval_env.h +++ b/src/eval_env.h @@ -2,6 +2,8 @@ #define NINJA_EVAL_ENV_H_ #include +#include +#include using namespace std; // A scope for variable lookups. @@ -13,17 +15,8 @@ struct Env { // as well as a pointer to a parent scope. struct BindingEnv : public Env { BindingEnv() : parent_(NULL) {} - virtual string LookupVariable(const string& var) { - map::iterator i = bindings_.find(var); - if (i != bindings_.end()) - return i->second; - if (parent_) - return parent_->LookupVariable(var); - return ""; - } - void AddBinding(const string& key, const string& val) { - bindings_[key] = val; - } + virtual string LookupVariable(const string& var); + void AddBinding(const string& key, const string& val); map bindings_; Env* parent_; diff --git a/src/ninja_jumble.cc b/src/ninja_jumble.cc index d351a6c..930ed59 100644 --- a/src/ninja_jumble.cc +++ b/src/ninja_jumble.cc @@ -170,60 +170,3 @@ void State::AddOut(Edge* edge, const string& path) { } node->in_edge_ = edge; } - -bool EvalString::Parse(const string& input, string* err) { - unparsed_ = input; - - string::size_type start, end; - start = 0; - do { - end = input.find('$', start); - if (end == string::npos) { - end = input.size(); - break; - } - if (end > start) - parsed_.push_back(make_pair(input.substr(start, end - start), RAW)); - start = end + 1; - if (start < input.size() && input[start] == '{') { - ++start; - for (end = start + 1; end < input.size(); ++end) { - if (input[end] == '}') - break; - } - if (end >= input.size()) { - *err = "expected closing curly after ${"; - return false; - } - parsed_.push_back(make_pair(input.substr(start, end - start), SPECIAL)); - ++end; - } else { - for (end = start; end < input.size(); ++end) { - char c = input[end]; - if (!(('a' <= c && c <= 'z') || ('0' <= c && c <= '9') || c == '_')) - break; - } - if (end == start) { - *err = "expected variable after $"; - return false; - } - parsed_.push_back(make_pair(input.substr(start, end - start), SPECIAL)); - } - start = end; - } while (end < input.size()); - if (end > start) - parsed_.push_back(make_pair(input.substr(start, end - start), RAW)); - - return true; -} - -string EvalString::Evaluate(Env* env) const { - string result; - for (TokenList::const_iterator i = parsed_.begin(); i != parsed_.end(); ++i) { - if (i->second == RAW) - result.append(i->first); - else - result.append(env->LookupVariable(i->first)); - } - return result; -} -- 2.7.4