-#include <stdio.h>
-#include <stdexcept>
-#include <expat.h>
-#include <iostream>
-#include <sstream>
-#include <map>
-#include <list>
-#include <stdlib.h>
+// Copyright (C) 2006-2021 CEA/DEN, EDF R&D
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
#include "parsers.hxx"
-#include "factory.hxx"
+
+#include <iostream>
+#include <stdexcept>
+#include <cstdio>
+
#include "Runtime.hxx"
-#include "Exception.hxx"
-#include "Cstr2d.hxx"
-#include "TypeCode.hxx"
-#include "Loop.hxx"
-#include "ForLoop.hxx"
-#include "ForEachLoop.hxx"
-#include "WhileLoop.hxx"
-#include "Switch.hxx"
-#include "Bloc.hxx"
#include "Proc.hxx"
-#include "InlineNode.hxx"
-#include "ServiceNode.hxx"
-#include "ServiceInlineNode.hxx"
-#include "OutputPort.hxx"
-#include "InputPort.hxx"
-#include "OutputDataStreamPort.hxx"
-#include "InputDataStreamPort.hxx"
-#include "ComponentInstance.hxx"
-#include "Container.hxx"
-
-using namespace YACS;
-using YACS::ENGINE::Runtime;
-using YACS::ENGINE::getRuntime;
+#include "ProcCataLoader.hxx"
+#include "Logger.hxx"
-using YACS::ENGINE::TypeCode;
-using YACS::Exception;
-using YACS::ENGINE::TypeCodeObjref;
-using YACS::ENGINE::TypeCodeStruct;
-using YACS::ENGINE::Objref;
-using YACS::ENGINE::InlineNode;
-using YACS::ENGINE::InlineFuncNode;
-using YACS::ENGINE::ServiceNode;
-using YACS::ENGINE::ServiceInlineNode;
-using YACS::ENGINE::Node;
-using YACS::ENGINE::Loop;
-using YACS::ENGINE::ForLoop;
-using YACS::ENGINE::ForEachLoop;
-using YACS::ENGINE::WhileLoop;
-using YACS::ENGINE::Switch;
-using YACS::ENGINE::Bloc;
-using YACS::ENGINE::Proc;
-using YACS::ENGINE::InputPort;
-using YACS::ENGINE::OutputPort;
-using YACS::ENGINE::InputDataStreamPort;
-using YACS::ENGINE::OutputDataStreamPort;
+#include "rootParser.hxx"
//#define _DEVDEBUG_
#include "YacsTrace.hxx"
-Runtime* theRuntime=0;
-static Proc* currentProc;
+#include <libxml/parser.h>
+#include <libxml/tree.h>
+#include <libxml/xmlreader.h>
+#include <libxml/parserInternals.h>
+YACS::ENGINE::Runtime* theRuntime=0;
#define BUFFSIZE 8192
char Buff[BUFFSIZE];
-XML_Parser p ;
-
-std::stack<parser*> sp;
-
-parser::~parser()
-{
- if(_level==0)
- {
- delete _counts;
- }
- else
- {
- DEBTRACE("Problem with parser: final stack level should be 0 and not " << _level);
- }
-}
-
-void parser::SetUserDataAndPush(parser* pp)
-{
- XML_SetUserData(p,pp);
- sp.push(pp);
-}
-
-void XMLCALL parser::start(void *data, const XML_Char* el, const XML_Char** attr)
-{
- parser* pp=static_cast <parser *> (data);
- pp->incrCount(el);
- pp->onStart(el,attr);
-}
-
-void parser::onEnd(const XML_Char *el,parser* child)
+extern YACS::ENGINE::Proc* currentProc;
+extern _xmlParserCtxt* saxContext;
+namespace YACS
{
- DEBTRACE("parser::onEnd: " << el)
-}
-void XMLCALL parser::end(void *data, const char *el)
+YACSLoader::YACSLoader()
{
- DEBTRACE("parser::end: " << el);
- parser* child=static_cast <parser *> (data);
- sp.pop();
- parser* pp=sp.top();
- XML_SetUserData(p,pp);
- pp->onEnd(el,child);
- child->end();
+ _defaultParsersMap.clear();
+ theRuntime = ENGINE::getRuntime();
}
-void parser::charData(const XML_Char *s, int len)
+void YACSLoader::registerProcCataLoader()
{
- _content=_content+std::string(s,len);
+ YACS::ENGINE::ProcCataLoader* factory= new YACS::ENGINE::ProcCataLoader(this);
+ theRuntime->setCatalogLoaderFactory("proc",factory);
}
-void XMLCALL parser::charac(void *data, const XML_Char *s, int len)
+ENGINE::Proc* YACSLoader::load(const char * file)
{
- parser* pp=static_cast <parser *> (data);
- pp->charData(s,len);
-}
+ DEBTRACE("YACSLoader::load: " << file);
+ parser::main_parser.init();
+ parser::main_parser._stackParser.push(&parser::main_parser);
+ xmlSAXHandler baseHandler =
+ {
+ 0, // internal_subset,
+ 0, // isStandalone
+ 0, // hasInternalSubset
+ 0, // hasExternalSubset
+ 0, // resolveEntity
+ 0, // getEntity
+ 0, // entityDecl
+ 0, // notationDecl
+ 0, // attributeDecl
+ 0, // elementDecl
+ 0, // unparsedEntityDecl
+ 0, // setDocumentLocator
+ parser::start_document, // startDocument
+ parser::end_document, // endDocument
+ parser::start_element, // startElement
+ parser::end_element, // endElement
+ 0, // reference
+ parser::characters, // characters
+ 0, // ignorableWhitespace
+ 0, // processingInstruction
+ parser::comment, // comment
+ parser::warning, // warning
+ parser::error, // error
+ parser::fatal_error, // fatalError
+ 0, // getParameterEntity
+ parser::cdata_block, // cdataBlock
+ 0 // externalSubset
+ };
-void parser::end ()
-{
- _level=_level-1;
- if(_level>0)
- {
- delete _counts;
- _counts=_stackCount.top();
- _orderState=_stackOrder.top();
- _stackCount.pop();
- _stackOrder.pop();
- }
-}
+ FILE* fin=fopen(file,"r");
+ if (! fin)
+ {
+ std::cerr << "Couldn't open schema file" << std::endl;
+ throw std::invalid_argument("Couldn't open schema file");
+ }
-void parser::init ()
-{
- if(_level>0)
- {
- _stackCount.push(_counts);
- _stackOrder.push(_orderState);
- _counts=new std::map<std::string,int>;
- }
- _level=_level+1;
- _counts->clear();
- _orderState=0;
-}
+ saxContext = xmlCreateFileParserCtxt(file);
-void parser::incrCount(const XML_Char *el)
-{
- if(_counts->count(el)==0)
- (*_counts)[el]=1;
+ if (!saxContext)
+ {
+ std::cerr << "Couldn't allocate memory for parser" << std::endl;
+ throw Exception("Couldn't allocate memory for parser");
+ }
+ saxContext->sax = &baseHandler;
+ parser::main_parser.SetUserDataAndPush(&YACS::roottypeParser::rootParser);
+ if ( !_defaultParsersMap.empty() )
+ roottypeParser::rootParser.setDefaultMap(&_defaultParsersMap);
else
- (*_counts)[el]=(*_counts)[el]+1;
-}
-
-void parser::checkOrder(std::string& el)
-{
- if(_orders.count(el)==0)return;
- if(_orders[el] < _orderState)
- {
- std::string msg="unexpected "+el+" element (wrong order)";
- throw YACS::Exception::Exception(msg);
- }
- else if(_orders[el] > _orderState)
- {
- _orderState=_orders[el];
- }
-}
-
-void parser::maxcount(std::string name, int max, std::string& el)
-{
- if(el!=name)return;
- if((*_counts)[name]>max)
- {
- std::stringstream msg;
- msg <<"unexpected "+name+" element (count="<<(*_counts)[name];
- msg <<" > maxOccurs=" << max << ")";
- throw YACS::Exception::Exception(msg.str());
- }
-}
-
-void parser::mincount(std::string name,int min )
-{
- if((*_counts)[name]<min)
- {
- std::stringstream msg;
- msg<<"expected "+name+" element (count="<<(*_counts)[name];
- msg << " < minOccurs=" << min << ")";
- throw YACS::Exception::Exception(msg.str());
- }
-}
-
-void parser::maxchoice(std::string *names, int max, std::string& el)
-{
- int i=0;
- int ncount=0;
- while (names[i]!= "")
- {
- ncount=ncount+(*_counts)[names[i]];
- ++i;
- }
- if(ncount>max)
- {
- std::stringstream msg;
- msg<<"unexpected "+el+" element (choice count="<<ncount<<" > maxOccurs=" << max << ")";
- throw YACS::Exception::Exception(msg.str());
- }
-}
-
-void parser::minchoice(std::string *names, int min)
-{
- int i=0;
- int ncount=0;
- while (names[i]!= "")
- {
- ncount=ncount+(*_counts)[names[i]];
- ++i;
- }
- if(ncount<min)
- {
- std::stringstream msg;
- msg << "expected element ";
- i=0;
- while (names[i]!= "")
- {
- msg << names[i] << ",";
- ++i;
- }
- msg << "(choice count="<<ncount<<" < minOccurs=" << min << ")";
- throw YACS::Exception::Exception(msg.str());
- }
-}
+ roottypeParser::rootParser.setDefaultMap(0);
-void parser::required(const std::string& name, const XML_Char** attr)
-{
- for (int i = 0; attr[i]; i += 2)
- {
- if(name == std::string(attr[i]))return;
- }
- throw YACS::Exception::Exception("Attribute: "+name+" is required");
-}
+ parser::main_parser._file = file;
+ currentProc = 0;
-void parser::buildAttr(const XML_Char** attr)
-{
- for (int i = 0; attr[i]; i += 2)
+ try
+ {
+ if ( xmlParseDocument(saxContext) == -1 )
{
- DEBTRACE(attr[i] << "=" << attr[i + 1])
+ if(!currentProc)
+ throw Exception("Basic error during parsing.");
+ YACS::ENGINE::Logger* logger = currentProc->getLogger("parser");
+ logger->fatal( saxContext->lastError.message, file, saxContext->input->line );
}
+ saxContext = 0;
+ return currentProc;
+ }
+ catch(Exception& e)
+ {
+ if(!currentProc)
+ throw e;
+ YACS::ENGINE::Logger* logger = currentProc->getLogger("parser");
+ logger->fatal(e.what(), file, saxContext->input->line);
+ saxContext = 0;
+ return currentProc;
+ }
}
-void parser::onStart(const XML_Char* el, const XML_Char** attr)
-{
- DEBTRACE( "parser::onStart: " << el )
- XML_SetUserData(p,&main_parser);
- sp.push(&main_parser);
- main_parser.buildAttr(attr);
-}
-
-/*! \brief Class for string parser.
- *
- * Class used to parse string
- */
-struct stringtypeParser:parser
-{
- std::string post()
- {
- return _content;
- }
-};
-static stringtypeParser stringParser;
-
-/*! \brief Class for double parser.
- *
- * Class used to parse double
- */
-struct doubletypeParser:parser
-{
- double post()
- {
- return Cstr2d(_content.c_str());
-// std::istringstream s(_content.c_str());
-// double a;
-// if (!(s >> a))
-// throw YACS::Exception::Exception("problem in conversion from string to double");
-// std::cerr << "--------------_content s a "<< _content.c_str() << " " << s.str() << " " << a << std::endl;
-// return a;
- }
-};
-static doubletypeParser doubleParser;
-
-/*! \brief Class for integer parser.
- *
- * Class used to parse integer
- */
-struct inttypeParser:parser
-{
- int post()
- {
- return atoi(_content.c_str());
- }
-};
-static inttypeParser intParser;
-
-/*! \brief Class for boolean parser.
- *
- * Class used to parse bool
- */
-struct booltypeParser:parser
-{
- bool post()
- {
- DEBTRACE( _content )
- if(_content == "true")return true;
- if(_content == "false")return false;
- std::stringstream temp(_content);
- bool b ;
- temp >> b;
- //std::cerr << b << std::endl;
- return b;
- }
-};
-static booltypeParser boolParser;
-
-/*! \brief Class for property parser.
- *
- * Class used to parse a property
- * A property is a pair of name(string), value(string)
- * XML schema is
- * <xsd:complexType name="PropertyType">
- * <xsd:attribute name="name" type="xsd:string" use="required"/>
- * <xsd:attribute name="value" type="xsd:string" use="required"/>
- * </xsd:complexType>
- *
- */
-struct propertytypeParser: parser
-{
- virtual void buildAttr(const XML_Char** attr)
- {
- required("name",attr);
- required("value",attr);
- for (int i = 0; attr[i]; i += 2)
- {
- if(std::string(attr[i]) == "name")name(attr[i+1]);
- if(std::string(attr[i]) == "value")value(attr[i+1]);
- }
- }
- virtual void name(const std::string& name){ _prop._name=name; }
- virtual void value(const std::string& name){ _prop._value=name; }
- myprop post(){return _prop;}
- myprop _prop;
-};
-static propertytypeParser propertyParser;
-
-/*! \brief Class for type parser.
- *
- * Class used to parse a type definition (class TypeCode in implementation)
- * with a name and a kind (reserved to atomic types)
- * XML schema is
- * <xsd:complexType name="TypeType">
- * <xsd:attribute name="name" type="xsd:string" use="required"/>
- * <xsd:attribute name="kind" type="xsd:string" use="required"/>
- * </xsd:complexType>
- *
- */
-struct typetypeParser: parser
-{
- virtual void buildAttr(const XML_Char** attr)
- {
- required("name",attr);
- required("kind",attr);
- for (int i = 0; attr[i]; i += 2)
- {
- if(std::string(attr[i]) == "name")name(attr[i+1]);
- if(std::string(attr[i]) == "kind")kind(attr[i+1]);
- }
- }
- virtual void pre (){}
- virtual void name(const std::string& name)
- {
- DEBTRACE( "type_name: " << name )
- _name=name;
- }
- virtual void kind(const std::string& name)
- {
- DEBTRACE( "type_kind: " << name )
- _kind=name;
- }
- virtual mytype post()
- {
- DEBTRACE( "type_post" )
- mytype t;
- t._kind=_kind;
- t._name=_name;
- return t;
- }
- std::string _name;
- std::string _kind;
-};
-static typetypeParser typeParser;
-
-/*! \brief Class for sequence parser.
- *
- * Class used to parse a sequence (type) definition (class TypeCodeSeq in implementation)
- * XML schema is
- * <xsd:complexType name="SequenceType">
- * <xsd:attribute name="name" type="xsd:string" use="required"/>
- * <xsd:attribute name="content" type="xsd:string" use="required"/>
- * </xsd:complexType>
- *
- */
-struct seqtypeParser:public parser
-{
- virtual void onStart(const XML_Char* el, const XML_Char** attr)
- {
- DEBTRACE( "seqtypeParser::onStart: " << el )
- parser* pp=&main_parser;
- XML_SetUserData(p,pp);
- sp.push(pp);
- pp->init();
- pp->pre();
- pp->buildAttr(attr);
- }
- virtual void onEnd(const char *el,parser* child)
- {
- DEBTRACE( "seqtypeParser::onEnd: " << el )
- }
- virtual void buildAttr(const XML_Char** attr)
- {
- required("name",attr);
- required("content",attr);
- for (int i = 0; attr[i]; i += 2)
- {
- if(std::string(attr[i]) == "name")name(attr[i+1]);
- if(std::string(attr[i]) == "content")content(attr[i+1]);
- }
- }
- void name(const std::string& name)
- {
- DEBTRACE( "seqtype_name: " << name )
- _name=name;
- }
- void content(const std::string& name)
- {
- DEBTRACE( "seqtype_content: " << name )
- if(currentProc->typeMap.count(name)==0)
- {
- std::stringstream msg;
- msg << "Type " << name << " does not exist" << " (" <<__FILE__ << ":" << __LINE__ << ")";
- throw Exception(msg.str());
- }
- _contentType=currentProc->typeMap[name];
-
- }
- TypeCode* post()
- {
- DEBTRACE( "seqtype_post" )
- TypeCode *t = currentProc->createSequenceTc(_name,_name,_contentType);
- return t;
- }
- TypeCode* _contentType;
- std::string _name;
-};
-static seqtypeParser seqParser;
-
-/*! \brief Class for objref parser.
- *
- * Class used to parse a objref (type) definition (class TypeCodeObjref in implementation)
- * XML schema is
- * <xsd:complexType name="ObjrefType">
- * <xsd:sequence>
- * <xsd:element name="base" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
- * </xsd:sequence>
- * <xsd:attribute name="name" type="xsd:string" use="required"/>
- * <xsd:attribute name="id" type="xsd:string" />
- * </xsd:complexType>
- *
- */
-struct objtypeParser: parser
-{
- virtual void onStart(const XML_Char* el, const XML_Char** attr)
- {
- DEBTRACE( "objtypeParser::onStart: " << el )
- std::string element(el);
- parser* pp=&main_parser;
- if(element == "base")pp=&stringParser;
- XML_SetUserData(p,pp);
- sp.push(pp);
- pp->init();
- pp->pre();
- pp->buildAttr(attr);
- }
- virtual void onEnd(const char *el,parser* child)
- {
- DEBTRACE( "objtypeParser::onEnd: " << el )
- std::string element(el);
- if(element == "base")base(((stringtypeParser*)child)->post());
- }
- virtual void buildAttr(const XML_Char** attr)
- {
- required("name",attr);
- for (int i = 0; attr[i]; i += 2)
- {
- if(std::string(attr[i]) == "name")name(attr[i+1]);
- if(std::string(attr[i]) == "id")id(attr[i+1]);
- }
- }
- virtual void pre ()
- {
- _id="";
- _ltc.clear();
- }
- virtual void name(const std::string& name)
- {
- DEBTRACE( "objtype_name: " << name )
- _name=name;
- }
- virtual void id(const std::string& name)
- {
- DEBTRACE( "objtype_id: " << name )
- _id=name;
- }
- virtual void base(const std::string& name)
- {
- DEBTRACE( "base_name: " << name )
- if(currentProc->typeMap.count(name)==0)
- {
- std::stringstream msg;
- msg << "Type " << name << " does not exist" ;
- msg << " (" <<__FILE__ << ":" << __LINE__ << ")";
- throw Exception(msg.str());
- }
- if(currentProc->typeMap[name]->kind() != Objref)
- {
- std::stringstream msg;
- msg << "Type " << name << " is not an objref" ;
- msg << " (" <<__FILE__ << ":" << __LINE__ << ")";
- throw Exception(msg.str());
- }
- _ltc.push_back((TypeCodeObjref *)currentProc->typeMap[name]);
- }
- virtual TypeCode * post()
- {
- DEBTRACE( "objtype_post" )
- TypeCode *t = currentProc->createInterfaceTc(_id,_name,_ltc);
- return t;
- }
- std::string _name;
- std::string _id;
- std::list<TypeCodeObjref *> _ltc;
-};
-static objtypeParser objParser;
-
-/*! \brief Class for member parser.
- *
- * Class used to parse a struct member
- * A struct member is a pair of name(string), type(string)
- * XML schema is
- * <xsd:complexType name="MemberType">
- * <xsd:attribute name="name" type="xsd:string" use="required"/>
- * <xsd:attribute name="type" type="xsd:string" use="required"/>
- * </xsd:complexType>
- *
- */
-struct membertypeParser: parser
-{
- virtual void buildAttr(const XML_Char** attr)
- {
- required("name",attr);
- required("type",attr);
- for (int i = 0; attr[i]; i += 2)
- {
- if(std::string(attr[i]) == "name")name(attr[i+1]);
- if(std::string(attr[i]) == "type")type(attr[i+1]);
- }
- }
- virtual void name(const std::string& name){ _prop._name=name; }
- virtual void type(const std::string& name){ _prop._value=name; }
- myprop post(){return _prop;}
- myprop _prop;
-};
-static membertypeParser memberParser;
-
-/*! \brief Class for struct parser.
- *
- * Class used to parse a struct (type) definition (class TypeCodeStruct in implementation)
- * XML schema is
- * <xsd:complexType name="StructType">
- * <xsd:sequence>
- * <xsd:element name="member" type="MemberType" minOccurs="0" maxOccurs="unbounded"/>
- * </xsd:sequence>
- * <xsd:attribute name="name" type="xsd:string" use="required"/>
- * <xsd:attribute name="id" type="xsd:string" />
- * </xsd:complexType>
- *
- */
-struct structtypeParser: parser
-{
- virtual void onStart(const XML_Char* el, const XML_Char** attr)
- {
- DEBTRACE( "structtypeParser::onStart: " << el )
- std::string element(el);
- parser* pp=&main_parser;
- if(element == "member")pp=&memberParser;
- XML_SetUserData(p,pp);
- sp.push(pp);
- pp->init();
- pp->pre();
- pp->buildAttr(attr);
- }
- virtual void onEnd(const char *el,parser* child)
- {
- DEBTRACE( "structtypeParser::onEnd: " << el )
- std::string element(el);
- if(element == "member")member(((membertypeParser*)child)->post());
- }
- virtual void buildAttr(const XML_Char** attr)
- {
- required("name",attr);
- for (int i = 0; attr[i]; i += 2)
- {
- if(std::string(attr[i]) == "name")name(attr[i+1]);
- if(std::string(attr[i]) == "id")id(attr[i+1]);
- }
- }
- virtual void pre ()
- {
- _id="";
- _members.clear();
- }
- virtual void name(const std::string& name)
- {
- DEBTRACE( "structtype_name: " << name );
- _name=name;
- }
- virtual void id(const std::string& name)
- {
- DEBTRACE( "structtype_id: " << name );
- _id=name;
- }
- virtual void member (const myprop& prop)
- {
- DEBTRACE( "structtype_member: " << prop._name << prop._value );
- if(currentProc->typeMap.count(prop._value)!=0)
- _members.push_back(prop);
- else
- {
- std::string msg="Unknown type " + prop._value + " for member " + prop._name + " in struct " + _name;
- throw Exception(msg);
- }
- }
- virtual TypeCode * post()
- {
- DEBTRACE( "structtype_post" );
- TypeCodeStruct *t;
- if(currentProc->typeMap.count(_name)!=0)
- {
- //reuse a forward declaration
- TypeCode* tt=currentProc->typeMap[_name];
- if(tt->kind()==YACS::ENGINE::Struct)
- {
- t=(TypeCodeStruct*)tt;
- }
- else
- {
- std::string msg="Forward declaration must be a struct type but " + std::string(tt->name()) + " is not one" ;
- throw Exception(msg);
- }
- }
- else
- {
- t = (TypeCodeStruct*)currentProc->createStructTc(_id,_name);
- }
- std::vector<myprop>::const_iterator iter;
- for(iter=_members.begin();iter!=_members.end();iter++)
- {
- DEBTRACE("member: " << iter->_name << " " <<iter->_value);
- t->addMember(iter->_name,currentProc->typeMap[iter->_value]);
- }
- return t;
- }
- std::string _name;
- std::string _id;
- std::vector<myprop> _members;
-};
-static structtypeParser structParser;
-
-/*! \brief Class for machine parser.
- *
- * Class used to parse computer adress on which container must be started
- * XML schema is
- * <xsd:complexType name="MachineType">
- * <xsd:attribute name="name" type="xsd:string" use="required"/>
- * </xsd:complexType>
- */
-struct machinetypeParser: parser
-{
- virtual void buildAttr(const XML_Char** attr)
- {
- required("name",attr);
- for (int i = 0; attr[i]; i += 2)
- {
- if(std::string(attr[i]) == "name")name(attr[i+1]);
- }
- }
- virtual void pre (){_mach._name="";}
- virtual void name(const std::string& name){ _mach._name=name; }
- machine post()
- {
- return _mach;
- }
- machine _mach;
-};
-static machinetypeParser machineParser;
-
-/*! \brief Class for container parser
- *
- * Class used to parse container description
- * XML schema is
- * <xsd:complexType name="ContainerType">
- * <xsd:sequence>
- * <xsd:element name="machine" type="MachineType" minOccurs="0" maxOccurs="unbounded"/>
- * <xsd:element name="property" type="PropertyType" minOccurs="0" maxOccurs="unbounded"/>
- * </xsd:sequence>
- * <xsd:attribute name="name" type="xsd:string" use="required"/>
- * </xsd:complexType>
- */
-struct containertypeParser: parser
-{
- virtual void buildAttr(const XML_Char** attr)
- {
- required("name",attr);
- for (int i = 0; attr[i]; i += 2)
- {
- if(std::string(attr[i]) == "name")name(attr[i+1]);
- }
- }
- virtual void onStart(const XML_Char* el, const XML_Char** attr)
- {
- std::string element(el);
- parser* pp=&main_parser;
- if(element == "machine")pp=&machineParser;
- if(element == "property")pp=&propertyParser;
- XML_SetUserData(p,pp);
- sp.push(pp);
- pp->init();
- pp->pre();
- pp->buildAttr(attr);
- }
- virtual void onEnd(const char *el,parser* child)
- {
- std::string element(el);
- if(element == "machine")machine_(((machinetypeParser*)child)->post());
- if(element == "property")property(((propertytypeParser*)child)->post());
- }
- virtual void pre (){_container._machs.clear();}
- virtual void name(const std::string& name){ _container._name=name; }
- virtual void machine_(const machine& m)
- {
- DEBTRACE( "machine: " << m._name )
- _container._machs.push_back(m);
- }
- virtual void property (const myprop& prop)
- {
- DEBTRACE( "property_set: " << prop._name << prop._value )
- _container._props[prop._name]=prop._value;
- }
- mycontainer post()
- {
- //mincount("machine",1);
- return _container;
- }
- mycontainer _container;
-};
-static containertypeParser containerParser;
-
-/*! \brief Class for loading parser
- *
- * Class used to parse service node loading information
- * XML schema is
- * <xsd:complexType name="LoadType">
- * <xsd:attribute name="container" type="xsd:string" use="required"/>
- * </xsd:complexType>
- */
-struct loadtypeParser: parser
-{
- virtual void buildAttr(const XML_Char** attr)
- {
- required("container",attr);
- for (int i = 0; attr[i]; i += 2)
- {
- if(std::string(attr[i]) == "container")container(attr[i+1]);
- }
- }
- virtual void pre (){_loadon._container="";}
- virtual void container(const std::string& name){ _loadon._container=name; }
- loadon post()
- {
- return _loadon;
- }
- loadon _loadon;
-};
-static loadtypeParser loadParser;
-
-/*! \brief Class for Inport parser.
- *
- * This class is a base class for other inport parsers
- * <xsd:complexType name="InPortType">
- * <xsd:sequence>
- * <xsd:element name="property" type="PropertyType" minOccurs="0"/>
- * </xsd:sequence>
- * <xsd:attribute name="name" type="xsd:string" use="required"/>
- * <xsd:attribute name="type" type="xsd:string" use="required"/>
- * </xsd:complexType>
- *
- */
-template <class T=myinport>
-struct inporttypeParser: parser
-{
- virtual void onStart(const XML_Char* el, const XML_Char** attr)
- {
- std::string element(el);
- parser* pp=&main_parser;
- if(element == "property")pp=&propertyParser;
- XML_SetUserData(p,pp);
- sp.push(pp);
- pp->init();
- pp->pre();
- pp->buildAttr(attr);
- }
- virtual void onEnd(const char *el,parser* child)
- {
- std::string element(el);
- if(element == "property")property(((propertytypeParser*)child)->post());
- }
- virtual void buildAttr(const XML_Char** attr)
- {
- required("name",attr);
- required("type",attr);
- for (int i = 0; attr[i]; i += 2)
- {
- if(std::string(attr[i]) == "name")name(attr[i+1]);
- if(std::string(attr[i]) == "type")type(attr[i+1]);
- }
- }
- virtual void pre ()
- {
- _port._name="";
- _port._type="";
- _port.clear();
- }
- virtual void name(const std::string& name)
- {
- _port._name=name;
- }
- virtual void type(const std::string& type)
- {
- _port._type=type;
- }
- virtual void property (const myprop& prop)
- {
- DEBTRACE( "property_set: " << prop._name << prop._value )
- _port.setProperty(prop._name,prop._value);
- }
- virtual T& post()
- {
- return _port;
- }
-protected:
- T _port;
-};
-static inporttypeParser<> inportParser;
-
-/*! \brief Class for Outport parser.
- *
- * This class is also used for OutputDataStream Port
- * same XML schema as inporttypeParser
- */
-template <class T=myoutport>
-struct outporttypeParser:public inporttypeParser<T>
-{
-};
-static outporttypeParser<> outportParser;
-
-/*! \brief Class for node parser.
- *
- * This class is a base class for other parsers
- */
-template <class T=InlineNode*>
-struct nodetypeParser:public parser
-{
- virtual void onStart(const XML_Char* el, const XML_Char** attr)
- {
- DEBTRACE( "nodetypeParser::onStart: " << el )
- std::string element(el);
- parser* pp=&main_parser;
- XML_SetUserData(p,pp);
- sp.push(pp);
- pp->init();
- pp->pre();
- pp->buildAttr(attr);
- }
- virtual void onEnd(const char *el,parser* child)
- {
- DEBTRACE( "nodetypeParser::onEnd: " << el )
- std::string element(el);
- }
- virtual void buildAttr(const XML_Char** attr)
- {
- required("name",attr);
- required("type",attr);
- for (int i = 0; attr[i]; i += 2)
- {
- if(std::string(attr[i]) == "name")name(attr[i+1]);
- if(std::string(attr[i]) == "state")state(attr[i+1]);
- if(std::string(attr[i]) == "type")type(attr[i+1]);
- }
- }
- virtual void pre()
- {
- _node=0;
- }
- virtual void name (const std::string& name)
- {
- DEBTRACE( "inline_name: " << name )
- _name=name;
- }
- virtual void state (const std::string& name)
- {
- _state=name;
- }
- virtual void type (const std::string& name)
- {
- DEBTRACE( "node_type " << name )
- _type=name;
- }
- virtual T post()
- {
- return _node;
- }
- std::string _type;
- std::string _name;
- std::string _state;
- T _node;
-};
-static nodetypeParser<> nodeParser;
-
-template <>
-InlineNode* nodetypeParser<InlineNode*>::post ()
+YACSLoader::~YACSLoader()
{
- std::string fullname = currentProc->names.back()+_type;
- if(currentProc->inlineMap.count(_type) != 0)
- {
- //InlineNode type with absolute name found
- InlineNode* n=currentProc->inlineMap[_type];
- _node=n->cloneNode(_name);
- }
- else if(currentProc->inlineMap.count(fullname) != 0)
- {
- //InlineNode type with relative name found
- InlineNode* n=currentProc->inlineMap[fullname];
- _node=n->cloneNode(_name);
- }
- else
- {
- throw Exception("Unknown InlineNode type");
- }
- if(_state == "disabled")_node->exDisabledState();
- DEBTRACE( "node_post " << _node->getName() )
- return _node;
}
-struct codetypeParser: parser
-{
- virtual void onStart(const XML_Char* el, const XML_Char** attr)
- {
- std::string element(el);
- parser* pp=&main_parser;
- if(element == "code")pp=&stringParser;
- XML_SetUserData(p,pp);
- sp.push(pp);
- pp->init();
- pp->pre();
- pp->buildAttr(attr);
- }
- virtual void onEnd(const char *el,parser* child)
- {
- std::string element(el);
- if(element == "code")code(((stringtypeParser*)child)->post());
- }
- virtual void pre (){_code="";}
- virtual void code (const std::string& s)
- {
- if(_code == "")
- _code=s;
- else
- _code=_code + '\n' + s;
- }
- virtual myfunc post ()
- {
- _func._name="script";
- _func._code=_code;
- return _func;
- }
- std::string _code;
- myfunc _func;
-};
-static codetypeParser codeParser;
-
-struct functypeParser: codetypeParser
-{
- virtual void buildAttr(const XML_Char** attr)
- {
- required("name",attr);
- for (int i = 0; attr[i]; i += 2)
- {
- if(std::string(attr[i]) == "name")name(attr[i+1]);
- }
- }
- virtual void name (const std::string& name)
- {
- _func._name=name;
- }
- virtual myfunc post ()
- {
- _func._code=_code;
- return _func;
- }
-};
-static functypeParser funcParser;
-
-static std::string t1[]={"script","function",""};
-
-template <class T=InlineNode*>
-struct inlinetypeParser:public nodetypeParser<T>
-{
- virtual void onStart(const XML_Char* el, const XML_Char** attr)
- {
- DEBTRACE( "inlinetypeParser::onStart: " << el )
- std::string element(el);
- parser* pp=&main_parser;
- this->maxcount("kind",1,element);
- this->maxcount("script",1,element);
- this->maxcount("function",1,element);
- this->maxchoice(t1,1,element);
- if(element == "kind")pp=&stringParser;
- else if(element == "script")pp=&codeParser;
- else if(element == "function")pp=&funcParser;
- else if(element == "inport")pp=&inportParser;
- else if(element == "outport")pp=&outportParser;
- XML_SetUserData(p,pp);
- sp.push(pp);
- pp->init();
- pp->pre();
- pp->buildAttr(attr);
- }
- virtual void onEnd(const char *el,parser* child)
- {
- DEBTRACE( "inlinetypeParser::onEnd: " << el )
- std::string element(el);
- if(element == "kind")kind(((stringtypeParser*)child)->post());
- else if(element == "script")script(((codetypeParser*)child)->post());
- else if(element == "function")function(((functypeParser*)child)->post());
- else if(element == "inport") inport(((inporttypeParser<myinport>*)child)->post());
- else if(element == "outport") outport(((outporttypeParser<myoutport>*)child)->post());
- }
- virtual void buildAttr(const XML_Char** attr)
- {
- this->required("name",attr);
- for (int i = 0; attr[i]; i += 2)
- {
- if(std::string(attr[i]) == "name")this->name(attr[i+1]);
- if(std::string(attr[i]) == "state")this->state(attr[i+1]);
- }
- }
- virtual void pre ()
- {
- this->_node=0;
- _kind="";
- this->_state="";
- }
- virtual void kind (const std::string& name)
- {
- DEBTRACE( "inline_kind " << name )
- _kind=name;
- }
- virtual void script (const myfunc& f){}
- virtual void function (const myfunc& f) {}
- virtual void inport (const myinport& p)
- {
- DEBTRACE( "inline_inport: " << p._name <<":"<<p._type)
- if(this->_node==0)
- throw Exception("Node must be completely defined before defining its ports");
- if(currentProc->typeMap.count(p._type)==0)
- {
- std::string msg="Unknown InPort Type: ";
- msg=msg+p._type+" for node: "+this->_node->getName()+" port name: "+p._name;
- throw Exception(msg);
- }
- this->_node->edAddInputPort(p._name,currentProc->typeMap[p._type]);
- }
- virtual void outport (const myoutport& p)
- {
- DEBTRACE( "inline_outport: " << p._name <<":"<<p._type)
- if(this->_node==0)
- throw Exception("Node must be completely defined before defining its ports");
- if(currentProc->typeMap.count(p._type)==0)
- {
- std::string msg="Unknown OutPort Type: ";
- msg=msg+p._type+" for node: "+this->_node->getName()+" port name: "+p._name;
- throw Exception(msg);
- }
- this->_node->edAddOutputPort(p._name,currentProc->typeMap[p._type]);
- }
- virtual T post()
- {
- DEBTRACE( "inline_post " << this->_node->getName() )
- if(this->_state == "disabled")this->_node->exDisabledState();
- /*
- std::list<OutputPort *>::iterator iter;
- std::list<OutputPort *> s=_node->getSetOfOutputPort();
- for(iter=s.begin();iter!=s.end();iter++)
- {
- std::cerr << "port name: " << (*iter)->getName() << std::endl;
- std::cerr << "port kind: " << (*iter)->edGetType()->kind() << std::endl;
- }
- */
- return this->_node;
- }
- std::string _kind;
-};
-static inlinetypeParser<> inlineParser;
-
-template <>
-void inlinetypeParser<InlineNode*>::script (const myfunc& f)
-{
- DEBTRACE( "inline_script: " << f._code )
- _node=theRuntime->createScriptNode(_kind,_name);
- _node->setScript(f._code);
-}
-template <>
-void inlinetypeParser<InlineNode*>::function (const myfunc& f)
-{
- DEBTRACE( "inline_function: " << f._code )
- InlineFuncNode *fnode;
- fnode=theRuntime->createFuncNode(_kind,_name);
- fnode->setScript(f._code);
- fnode->setFname(f._name);
- _node=fnode;
-}
-
-/*! \brief Class for parsing ServiceInlineNode description
- *
- *
- */
-template <class T=ServiceInlineNode*>
-struct sinlinetypeParser:public inlinetypeParser<T>
-{
- virtual void onStart(const XML_Char* el, const XML_Char** attr)
- {
- DEBTRACE( "sinlinetypeParser::onStart: " << el )
- std::string element(el);
- parser* pp=&main_parser;
- this->maxcount("kind",1,element);
- this->maxcount("function",1,element);
- this->maxcount("load",1,element);
- if(element == "kind")pp=&stringParser;
- else if(element == "function")pp=&funcParser;
- else if(element == "load")pp=&loadParser;
- else if(element == "inport")pp=&inportParser;
- else if(element == "outport")pp=&outportParser;
- XML_SetUserData(p,pp);
- sp.push(pp);
- pp->init();
- pp->pre();
- pp->buildAttr(attr);
- }
- virtual void onEnd(const char *el,parser* child)
- {
- DEBTRACE( "sinlinetypeParser::onEnd: " << el )
- std::string element(el);
- if(element == "kind")this->kind(((stringtypeParser*)child)->post());
- else if(element == "function")this->function(((functypeParser*)child)->post());
- else if(element == "load") load(((loadtypeParser*)child)->post());
- else if(element == "inport") this->inport(((inporttypeParser<myinport>*)child)->post());
- else if(element == "outport") this->outport(((outporttypeParser<myoutport>*)child)->post());
- }
- //virtual void service (const myfunc& f) {}
- virtual void load (const loadon& l)
- {
- DEBTRACE( "sinline_load: " )
- if(this->_node==0)
- throw Exception("ServiceInlineNode must be completely defined before defining how to load it");
-
- if(currentProc->containerMap.count(l._container) != 0)
- {
- //If it has already a container replace it ?????
- this->_node->getComponent()->setContainer(currentProc->containerMap[l._container]);
- }
- else
- {
- std::cerr << "WARNING: Unknown container " << l._container << std::endl;
- }
- }
-};
-
-template <>
-void inlinetypeParser<ServiceInlineNode*>::function (const myfunc& f)
-{
- DEBTRACE( "sinline_function: " << f._code )
- ServiceInlineNode *fnode;
- fnode=theRuntime->createSInlineNode(_kind,_name);
- fnode->setScript(f._code);
- fnode->setMethod(f._name);
- fnode->setComponent(theRuntime->createComponentInstance("PyCompo","SalomePy"));
- //fnode->setRef("PyCompo");
- _node=fnode;
-}
-
-static sinlinetypeParser<> sinlineParser;
-
-static std::string t2[]={"ref","node","component",""};
-
-template <class T=ServiceNode*>
-struct servicetypeParser:public inlinetypeParser<T>
-{
- virtual void onStart(const XML_Char* el, const XML_Char** attr)
- {
- DEBTRACE( "servicetypeParser::onStart: " << el )
- std::string element(el);
- parser* pp=&main_parser;
- this->maxcount("kind",1,element);
- this->maxcount("ref",1,element);
- this->maxcount("node",1,element);
- this->maxcount("component",1,element);
- this->maxcount("method",1,element);
- this->maxcount("load",1,element);
- this->maxchoice(t2,1,element);
- if(element == "kind")pp=&stringParser;
- else if(element == "ref")pp=&stringParser;
- else if(element == "component")pp=&stringParser;
- else if(element == "node")pp=&stringParser;
- else if(element == "method")pp=&stringParser;
- else if(element == "load")pp=&loadParser;
- else if(element == "inport")pp=&inportParser;
- else if(element == "outport")pp=&outportParser;
- else if(element == "instream")pp=&inportParser;
- else if(element == "outstream")pp=&outportParser;
- XML_SetUserData(p,pp);
- sp.push(pp);
- pp->init();
- pp->pre();
- pp->buildAttr(attr);
- }
- virtual void onEnd(const char *el,parser* child)
- {
- DEBTRACE( "servicetypeParser::onEnd: " << el )
- std::string element(el);
- if(element == "kind")this->kind(((stringtypeParser*)child)->post());
- else if(element == "ref") ref(((stringtypeParser*)child)->post());
- else if(element == "component") component(((stringtypeParser*)child)->post());
- else if(element == "node") node(((stringtypeParser*)child)->post());
- else if(element == "method") method(((stringtypeParser*)child)->post());
- else if(element == "load") load(((loadtypeParser*)child)->post());
- else if(element == "inport") this->inport(((inporttypeParser<myinport>*)child)->post());
- else if(element == "outport") this->outport(((outporttypeParser<myoutport>*)child)->post());
- else if(element == "instream") instream(((inporttypeParser<myinport>*)child)->post());
- else if(element == "outstream") outstream(((outporttypeParser<myoutport>*)child)->post());
- }
- virtual void ref (const std::string& name)
- {
- DEBTRACE( "service_ref: " << name )
- this->_node=theRuntime->createRefNode(this->_kind,this->_name);
- this->_node->setRef(name);
- }
- virtual void component (const std::string& name)
- {
- DEBTRACE( "service_component: " << name )
- this->_node=theRuntime->createCompoNode(this->_kind,this->_name);
- this->_node->setRef(name);
- }
- virtual void node (const std::string& name)
- {
- DEBTRACE( "service_node: " << name )
- std::string fullname = currentProc->names.back()+name;
- if(currentProc->serviceMap.count(name) != 0)
- {
- //ServiceNode with absolute name found
- ServiceNode* n=currentProc->serviceMap[name];
- this->_node =n->createNode(this->_name);
- }
- else if(currentProc->serviceMap.count(fullname) != 0)
- {
- //ServiceNode with relative name found
- //TODO: must be a short name (possible only in the same context)
- ServiceNode* n=currentProc->serviceMap[fullname];
- this->_node =n->createNode(this->_name);
- }
- else
- {
- throw Exception("Unknown ServiceNode");
- }
- }
- virtual void method (const std::string& name)
- {
- DEBTRACE( "service_method: " << name )
- if(this->_node==0)
- throw Exception("ServiceNode must be completely defined before defining its method");
- this->_node->setMethod(name);
- }
-
- virtual void load (const loadon& l)
- {
- DEBTRACE( "service_load: " )
- if(this->_node==0)
- throw Exception("ServiceNode must be completely defined before defining how to load it");
-
- if(currentProc->containerMap.count(l._container) != 0)
- {
- //If it has already a container replace it ?????
- this->_node->getComponent()->setContainer(currentProc->containerMap[l._container]);
- }
- else
- {
- std::cerr << "WARNING: Unknown container " << l._container << std::endl;
- }
- }
-
- virtual void instream (const myinport& p)
- {
- DEBTRACE( "service_instream" )
- DEBTRACE( p._type )
- DEBTRACE( p._name )
- if(this->_node==0)
- throw Exception("ServiceNode must be completely defined before defining its ports");
- if(currentProc->typeMap.count(p._type)==0)
- {
- std::string msg="Unknown InPort Type: ";
- msg=msg+p._type+" for node: "+this->_node->getName()+" port name: "+p._name;
- throw Exception(msg);
- }
- InputDataStreamPort* port;
- port=this->_node->edAddInputDataStreamPort(p._name,currentProc->typeMap[p._type]);
- // Set all properties for this port
- std::map<std::string, std::string>::const_iterator pt;
- for(pt=p._props.begin();pt!=p._props.end();pt++)
- port->setProperty((*pt).first,(*pt).second);
- }
- virtual void outstream (const myoutport& p)
- {
- DEBTRACE( "service_outstream" )
- DEBTRACE( p._type )
- DEBTRACE( p._name )
- if(this->_node==0)
- throw Exception("ServiceNode must be completely defined before defining its ports");
- if(currentProc->typeMap.count(p._type)==0)
- {
- std::string msg="Unknown OutPort Type: ";
- msg=msg+p._type+" for node: "+this->_node->getName()+" port name: "+p._name;
- throw Exception(msg);
- }
- OutputDataStreamPort* port;
- port=this->_node->edAddOutputDataStreamPort(p._name,currentProc->typeMap[p._type]);
- // Set all properties for this port
- std::map<std::string, std::string>::const_iterator pt;
- for(pt=p._props.begin();pt!=p._props.end();pt++)
- port->setProperty((*pt).first,(*pt).second);
- }
- virtual T post()
- {
- DEBTRACE( "service_post " << this->_node->getName() )
- this->mincount("method",1);
- if(this->_state == "disabled")this->_node->exDisabledState();
- return this->_node;
- }
-};
-static servicetypeParser<> serviceParser;
-
-template <class T=mycontrol>
-struct controltypeParser: parser
-{
- virtual void onStart(const XML_Char* el, const XML_Char** attr)
- {
- std::string element(el);
- parser* pp=&main_parser;
- this->maxcount("fromnode",1,element);
- this->maxcount("tonode",1,element);
- if(element == "fromnode")pp=&stringParser;
- else if(element == "tonode")pp=&stringParser;
- XML_SetUserData(p,pp);
- sp.push(pp);
- pp->init();
- pp->pre();
- pp->buildAttr(attr);
- }
- virtual void onEnd(const char *el,parser* child)
- {
- std::string element(el);
- if(element == "fromnode")fromnode(((stringtypeParser*)child)->post());
- else if(element == "tonode")tonode(((stringtypeParser*)child)->post());
- }
- virtual void pre ()
- {
- _link.clear();
- }
- virtual void fromnode (const std::string& name)
- {
- _link.fromnode(name);
- }
- virtual void tonode (const std::string& name)
- {
- _link.tonode(name);
- }
- virtual void property (const myprop& prop)
- {
- DEBTRACE( "property_set: " << prop._name << prop._value )
- _link.setProperty(prop._name,prop._value);
- }
- virtual T& post()
- {
- mincount("fromnode",1);
- mincount("tonode",1);
- return _link;
- }
- T _link;
-};
-static controltypeParser<> controlParser;
-
-template <class T=mylink>
-struct linktypeParser: controltypeParser<T>
-{
- virtual void onStart(const XML_Char* el, const XML_Char** attr)
- {
- std::string element(el);
- this->maxcount("fromnode",1,element);
- this->maxcount("tonode",1,element);
- this->maxcount("fromport",1,element);
- this->maxcount("toport",1,element);
- parser* pp=&main_parser;
- if(element == "fromnode")pp=&stringParser;
- else if(element == "tonode")pp=&stringParser;
- else if(element == "toport")pp=&stringParser;
- else if(element == "fromport")pp=&stringParser;
- else if(element == "property")pp=&propertyParser;
- XML_SetUserData(p,pp);
- sp.push(pp);
- pp->init();
- pp->pre();
- pp->buildAttr(attr);
- }
- virtual void onEnd(const char *el,parser* child)
- {
- std::string element(el);
- if(element == "fromnode")this->fromnode(((stringtypeParser*)child)->post());
- else if(element == "tonode")this->tonode(((stringtypeParser*)child)->post());
- else if(element == "toport")toport(((stringtypeParser*)child)->post());
- else if(element == "fromport")fromport(((stringtypeParser*)child)->post());
- else if(element == "property")this->property(((propertytypeParser*)child)->post());
- }
- virtual void buildAttr(const XML_Char** attr)
- {
- for (int i = 0; attr[i]; i += 2)
- {
- if((std::string(attr[i]) == "control")
- && (std::string(attr[i+1]) == "false"))
- this->_link._withControl=false;
- }
- }
- virtual void fromport (const std::string& name)
- {
- this->_link.fromport(name);
- }
- virtual void toport (const std::string& name)
- {
- this->_link.toport(name);
- }
- virtual T& post()
- {
- this->mincount("fromnode",1);
- this->mincount("tonode",1);
- this->mincount("fromport",1);
- this->mincount("toport",1);
- return this->_link;
- }
-};
-static linktypeParser<> linkParser;
-
-template <class T=mystream>
-struct streamtypeParser: linktypeParser<T>
-{
-};
-static streamtypeParser<> streamParser;
-
-static std::string t4[]={"string","objref","double","int","boolean","array","struct",""};
-
-/*! \brief Class for XML-RPC value parser.
- *
- * This class is used to parse XML data that describes a sequence in XML-RPC format
- * Its XML schema is:
- * <xsd:complexType name="ValueType">
- * <xsd:choice >
- * <xsd:element name="int" type="IntType"/>
- * <xsd:element name="boolean" type="BooleanType"/>
- * <xsd:element name="double" type="DoubleType"/>
- * <xsd:element name="string" type="StringType"/>
- * <xsd:element name="objref" type="ObjrefType"/>
- * <xsd:element name="array" type="ArrayType"/>
- * <xsd:element name="struct" type="StructType"/>
- * </xsd:choice>
- * </xsd:complexType>
- */
-struct valuetypeParser: parser
-{
- virtual void onStart(const XML_Char* el, const XML_Char** attr);
- virtual void onEnd(const char *el,parser* child);
- virtual void pre (){ }
- virtual void int_ (const int& d)
- {
- std::ostringstream os;
- os << "<int>" << d<< "</int>";
- _data=os.str();
- _v.push_back(_data);
- }
- virtual void boolean (const bool& d)
- {
- std::ostringstream os;
- os << "<boolean>" << d<< "</boolean>";
- _data=os.str();
- _v.push_back(_data);
- }
- virtual void double_ (const double& d)
- {
- std::ostringstream os;
- os << "<double>"<< d<< "</double>";
- _data=os.str();
- _v.push_back(_data);
- }
- virtual void string(const std::string& d)
- {
- _data="<string>"+ d+ "</string>";
- _v.push_back(_data);
- }
- virtual void objref(const std::string& d)
- {
- _data="<objref>"+ d+ "</objref>";
- _v.push_back(_data);
- }
- virtual void array (const std::string& d)
- {
- _v.push_back(d);
- }
- virtual void struct_ (const std::string& d)
- {
- _v.push_back(d);
- }
- virtual std::string post()
- {
- minchoice(t4,1);
- std::string value="<value>"+_v.back()+"</value>\n";
- _v.pop_back();
- return value;
- }
- std::string _data;
- std::vector<std::string> _v;
-};
-static valuetypeParser valueParser;
-
-/*! \brief Class for XML-RPC data parser.
- *
- * This class is used to parse XML data that describes a sequence in XML-RPC format
- * Its XML schema is:
- * <xsd:complexType name="DataType">
- * <xsd:element name="value" type="ValueType"/>
- * </xsd:complexType>
- */
-struct datatypeParser: parser
-{
- virtual void onStart(const XML_Char* el, const XML_Char** attr)
- {
- std::string element(el);
- parser* pp=&main_parser;
- if(element == "value")pp=&valueParser;
- XML_SetUserData(p,pp);
- sp.push(pp);
- pp->init();
- pp->pre();
- pp->buildAttr(attr);
- }
- virtual void onEnd(const char *el,parser* child)
- {
- std::string element(el);
- if(element == "value")value(((valuetypeParser*)child)->post());
- }
- virtual void pre ()
- {
- _datas.push_back(_data);
- _data="";
- }
- virtual void value (const std::string& v){
- _data=_data+v;
- }
- virtual std::string post()
- {
- mincount("value",1);
- std::string d="<data>\n"+_data+"</data>";
- _data=_datas.back();
- _datas.pop_back();
- return d;
- }
- std::string _data;
- std::vector<std::string> _datas;
-};
-static datatypeParser dataParser;
-
-/*! \brief Class for XML-RPC member parser.
- *
- * This class is used to parse XML data that describes a sequence in XML-RPC format
- * Its XML schema is:
- * <xsd:complexType name="MemberDataType">
- * <xsd:element name="name" type="StringType"/>
- * <xsd:element name="value" type="ValueType"/>
- * </xsd:complexType>
- */
-struct memberdatatypeParser: parser
-{
- virtual void onStart(const XML_Char* el, const XML_Char** attr)
- {
- std::string element(el);
- parser* pp=&main_parser;
- if(element == "name")pp=&stringParser;
- else if(element == "value")pp=&valueParser;
- XML_SetUserData(p,pp);
- sp.push(pp);
- pp->init();
- pp->pre();
- pp->buildAttr(attr);
- }
- virtual void onEnd(const char *el,parser* child)
- {
- std::string element(el);
- this->maxcount("name",1,element);
- this->maxcount("value",1,element);
- if(element == "name")name(((stringtypeParser*)child)->post());
- else if(element == "value")value(((valuetypeParser*)child)->post());
- }
- virtual void pre ()
- {
- _datas.push_back(_data);
- _data="";
- }
- virtual void name (const std::string& v)
- {
- _data=_data+"<name>"+v+"</name>";
- }
- virtual void value (const std::string& v)
- {
- _data=_data+v;
- }
- virtual std::string post()
- {
- mincount("value",1);
- mincount("name",1);
- std::string d="<member>\n"+_data+"</member>";
- _data=_datas.back();
- _datas.pop_back();
- return d;
- }
- std::string _data;
- std::vector<std::string> _datas;
-};
-static memberdatatypeParser memberdataParser;
-
-/*! \brief Class for XML-RPC struct parser.
- *
- * This class is used to parse XML data that describes a sequence in XML-RPC format
- * Its XML schema is:
- * <xsd:complexType name="StructDataType">
- * <xsd:element name="member" type="MemberDataType" minOccurs="1"/>
- * </xsd:complexType>
- */
-struct structdatatypeParser: parser
-{
- virtual void onStart(const XML_Char* el, const XML_Char** attr)
- {
- std::string element(el);
- parser* pp=&main_parser;
- if(element == "member")pp=&memberdataParser;
- XML_SetUserData(p,pp);
- sp.push(pp);
- pp->init();
- pp->pre();
- pp->buildAttr(attr);
- }
- virtual void onEnd(const char *el,parser* child)
- {
- std::string element(el);
- if(element == "member")member(((memberdatatypeParser*)child)->post());
- }
- virtual void pre ()
- {
- _membersStack.push_back(_members);
- _members="";
- }
- virtual void member (const std::string& d)
- {
- _members=_members+d;
- }
- virtual std::string post()
- {
- mincount("member",1);
- std::string value="<struct>"+_members+"</struct>";
- _members=_membersStack.back();
- _membersStack.pop_back();
- return value;
- }
- std::string _members;
- std::vector<std::string> _membersStack;
-};
-static structdatatypeParser structdataParser;
-
-/*! \brief Class for XML-RPC array parser.
- *
- * This class is used to parse XML data that describes a sequence in XML-RPC format
- * Its XML schema is:
- * <xsd:complexType name="ArrayType">
- * <xsd:element name="data" type="DataType" minOccurs="1" maxOccurs="1"/>
- * </xsd:complexType>
- */
-struct arraytypeParser: parser
-{
- virtual void onStart(const XML_Char* el, const XML_Char** attr)
- {
- std::string element(el);
- this->maxcount("data",1,element);
- parser* pp=&main_parser;
- if(element == "data")pp=&dataParser;
- XML_SetUserData(p,pp);
- sp.push(pp);
- pp->init();
- pp->pre();
- pp->buildAttr(attr);
- }
- virtual void onEnd(const char *el,parser* child)
- {
- std::string element(el);
- if(element == "data")data(((datatypeParser*)child)->post());
- }
- virtual void pre (){ }
- virtual void data (const std::string& d)
- {
- _arrays.push_back(d);
- }
- virtual std::string post()
- {
- mincount("data",1);
- std::string value="<array>"+_arrays.back()+"</array>";
- _arrays.pop_back();
- return value;
- }
- std::vector<std::string> _arrays;
-};
-static arraytypeParser arrayParser;
-
-
-void valuetypeParser::onStart(const XML_Char* el, const XML_Char** attr)
-{
- std::string element(el);
- parser* pp=&main_parser;
- this->maxcount("string",1,element);
- this->maxcount("objref",1,element);
- this->maxcount("double",1,element);
- this->maxcount("int",1,element);
- this->maxcount("boolean",1,element);
- this->maxcount("array",1,element);
- this->maxcount("struct",1,element);
- this->maxchoice(t4,1,element);
- if(element == "string")pp=&stringParser;
- else if(element == "objref")pp=&stringParser;
- else if(element == "double")pp=&doubleParser;
- else if(element == "int")pp=&intParser;
- else if(element == "boolean")pp=&boolParser;
- else if(element == "array")pp=&arrayParser;
- else if(element == "struct")pp=&structdataParser;
- XML_SetUserData(p,pp);
- sp.push(pp);
- pp->init();
- pp->pre();
- pp->buildAttr(attr);
-}
-
-void valuetypeParser::onEnd(const char *el,parser* child)
-{
- std::string element(el);
- if(element == "string")string(((stringtypeParser*)child)->post());
- else if(element == "objref")objref(((stringtypeParser*)child)->post());
- else if(element == "double")double_(((doubletypeParser*)child)->post());
- else if(element == "int")int_(((inttypeParser*)child)->post());
- else if(element == "boolean")boolean(((booltypeParser*)child)->post());
- else if(element == "array")array(((arraytypeParser*)child)->post());
- else if(element == "struct")struct_(((structdatatypeParser*)child)->post());
-}
-
-struct parametertypeParser: parser
-{
- virtual void onStart(const XML_Char* el, const XML_Char** attr)
- {
- std::string element(el);
- this->maxcount("tonode",1,element);
- this->maxcount("toport",1,element);
- this->maxcount("value",1,element);
- parser* pp=&main_parser;
- if(element == "tonode")pp=&stringParser;
- else if(element == "toport")pp=&stringParser;
- else if(element == "value")pp=&valueParser;
- XML_SetUserData(p,pp);
- sp.push(pp);
- pp->init();
- pp->pre();
- pp->buildAttr(attr);
- }
- virtual void onEnd(const char *el,parser* child)
- {
- std::string element(el);
- if(element == "tonode")tonode(((stringtypeParser*)child)->post());
- else if(element == "toport")toport(((stringtypeParser*)child)->post());
- else if(element == "value")value(((valuetypeParser*)child)->post());
- }
- virtual void pre (){}
- virtual void tonode (const std::string& name){
- _param._tonode=name;
- }
- virtual void toport (const std::string& name){
- _param._toport=name;
- }
- virtual void value (const std::string& name){
- _param._value=name;
- }
- virtual myparam& post(){
- mincount("tonode",1);
- mincount("toport",1);
- mincount("value",1);
- return _param;
- }
- myparam _param;
-};
-static parametertypeParser paramParser;
-
-static std::string t3[]={"inline","sinline","service","node","forloop","foreach","while","switch","bloc",""};
-
-struct casetypeParser:parser
-{
- void onStart(const XML_Char* el, const XML_Char** attr);
- void onEnd(const char *el,parser* child);
- virtual void buildAttr(const XML_Char** attr)
- {
- this->required("id",attr);
- for (int i = 0; attr[i]; i += 2)
- {
- if(std::string(attr[i]) == "id")id(atoi(attr[i+1]));
- }
- }
- virtual void pre ()
- {
- _cnode=0;
- _id=0;
- }
- virtual void id (const int& n)
- {
- DEBTRACE( "case_id: " << n )
- _id=n;
- //store this level id
- _idStack.push_back(_id);
- //store this level name
- std::stringstream temp;
- if (_id <0) temp << "m" << -_id << "_";
- else temp << "p" << _id << "_";
- std::string fullname=currentProc->names.back()+temp.str();
- DEBTRACE( "case_fullname: " << fullname )
- currentProc->names.push_back(fullname);
- }
- virtual void property (const myprop& prop)
- {
- DEBTRACE( "property_set: " << prop._name << prop._value )
- }
- virtual void inline_ (InlineNode* const& n)
- {
- _cnode=n;
- std::string fullname=currentProc->names.back()+ n->getName();
- currentProc->nodeMap[fullname]=n;
- currentProc->inlineMap[fullname]=n;
- }
- virtual void sinline (ServiceInlineNode* const& n)
- {
- _cnode=n;
- std::string fullname=currentProc->names.back()+ n->getName();
- currentProc->nodeMap[fullname]=n;
- currentProc->serviceMap[fullname]=n;
- }
- virtual void service (ServiceNode* const& n)
- {
- _cnode=n;
- std::string fullname=currentProc->names.back()+ n->getName();
- currentProc->nodeMap[fullname]=n;
- currentProc->serviceMap[fullname]=n;
- }
- virtual void node (InlineNode* const& n)
- {
- _cnode=n;
- std::string fullname=currentProc->names.back()+ n->getName();
- currentProc->nodeMap[fullname]=n;
- currentProc->inlineMap[fullname]=n;
- }
- virtual void forloop (ForLoop* const& n)
- {
- _cnode=n;
- std::string fullname=currentProc->names.back()+ n->getName();
- currentProc->nodeMap[fullname]=n;
- }
- virtual void foreach (ForEachLoop* const& n)
- {
- _cnode=n;
- std::string fullname=currentProc->names.back()+ n->getName();
- currentProc->nodeMap[fullname]=n;
- fullname += ".splitter";
- currentProc->nodeMap[fullname]=n->getChildByShortName("splitter");
- }
- virtual void while_ (WhileLoop* const& n)
- {
- _cnode=n;
- std::string fullname=currentProc->names.back()+ n->getName();
- currentProc->nodeMap[fullname]=n;
- }
- virtual void switch_ (Switch* const& n)
- {
- _cnode=n;
- std::string fullname=currentProc->names.back()+ n->getName();
- currentProc->nodeMap[fullname]=n;
- }
- virtual void bloc (Bloc* const& n)
- {
- _cnode=n;
- std::string fullname=currentProc->names.back()+ n->getName();
- currentProc->nodeMap[fullname]=n;
- }
- virtual std::pair<int,Node*> post()
- {
- DEBTRACE( "case_post" )
- minchoice(t3,1);
- //get back this level id
- _id=_idStack.back();
- _idStack.pop_back();
- //pop back this level name
- currentProc->names.pop_back();
- return std::pair<int,Node*>(_id,_cnode);
- }
- Node* _cnode;
- int _id;
- std::vector<int> _idStack;
-};
-static casetypeParser caseParser;
-
-struct defaultcasetypeParser:casetypeParser
-{
- virtual void buildAttr(const XML_Char** attr)
- {
- for (int i = 0; attr[i]; i += 2)
- {
- DEBTRACE( attr[i] << "=" << attr[i + 1] )
- }
- }
- virtual void pre ()
- {
- _id=0;
- _cnode=0;
- //store this level id
- _idStack.push_back(_id);
- //store this level name
- std::string fullname=currentProc->names.back()+"default_";
- DEBTRACE( "case_fullname: " << fullname )
- currentProc->names.push_back(fullname);
- }
-};
-static defaultcasetypeParser defaultcaseParser;
-
-struct switchtypeParser:parser
-{
- void onStart(const XML_Char* el, const XML_Char** attr);
- void onEnd(const char *el,parser* child);
- virtual void buildAttr(const XML_Char** attr)
- {
- this->required("name",attr);
- for (int i = 0; attr[i]; i += 2)
- {
- if(std::string(attr[i]) == "name")name(attr[i+1]);
- if(std::string(attr[i]) == "state")state(attr[i+1]);
- if(std::string(attr[i]) == "select")select(atoi(attr[i+1]));
- }
- }
- virtual void pre (){_state="";}
- virtual void case_ (const std::pair<int,Node*>& p)
- {
- Switch* s=_cnodes.back();
- s->edSetNode(p.first,p.second);
- }
- virtual void default_ (const std::pair<int,Node*>& p)
- {
- Switch* s=_cnodes.back();
- s->edSetDefaultNode(p.second);
- }
- virtual void name (const std::string& name)
- {
- Switch* s;
- std::string fullname=currentProc->names.back()+name;
- DEBTRACE( "switch_fullname: " << fullname )
- s=theRuntime->createSwitch(name);
- _cnodes.push_back(s);
- currentProc->names.push_back(fullname+'.');
- }
- virtual void state (const std::string& state)
- {
- //state is an attribute (no order). It can be defined before name
- //To be improved
- Switch* s=_cnodes.back();
- if(_state == "disabled")
- {
- DEBTRACE( "Switch disabled: " << s->getName())
- s->exDisabledState();
- }
- }
- virtual void select (const int& s)
- {
- //select is an attribute
- Switch* sw=_cnodes.back();
- InputPort *p=sw->edGetConditionPort();
- p->edInit(s);
- }
- virtual Switch* post ()
- {
- DEBTRACE( "switch_post: " )
- Switch* sw=_cnodes.back();
- //pop back current level name and node
- _cnodes.pop_back();
- currentProc->names.pop_back();
- return sw;
- }
- // stack to store switches in case of switch in switch
- std::vector<Switch *> _cnodes;
- std::string _state;
-};
-static switchtypeParser switchParser;
-
-template <class T=Loop*>
-struct looptypeParser:parser
-{
- void onStart(const XML_Char* el, const XML_Char** attr);
- void onEnd(const char *el,parser* child);
- virtual void buildAttr(const XML_Char** attr)
- {
- this->required("name",attr);
- for (int i = 0; attr[i]; i += 2)
- {
- if(std::string(attr[i]) == "name")name(attr[i+1]);
- if(std::string(attr[i]) == "state")state(attr[i+1]);
- }
- }
- virtual void pre ()
- {
- _state="";
- _cnode=0;
- }
- virtual void name (const std::string& name)
- {
- DEBTRACE( "bloc_name: " << name );
- }
- virtual void state (const std::string& name)
- {
- DEBTRACE( "bloc_state: " << name );
- _state=name;
- }
- virtual void property (const myprop& prop)
- {
- DEBTRACE( "property_set" << prop._name << prop._value );
- }
- virtual void inline_ (InlineNode* const& n)
- {
- DEBTRACE( "loop_inline" << n->getName() );
- _cnode->edSetNode(n);
- std::string fullname=currentProc->names.back()+ n->getName();
- currentProc->nodeMap[fullname]=n;
- currentProc->inlineMap[fullname]=n;
- }
- virtual void sinline (ServiceInlineNode* const& n)
- {
- DEBTRACE( "loop_sinline" << n->getName() )
- _cnode->edSetNode(n);
- std::string fullname=currentProc->names.back()+ n->getName();
- currentProc->nodeMap[fullname]=n;
- currentProc->serviceMap[fullname]=n;
- }
- virtual void service (ServiceNode* const& n)
- {
- DEBTRACE( "loop_service" << n->getName() )
- _cnode->edSetNode(n);
- std::string fullname=currentProc->names.back()+ n->getName();
- currentProc->nodeMap[fullname]=n;
- currentProc->serviceMap[fullname]=n;
- }
- virtual void node (InlineNode* const& n)
- {
- DEBTRACE( "loop_node" << n->getName() )
- _cnode->edSetNode(n);
- std::string fullname=currentProc->names.back()+ n->getName();
- currentProc->nodeMap[fullname]=n;
- currentProc->inlineMap[fullname]=n;
- }
- virtual void forloop (ForLoop* const& b)
- {
- DEBTRACE( "loop_forloop" << b->getName() )
- _cnode->edSetNode(b);
- std::string fullname=currentProc->names.back()+ b->getName();
- currentProc->nodeMap[fullname]=b;
- }
- virtual void foreach (ForEachLoop* const& b)
- {
- DEBTRACE("loop_foreach" << b->getName())
- _cnode->edSetNode(b);
- std::string fullname=currentProc->names.back()+ b->getName();
- currentProc->nodeMap[fullname]=b;
- fullname += ".splitter";
- currentProc->nodeMap[fullname]=b->getChildByShortName("splitter");
- }
- virtual void while_ (WhileLoop* const& b)
- {
- DEBTRACE( "loop_while: " << b->getName() )
- _cnode->edSetNode(b);
- std::string fullname=currentProc->names.back()+ b->getName();
- currentProc->nodeMap[fullname]=b;
- }
- virtual void switch_ (Switch* const& b)
- {
- DEBTRACE( "loop_switch: " << b->getName() )
- _cnode->edSetNode(b);
- std::string fullname=currentProc->names.back()+ b->getName();
- currentProc->nodeMap[fullname]=b;
- }
- virtual void bloc (Bloc* const& b)
- {
- DEBTRACE( "loop_bloc " << b->getName() )
- _cnode->edSetNode(b);
- std::string fullname=currentProc->names.back()+ b->getName();
- currentProc->nodeMap[fullname]=b;
- }
-
- virtual void datalink (const mylink& l)
- {
- DEBTRACE( "loop_datalink: " << l.fromnode() << l.fromport() << l.tonode() << l.toport())
- std::string msg;
-
- //Try only relative name for from node
- std::string fromname = currentProc->names.back()+l.fromnode();
- if(currentProc->nodeMap.count(fromname) == 0)
- {
- msg="from node " + l.fromnode() + " does not exist in data link: ";
- msg=msg+l.fromnode()+"("+l.fromport()+")->"+l.tonode()+"("+l.toport()+")";
- throw Exception(msg);
- }
- //Try relative name for to node and then absolute one
- std::string toname = currentProc->names.back()+l.tonode();
- if(currentProc->nodeMap.count(toname) == 0)
- {
- //It's not a relative name. Try an absolute one (I think it's not possible)
- toname=l.tonode();
- if(currentProc->nodeMap.count(toname) == 0)
- {
- // The TO node does not exist -> error
- msg="to node " + l.tonode() + " does not exist in data link: ";
- msg=msg+l.fromnode()+"("+l.fromport()+")->"+l.tonode()+"("+l.toport()+")";
- throw Exception(msg);
- }
- }
- // We only link local node and other nodes (relative or absolute name in this order)
- DEBTRACE(fromname <<":"<<l.fromport()<<toname<<":"<<l.toport());
- if (l.withControl())
- _cnode->edAddDFLink(currentProc->nodeMap[fromname]->getOutputPort(l.fromport()),
- currentProc->nodeMap[toname]->getInputPort(l.toport()));
- else
- _cnode->edAddLink(currentProc->nodeMap[fromname]->getOutputPort(l.fromport()),
- currentProc->nodeMap[toname]->getInputPort(l.toport()));
- }
-
- std::string _state;
- T _cnode;
- std::vector<T> _cnodes;
-};
-
-template <class T=ForLoop*>
-struct forlooptypeParser:looptypeParser<T>
-{
- virtual void buildAttr(const XML_Char** attr)
- {
- this->required("name",attr);
- for (int i = 0; attr[i]; i += 2)
- {
- if(std::string(attr[i]) == "name")name(attr[i+1]);
- if(std::string(attr[i]) == "state")this->state(attr[i+1]);
- if(std::string(attr[i]) == "nsteps")nsteps(atoi(attr[i+1]));
- }
- }
- virtual void name (const std::string& name)
- {
- DEBTRACE( "forloop_name: " << name );
- std::string fullname=currentProc->names.back()+name;
- this->_cnode=theRuntime->createForLoop(name);
- currentProc->nodeMap[fullname]=this->_cnode;
- this->_cnodes.push_back(this->_cnode);
- currentProc->names.push_back(fullname+'.');
- _nsteps=0;
- }
- virtual void nsteps (const int& n)
- {
- DEBTRACE( "forloop_nsteps: " << n )
- if(!this->_cnode)
- throw Exception("Node name must be defined before nsteps");
- InputPort *iNbTimes=this->_cnode->edGetNbOfTimesInputPort();
- iNbTimes->edInit(n);
- }
- virtual T post()
- {
- DEBTRACE( "forloop_post" )
- this->minchoice(t3,1);
- T b=this->_cnode;
- this->_cnodes.pop_back();
- currentProc->names.pop_back();
- this->_cnode=this->_cnodes.back();
- return b;
- }
- int _nsteps;
-};
-static forlooptypeParser<> forloopParser;
-
-template <class T=WhileLoop*>
-struct whilelooptypeParser:looptypeParser<T>
-{
- virtual void name (const std::string& name)
- {
- DEBTRACE( "while_name: " << name )
- std::string fullname=currentProc->names.back()+name;
- this->_cnode=theRuntime->createWhileLoop(name);
- currentProc->nodeMap[fullname]=this->_cnode;
- this->_cnodes.push_back(this->_cnode);
- currentProc->names.push_back(fullname+'.');
- }
- virtual T post()
- {
- DEBTRACE( "while_post" << this->_cnode->getName() )
- this->minchoice(t3,1);
- InputPort *cond=this->_cnode->edGetConditionPort();
- cond->edInit(true);
- T b=this->_cnode;
- this->_cnodes.pop_back();
- currentProc->names.pop_back();
- this->_cnode=this->_cnodes.back();
- return b;
- }
-};
-static whilelooptypeParser<> whileloopParser;
-
-template <class T=ForEachLoop*>
-struct foreachlooptypeParser:looptypeParser<T>
-{
- virtual void buildAttr(const XML_Char** attr)
- {
- this->required("name",attr);
- this->required("type",attr);
- for (int i = 0; attr[i]; i += 2)
- {
- if(std::string(attr[i]) == "name")name(attr[i+1]);
- if(std::string(attr[i]) == "state")this->state(attr[i+1]);
- if(std::string(attr[i]) == "nbranch")nbranch(atoi(attr[i+1]));
- if(std::string(attr[i]) == "type")datatype(attr[i+1]);
- }
- postAttr();
- }
- virtual void pre ()
- {
- _nbranch=0;
- this->looptypeParser<T>::pre();
- }
- virtual void name (const std::string& name)
- {
- DEBTRACE("foreach_name: " << name)
- _name=name;
- _fullname=currentProc->names.back()+name;
- }
- virtual void nbranch (const int& n)
- {
- DEBTRACE("foreach_nbranch: " << n )
- _nbranch=n;
- }
- virtual void datatype (const std::string& type)
- {
- DEBTRACE("foreach_datatype: "<< type)
- _datatype=type;
- }
- virtual void postAttr()
- {
- if(currentProc->typeMap.count(_datatype)==0)
- {
- std::stringstream msg;
- msg << "Type "<< _datatype <<" does not exist"<<" ("<<__FILE__<<":"<<__LINE__<< ")";
- throw Exception(msg.str());
- }
- this->_cnode=theRuntime->createForEachLoop(_name,currentProc->typeMap[_datatype]);
- //set number of branches
- if(_nbranch > 0)this->_cnode->edGetNbOfBranchesPort()->edInit(_nbranch);
- this->_cnodes.push_back(this->_cnode);
- currentProc->names.push_back(_fullname + '.');
- }
- virtual T post()
- {
- DEBTRACE("foreach_post" << this->_cnode->getName())
- this->minchoice(t3,1);
- T b=this->_cnode;
- this->_cnodes.pop_back();
- currentProc->names.pop_back();
- if(this->_cnodes.size() == 0)
- this->_cnode=0;
- else
- this->_cnode=this->_cnodes.back();
- return b;
- }
- int _nbranch;
- std::string _fullname;
- std::string _name;
- std::string _datatype;
-};
-static foreachlooptypeParser<> foreachloopParser;
-
-template <class T=Bloc*>
-struct bloctypeParser:parser
-{
- bloctypeParser():parser()
- {
- _orders["property"]=0;
- _orders["inline"]=2;
- _orders["service"]=2;
- _orders["sinline"]=2;
- _orders["node"]=2;
- _orders["forloop"]=2;
- _orders["foreach"]=2;
- _orders["while"]=2;
- _orders["switch"]=2;
- _orders["bloc"]=2;
- _orders["control"]=3;
- _orders["datalink"]=3;
- _orders["stream"]=3;
- _orders["parameter"]=3;
- }
- virtual void onStart(const XML_Char* el, const XML_Char** attr);
- virtual void onEnd(const char *el,parser* child);
- virtual void buildAttr(const XML_Char** attr)
- {
- this->required("name",attr);
- for (int i = 0; attr[i]; i += 2)
- {
- if(std::string(attr[i]) == "name")name(attr[i+1]);
- if(std::string(attr[i]) == "state")state(attr[i+1]);
- }
- }
- void name (const std::string& name)
- {
- }
- virtual void state (const std::string& name){
- DEBTRACE( "bloc_state: " << name )
- _state=name;
- if(_state == "disabled")
- {
- DEBTRACE( "Bloc disabled: " << _bloc->getName())
- _bloc->exDisabledState();
- }
- }
- virtual void property (const myprop& prop)
- {
- DEBTRACE( "property_set: " << prop._name << prop._value )
- _bloc->setProperty(prop._name,prop._value);
- }
- virtual void inline_ (InlineNode* const& n)
- {
- DEBTRACE( "bloc_pynode_set: " << n->getName() )
- _bloc->edAddChild(n);
- std::string fullname = currentProc->names.back()+n->getName();
- currentProc->nodeMap[fullname]=n;
- currentProc->inlineMap[fullname]=n;
- }
- virtual void sinline (ServiceInlineNode* const& n)
- {
- DEBTRACE( "bloc_sinline: " << n->getName() )
- _bloc->edAddChild(n);
- std::string fullname = currentProc->names.back()+n->getName();
- currentProc->nodeMap[fullname]=n;
- currentProc->serviceMap[fullname]=n;
- }
- virtual void service (ServiceNode* const& n)
- {
- DEBTRACE( "bloc_service_set: " << n->getName() )
- _bloc->edAddChild(n);
- std::string fullname = currentProc->names.back()+n->getName();
- currentProc->nodeMap[fullname]=n;
- currentProc->serviceMap[fullname]=n;
- }
- virtual void node (InlineNode* const& n)
- {
- DEBTRACE( "bloc_node_set: " << n->getName() )
- _bloc->edAddChild(n);
- std::string fullname = currentProc->names.back()+n->getName();
- DEBTRACE( "bloc_node_set fullname = " << fullname )
- currentProc->nodeMap[fullname]=n;
- currentProc->inlineMap[fullname]=n;
- }
- virtual void forloop (ForLoop* const& b)
- {
- DEBTRACE( "bloc_forloop_set: " << b->getName() )
- _bloc->edAddChild(b);
- std::string fullname = currentProc->names.back()+b->getName();
- currentProc->nodeMap[fullname]=b;
- }
- virtual void foreach (ForEachLoop* const& b)
- {
- DEBTRACE( "bloc_foreach_set: " << b->getName() )
- _bloc->edAddChild(b);
- std::string fullname = currentProc->names.back()+b->getName();
- currentProc->nodeMap[fullname]=b;
- fullname += ".splitter";
- currentProc->nodeMap[fullname]=b->getChildByShortName("splitter");
- }
- virtual void while_ (WhileLoop* const& b)
- {
- DEBTRACE( "bloc_while_set: " << b->getName() )
- _bloc->edAddChild(b);
- std::string fullname = currentProc->names.back()+b->getName();
- currentProc->nodeMap[fullname]=b;
- }
- virtual void switch_ (Switch* const& b)
- {
- DEBTRACE( "bloc_switch_set: " << b->getName() )
- _bloc->edAddChild(b);
- std::string fullname = currentProc->names.back()+b->getName();
- currentProc->nodeMap[fullname]=b;
- }
- virtual void bloc (Bloc* const& b)
- {
- DEBTRACE( "bloc_bloc_set: " << b->getName() )
- _bloc->edAddChild(b);
- std::string fullname=currentProc->names.back()+ b->getName();
- currentProc->nodeMap[fullname]=b;
- }
- virtual void control (const mycontrol& l)
- {
- DEBTRACE( "bloc_control_set: " << l.fromnode() << " "<< l.tonode() )
- std::string msg;
-
- if(currentProc->nodeMap.count(currentProc->names.back()+l.fromnode()) == 0)
- {
- msg="from node " + l.fromnode() + " does not exist in control link: ";
- msg=msg+l.fromnode()+"->"+l.tonode();
- msg=msg+ " context: "+currentProc->names.back();
- throw Exception(msg);
- }
- if(currentProc->nodeMap.count(currentProc->names.back()+l.tonode()) == 0)
- {
- msg="to node " + l.tonode() + " does not exist in control link: ";
- msg=msg+l.fromnode()+"->"+l.tonode();
- msg=msg+ " context: "+currentProc->names.back();
- throw Exception(msg);
- }
- // We only link local nodes
- _bloc->edAddCFLink(currentProc->nodeMap[currentProc->names.back()+l.fromnode()],
- currentProc->nodeMap[currentProc->names.back()+l.tonode()]);
- }
- virtual void datalink (const mylink& l)
- {
- DEBTRACE( "bloc_datalink_set: "<<l.fromnode()<<"("<<l.fromport()<<")->"<<l.tonode()<<"("<<l.toport()<<")")
- std::string msg;
-
- //Try only relative name for from node
- std::string fromname = currentProc->names.back()+l.fromnode();
- if(currentProc->nodeMap.count(fromname) == 0)
- {
- msg="from node " + l.fromnode() + " does not exist in data link: ";
- msg=msg+l.fromnode()+"("+l.fromport()+")->"+l.tonode()+"("+l.toport()+")";
- throw Exception(msg);
- }
- //Try relative name for to node and then absolute one
- std::string toname = currentProc->names.back()+l.tonode();
- if(currentProc->nodeMap.count(toname) == 0)
- {
- //It's not a relative name. Try an absolute one (I think it's not possible)
- toname=l.tonode();
- if(currentProc->nodeMap.count(toname) == 0)
- {
- // The TO node does not exist -> error
- msg="to node " + l.tonode() + " does not exist in data link: ";
- msg=msg+l.fromnode()+"("+l.fromport()+")->"+l.tonode()+"("+l.toport()+")";
- throw Exception(msg);
- }
- }
- // We only link local node and other nodes (relative or absolute name in this order)
- DEBTRACE(fromname <<":"<<l.fromport()<<toname<<":"<<l.toport())
- if (l.withControl())
- _bloc->edAddDFLink(currentProc->nodeMap[fromname]->getOutputPort(l.fromport()),
- currentProc->nodeMap[toname]->getInputPort(l.toport()));
- else
- _bloc->edAddLink(currentProc->nodeMap[fromname]->getOutputPort(l.fromport()),
- currentProc->nodeMap[toname]->getInputPort(l.toport()));
- }
- virtual void stream (const mystream& l)
- {
- DEBTRACE( "bloc_stream_set: " << l.fromnode() << l.fromport() << l.tonode() << l.toport() )
- std::string msg;
- std::string fromname = currentProc->names.back()+l.fromnode();
- std::string toname = currentProc->names.back()+l.tonode();
- //only relative names
- if(currentProc->nodeMap.count(fromname) == 0)
- {
- msg="from node " + l.fromnode() + " does not exist in stream link: ";
- msg=msg+l.fromnode()+"("+l.fromport()+")->"+l.tonode()+"("+l.toport()+")";
- throw Exception(msg);
- }
- if(currentProc->nodeMap.count(toname) == 0)
- {
- msg="to node " + l.tonode() + " does not exist in stream link: ";
- msg=msg+l.fromnode()+"("+l.fromport()+")->"+l.tonode()+"("+l.toport()+")";
- throw Exception(msg);
- }
- OutputDataStreamPort* pout=currentProc->nodeMap[fromname]->getOutputDataStreamPort(l.fromport());
- InputDataStreamPort* pin=currentProc->nodeMap[toname]->getInputDataStreamPort(l.toport());
- _bloc->edAddLink(pout,pin);
- // Set all properties for this link
- std::map<std::string, std::string>::const_iterator pt;
- for(pt=l._props.begin();pt!=l._props.end();pt++)
- {
- pin->setProperty((*pt).first,(*pt).second);
- pout->setProperty((*pt).first,(*pt).second);
- }
- }
- virtual void parameter (const myparam& p)
- {
- DEBTRACE( "++++++++++++++++++++Parameter+++++++++++++++++++++" )
- std::string msg;
- std::string toname = currentProc->names.back()+p._tonode;
- if(currentProc->nodeMap.count(toname) == 0)
- {
- msg="to node " + p._tonode + " does not exist in parameter: ";
- msg=msg+"->"+p._tonode+"("+p._toport+")";
- throw Exception(msg);
- }
- InputPort* inport=currentProc->nodeMap[toname]->getInputPort(p._toport);
- //We don't know the parameter type. So we try to initialize the port
- //with the value. If it's not the right type, edInit throws an exception
- //std::cerr << "----------------------------- " << p.value.c_str() << std::endl;
- inport->edInit("XML",p._value.c_str());
- DEBTRACE( "++++++++++++++++++++End parameter+++++++++++++++++++++" )
- }
- T post()
- {
- DEBTRACE( "bloc_post" )
- currentProc->names.pop_back();
- T b=_bloc;
- _blocs.pop_back();
- if(_blocs.empty())
- _bloc=NULL;
- else
- _bloc=_blocs.back();
- return b;
- }
- T _bloc;
- std::string _state;
- std::vector<Bloc *> _blocs;
-};
-static bloctypeParser<> blocParser;
-
-template <>
-void bloctypeParser<Bloc*>::name (const std::string& name)
-{
- DEBTRACE( "bloc_name: " << name )
- std::string fullname=currentProc->names.back()+name;
- _bloc=theRuntime->createBloc(name);
- _blocs.push_back(_bloc);
- currentProc->names.push_back(fullname+'.');
-}
-
-void switchtypeParser::onStart(const XML_Char* el, const XML_Char** attr)
-{
- DEBTRACE( "switchtypeParser::onStart: " << el )
- std::string element(el);
- this->maxcount("default",1,element);
- parser* pp=&main_parser;
- if(element == "case")pp=&caseParser;
- else if(element == "default")pp=&defaultcaseParser;
- XML_SetUserData(p,pp);
- sp.push(pp);
- pp->init();
- pp->pre();
- pp->buildAttr(attr);
-}
-void switchtypeParser::onEnd(const char *el,parser* child)
-{
- DEBTRACE( "switchtypeParser::onEnd: " << el )
- std::string element(el);
- if(element == "case")case_(((casetypeParser*)child)->post());
- else if(element == "default")default_(((defaultcasetypeParser*)child)->post());
-}
-
-
-void casetypeParser::onStart(const XML_Char* el, const XML_Char** attr)
-{
- DEBTRACE( "casetypeParser::onStart: " << el )
- std::string element(el);
- this->maxcount("inline",1,element);
- this->maxcount("sinline",1,element);
- this->maxcount("service",1,element);
- this->maxcount("node",1,element);
- this->maxcount("forloop",1,element);
- this->maxcount("foreach",1,element);
- this->maxcount("while",1,element);
- this->maxcount("switch",1,element);
- this->maxcount("bloc",1,element);
- this->maxchoice(t3,1,element);
- parser* pp=&main_parser;
- if(element == "property")pp=&propertyParser;
- else if(element == "inline")pp=&inlineParser;
- else if(element == "sinline")pp=&sinlineParser;
- else if(element == "service")pp=&serviceParser;
- else if(element == "node")pp=&nodeParser;
- else if(element == "forloop")pp=&forloopParser;
- else if(element == "foreach")pp=&foreachloopParser;
- else if(element == "while")pp=&whileloopParser;
- else if(element == "switch")pp=&switchParser;
- else if(element == "bloc")pp=&blocParser;
- XML_SetUserData(p,pp);
- sp.push(pp);
- pp->init();
- pp->pre();
- pp->buildAttr(attr);
-}
-
-void casetypeParser::onEnd(const char *el,parser* child)
-{
- DEBTRACE( "casetypeParser::onEnd: " << el )
- std::string element(el);
- if(element == "property")property(((propertytypeParser*)child)->post());
- else if(element == "inline")inline_(((inlinetypeParser<>*)child)->post());
- else if(element == "sinline")sinline(((sinlinetypeParser<>*)child)->post());
- else if(element == "service")service(((servicetypeParser<>*)child)->post());
- else if(element == "node")node(((nodetypeParser<>*)child)->post());
- else if(element == "forloop")forloop(((forlooptypeParser<>*)child)->post());
- else if(element == "foreach")foreach(((foreachlooptypeParser<>*)child)->post());
- else if(element == "while")while_(((whilelooptypeParser<>*)child)->post());
- else if(element == "switch")switch_(((switchtypeParser*)child)->post());
- else if(element == "bloc")bloc(((bloctypeParser<>*)child)->post());
-}
-
-template <class T>
-void looptypeParser<T>::onStart(const XML_Char* el, const XML_Char** attr)
-{
- DEBTRACE( "looptypeParser::onStart: " << el )
- std::string element(el);
- this->maxcount("inline",1,element);
- this->maxcount("sinline",1,element);
- this->maxcount("service",1,element);
- this->maxcount("node",1,element);
- this->maxcount("forloop",1,element);
- this->maxcount("foreach",1,element);
- this->maxcount("while",1,element);
- this->maxcount("switch",1,element);
- this->maxcount("bloc",1,element);
- this->maxchoice(t3,1,element);
- parser* pp=&main_parser;
- if(element == "property")pp=&propertyParser;
- else if(element == "inline")pp=&inlineParser;
- else if(element == "sinline")pp=&sinlineParser;
- else if(element == "service")pp=&serviceParser;
- else if(element == "node")pp=&nodeParser;
- else if(element == "forloop")pp=&forloopParser;
- else if(element == "foreach")pp=&foreachloopParser;
- else if(element == "while")pp=&whileloopParser;
- else if(element == "switch")pp=&switchParser;
- else if(element == "bloc")pp=&blocParser;
- else if(element == "datalink")pp=&linkParser;
- XML_SetUserData(p,pp);
- sp.push(pp);
- pp->init();
- pp->pre();
- pp->buildAttr(attr);
-}
-template <class T>
-void looptypeParser<T>::onEnd(const char *el,parser* child)
-{
- DEBTRACE( "looptypeParser::onEnd: " << el )
- std::string element(el);
- if(element == "property")property(((propertytypeParser*)child)->post());
- else if(element == "inline")inline_(((inlinetypeParser<>*)child)->post());
- else if(element == "sinline")sinline(((sinlinetypeParser<>*)child)->post());
- else if(element == "service")service(((servicetypeParser<>*)child)->post());
- else if(element == "node")node(((nodetypeParser<>*)child)->post());
- else if(element == "forloop")forloop(((forlooptypeParser<>*)child)->post());
- else if(element == "foreach")foreach(((foreachlooptypeParser<>*)child)->post());
- else if(element == "while")while_(((whilelooptypeParser<>*)child)->post());
- else if(element == "switch")switch_(((switchtypeParser*)child)->post());
- else if(element == "bloc")bloc(((bloctypeParser<>*)child)->post());
- else if(element == "datalink") datalink(((linktypeParser<>*)child)->post());
-}
-
-template <class T>
-void bloctypeParser<T>::onStart(const XML_Char* el, const XML_Char** attr)
-{
- DEBTRACE( "bloctypeParser::onStart: " << el )
- std::string element(el);
- checkOrder(element);
- parser* pp=&main_parser;
- if(element == "property")pp=&propertyParser;
- else if(element == "inline")pp=&inlineParser;
- else if(element == "sinline")pp=&sinlineParser;
- else if(element == "service")pp=&serviceParser;
- else if(element == "node")pp=&nodeParser;
- else if(element == "forloop")pp=&forloopParser;
- else if(element == "foreach")pp=&foreachloopParser;
- else if(element == "while")pp=&whileloopParser;
- else if(element == "switch")pp=&switchParser;
- else if(element == "bloc")pp=&blocParser;
- else if(element == "control")pp=&controlParser;
- else if(element == "datalink")pp=&linkParser;
- else if(element == "stream")pp=&streamParser;
- else if(element == "parameter")pp=¶mParser;
- XML_SetUserData(p,pp);
- sp.push(pp);
- pp->init();
- pp->pre();
- pp->buildAttr(attr);
-}
-template <class T>
-void bloctypeParser<T>::onEnd(const char *el,parser* child)
-{
- DEBTRACE( "bloctypeParser::onEnd: " << el )
- std::string element(el);
- if(element == "property")property(((propertytypeParser*)child)->post());
- else if(element == "inline")inline_(((inlinetypeParser<>*)child)->post());
- else if(element == "sinline")sinline(((sinlinetypeParser<>*)child)->post());
- else if(element == "service")service(((servicetypeParser<>*)child)->post());
- else if(element == "node")node(((nodetypeParser<>*)child)->post());
- else if(element == "forloop")forloop(((forlooptypeParser<>*)child)->post());
- else if(element == "foreach")foreach(((foreachlooptypeParser<>*)child)->post());
- else if(element == "while")while_(((whilelooptypeParser<>*)child)->post());
- else if(element == "switch")switch_(((switchtypeParser*)child)->post());
- else if(element == "bloc")bloc(((bloctypeParser<>*)child)->post());
- else if(element == "control") control(((controltypeParser<>*)child)->post());
- else if(element == "datalink") datalink(((linktypeParser<>*)child)->post());
- else if(element == "stream") stream(((streamtypeParser<>*)child)->post());
- else if(element == "parameter") parameter(((parametertypeParser*)child)->post());
-}
-
-template <class T=Proc*>
-struct proctypeParser:bloctypeParser<T>
-{
- proctypeParser():bloctypeParser<T>()
- {
- this->_orders["type"]=1;
- this->_orders["sequence"]=1;
- this->_orders["objref"]=1;
- }
- void onStart(const XML_Char* el, const XML_Char** attr)
- {
- DEBTRACE( "proctypeParser::onStart: " << el )
- std::string element(el);
- this->checkOrder(element);
- parser* pp=&main_parser;
- if(element == "property")pp=&propertyParser;
- else if(element == "type")pp=&typeParser;
- else if(element == "sequence")pp=&seqParser;
- else if(element == "objref")pp=&objParser;
- else if(element == "struct")pp=&structParser;
- else if(element == "container")pp=&containerParser;
- else if(element == "inline")pp=&inlineParser;
- else if(element == "sinline")pp=&sinlineParser;
- else if(element == "service")pp=&serviceParser;
- else if(element == "node")pp=&nodeParser;
- else if(element == "forloop")pp=&forloopParser;
- else if(element == "foreach")pp=&foreachloopParser;
- else if(element == "while")pp=&whileloopParser;
- else if(element == "switch")pp=&switchParser;
- else if(element == "bloc")pp=&blocParser;
- else if(element == "control")pp=&controlParser;
- else if(element == "datalink")pp=&linkParser;
- else if(element == "stream")pp=&streamParser;
- else if(element == "parameter")pp=¶mParser;
- else
- {
- // OCC: san -- Allow external parsers for handling of unknown elements
- // and attributes. This capability is used by YACS GUI to read
- // graph presentation data
- if ( this->_defaultParsersMap )
- {
- if((this->_defaultParsersMap)->count(element) != 0)
- {
- pp=(*(this->_defaultParsersMap))[element];
- }
- else
- {
- std::cerr << "There is no parser for this element type. It will be ignored!" << std::endl;
- }
- }
- }
- XML_SetUserData(p,pp);
- sp.push(pp);
- pp->init();
- pp->pre();
- pp->buildAttr(attr);
- }
- virtual void onEnd(const char *el,parser* child)
- {
- DEBTRACE( "proctypeParser::onEnd: " << el )
- std::string element(el);
- if(element == "property")this->property(((propertytypeParser*)child)->post());
- else if(element == "type")type(((typetypeParser*)child)->post());
- else if(element == "sequence")sequence(((seqtypeParser*)child)->post());
- else if(element == "objref")objref(((objtypeParser*)child)->post());
- else if(element == "struct")struct_(((structtypeParser*)child)->post());
- else if(element == "container")container(((containertypeParser*)child)->post());
- else if(element == "inline")this->inline_(((inlinetypeParser<>*)child)->post());
- else if(element == "sinline")this->sinline(((sinlinetypeParser<>*)child)->post());
- else if(element == "service")this->service(((servicetypeParser<>*)child)->post());
- else if(element == "node")this->node(((nodetypeParser<>*)child)->post());
- else if(element == "forloop")this->forloop(((forlooptypeParser<>*)child)->post());
- else if(element == "foreach")this->foreach(((foreachlooptypeParser<>*)child)->post());
- else if(element == "while")this->while_(((whilelooptypeParser<>*)child)->post());
- else if(element == "switch")this->switch_(((switchtypeParser*)child)->post());
- else if(element == "bloc")this->bloc(((bloctypeParser<>*)child)->post());
- else if(element == "control") this->control(((controltypeParser<>*)child)->post());
- else if(element == "datalink") this->datalink(((linktypeParser<>*)child)->post());
- else if(element == "stream") this->stream(((streamtypeParser<>*)child)->post());
- else if(element == "parameter") this->parameter(((parametertypeParser*)child)->post());
- }
- virtual void buildAttr(const XML_Char** attr)
- {
- for (int i = 0; attr[i]; i += 2)
- {
- if(std::string(attr[i]) == "state")this->state(attr[i+1]);
- }
- }
- virtual void pre ()
- {
- std::string name("proc");
- currentProc=theRuntime->createProc(name);
- this->_bloc=currentProc;
- currentProc->names.push_back("");
- }
- virtual void type (const mytype& t)
- {
- DEBTRACE( "type_set" )
- currentProc->typeMap[t._name]=currentProc->createType(t._name,t._kind);
- }
- virtual void sequence (TypeCode* const& t)
- {
- DEBTRACE( "sequence_set" )
- currentProc->typeMap[t->name()]=t;
- }
- virtual void objref (TypeCode* const& t)
- {
- DEBTRACE( "objref_set" )
- currentProc->typeMap[t->name()]=t;
- }
- virtual void struct_ (TypeCode* const& t)
- {
- DEBTRACE( "struct_set" )
- currentProc->typeMap[t->name()]=t;
- }
- virtual void container (const mycontainer& t)
- {
- DEBTRACE( "container_set: " << t._name )
- std::vector<machine>::const_iterator iter;
- for(iter=t._machs.begin();iter!=t._machs.end();iter++)
- {
- DEBTRACE( "machine name: " << (*iter)._name )
- }
-
- if(currentProc->containerMap.count(t._name) == 0)
- {
- YACS::ENGINE::Container* cont=theRuntime->createContainer();
- // Set all properties for this container
- std::map<std::string, std::string>::const_iterator pt;
- for(pt=t._props.begin();pt!=t._props.end();pt++)
- cont->setProperty((*pt).first,(*pt).second);
- currentProc->containerMap[t._name]=cont;
- }
- else
- {
- std::cerr << "Warning: container " << t._name << " already defined. It will be ignored" << std::endl;
- }
- }
-
- T post(){return this->_bloc;}
-};
-static proctypeParser<> procParser;
-
-struct roottypeParser:parser
-{
- void onStart(const XML_Char* el, const XML_Char** attr)
- {
- DEBTRACE( "roottypeParser::onStart: " << el )
- std::string element(el);
- parser* pp=&main_parser;
- if(element == "proc")pp=&procParser;
- XML_SetUserData(p,pp);
- sp.push(pp);
- pp->init();
- pp->pre();
- pp->buildAttr(attr);
- }
- virtual void onEnd(const char *el,parser* child)
- {
- DEBTRACE( "roottypeParser::onEnd: " << el )
- std::string element(el);
- if(element == "proc")proc(((proctypeParser<>*)child)->post());
- }
- virtual void proc (Proc* const& b)
- {
- DEBTRACE( "root_proc_set" << b->getName() )
- _proc=b;
- }
- Proc* _proc;
-};
-static roottypeParser rootParser;
-
-YACSLoader::YACSLoader()
-{
- theRuntime = getRuntime();
-}
-
-Proc* YACSLoader::load(const char * file)
-{
- FILE* fin=fopen(file,"r");
- if (! fin)
- {
- std::cerr << "Couldn't open schema file" << std::endl;
- throw std::invalid_argument("Couldn't open schema file");
- //throw Exception("Couldn't open schema file");
- }
-
- p = XML_ParserCreate(NULL);
- if (! p)
- {
- std::cerr << "Couldn't allocate memory for parser" << std::endl;
- throw Exception("Couldn't allocate memory for parser");
- }
- XML_SetElementHandler(p, parser::start,parser::end);
- XML_SetCharacterDataHandler(p,parser::charac );
- XML_SetUserData(p,&rootParser);
- sp.push(&rootParser);
- // OCC: san -- Allow external parsers for handling of unknown elements
- // and attributes. This capability is used by YACS GUI to read
- // graph presentation data
- if ( !_defaultParsersMap.empty() )
- procParser._defaultParsersMap = &_defaultParsersMap;
-
- try
- {
- for (;;)
- {
- int done;
- int len;
-
- len = fread(Buff, 1, BUFFSIZE, fin);
- if (ferror(fin))
- {
- std::cerr << "Read error" << std::endl;
- throw Exception("Read error");
- }
- done = feof(fin);
-
- if (XML_Parse(p, Buff, len, done) == XML_STATUS_ERROR)
- {
- throw Exception(XML_ErrorString(XML_GetErrorCode(p)));
- }
-
- if (done)
- break;
- }
- XML_ParserFree (p);
- p=0;
- return rootParser._proc;
- }
- catch(Exception& e)
- {
- //get line number from XML parser
- std::cerr << "Error at line: " << XML_GetCurrentLineNumber(p) << std::endl;
- delete currentProc;
- currentProc=0;
- throw e;
- }
-}
-
-YACSLoader::~YACSLoader()
-{
}