Shinichiro Hamaji | 776ca30 | 2015-06-06 03:52:48 +0900 | [diff] [blame] | 1 | #include "func.h" |
| 2 | |
| 3 | #include <stdio.h> |
| 4 | |
| 5 | #include <unordered_map> |
| 6 | |
Shinichiro Hamaji | 9619b36 | 2015-06-16 16:13:25 +0900 | [diff] [blame^] | 7 | #include "eval.h" |
Shinichiro Hamaji | 776ca30 | 2015-06-06 03:52:48 +0900 | [diff] [blame] | 8 | #include "log.h" |
| 9 | #include "strutil.h" |
| 10 | |
| 11 | namespace { |
| 12 | |
| 13 | void 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 Hamaji | 9619b36 | 2015-06-16 16:13:25 +0900 | [diff] [blame^] | 19 | void 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 | |
| 25 | void 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 Hamaji | 776ca30 | 2015-06-06 03:52:48 +0900 | [diff] [blame] | 30 | FuncInfo g_func_infos[] = { |
| 31 | { "info", &BuiltinInfoFunc, 1 }, |
Shinichiro Hamaji | 9619b36 | 2015-06-16 16:13:25 +0900 | [diff] [blame^] | 32 | { "warning", &BuiltinWarningFunc, 1 }, |
| 33 | { "error", &BuiltinErrorFunc, 1 }, |
Shinichiro Hamaji | 776ca30 | 2015-06-06 03:52:48 +0900 | [diff] [blame] | 34 | }; |
| 35 | |
| 36 | unordered_map<StringPiece, FuncInfo*>* g_func_info_map; |
| 37 | |
| 38 | } // namespace |
| 39 | |
| 40 | void 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 | |
| 49 | void QuitFuncTable() { |
| 50 | delete g_func_info_map; |
| 51 | } |
| 52 | |
| 53 | FuncInfo* 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 | } |