blob: 621518de29d93952e91cedaabac01d58f252e37d [file] [log] [blame]
#include "func.h"
#include <stdio.h>
#include <unordered_map>
#include "eval.h"
#include "log.h"
#include "strutil.h"
namespace {
void BuiltinInfoFunc(const vector<Value*>& args, Evaluator* ev, string*) {
shared_ptr<string> a = args[0]->Eval(ev);
printf("%s\n", a->c_str());
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;
} // namespace
void InitFuncTable() {
g_func_info_map = new unordered_map<StringPiece, FuncInfo*>;
for (size_t i = 0; i < sizeof(g_func_infos) / sizeof(g_func_infos[0]); i++) {
FuncInfo* fi = &g_func_infos[i];
bool ok = g_func_info_map->insert(make_pair(Intern(fi->name), fi)).second;
CHECK(ok);
}
}
void QuitFuncTable() {
delete g_func_info_map;
}
FuncInfo* GetFuncInfo(StringPiece name) {
auto found = g_func_info_map->find(name);
if (found == g_func_info_map->end())
return NULL;
return found->second;
}