OSDN Git Service

modified child node execution way master
authornothan <nothan87@gmail.com>
Wed, 30 Mar 2011 17:37:42 +0000 (02:37 +0900)
committernothan <nothan87@gmail.com>
Wed, 30 Mar 2011 17:37:42 +0000 (02:37 +0900)
src/livemlrunner.cpp
src/livemlrunner.h

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;
index e46d10f..cbe81b2 100644 (file)
@@ -42,6 +42,7 @@ enum
   LML_CMDRTN_STOP = 0x01,
   LML_CMDRTN_NEXT = 0x02,
   LML_CMDRTN_REACTION = 0x04,
+  LML_CMDRTN_CHILD = 0x08
 };
 
 class LiveMLRunner;
@@ -399,6 +400,7 @@ public:
   LiveMLRunner *runner;
   LMLActorObject *obj;
   ActiveAction *action;
+  bool close;
 
   LMLParameter(Parameter *param, LiveMLRunner *runner, LMLActorObject *obj, ActiveAction *action)
   {
@@ -406,6 +408,7 @@ public:
     this->runner = runner;
     this->obj = obj;
     this->action = action;
+    this->close = false;
   }
 
   LMLVariable* getVariable(variable_size);
@@ -419,7 +422,6 @@ class LiveMLRunner
   struct FuncPtr
   {
     LML_CMDRTN (*func)(LMLParameter&);
-    LML_CMDRTN (*closeFunc)(LMLParameter&);
   };
 
   list<LMLActorObject> _actorList;
@@ -443,8 +445,7 @@ public:
 
   bool registerCommand(
     const char*,
-    LML_CMDRTN (*)(LMLParameter&),
-    LML_CMDRTN (*)(LMLParameter&) = NULL
+    LML_CMDRTN (*)(LMLParameter&)
   );
 
   void setMaxActors(size_t);