func.cc revision 9619b36d9d833d7b3ba77b8100944cdc9cc85de0
1#include "func.h" 2 3#include <stdio.h> 4 5#include <unordered_map> 6 7#include "eval.h" 8#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 19void 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 30FuncInfo g_func_infos[] = { 31 { "info", &BuiltinInfoFunc, 1 }, 32 { "warning", &BuiltinWarningFunc, 1 }, 33 { "error", &BuiltinErrorFunc, 1 }, 34}; 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} 59