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