blob: e9fa0d7d6a9f39488c7013e23d63e1e2250ec1f4 [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
Shinichiro Hamaji2e6cbfc2015-06-16 18:46:50 +090013void PatsubstFunc(const vector<Value*>& args, Evaluator* ev, string* s) {
14 shared_ptr<string> pat = args[0]->Eval(ev);
15 shared_ptr<string> repl = args[1]->Eval(ev);
16 shared_ptr<string> str = args[2]->Eval(ev);
Shinichiro Hamaji37591ce2015-06-16 19:36:05 +090017 WordWriter ww(s);
Shinichiro Hamaji2e6cbfc2015-06-16 18:46:50 +090018 for (StringPiece tok : WordScanner(*str)) {
Shinichiro Hamaji37591ce2015-06-16 19:36:05 +090019 ww.MaybeAddWhitespace();
Shinichiro Hamaji2e6cbfc2015-06-16 18:46:50 +090020 AppendSubstPattern(tok, *pat, *repl, s);
21 }
Shinichiro Hamaji4f22f5c2015-06-16 16:28:25 +090022}
23
Shinichiro Hamaji37591ce2015-06-16 19:36:05 +090024void StripFunc(const vector<Value*>& args, Evaluator* ev, string* s) {
25 shared_ptr<string> str = args[0]->Eval(ev);
26 WordWriter ww(s);
27 for (StringPiece tok : WordScanner(*str)) {
28 ww.Write(tok);
29 }
Shinichiro Hamaji4f22f5c2015-06-16 16:28:25 +090030}
31
Shinichiro Hamaji37591ce2015-06-16 19:36:05 +090032void SubstFunc(const vector<Value*>& args, Evaluator* ev, string* s) {
33 shared_ptr<string> pat = args[0]->Eval(ev);
34 shared_ptr<string> repl = args[1]->Eval(ev);
35 shared_ptr<string> str = args[2]->Eval(ev);
36 size_t index = 0;
37 while (index < str->size()) {
38 size_t found = str->find(*pat, index);
39 if (found == string::npos)
40 break;
41 AppendString(StringPiece(*str).substr(index, found - index), s);
42 AppendString(*repl, s);
43 index = found + pat->size();
44 }
45 AppendString(StringPiece(*str).substr(index), s);
Shinichiro Hamaji4f22f5c2015-06-16 16:28:25 +090046}
47
Shinichiro Hamaji2e6cbfc2015-06-16 18:46:50 +090048void FindstringFunc(const vector<Value*>&, Evaluator*, string*) {
Shinichiro Hamaji4f22f5c2015-06-16 16:28:25 +090049 printf("TODO(findstring)");
50}
51
Shinichiro Hamaji2e6cbfc2015-06-16 18:46:50 +090052void FilterFunc(const vector<Value*>&, Evaluator*, string*) {
Shinichiro Hamaji4f22f5c2015-06-16 16:28:25 +090053 printf("TODO(filter)");
54}
55
Shinichiro Hamaji2e6cbfc2015-06-16 18:46:50 +090056void FilterOutFunc(const vector<Value*>&, Evaluator*, string*) {
Shinichiro Hamaji4f22f5c2015-06-16 16:28:25 +090057 printf("TODO(filter-out)");
58}
59
Shinichiro Hamaji2e6cbfc2015-06-16 18:46:50 +090060void SortFunc(const vector<Value*>&, Evaluator*, string*) {
Shinichiro Hamaji4f22f5c2015-06-16 16:28:25 +090061 printf("TODO(sort)");
62}
63
Shinichiro Hamaji2e6cbfc2015-06-16 18:46:50 +090064void WordFunc(const vector<Value*>&, Evaluator*, string*) {
Shinichiro Hamaji4f22f5c2015-06-16 16:28:25 +090065 printf("TODO(word)");
66}
67
Shinichiro Hamaji2e6cbfc2015-06-16 18:46:50 +090068void WordlistFunc(const vector<Value*>&, Evaluator*, string*) {
Shinichiro Hamaji4f22f5c2015-06-16 16:28:25 +090069 printf("TODO(wordlist)");
70}
71
Shinichiro Hamaji2e6cbfc2015-06-16 18:46:50 +090072void WordsFunc(const vector<Value*>&, Evaluator*, string*) {
Shinichiro Hamaji4f22f5c2015-06-16 16:28:25 +090073 printf("TODO(words)");
74}
75
Shinichiro Hamaji2e6cbfc2015-06-16 18:46:50 +090076void FirstwordFunc(const vector<Value*>&, Evaluator*, string*) {
Shinichiro Hamaji4f22f5c2015-06-16 16:28:25 +090077 printf("TODO(firstword)");
78}
79
Shinichiro Hamaji2e6cbfc2015-06-16 18:46:50 +090080void LastwordFunc(const vector<Value*>&, Evaluator*, string*) {
Shinichiro Hamaji4f22f5c2015-06-16 16:28:25 +090081 printf("TODO(lastword)");
82}
83
Shinichiro Hamaji2e6cbfc2015-06-16 18:46:50 +090084void JoinFunc(const vector<Value*>&, Evaluator*, string*) {
Shinichiro Hamaji4f22f5c2015-06-16 16:28:25 +090085 printf("TODO(join)");
86}
87
Shinichiro Hamaji2e6cbfc2015-06-16 18:46:50 +090088void WildcardFunc(const vector<Value*>&, Evaluator*, string*) {
Shinichiro Hamaji4f22f5c2015-06-16 16:28:25 +090089 printf("TODO(wildcard)");
90}
91
Shinichiro Hamaji2e6cbfc2015-06-16 18:46:50 +090092void DirFunc(const vector<Value*>&, Evaluator*, string*) {
Shinichiro Hamaji4f22f5c2015-06-16 16:28:25 +090093 printf("TODO(dir)");
94}
95
Shinichiro Hamaji2e6cbfc2015-06-16 18:46:50 +090096void NotdirFunc(const vector<Value*>&, Evaluator*, string*) {
Shinichiro Hamaji4f22f5c2015-06-16 16:28:25 +090097 printf("TODO(notdir)");
98}
99
Shinichiro Hamaji2e6cbfc2015-06-16 18:46:50 +0900100void SuffixFunc(const vector<Value*>&, Evaluator*, string*) {
Shinichiro Hamaji4f22f5c2015-06-16 16:28:25 +0900101 printf("TODO(suffix)");
102}
103
Shinichiro Hamaji2e6cbfc2015-06-16 18:46:50 +0900104void BasenameFunc(const vector<Value*>&, Evaluator*, string*) {
Shinichiro Hamaji4f22f5c2015-06-16 16:28:25 +0900105 printf("TODO(basename)");
106}
107
Shinichiro Hamaji2e6cbfc2015-06-16 18:46:50 +0900108void AddsuffixFunc(const vector<Value*>&, Evaluator*, string*) {
Shinichiro Hamaji4f22f5c2015-06-16 16:28:25 +0900109 printf("TODO(addsuffix)");
110}
111
Shinichiro Hamaji2e6cbfc2015-06-16 18:46:50 +0900112void AddprefixFunc(const vector<Value*>&, Evaluator*, string*) {
Shinichiro Hamaji4f22f5c2015-06-16 16:28:25 +0900113 printf("TODO(addprefix)");
114}
115
Shinichiro Hamaji2e6cbfc2015-06-16 18:46:50 +0900116void RealpathFunc(const vector<Value*>&, Evaluator*, string*) {
Shinichiro Hamaji4f22f5c2015-06-16 16:28:25 +0900117 printf("TODO(realpath)");
118}
119
Shinichiro Hamaji2e6cbfc2015-06-16 18:46:50 +0900120void AbspathFunc(const vector<Value*>&, Evaluator*, string*) {
Shinichiro Hamaji4f22f5c2015-06-16 16:28:25 +0900121 printf("TODO(abspath)");
122}
123
Shinichiro Hamaji2e6cbfc2015-06-16 18:46:50 +0900124void IfFunc(const vector<Value*>&, Evaluator*, string*) {
Shinichiro Hamaji4f22f5c2015-06-16 16:28:25 +0900125 printf("TODO(if)");
126}
127
Shinichiro Hamaji2e6cbfc2015-06-16 18:46:50 +0900128void AndFunc(const vector<Value*>&, Evaluator*, string*) {
Shinichiro Hamaji4f22f5c2015-06-16 16:28:25 +0900129 printf("TODO(and)");
130}
131
Shinichiro Hamaji2e6cbfc2015-06-16 18:46:50 +0900132void OrFunc(const vector<Value*>&, Evaluator*, string*) {
Shinichiro Hamaji4f22f5c2015-06-16 16:28:25 +0900133 printf("TODO(or)");
134}
135
Shinichiro Hamaji2e6cbfc2015-06-16 18:46:50 +0900136void ValueFunc(const vector<Value*>&, Evaluator*, string*) {
Shinichiro Hamaji4f22f5c2015-06-16 16:28:25 +0900137 printf("TODO(value)");
138}
139
Shinichiro Hamaji2e6cbfc2015-06-16 18:46:50 +0900140void EvalFunc(const vector<Value*>&, Evaluator*, string*) {
Shinichiro Hamaji4f22f5c2015-06-16 16:28:25 +0900141 printf("TODO(eval)");
142}
143
Shinichiro Hamaji2e6cbfc2015-06-16 18:46:50 +0900144void ShellFunc(const vector<Value*>&, Evaluator*, string*) {
Shinichiro Hamaji4f22f5c2015-06-16 16:28:25 +0900145 printf("TODO(shell)");
146}
147
Shinichiro Hamaji2e6cbfc2015-06-16 18:46:50 +0900148void CallFunc(const vector<Value*>&, Evaluator*, string*) {
Shinichiro Hamaji4f22f5c2015-06-16 16:28:25 +0900149 printf("TODO(call)");
150}
151
Shinichiro Hamaji2e6cbfc2015-06-16 18:46:50 +0900152void ForeachFunc(const vector<Value*>&, Evaluator*, string*) {
Shinichiro Hamaji4f22f5c2015-06-16 16:28:25 +0900153 printf("TODO(foreach)");
154}
155
Shinichiro Hamaji2e6cbfc2015-06-16 18:46:50 +0900156void OriginFunc(const vector<Value*>&, Evaluator*, string*) {
Shinichiro Hamaji4f22f5c2015-06-16 16:28:25 +0900157 printf("TODO(origin)");
158}
159
Shinichiro Hamaji2e6cbfc2015-06-16 18:46:50 +0900160void FlavorFunc(const vector<Value*>&, Evaluator*, string*) {
Shinichiro Hamaji4f22f5c2015-06-16 16:28:25 +0900161 printf("TODO(flavor)");
162}
163
Shinichiro Hamaji2e6cbfc2015-06-16 18:46:50 +0900164void InfoFunc(const vector<Value*>& args, Evaluator* ev, string*) {
Shinichiro Hamaji776ca302015-06-06 03:52:48 +0900165 shared_ptr<string> a = args[0]->Eval(ev);
166 printf("%s\n", a->c_str());
167 fflush(stdout);
168}
169
Shinichiro Hamaji2e6cbfc2015-06-16 18:46:50 +0900170void WarningFunc(const vector<Value*>& args, Evaluator* ev, string*) {
Shinichiro Hamaji9619b362015-06-16 16:13:25 +0900171 shared_ptr<string> a = args[0]->Eval(ev);
Shinichiro Hamaji8ee8c372015-06-16 16:19:40 +0900172 printf("%s:%d: %s\n", LOCF(ev->loc()), a->c_str());
Shinichiro Hamaji9619b362015-06-16 16:13:25 +0900173 fflush(stdout);
174}
175
Shinichiro Hamaji2e6cbfc2015-06-16 18:46:50 +0900176void ErrorFunc(const vector<Value*>& args, Evaluator* ev, string*) {
Shinichiro Hamaji9619b362015-06-16 16:13:25 +0900177 shared_ptr<string> a = args[0]->Eval(ev);
178 ev->Error(StringPrintf("*** %s.", a->c_str()));
179}
180
Shinichiro Hamaji776ca302015-06-06 03:52:48 +0900181FuncInfo g_func_infos[] = {
Shinichiro Hamaji2e6cbfc2015-06-16 18:46:50 +0900182 { "patsubst", &PatsubstFunc, 3 },
183 { "strip", &StripFunc, 1 },
184 { "subst", &SubstFunc, 3 },
185 { "findstring", &FindstringFunc, 2 },
186 { "filter", &FilterFunc, 2 },
187 { "filter-out", &FilterOutFunc, 2 },
188 { "sort", &SortFunc, 1 },
189 { "word", &WordFunc, 2 },
190 { "wordlist", &WordlistFunc, 3 },
191 { "words", &WordsFunc, 1 },
192 { "firstword", &FirstwordFunc, 1 },
193 { "lastword", &LastwordFunc, 1 },
194 { "join", &JoinFunc, 2 },
195
196 { "wildcard", &WildcardFunc, 1 },
197 { "dir", &DirFunc, 1 },
198 { "notdir", &NotdirFunc, 1 },
199 { "suffix", &SuffixFunc, 1 },
200 { "basename", &BasenameFunc, 1 },
201 { "addsuffix", &AddsuffixFunc, 1 },
202 { "addprefix", &AddprefixFunc, 1 },
203 { "realpath", &RealpathFunc, 1 },
204 { "abspath", &AbspathFunc, 1 },
205 { "if", &IfFunc, 1 },
206 { "and", &AndFunc, 1 },
207 { "or", &OrFunc, 1 },
208 { "value", &ValueFunc, 1 },
209 { "eval", &EvalFunc, 1 },
210 { "shell", &ShellFunc, 1 },
211 { "call", &CallFunc, 1 },
212 { "foreach", &ForeachFunc, 1 },
213 { "origin", &OriginFunc, 1 },
214 { "flavor", &FlavorFunc, 1 },
215 { "info", &InfoFunc, 1 },
216 { "warning", &WarningFunc, 1 },
217 { "error", &ErrorFunc, 1 },
Shinichiro Hamaji776ca302015-06-06 03:52:48 +0900218};
219
220unordered_map<StringPiece, FuncInfo*>* g_func_info_map;
221
222} // namespace
223
224void InitFuncTable() {
225 g_func_info_map = new unordered_map<StringPiece, FuncInfo*>;
226 for (size_t i = 0; i < sizeof(g_func_infos) / sizeof(g_func_infos[0]); i++) {
227 FuncInfo* fi = &g_func_infos[i];
228 bool ok = g_func_info_map->insert(make_pair(Intern(fi->name), fi)).second;
229 CHECK(ok);
230 }
231}
232
233void QuitFuncTable() {
234 delete g_func_info_map;
235}
236
237FuncInfo* GetFuncInfo(StringPiece name) {
238 auto found = g_func_info_map->find(name);
239 if (found == g_func_info_map->end())
240 return NULL;
241 return found->second;
242}