void OTMLNode::copy(const OTMLNodePtr& node) { setTag(node->tag()); setValue(node->rawValue()); setUnique(node->isUnique()); setNull(node->isNull()); setSource(node->source()); clear(); for(const OTMLNodePtr& child : node->m_children) addChild(child->clone()); }
// otml nodes void push_otml_subnode_luavalue(const OTMLNodePtr& node) { if(node->hasValue()) { union { bool b; double d; long l; }; std::string value = node->rawValue(); if(stdext::cast(value, b)) g_lua.pushBoolean(b); else if(stdext::cast(value, l)) g_lua.pushInteger(l); else if(stdext::cast(value, d)) g_lua.pushNumber(d); else g_lua.pushString(value); } else if(node->hasChildren()) { g_lua.newTable(); bool pushedChild = false; int currentIndex = 1; for(const OTMLNodePtr& cnode : node->children()) { push_otml_subnode_luavalue(cnode); if(!g_lua.isNil()) { if(cnode->isUnique()) { g_lua.pushString(cnode->tag()); g_lua.insert(-2); g_lua.rawSet(); } else g_lua.rawSeti(currentIndex++); pushedChild = true; } else g_lua.pop(); } if(!pushedChild) { g_lua.pop(); g_lua.pushNil(); } } else g_lua.pushNil(); }