summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEvan Martin <martine@danga.com>2011-01-19 05:12:13 (GMT)
committerEvan Martin <martine@danga.com>2011-01-19 05:12:13 (GMT)
commit7db7fe686658ed8cdd405a9fcc33626b64ba5eff (patch)
treeb5e676c6d2a9ab68e9bd1f2164476f11c15fd1b0
parent01271bf57eff2237ec3bd1289e4c303a86efb155 (diff)
downloadNinja-7db7fe686658ed8cdd405a9fcc33626b64ba5eff.zip
Ninja-7db7fe686658ed8cdd405a9fcc33626b64ba5eff.tar.gz
Ninja-7db7fe686658ed8cdd405a9fcc33626b64ba5eff.tar.bz2
split some of jumble out
-rw-r--r--build.ninja5
-rw-r--r--src/eval_env.cc71
-rw-r--r--src/eval_env.h15
-rw-r--r--src/ninja_jumble.cc57
4 files changed, 78 insertions, 70 deletions
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<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;
+}
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 <map>
+#include <string>
+#include <vector>
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<string, string>::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<string, string> 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;
-}