aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--eval.cc4
-rw-r--r--eval.h4
-rw-r--r--func.cc14
3 files changed, 22 insertions, 0 deletions
diff --git a/eval.cc b/eval.cc
index f1ae682..9060f36 100644
--- a/eval.cc
+++ b/eval.cc
@@ -129,3 +129,7 @@ EvalResult* Evaluator::GetEvalResult() {
er->rule_vars.swap(rule_vars_);
return er;
}
+
+void Evaluator::Error(const string& msg) {
+ ERROR("%s:%d: %s", loc_.filename, loc_.lineno, msg.c_str());
+}
diff --git a/eval.h b/eval.h
index 78cc307..51460a9 100644
--- a/eval.h
+++ b/eval.h
@@ -41,6 +41,8 @@ class Evaluator {
EvalResult* GetEvalResult();
+ const Loc& loc() const { return loc_; }
+
#if 0
const vector<Rule*>& rules() const { return rules_; }
const Vars* vars() const { return vars_; }
@@ -49,6 +51,8 @@ class Evaluator {
}
#endif
+ void Error(const string& msg);
+
private:
const Vars* in_vars_;
Vars* vars_;
diff --git a/func.cc b/func.cc
index 2910193..621518d 100644
--- a/func.cc
+++ b/func.cc
@@ -4,6 +4,7 @@
#include <unordered_map>
+#include "eval.h"
#include "log.h"
#include "strutil.h"
@@ -15,8 +16,21 @@ void BuiltinInfoFunc(const vector<Value*>& args, Evaluator* ev, string*) {
fflush(stdout);
}
+void BuiltinWarningFunc(const vector<Value*>& args, Evaluator* ev, string*) {
+ shared_ptr<string> a = args[0]->Eval(ev);
+ printf("%s:%d: %s\n", ev->loc().filename, ev->loc().lineno, a->c_str());
+ fflush(stdout);
+}
+
+void BuiltinErrorFunc(const vector<Value*>& args, Evaluator* ev, string*) {
+ shared_ptr<string> a = args[0]->Eval(ev);
+ ev->Error(StringPrintf("*** %s.", a->c_str()));
+}
+
FuncInfo g_func_infos[] = {
{ "info", &BuiltinInfoFunc, 1 },
+ { "warning", &BuiltinWarningFunc, 1 },
+ { "error", &BuiltinErrorFunc, 1 },
};
unordered_map<StringPiece, FuncInfo*>* g_func_info_map;