aboutsummaryrefslogtreecommitdiff
path: root/exec.cc
diff options
context:
space:
mode:
authorShinichiro Hamaji <shinichiro.hamaji@gmail.com>2015-06-18 18:38:32 +0900
committerShinichiro Hamaji <shinichiro.hamaji@gmail.com>2015-06-19 12:49:20 +0900
commit22fede4a72593f1a0a1bad458f3496113c84e55d (patch)
tree2fe3192f7da75a9dffb9126526424b9ace49da4f /exec.cc
parent7154e8d09b1ee5115554594c9dee56c6cb6bd554 (diff)
downloadkati-22fede4a72593f1a0a1bad458f3496113c84e55d.tar.gz
[C++] Implement AutoSuffixXVar
Diffstat (limited to 'exec.cc')
-rw-r--r--exec.cc49
1 files changed, 46 insertions, 3 deletions
diff --git a/exec.cc b/exec.cc
index 337e7f8..8d490f3 100644
--- a/exec.cc
+++ b/exec.cc
@@ -60,6 +60,29 @@ DECLARE_AUTO_VAR_CLASS(AutoHatVar);
DECLARE_AUTO_VAR_CLASS(AutoPlusVar);
DECLARE_AUTO_VAR_CLASS(AutoStarVar);
+class AutoSuffixDVar : public AutoVar {
+ public:
+ AutoSuffixDVar(Executor* ex, const char* sym, Var* wrapped)
+ : AutoVar(ex, sym), wrapped_(wrapped) {
+ }
+ virtual ~AutoSuffixDVar() = default;
+ virtual void Eval(Evaluator* ev, string* s) const override;
+
+ private:
+ Var* wrapped_;
+};
+
+class AutoSuffixFVar : public AutoVar {
+ public:
+ AutoSuffixFVar(Executor* ex, const char* sym, Var* wrapped)
+ : AutoVar(ex, sym), wrapped_(wrapped) {}
+ virtual ~AutoSuffixFVar() = default;
+ virtual void Eval(Evaluator* ev, string* s) const override;
+
+ private:
+ Var* wrapped_;
+};
+
struct Runner {
Runner()
: echo(true), ignore_error(false) {
@@ -76,9 +99,11 @@ class Executor {
explicit Executor(Vars* vars)
: vars_(vars),
ev_(new Evaluator(vars_)) {
-#define INSERT_AUTO_VAR(name, sym) do { \
- Var* v = new AutoAtVar(this, sym); \
- (*vars)[STRING_PIECE(sym)] = v; \
+#define INSERT_AUTO_VAR(name, sym) do { \
+ Var* v = new name(this, sym); \
+ (*vars)[STRING_PIECE(sym)] = v; \
+ (*vars)[STRING_PIECE(sym"D")] = new AutoSuffixDVar(this, sym"D", v); \
+ (*vars)[STRING_PIECE(sym"F")] = new AutoSuffixFVar(this, sym"F", v); \
} while (0)
INSERT_AUTO_VAR(AutoAtVar, "@");
INSERT_AUTO_VAR(AutoLessVar, "<");
@@ -177,6 +202,24 @@ void AutoStarVar::Eval(Evaluator*, string* s) const {
AppendString(StripExt(ex_->current_dep_node()->output), s);
}
+void AutoSuffixDVar::Eval(Evaluator* ev, string* s) const {
+ string buf;
+ wrapped_->Eval(ev, &buf);
+ WordWriter ww(s);
+ for (StringPiece tok : WordScanner(buf)) {
+ ww.Write(Dirname(tok));
+ }
+}
+
+void AutoSuffixFVar::Eval(Evaluator* ev, string* s) const {
+ string buf;
+ wrapped_->Eval(ev, &buf);
+ WordWriter ww(s);
+ for (StringPiece tok : WordScanner(buf)) {
+ ww.Write(Basename(tok));
+ }
+}
+
} // namespace
void Exec(const vector<DepNode*>& roots, Vars* vars) {