diff options
author | Evan Martin <martine@danga.com> | 2011-01-19 05:12:13 (GMT) |
---|---|---|
committer | Evan Martin <martine@danga.com> | 2011-01-19 05:12:13 (GMT) |
commit | 7db7fe686658ed8cdd405a9fcc33626b64ba5eff (patch) | |
tree | b5e676c6d2a9ab68e9bd1f2164476f11c15fd1b0 /src/eval_env.cc | |
parent | 01271bf57eff2237ec3bd1289e4c303a86efb155 (diff) | |
download | Ninja-7db7fe686658ed8cdd405a9fcc33626b64ba5eff.zip Ninja-7db7fe686658ed8cdd405a9fcc33626b64ba5eff.tar.gz Ninja-7db7fe686658ed8cdd405a9fcc33626b64ba5eff.tar.bz2 |
split some of jumble out
Diffstat (limited to 'src/eval_env.cc')
-rw-r--r-- | src/eval_env.cc | 71 |
1 files changed, 71 insertions, 0 deletions
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<string, string>::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; +} |