// -*- mode: C++; tab-width: 4; indent-tabs-mode: t; -*- vim:ts=4:sw=4 // // Copyright (C) 2004,2005 David Lau (skunix) // Chong Kai Xiong (descender) // // This file is part of The Plains of Usata. // // The Plains of Usata is licensed under the GNU General Public // License (GPL) version 2. For details, please see the COPYING file // included in the software distribution, or visit // http://www.fsf.org/licenses/gpl.html. // // $Id: scene_parser_elements.cpp,v 1.1 2005/02/18 02:24:33 skunix Exp $ #include "../log.hpp" #include "scene_parser_elements.hpp" #include namespace usata { namespace { using namespace scene_parser_elements; SceneElementType DocumentElements[]= { {"object", ObjectE::create}, {0,0} }; SceneElementType* check_element_type(const std::string& name, SceneElementType* set) { for(;set->id;set++) { if (name==set->id) { return set; } } return 0; } } SceneDocument::SceneDocument(SceneParser*parser) : SceneElement(0,parser) { } SceneDocument::~SceneDocument() { } SceneElement* SceneDocument::make_child(const char* eName) { SceneElementType* set = check_element_type(eName, DocumentElements); if (set) { return set->create(this, mParser); } return 0; } void SceneDocument::start_element(const char*peName, const char** eAttr) { std::string eName(peName); if (eName != "scene") { } } namespace scene_parser_elements { SceneElementType ObjectElements[] = { {"int", IntE::create }, {0,0} }; const char * attr_check(const std::string& n, const char** attrib) { const char* retval =0 ; for (int indx=0; attrib[indx]; indx+=2) { if (n == attrib[indx]) { retval= attrib[indx+1]; break; } } return retval; } SceneElement* ObjectE::create(SceneElement* parent,SceneParser*parser) { return new ObjectE(parent,parser); } bool ObjectE::take_data_any(const std::string& name, const boost::any&data) { mOd->props.add(name,data); return true; } void ObjectE::start_element(const char*, const char **attrib) { } void ObjectE::end_element() { } SceneElement* ObjectE::make_child(const char* eName) { return 0; } ObjectE::ObjectE(SceneElement* parent, SceneParser*parser) : SceneElement(parent,parser), mOd(new ObjectDescription) { } ObjectE::~ObjectE() { } void SimpleElementBase::start_element(const char*aIgnore, const char**attrib) { const char * aName; const char * aValue; aName = attr_check("name", attrib); aValue = attr_check("value", attrib); if (aName) { mName = aName; mHaveName=true; } process(aValue); } IntE::IntE(SceneElement* parent, SceneParser* parser) : SimpleElementBase(parent,parser) { } SceneElement * IntE::create(SceneElement*p, SceneParser*pp) { return new IntE(p,pp); } void IntE::process(const char* v) { try { mValue = boost::lexical_cast(v); } catch(boost::bad_lexical_cast&) { // FIXME: warn mValue=0; } return; } void IntE::end_element() { SceneElementHub * seh = dynamic_cast(mParent); if (!seh) { //FIXME: warn! return; } boost::any ccc(mValue); seh->take_data_any(mName, ccc); return; } void IntE::content(const char*b, int l) { } } }