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)) {
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)) {
350 pool = findLocal (name);
352 return getLocalAry (pool, name, i);
354 return getGlobalAry (name, i);
357 throw (padEmpty (name) + uErrorBadName);
362 ustring MlEnv::getAry_string (const ustring& name, size_t i) {
363 MNode* v = getAry (name, i);
365 return v->to_string ();
370 size_t MlEnv::getArySize (const ustring& name) {
373 if (validName (name)) {
374 pool = findLocal (name);
376 return getLocalArySize (pool, name);
378 return getGlobalArySize (name);
381 throw (padEmpty (name) + uErrorBadName);
386 void MlEnv::beginLocal () {
387 MotorVar* v = new MotorVar;
388 mlPool->localVar.push_back (v);
391 void MlEnv::setLocalVar (const ustring& name, MNode* val) {
392 MotorVar* pool = &mlPool->localVar.back ();
393 if (validName (name)) {
394 pool->setVar (name, val);
396 logSetVar (name, val, true);
402 logSetVarError (name, val);
407 void MlEnv::defineLocalVar (const ustring& name) {
408 MotorVar* pool = &mlPool->localVar.back ();
409 if (validName (name)) {
410 pool->setVar (name, NULL);
414 void MlEnv::endLocal () {
415 mlPool->localVar.pop_back ();
418 MotorVar* MlEnv::findLocal (const ustring& name) {
419 boost::ptr_vector<MotorVar>::reverse_iterator t;
420 MotorVar::iterator it;
422 for (t = mlPool->localVar.rbegin (); t != mlPool->localVar.rend (); t ++) {
424 if (it != t->end ()) {
432 void MlEnv::logSetVar (const ustring& name, MNode* val, bool flocal) {
433 if (! log || mlPool->nolog)
438 *log << name << " <= ";
440 *log << val->dump_string_short ();
446 void MlEnv::logSetVarError (const ustring& name, MNode* val) {
450 *log << name << " <= ";
452 *log << val->dump_string_short ();
456 void MlEnv::logSetAryError (const ustring& name, size_t i, MNode* val) {
459 *log << " error: [" << name << uUScore << i << " <= ";
461 *log << val->dump_string_short ();
465 void MlEnv::logSetArySizeError (const ustring& name, size_t n) {
468 *log << " [" << name << "_n" << " <= " << n << "]\n";
472 void MlEnv::push_linenum (MNode* c, int ln) {
473 mlPool->linenum.insert (std::pair<MNode*, int> (c, ln));
476 void MlEnv::logLinenum (MNode* c) {
477 boost::unordered_map<MNode*, int>::iterator i;
479 i = mlPool->linenum.find (c);
480 if (i == mlPool->linenum.end ()) {
483 *log << i->second << ": ";
487 void MlEnv::logSexp (MNode* c) {
490 if (!mlPool->nolog && log && c && c->isCons ()) {
491 for (i = 0; i < mlPool->includeCount; i ++)
494 if (c->car () && c->car ()->isSym ()
495 && (match (*ptr_symbol (c->car ()), CharConst ("defun")) || matchHead (*ptr_symbol (c->car ()), CharConst ("defun-")))
496 && c->cdr () && c->cdr ()->isCons ()
497 && c->cdr ()->cdr () && c->cdr ()->cdr ()->isCons ()) {
498 *log << "(" << c->car ()->dump_string ();
499 if (c->cdr ()->car ()) {
500 *log << " " << c->cdr ()->car ()->dump_string ();
504 if (c->cdr ()->cdr ()->car ()) {
505 *log << " " << c->cdr ()->cdr ()->car ()->dump_string () << " ...\n";
510 *log << c->dump_string_short () << "\n";
515 void MlEnv::setMStack (MLFunc* mobj) {
516 MlFTable::MStackVal* t = &mlFTable->mstack.back ();
518 assert (t->mobj == NULL);
522 void MlEnv::execDatastoreFunc () {
525 for (i = 0; i < datastoreFuncStack.size (); i ++) {
526 datastoreFuncStack[i].second (datastoreFuncStack[i].first);