3 #include "util_check.h"
5 #include "util_string.h"
7 #include "motorconst.h"
9 #include <boost/ptr_container/ptr_vector.hpp>
10 #include <boost/unordered_map.hpp>
12 void MlPool::setStartTime () {
14 limittime = starttime + cDEFAULTTIMELIMIT;
17 bool MlPool::qtimeup (std::ostream* log) {
18 if (now () > limittime) {
26 void MlPool::inclIncCount () {
27 if (includeCount == kIncludeMax)
28 throw (uErrorInclNest);
32 bool MlPool::inclIncCount_nothrow () {
33 if (includeCount == kIncludeMax)
39 void MlPool::declIncCount () {
40 assert (includeCount > 0);
44 bool MlEnv::searchMTable (const ustring& name, FTableVal*& ans) {
48 if (mlFTable->mtable && (it = mlFTable->mtable->find (name)) != mlFTable->mtable->end ()) {
50 for (i = mlFTable->mstack.size () - 1; i >= 0; i --) {
51 if (mlFTable->mstack[i].mfunc->mlid == ans->mlid) {
53 throw (name + ": forbidden.");
62 bool MlEnv::searchSTable (const ustring& name, FTableVal*& ans, MLFunc*& mobj) {
64 MlFTable::MStackVal* t;
67 for (i = mlFTable->mstack.size () - 1; i >= 0; i --) {
68 t = &mlFTable->mstack[i];
69 if (t->mobj && t->mfunc->stable && (it = t->mfunc->stable->find (name)) != t->mfunc->stable->end ()) {
79 bool MlEnv::searchFTable (const ustring& name, FTableVal*& ans) {
82 if (mlFTable->ftable && (it = mlFTable->ftable->find (name)) != mlFTable->ftable->end ()) {
90 bool MlEnv::validName (const ustring& name) {
92 static uregex re_var (rMOTORVAR);
94 return (regex_match (name, m, re_var));
97 void MlEnv::setGlobalAry (const ustring& name, size_t i, MNode* val) {
100 a.append (to_ustring (i));
101 mlPool->globalVar.setVar (a, val);
107 void MlEnv::setGlobalArySize (const ustring& name, size_t n) {
110 a.append (CharConst ("_n"));
111 val = newMNode_num (n);
112 mlPool->globalVar.setVar (a, val);
118 void MlEnv::setLocalAry (MotorVar* pool, const ustring& name, size_t i, MNode* val) {
121 a.append (to_ustring (i));
122 pool->setVar (a, val);
124 logSetVar (a, val, true);
128 void MlEnv::setLocalArySize (MotorVar* pool, const ustring& name, size_t n) {
131 a.append (CharConst ("_n"));
132 val = newMNode_num (n);
133 pool->setVar (a, val);
135 logSetVar (a, val, true);
139 MNode* MlEnv::getGlobalAry (const ustring& name, size_t i) {
142 a.append (to_ustring (i));
143 return mlPool->globalVar.getVar (a);
146 size_t MlEnv::getGlobalArySize (const ustring& name) {
149 a.append (CharConst ("_n"));
150 v = mlPool->globalVar.getVar (a);
151 if (v && v->isReal ()) {
152 return (size_t)v->real;
158 MNode* MlEnv::getLocalAry (MotorVar* pool, const ustring& name, size_t i) {
161 a.append (to_ustring (i));
162 return pool->getVar (a);
165 size_t MlEnv::getLocalArySize (MotorVar* pool, const ustring& name) {
169 a.append (CharConst ("_n"));
170 v = pool->getVar (a);
171 if (v && v->isReal ()) {
172 return (size_t)v->real;
178 void MlEnv::setVar (const ustring& name, MNode* val) {
181 if (validName (name)) {
182 pool = findLocal (name);
184 pool->setVar (name, val);
186 logSetVar (name, val, true);
189 mlPool->globalVar.setVar (name, val);
191 logSetVar (name, val);
198 logSetVarError (name, val);
203 void MlEnv::setVar_nolog (const ustring& name, MNode* val) {
206 if (validName (name)) {
207 pool = findLocal (name);
209 pool->setVar (name, val);
211 mlPool->globalVar.setVar (name, val);
217 logSetVarError (name, val);
222 void MlEnv::setVar2 (const ustring& name, MNode* val) {
225 if (checkAry (name, sym)) {
232 void MlEnv::setAry (const ustring& name, size_t i, MNode* val) {
235 if (validName (name) && i >= 0) {
236 pool = findLocal (name);
238 setLocalAry (pool, name, i, val);
240 setGlobalAry (name, i, val);
246 logSetAryError (name, i, val);
251 void MlEnv::setArySize (const ustring& name, size_t n) {
254 if (validName (name)) {
255 pool = findLocal (name);
257 setLocalArySize (pool, name, n);
259 setGlobalArySize (name, n);
262 throw (padEmpty (name) + uErrorBadName);
264 // logSetArySizeError (name, n);
269 void MlEnv::setAry (const ustring& name, MNode* list) {
273 if (validName (name)) {
274 pool = findLocal (name);
277 } else if (list->isCons ()) {
278 while (list && list->isCons ()) {
280 setLocalAry (pool, name, n, list->car ());
283 } else if (list->isVector ()) {
284 MotorVector::iterator b = list->vector->begin ();
285 MotorVector::iterator e = list->vector->end ();
286 for (; b < e; ++ b) {
288 setLocalAry (pool, name, n, (*b) ());
291 throw (ustring (CharConst ("setting a scalar value to an array.")));
293 setLocalArySize (pool, name, n);
296 } else if (list->isCons ()) {
297 while (list && list->isCons ()) {
299 setGlobalAry (name, n, list->car ());
302 } else if (list->isVector ()) {
303 MotorVector::iterator b = list->vector->begin ();
304 MotorVector::iterator e = list->vector->end ();
305 for (; b < e; ++ b) {
307 setGlobalAry (name, n, (*b) ());
310 throw (ustring (CharConst ("setting a scalar value to an array.")));
312 setGlobalArySize (name, n);
315 throw (padEmpty (name) + uErrorBadName);
317 // logSetVarError (name, NULL);
322 MNode* MlEnv::getVar (const ustring& name) {
325 if (validName (name)) {
326 pool = findLocal (name);
328 return (pool->getVar (name));
330 return (mlPool->globalVar.getVar (name));
333 throw (padEmpty (name) + uErrorBadName);
338 ustring MlEnv::getVar_string (const ustring& name) {
339 MNode* v = getVar (name);
341 return v->to_string ();
346 MNode* MlEnv::getAry (const ustring& name, size_t i) {
349 if (validName (name)) {
351 pool = findLocal (name);
353 return getLocalAry (pool, name, i);
355 return getGlobalAry (name, i);
359 throw (padEmpty (name) + uErrorBadName);
364 ustring MlEnv::getAry_string (const ustring& name, size_t i) {
365 MNode* v = getAry (name, i);
367 return v->to_string ();
372 size_t MlEnv::getArySize (const ustring& name) {
375 if (validName (name)) {
376 pool = findLocal (name);
378 return getLocalArySize (pool, name);
380 return getGlobalArySize (name);
383 throw (padEmpty (name) + uErrorBadName);
388 void MlEnv::beginLocal () {
389 MotorVar* v = new MotorVar;
390 mlPool->localVar.push_back (v);
393 void MlEnv::setLocalVar (const ustring& name, MNode* val) {
394 MotorVar* pool = &mlPool->localVar.back ();
395 if (validName (name)) {
396 pool->setVar (name, val);
398 logSetVar (name, val, true);
404 logSetVarError (name, val);
409 void MlEnv::defineLocalVar (const ustring& name) {
410 MotorVar* pool = &mlPool->localVar.back ();
411 if (validName (name)) {
412 pool->setVar (name, NULL);
416 void MlEnv::endLocal () {
417 mlPool->localVar.pop_back ();
420 MotorVar* MlEnv::findLocal (const ustring& name) {
421 boost::ptr_vector<MotorVar>::reverse_iterator t;
422 MotorVar::iterator it;
424 for (t = mlPool->localVar.rbegin (); t != mlPool->localVar.rend (); t ++) {
426 if (it != t->end ()) {
434 void MlEnv::logSetVar (const ustring& name, MNode* val, bool flocal) {
435 if (! log || mlPool->nolog)
440 *log << name << " <= ";
442 *log << val->dump_string_short ();
448 void MlEnv::logSetVarError (const ustring& name, MNode* val) {
452 *log << name << " <= ";
454 *log << val->dump_string_short ();
458 void MlEnv::logSetAryError (const ustring& name, size_t i, MNode* val) {
461 *log << " error: [" << name << uUScore << i << " <= ";
463 *log << val->dump_string_short ();
467 void MlEnv::logSetArySizeError (const ustring& name, size_t n) {
470 *log << " [" << name << "_n" << " <= " << n << "]\n";
474 void MlEnv::push_linenum (MNode* c, int ln) {
475 mlPool->linenum.insert (std::pair<MNode*, int> (c, ln));
478 void MlEnv::logLinenum (MNode* c) {
479 boost::unordered_map<MNode*, int>::iterator i;
481 i = mlPool->linenum.find (c);
482 if (i == mlPool->linenum.end ()) {
485 *log << i->second << ": ";
489 void MlEnv::logSexp (MNode* c) {
492 if (!mlPool->nolog && log && c && c->isCons ()) {
493 for (i = 0; i < mlPool->includeCount; i ++)
496 // *log << c->dump_string_short () << "\n";
497 if (c->car () && c->car ()->isSym ()
498 && (match (*c->car ()->sym, CharConst ("defun")) || matchHead (*c->car ()->sym, CharConst ("defun-")))
499 && c->cdr () && c->cdr ()->isCons ()
500 && c->cdr ()->cdr () && c->cdr ()->cdr ()->isCons ()) {
501 *log << "(" << c->car ()->dump_string ();
502 if (c->cdr ()->car ()) {
503 *log << " " << c->cdr ()->car ()->dump_string ();
507 if (c->cdr ()->cdr ()->car ()) {
508 *log << " " << c->cdr ()->cdr ()->car ()->dump_string () << " ...\n";
513 *log << c->dump_string_short () << "\n";
518 void MlEnv::setMStack (MLFunc* mobj) {
519 MlFTable::MStackVal* t = &mlFTable->mstack.back ();
521 assert (t->mobj == NULL);
525 void MlEnv::execDatastoreFunc () {
528 for (i = 0; i < datastoreFuncStack.size (); i ++) {
529 datastoreFuncStack[i].second (datastoreFuncStack[i].first);