OSDN Git Service

modified child node execution way
[liveml/LiveML.git] / src / livemlrunner.cpp
index 9b8fb63..3ac1510 100644 (file)
@@ -90,11 +90,13 @@ namespace lmlCommand
 {
   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)
@@ -112,16 +114,17 @@ namespace lmlCommand
 
   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)
@@ -162,31 +165,22 @@ namespace lmlCommand
 
   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)
@@ -270,28 +264,9 @@ namespace lmlCommand
 
   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)
@@ -346,15 +321,13 @@ LiveMLRunner::~LiveMLRunner()
 
 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;
 }
@@ -392,8 +365,18 @@ LML_CMDRTN LiveMLRunner::runChildAction(LMLParameter& param)
   while (ca->tag != NULL)
   {
     calcu_decode_workarea((void*)&param);
+
+    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;