OSDN Git Service

added the exit tag
authornothan <nothan87@gmail.com>
Sat, 19 Feb 2011 18:19:26 +0000 (03:19 +0900)
committernothan <nothan87@gmail.com>
Sat, 19 Feb 2011 18:19:26 +0000 (03:19 +0900)
added the actor types(general/director)

src/list.hpp
src/livemlparser.cpp
src/livemlparser.h
src/livemlrunner.cpp
src/livemlrunner.h
test/test.cpp
test/test.xml

index d065e70..f3ebaa3 100644 (file)
@@ -108,6 +108,7 @@ public:
     list_item<T>* item = new(_free) list_item<T>;
     _free = _free->next;
     item->next = NULL;
+    item->prev = NULL;
     if (_free != NULL) _free->prev = NULL;
 
     return item;
index b9818da..f785b8d 100644 (file)
@@ -264,6 +264,9 @@ PARAM_ACTOR(registerParameterType(paramActor))
   po = reg->addParameter();
   po->set(0, PARAM_NUMERIC);
 
+  // exit
+  reg = addTagType("exit");
+
   // val
   reg = addTagType("val");
   po = reg->addParameter();
@@ -272,6 +275,7 @@ PARAM_ACTOR(registerParameterType(paramActor))
   po->set(1, PARAM_NUMERIC);
 
   registerEventType();
+  registerActorType();
 }
 
 void LiveMLParser::registerEventType(void)
@@ -279,3 +283,9 @@ void LiveMLParser::registerEventType(void)
   eventTypeContainer.add("init");
   eventTypeContainer.add("release");
 }
+
+void LiveMLParser::registerActorType(void)
+{
+  actorTypeContainer.add("general");
+  actorTypeContainer.add("director");
+}
index fdca460..3e43763 100644 (file)
@@ -196,6 +196,7 @@ public:
   static variable_size variableEncoder(const char*, void*);
 protected:
   void registerEventType(void);
+  void registerActorType(void);
 
   static PARAMFUNC(paramText);
   static PARAMFUNC(paramNumeric);
index ea4cfc9..c0e5406 100644 (file)
@@ -103,24 +103,18 @@ namespace lmlCommand
 
   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;
   }
@@ -192,6 +186,13 @@ namespace lmlCommand
     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);
@@ -263,8 +264,6 @@ LiveMLRunner::LiveMLRunner(LiveMLParser *p)
   setMaxActors(1000);  // unauthorised
   text_decode_init(1024); // unauthorised
   _commandFuncs.resize(parser->countTagType());
-  _currentActor = NULL;
-  _currentObject = NULL;
   variable.numericList.allocator(&_numericVariableAllocator);
 
   registerCommand("print", lmlCommand::print);
@@ -276,6 +275,7 @@ LiveMLRunner::LiveMLRunner(LiveMLParser *p)
   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);
@@ -307,28 +307,34 @@ LML_CMDRTN LiveMLRunner::runCommand(LMLParameter &param, Tag *tag)
   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;
 }
@@ -336,13 +342,16 @@ LML_CMDRTN LiveMLRunner::runCommand(LMLParameter &param, Tag *tag)
 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;
   }
 
@@ -359,14 +368,14 @@ void LiveMLRunner::callEvent(LMLActorObject &obj, event_type id)
   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)
@@ -382,15 +391,16 @@ 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)
@@ -417,24 +427,44 @@ LMLActorObject* LiveMLRunner::addActor(const char *name)
   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;
@@ -461,7 +491,24 @@ void LiveMLRunner::setMaxActors(size_t size)
 
 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)
index 471cdf0..2816de5 100644 (file)
@@ -198,6 +198,8 @@ public:
   void release(void)
   {
     variable.clear();
+    activeActionStack.clear();
+    activeEventStack.clear();
   }
 
   void setRepeatAllocator(list_allocator<unsigned int> *alloc)
@@ -213,25 +215,23 @@ public:
 
   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)
@@ -242,25 +242,23 @@ public:
 
   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);
   }
 
@@ -310,8 +308,6 @@ class LiveMLRunner
   };
 
   list<LMLActorObject> _actorList;
-  LMLActorObject *_currentActor;
-  LMLActorObject *_currentObject;
   vector<FuncPtr> _commandFuncs;
 
   list_allocator<ActiveAction> _actionAllocator;
@@ -334,12 +330,7 @@ public:
 
   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&);
index a0818e6..ce9b31b 100644 (file)
@@ -9,7 +9,6 @@ int main(int argc, char *argv[])
   LiveMLRunner runner(&parser);
 
   LMLActorObject *obj = runner.addActor("scene");
-  obj->setAction((action_type)0);
 
   while (runner.run()) sleep(1);
 
index 202fe5d..ee642ff 100644 (file)
@@ -1,14 +1,13 @@
 <?xml version="1.0" encoding="UTF-8"?>
 
 <liveml xmlns="http://t-denrai.net/common/liveml">
-  <actor name="scene">
+  <actor name="scene" type="director">
     <event type="init">
     </event>
     <!-- Local Actions -->
     <action name="1">
       <active val="g.ACTOR">actor</active>
-      <callAction target="$g.ACTOR">action2</callAction>
-      <callAction>g1</callAction>
+      <!-- <callAction target="$g.ACTOR">action2</callAction> -->
     </action>
     <action name="2">
       <print>call[scene.action2]</print>
       <print>call[release]</print>
     </event>
     <action name="action">
+      <exit/>
+      <!--
       <val name="a">10</val>
       <repeat count="$a">
         <print>roop[actor.action]</print>
         <wait>1</wait>
       </repeat>
-      <callEvent>release</callEvent>
+      -->
     </action>
     <action name="action2">
       <print>call[actor.action2]</print>