Beispiel #1
0
   //
   // ::virtual_makeObjects
   //
   virtual void virtual_makeObjects(ObjectVector *objects, VariableData *dst)
   {
      VariableType::Reference type = getType();
      bigsint                 size = type->getSize(pos);
      VariableType::BasicType bt   = type->getBasicType();
      VariableData::Pointer   src  = expr->getData();
      VariableData::Pointer   data = VariableData::create_stack(size);
      VariableData::Pointer   tmp  = VariableData::
         create_stack(src->type == VariableData::MT_FARPTR ? 2 : 1);

      if (dst->type != VariableData::MT_VOID)
         make_objects_memcpy_prep(objects, dst, data, pos);

      if(bt == VariableType::BT_INT_L || bt == VariableType::BT_INT_LL ||
         bt == VariableType::BT_UNS_L || bt == VariableType::BT_UNS_LL)
      {
         doL(objects, dst, src, tmp);
      }
      else if (VariableType::IsTypeInteger(bt))
      {
         doI(objects, dst, src, tmp);
      }
      else if (bt == VariableType::BT_PTR)
      {
         bigsint value = type->getReturn()->getSize(pos);
         if(type->getSize(pos) == 1)
         {
            if(value == 1)
               doP(objects, dst, src, tmp, NULL);
            else
               doP(objects, dst, src, tmp, objects->getValue(value));
         }
         else
         {
            if(value == 1)
               doPF(objects, dst, src, tmp, NULL);
            else
               doPF(objects, dst, src, tmp, objects->getValue(value));
         }
      }
      else if (VariableType::IsTypeFixed(bt))
      {
         doX(objects, dst, src, tmp);
      }
      else
         Error_NP("invalid BT");

      if (dst->type != VariableData::MT_VOID)
         make_objects_memcpy_post(objects, dst, data, type, context, pos);
   }
bool SceneLoader::doG(istream &str, string &name)
{
    name = getString(str);
    if (name.empty()) {
        *err << "Couldn't read group name at ";
        errLine(str.tellg());
        return false;
    }

    if (groups[name] != NULL)
    {
        *err << "Illegal re-use of group name \"" << name << "\" at ";
        curPos(*err,str.tellg());
        *err << endl;
        return false;
    }

    SceneGroup *n = new SceneGroup();
    groups[name] = n;
    n->_name = name;

    do {
        int state = findOpenOrClosedParen(str);
        if (state == ERROR)
            return false;
        else if (state == CLOSED)
            return true;
        else if (state == OPEN)
        {
            string cmd;
            if (readCommand(str, cmd)) {
                if (cmd != "I")
                {
                    *err << "Command other than I from G at ";
                    curPos(*err,str.tellg());
                    *err << endl;
                }
                string iname;
                SceneInstance *newNode;
                if ((newNode = doI(str,iname)) != NULL) {
                    n->_children.push_back( newNode );
                }
                findCloseParen(str);
            }
        }
    } while (true);
}