aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDelilah Hoare <delilah@dhoare.me>2022-03-05 23:37:07 +1100
committerCole Faust <colecfaust@gmail.com>2022-11-28 12:42:27 -0800
commit172ebf84cace3d848f91ae8532a91ebbb79b0dcc (patch)
tree44553f75356d78b9f22f12e81a67cb7a10672dab
parent1c7fee78f28175988570a6f00decb6d6df45828f (diff)
downloadkati-172ebf84cace3d848f91ae8532a91ebbb79b0dcc.tar.gz
Implement $?
-rw-r--r--src/command.cc16
1 files changed, 15 insertions, 1 deletions
diff --git a/src/command.cc b/src/command.cc
index 5268b9e..431b8ae 100644
--- a/src/command.cc
+++ b/src/command.cc
@@ -21,6 +21,7 @@
#include "dep.h"
#include "eval.h"
+#include "fileutil.h"
#include "flags.h"
#include "log.h"
#include "strutil.h"
@@ -67,6 +68,7 @@ DECLARE_AUTO_VAR_CLASS(AutoLessVar);
DECLARE_AUTO_VAR_CLASS(AutoHatVar);
DECLARE_AUTO_VAR_CLASS(AutoPlusVar);
DECLARE_AUTO_VAR_CLASS(AutoStarVar);
+DECLARE_AUTO_VAR_CLASS(AutoQuestionVar);
DECLARE_AUTO_VAR_CLASS(AutoNotImplementedVar);
class AutoSuffixDVar : public AutoVar {
@@ -125,6 +127,18 @@ void AutoStarVar::Eval(Evaluator*, string* s) const {
pat.Stem(n->output.str()).AppendToString(s);
}
+void AutoQuestionVar::Eval(Evaluator*, string* s) const {
+ unordered_set<StringPiece> seen;
+ WordWriter ww(s);
+ double target_age = GetTimestamp(ce_->current_dep_node()->output.str());
+ for (Symbol ai : ce_->current_dep_node()->actual_inputs) {
+ if (seen.insert(ai.str()).second
+ && GetTimestamp(ai.str()) > target_age) {
+ ww.Write(ai.str());
+ }
+ }
+}
+
void AutoNotImplementedVar::Eval(Evaluator* ev, string*) const {
ev->Error(StringPrintf("Automatic variable `$%s' isn't supported yet", sym_));
}
@@ -179,9 +193,9 @@ CommandEvaluator::CommandEvaluator(Evaluator* ev) : ev_(ev) {
INSERT_AUTO_VAR(AutoHatVar, "^");
INSERT_AUTO_VAR(AutoPlusVar, "+");
INSERT_AUTO_VAR(AutoStarVar, "*");
+ INSERT_AUTO_VAR(AutoQuestionVar, "?");
// TODO: Implement them.
INSERT_AUTO_VAR(AutoNotImplementedVar, "%");
- INSERT_AUTO_VAR(AutoNotImplementedVar, "?");
INSERT_AUTO_VAR(AutoNotImplementedVar, "|");
}