LML_CMDFUNC(action_close)
{
- DCODE(printf("action closed [%s]\n", param.getTag(0)->param.getString(0));)
- ActiveAction *aa = param.actionStack->current();
- if (param.getTag(0) == aa->action->tag)
- {
- param.obj->activeActionStack.close();
- }
+ DCODE(printf("\"%s\" action closed [address: %x]\n", param.getTag(0)->param.getString(0), param.actionStack->current());)
+ param.actionStack->close();
+ DCODE(printf("current address is %x[has: %d]\n", param.actionStack->current(), param.actionStack->has());)
return LML_CMDRTN_STOP | LML_CMDRTN_REACTION;
}
LML_CMDFUNC(event_close)
{
- DCODE(printf("event closed [%s]\n", param.getTag(0)->param.getString(0));)
- ActiveAction *aa = param.actionStack->current();
- if (param.getTag(0) == aa->action->tag)
- {
- param.obj->activeEventStack.close();
- }
+ DCODE(printf("\"%s\" event closed [address: %x]\n", param.getTag(0)->param.getString(0), param.actionStack->current());)
+ param.actionStack->close();
+ DCODE(printf("current address is %x[has: %d]\n", param.actionStack->current(), param.actionStack->has());)
return LML_CMDRTN_STOP | LML_CMDRTN_REACTION;
}
return param.actionStack->waitCounter ? LML_CMDRTN_STOP : LML_CMDRTN_NEXT;
}
+ LML_CMDFUNC(exit)
+ {
+ param.runner->dropActor(*param.obj);
+
+ return LML_CMDRTN_STOP;
+ }
+
LML_CMDFUNC(val)
{
variable_size id = *(variable_size*)param.get(0);
setMaxActors(1000); // unauthorised
text_decode_init(1024); // unauthorised
_commandFuncs.resize(parser->countTagType());
- _currentActor = NULL;
- _currentObject = NULL;
variable.numericList.allocator(&_numericVariableAllocator);
registerCommand("print", lmlCommand::print);
registerCommand("break", lmlCommand::rbreak);
// registerCommand("if", lmlCommand::rif);
registerCommand("wait", lmlCommand::wait);
+ registerCommand("exit", lmlCommand::exit);
registerCommand("val", lmlCommand::val);
registerCommand("callAction", lmlCommand::callAction);
registerCommand("callEvent", lmlCommand::callEvent);
LML_CMDRTN (*func)(LMLParameter&) = NULL;
TagType *rt = tag->type;
+ DCODE(printf("LiveMLRunner::runCommand()\n");)
// close a tag
if (rt == NULL)
{
rt = tag->param.getTag(0)->type;
func = _commandFuncs[rt->id].closeFunc;
- DCODE(printf("close tag: %s[%d]\n", rt->getName().c_str(), rt->id);)
}
else
{
- DCODE(printf("tag: %s[%d]\n", rt->getName().c_str(), rt->id);)
func = _commandFuncs[rt->id].func;
}
LML_CMDRTN result = LML_CMDRTN_NEXT;
if (func != NULL)
{
- DCODE(printf("execute command: %s\n", rt->getName().c_str());)
+ DCODE(
+ if (tag->type == NULL) printf("execute command: %s[close]\n", rt->getName().c_str());
+ else printf("execute command: %s\n", rt->getName().c_str());
+ )
param.param = &tag->param;
result = (*func)(param);
text_decode_clear();
- DCODE(printf("finish command: %s\n", rt->getName().c_str());)
+ DCODE(
+ if (tag->type == NULL) printf("finish command: %s[close]\n", rt->getName().c_str());
+ else printf("finish command: %s\n", rt->getName().c_str());
+ )
}
+ DCODE(else DCODE(printf("not execute command: %s[id: %d]\n", rt->getName().c_str(), rt->id);))
return result;
}
LML_CMDRTN LiveMLRunner::runAction(LMLParameter& param)
{
LML_CMDRTN result = LML_CMDRTN_NULL;
- ActiveAction &aa = *param.actionStack->current();
+ ActiveAction *aa = param.actionStack->current();
+
+ DCODE(printf("LiveMLRunner::runAction()\n");)
- while (aa.tag != NULL)
+ if (aa == NULL) return result;
+ while (aa->tag != NULL)
{
- result = runCommand(param, aa.tag);
+ result = runCommand(param, aa->tag);
- if (result & LML_CMDRTN_NEXT) aa.tag = list_next(aa.tag);
+ if (result & LML_CMDRTN_NEXT) aa->tag = list_next(aa->tag);
if (result & LML_CMDRTN_STOP) break;
}
obj.activeEventStack.clear();
if (!obj.setEvent(id)) return;
+ LMLParameter param(NULL, this, &obj, &(ActiveActionStack)obj.activeEventStack);
do
{
- LMLParameter param(NULL, this, &obj, &(ActiveActionStack)obj.activeEventStack);
LML_CMDRTN result = runAction(param);
if ((result & LML_CMDRTN_STOP) && !(result & LML_CMDRTN_REACTION)) break;
}
- while (obj.activeEventStack.has());
+ while (param.actionStack->has());
}
void LiveMLRunner::callEvent(event_type id)
bool LiveMLRunner::runActiveActions(LMLActorObject &obj)
{
- while (obj.activeActionStack.has())
+ LMLParameter param(NULL, this, &obj, &obj.activeActionStack);
+
+ while (param.actionStack->has())
{
- LMLParameter param(NULL, this, &obj, &obj.activeActionStack);
LML_CMDRTN result = runAction(param);
if ((result & LML_CMDRTN_STOP) && !(result & LML_CMDRTN_REACTION)) break;
}
- return obj.activeActionStack.has();
+ return param.actionStack->has();
}
bool LiveMLRunner::runObject(LMLActorObject &obj)
obj->setRepeatAllocator(&_repeatAllocator);
obj->setAction((action_type)0);
callEvent(*obj, (event_type)0);
- DCODE(printf("add actor: end\n");)
+ DCODE(printf("add actor: end[%d]\n", obj);)
return obj;
}
+void LiveMLRunner::dropActor(LMLActorObject &obj)
+{
+ DCODE(printf("LiveMLRunner::dropActor()\n");)
+ callEvent(obj, (event_type)1);
+ obj.release();
+ _actorList.remove(&obj);
+}
+
bool LiveMLRunner::run(void)
{
bool running = false;
+ DCODE(printf("LiveMLRunner::run()\n");)
+
LMLActorObject *actor = _actorList.front();
while (actor)
{
- DCODE(printf("execute actor: start\n");)
+ DCODE(printf("execute actor: start [%x]\n", actor);)
LMLActorObject *actorNext = list_next(actor);
running |= runObject((LMLActorObject&)*actor);
- if (actorNext == NULL) actorNext = list_next(actor);
+ if (NULL == actorNext)
+ {
+ if ((LMLActorObject*)_actorList.allocator()->get_free() == actor)
+ {
+ actor = list_prev(actor);
+ }
+ if (NULL != actor)
+ {
+ actorNext = list_next(actor);
+ }
+ }
+ DCODE(printf("execute actor: end [%x]\n", actor);)
actor = actorNext;
- DCODE(printf("execute actor: end\n");)
}
return running;
LMLActorObject* LiveMLRunner::createActor(size_t type)
{
- return _actorList.push_back();
+ LMLActorObject *obj;
+
+ switch (type)
+ {
+ case 0:
+ obj = _actorList.push_back();
+ break;
+ case 1:
+ obj = _actorList.front();
+ if (NULL != obj && obj->parser->tag->param.has(1) && 1 == *(size_t*)obj->parser->tag->param.get(1))
+ {
+ dropActor(*obj);
+ }
+ obj = _actorList.push_front();
+ break;
+ }
+
+ return obj;
}
LMLVariable* LMLParameter::getVariable(variable_size id)
void release(void)
{
variable.clear();
+ activeActionStack.clear();
+ activeEventStack.clear();
}
void setRepeatAllocator(list_allocator<unsigned int> *alloc)
bool setAction(ActionParser *action)
{
- DCODE(printf("LMLActorObject::setAction(ActionParser*) begin.\n");)
+ DCODE(printf("LMLActorObject::setAction(%x)\n", action);)
if (action == NULL) return false;
ActiveAction *aa = activeActionStack.add();
aa->action = action;
aa->variable.numericList.allocator(variable.numericList.allocator());
aa->tag = action->tag;
- DCODE(printf("LMLActorObject::setAction(ActionParser*) end.\n");)
return true;
}
bool setAction(action_type type)
{
- DCODE(printf("LMLActorObject::setAction(%d) begin.\n", type);)
+ DCODE(printf("LMLActorObject::setAction(%d)\n", type);)
ActionParser *action = parser->actionContainer[type];
if (action == NULL) return false;
setAction(action);
- DCODE(printf("LMLActorObject::setAction(%d) end.\n", type);)
return true;
}
bool setAction(const char *name)
bool setEvent(EventParser *event)
{
- DCODE(printf("LMLActorObject::setEvent(EventParser*) begin.\n");)
+ DCODE(printf("LMLActorObject::setEvent(%x)\n", event);)
if (event == NULL) return false;
ActiveAction *aa = activeEventStack.add();
aa->action = (ActionParser*)event;
aa->variable.numericList.allocator(variable.numericList.allocator());
aa->tag = event->tag;
- DCODE(printf("LMLActorObject::setEvent(EventParser*) end.\n");)
return true;
}
bool setEvent(event_type type)
{
- DCODE(printf("LMLActorObject::setEvent(%d) begin.\n", type);)
+ DCODE(printf("LMLActorObject::setEvent(%d)\n", type);)
EventParser *event = parser->eventContainer[type];
if (event == NULL) return false;
- DCODE(printf("LMLActorObject::setEvent(%d) end.\n", type);)
return setEvent(event);
}
};
list<LMLActorObject> _actorList;
- LMLActorObject *_currentActor;
- LMLActorObject *_currentObject;
vector<FuncPtr> _commandFuncs;
list_allocator<ActiveAction> _actionAllocator;
void setMaxActors(size_t);
LMLActorObject* addActor(const char*);
-
- void setCurrentActor(LMLActorObject *obj) { _currentActor = obj; }
- LMLActorObject* getCurrentActor(void) { return _currentActor; }
-
- void setCurrentObject(LMLActorObject *obj) { _currentObject = obj; }
- LMLActorObject* getCurrentObject(void) { return _currentObject; }
+ void dropActor(LMLActorObject&);
LML_CMDRTN runCommand(LMLParameter&, Tag*);
LML_CMDRTN runAction(LMLParameter&);