blob: 621518de29d93952e91cedaabac01d58f252e37d [file] [log] [blame]
Shinichiro Hamaji776ca302015-06-06 03:52:48 +09001#include "func.h"
2
3#include <stdio.h>
4
5#include <unordered_map>
6
Shinichiro Hamaji9619b362015-06-16 16:13:25 +09007#include "eval.h"
Shinichiro Hamaji776ca302015-06-06 03:52:48 +09008#include "log.h"
9#include "strutil.h"
10
11namespace {
12
13void BuiltinInfoFunc(const vector<Value*>& args, Evaluator* ev, string*) {
14 shared_ptr<string> a = args[0]->Eval(ev);
15 printf("%s\n", a->c_str());
16 fflush(stdout);
17}
18
Shinichiro Hamaji9619b362015-06-16 16:13:25 +090019void BuiltinWarningFunc(const vector<Value*>& args, Evaluator* ev, string*) {
20 shared_ptr<string> a = args[0]->Eval(ev);
21 printf("%s:%d: %s\n", ev->loc().filename, ev->loc().lineno, a->c_str());
22 fflush(stdout);
23}
24
25void BuiltinErrorFunc(const vector<Value*>& args, Evaluator* ev, string*) {
26 shared_ptr<string> a = args[0]->Eval(ev);
27 ev->Error(StringPrintf("*** %s.", a->c_str()));
28}
29
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090030FuncInfo g_func_infos[] = {
31 { "info", &BuiltinInfoFunc, 1 },
Shinichiro Hamaji9619b362015-06-16 16:13:25 +090032 { "warning", &BuiltinWarningFunc, 1 },
33 { "error", &BuiltinErrorFunc, 1 },
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090034};
35
36unordered_map<StringPiece, FuncInfo*>* g_func_info_map;
37
38} // namespace
39
40void InitFuncTable() {
41 g_func_info_map = new unordered_map<StringPiece, FuncInfo*>;
42 for (size_t i = 0; i < sizeof(g_func_infos) / sizeof(g_func_infos[0]); i++) {
43 FuncInfo* fi = &g_func_infos[i];
44 bool ok = g_func_info_map->insert(make_pair(Intern(fi->name), fi)).second;
45 CHECK(ok);
46 }
47}
48
49void QuitFuncTable() {
50 delete g_func_info_map;
51}
52
53FuncInfo* GetFuncInfo(StringPiece name) {
54 auto found = g_func_info_map->find(name);
55 if (found == g_func_info_map->end())
56 return NULL;
57 return found->second;
58}