{
LML_CMDFUNC(action)
{
- ActiveAction *aa = param.action;
- ChildAction *ca = aa->current();
- ca->tag = (XMLElement*)ca->tag->child;
+ if (param.close)
+ {
+ param.action->current()->tag = NULL;
+ return LML_CMDRTN_NULL;
+ }
- return LML_CMDRTN_NULL;
+ return LML_CMDRTN_CHILD;
}
LML_CMDFUNC(endAction)
LML_CMDFUNC(event)
{
- if (!param.has(1) || param.get(1)->getInteger())
+ if (!param.close)
{
- ActiveAction *aa = param.action;
- ChildAction *ca = aa->current();
- ca->tag = (XMLElement*)ca->tag->child;
-
- return LML_CMDRTN_NULL;
+ if (!param.has(1) || param.get(1)->getInteger())
+ {
+ return LML_CMDRTN_CHILD;
+ }
}
- return LML_CMDRTN_NEXT;
+ param.action->current()->tag = NULL;
+
+ return LML_CMDRTN_NULL;
}
LML_CMDFUNC(print)
LML_CMDFUNC(repeat)
{
- ActiveAction *aa = param.action;
- ChildAction *ca = aa->current();
- XMLElement **resumeTag = ca->resumeTagStack.current();
-
- if (resumeTag == NULL || *resumeTag != ca->tag)
- {
- *param.action->repeatCounter.push_back() = 0;
- *ca->resumeTagStack.add() = ca->tag;
-
- return lmlCommand::repeat(param);
- }
+ if (!param.close) *param.action->repeatCounter.push_back() = 0;
unsigned int *counter = param.action->repeatCounter.back();
- if (param.has(0) && *counter >= param.get(0)->getInteger())
+
+ if (param.has(0))
{
- param.action->repeatCounter.remove(counter);
- ca->resumeTagStack.close();
+ if (*counter >= param.get(0)->getInteger())
+ {
+ param.action->repeatCounter.remove(counter);
- return LML_CMDRTN_NEXT;
+ return LML_CMDRTN_NEXT;
+ }
+ (*counter)++;
}
- ca->tag = (XMLElement*)ca->tag->child;
- if (param.has(0)) (*counter)++;
-
- return LML_CMDRTN_NULL;
+ return LML_CMDRTN_CHILD;
}
LML_CMDFUNC(rcontinue)
LML_CMDFUNC(rif)
{
- ActiveAction *aa = param.action;
- ChildAction *ca = aa->current();
- XMLElement **resumeTag = ca->resumeTagStack.current();
-
- if (NULL != resumeTag || *resumeTag == ca->tag)
- {
- ca->resumeTagStack.close();
-
- return LML_CMDRTN_NEXT;
- }
-
- if (param.get(0)->getInteger())
- {
- *ca->resumeTagStack.add() = ca->tag;
- ActiveAction *aa = param.action;
- ChildAction *ca = aa->current();
- ca->tag = (XMLElement*)ca->tag->child;
+ if (param.close) return LML_CMDRTN_NEXT;
- return LML_CMDRTN_NULL;
- }
-
- return LML_CMDRTN_NEXT;
+ return param.get(0)->getInteger() ? LML_CMDRTN_CHILD : LML_CMDRTN_NEXT;
}
LML_CMDFUNC(focus)
bool LiveMLRunner::registerCommand(
const char* name,
- LML_CMDRTN (*func)(LMLParameter&),
- LML_CMDRTN (*closeFunc)(LMLParameter&)
+ LML_CMDRTN (*func)(LMLParameter&)
)
{
tag_type id = parser->getTagTypeId(name);
if (id == UNameContainer<TagType>::NOTFOUND) return false;
_commandFuncs[id].func = func;
- _commandFuncs[id].closeFunc = closeFunc;
return true;
}
while (ca->tag != NULL)
{
calcu_decode_workarea((void*)¶m);
+
+ param.close = ca->resumeTagStack.current() != NULL;
+ if (param.close) param.close = ca->tag == *ca->resumeTagStack.current();
+ if (param.close) ca->resumeTagStack.close();
+
result = runCommand(param, ca->tag);
+ if (result & LML_CMDRTN_CHILD)
+ {
+ *ca->resumeTagStack.add() = ca->tag;
+ ca->tag = (XMLElement*)ca->tag->child;
+ }
if (result & LML_CMDRTN_NEXT)
{
ca->tag = (XMLElement*)ca->tag->next;
LML_CMDRTN_STOP = 0x01,
LML_CMDRTN_NEXT = 0x02,
LML_CMDRTN_REACTION = 0x04,
+ LML_CMDRTN_CHILD = 0x08
};
class LiveMLRunner;
LiveMLRunner *runner;
LMLActorObject *obj;
ActiveAction *action;
+ bool close;
LMLParameter(Parameter *param, LiveMLRunner *runner, LMLActorObject *obj, ActiveAction *action)
{
this->runner = runner;
this->obj = obj;
this->action = action;
+ this->close = false;
}
LMLVariable* getVariable(variable_size);
struct FuncPtr
{
LML_CMDRTN (*func)(LMLParameter&);
- LML_CMDRTN (*closeFunc)(LMLParameter&);
};
list<LMLActorObject> _actorList;
bool registerCommand(
const char*,
- LML_CMDRTN (*)(LMLParameter&),
- LML_CMDRTN (*)(LMLParameter&) = NULL
+ LML_CMDRTN (*)(LMLParameter&)
);
void setMaxActors(size_t);