2 #include "typeParsers.hxx"
3 #include "dataParsers.hxx"
4 #include "Exception.hxx"
11 #include "YacsTrace.hxx"
13 extern YACS::ENGINE::Proc* currentProc;
14 extern YACS::ENGINE::Runtime* theRuntime;
18 typetypeParser typetypeParser::typeParser;
19 seqtypeParser seqtypeParser::seqParser;
20 objtypeParser objtypeParser::objParser;
21 structtypeParser structtypeParser::structParser;
22 membertypeParser membertypeParser::memberParser;
24 void typetypeParser::buildAttr(const XML_Char** attr)
26 required("name",attr);
27 required("kind",attr);
28 for (int i = 0; attr[i]; i += 2)
30 if(std::string(attr[i]) == "name")name(attr[i+1]);
31 if(std::string(attr[i]) == "kind")kind(attr[i+1]);
34 void typetypeParser::pre (){}
35 void typetypeParser::name(const std::string& name)
37 DEBTRACE( "type_name: " << name )
40 void typetypeParser::kind(const std::string& name)
42 DEBTRACE( "type_kind: " << name )
45 mytype typetypeParser::post()
47 DEBTRACE( "type_post" )
54 void seqtypeParser::onStart(const XML_Char* el, const XML_Char** attr)
56 DEBTRACE( "seqtypeParser::onStart: " << el )
57 parser* pp=&parser::main_parser;
58 SetUserDataAndPush(pp);
63 void seqtypeParser::onEnd(const char *el,parser* child)
65 DEBTRACE( "seqtypeParser::onEnd: " << el )
67 void seqtypeParser::buildAttr(const XML_Char** attr)
69 required("name",attr);
70 required("content",attr);
71 for (int i = 0; attr[i]; i += 2)
73 if(std::string(attr[i]) == "name")name(attr[i+1]);
74 if(std::string(attr[i]) == "content")content(attr[i+1]);
77 void seqtypeParser::name(const std::string& name)
79 DEBTRACE( "seqtype_name: " << name )
82 void seqtypeParser::content(const std::string& name)
84 DEBTRACE( "seqtype_content: " << name )
85 if(currentProc->typeMap.count(name)==0)
87 //Check if the typecode is defined in the runtime
88 YACS::ENGINE::TypeCode* t=theRuntime->getTypeCode(name);
91 std::stringstream msg;
92 msg << "Type " << name << " does not exist" << " (" <<__FILE__ << ":" << __LINE__ << ")";
93 throw Exception(msg.str());
97 currentProc->typeMap[name]=t;
101 _contentType=currentProc->typeMap[name];
104 ENGINE::TypeCode* seqtypeParser::post()
106 DEBTRACE( "seqtype_post" )
107 ENGINE::TypeCode *t = currentProc->createSequenceTc(_name,_name,_contentType);
111 void objtypeParser::onStart(const XML_Char* el, const XML_Char** attr)
113 DEBTRACE( "objtypeParser::onStart: " << el )
114 std::string element(el);
115 parser* pp=&parser::main_parser;
116 if(element == "base")pp=&stringtypeParser::stringParser;
117 SetUserDataAndPush(pp);
122 void objtypeParser::onEnd(const char *el,parser* child)
124 DEBTRACE( "objtypeParser::onEnd: " << el )
125 std::string element(el);
126 if(element == "base")base(((stringtypeParser*)child)->post());
128 void objtypeParser::buildAttr(const XML_Char** attr)
130 required("name",attr);
131 for (int i = 0; attr[i]; i += 2)
133 if(std::string(attr[i]) == "name")name(attr[i+1]);
134 if(std::string(attr[i]) == "id")id(attr[i+1]);
137 void objtypeParser::pre ()
142 void objtypeParser::name(const std::string& name)
144 DEBTRACE( "objtype_name: " << name )
147 void objtypeParser::id(const std::string& name)
149 DEBTRACE( "objtype_id: " << name )
152 void objtypeParser::base(const std::string& name)
154 DEBTRACE( "base_name: " << name )
155 if(currentProc->typeMap.count(name)==0)
157 //Check if the typecode is defined in the runtime
158 YACS::ENGINE::TypeCode* t=theRuntime->getTypeCode(name);
161 std::stringstream msg;
162 msg << "Type " << name << " does not exist" << " (" <<__FILE__ << ":" << __LINE__ << ")";
163 throw Exception(msg.str());
167 currentProc->typeMap[name]=t;
171 if(currentProc->typeMap[name]->kind() != ENGINE::Objref)
173 std::stringstream msg;
174 msg << "Type " << name << " is not an objref" ;
175 msg << " (" <<__FILE__ << ":" << __LINE__ << ")";
176 throw Exception(msg.str());
178 _ltc.push_back((ENGINE::TypeCodeObjref *)currentProc->typeMap[name]);
180 ENGINE::TypeCode * objtypeParser::post()
182 DEBTRACE( "objtype_post" )
183 ENGINE::TypeCode *t = currentProc->createInterfaceTc(_id,_name,_ltc);
187 void membertypeParser::buildAttr(const XML_Char** attr)
189 required("name",attr);
190 required("type",attr);
191 for (int i = 0; attr[i]; i += 2)
193 if(std::string(attr[i]) == "name")name(attr[i+1]);
194 if(std::string(attr[i]) == "type")type(attr[i+1]);
197 void membertypeParser::name(const std::string& name){ _prop._name=name; }
198 void membertypeParser::type(const std::string& name){ _prop._value=name; }
199 myprop membertypeParser::post(){return _prop;}
201 void structtypeParser::onStart(const XML_Char* el, const XML_Char** attr)
203 DEBTRACE( "structtypeParser::onStart: " << el )
204 std::string element(el);
205 parser* pp=&parser::main_parser;
206 if(element == "member")pp=&membertypeParser::memberParser;
207 SetUserDataAndPush(pp);
212 void structtypeParser::onEnd(const char *el,parser* child)
214 DEBTRACE( "structtypeParser::onEnd: " << el )
215 std::string element(el);
216 if(element == "member")member(((membertypeParser*)child)->post());
218 void structtypeParser::buildAttr(const XML_Char** attr)
220 required("name",attr);
221 for (int i = 0; attr[i]; i += 2)
223 if(std::string(attr[i]) == "name")name(attr[i+1]);
224 if(std::string(attr[i]) == "id")id(attr[i+1]);
227 void structtypeParser::pre ()
232 void structtypeParser::name(const std::string& name)
234 DEBTRACE( "structtype_name: " << name );
237 void structtypeParser::id(const std::string& name)
239 DEBTRACE( "structtype_id: " << name );
242 void structtypeParser::member (const myprop& prop)
244 DEBTRACE( "structtype_member: " << prop._name << prop._value );
245 if(currentProc->typeMap.count(prop._value)==0)
247 //Check if the typecode is defined in the runtime
248 YACS::ENGINE::TypeCode* t=theRuntime->getTypeCode(prop._value);
251 std::string msg="Unknown type " + prop._value + " for member " + prop._name + " in struct " + _name;
252 throw Exception(msg);
256 currentProc->typeMap[prop._value]=t;
261 _members.push_back(prop);
263 ENGINE::TypeCode * structtypeParser::post()
265 DEBTRACE( "structtype_post" );
266 ENGINE::TypeCodeStruct *t;
267 if(currentProc->typeMap.count(_name)!=0)
269 //reuse a forward declaration
270 ENGINE::TypeCode* tt=currentProc->typeMap[_name];
271 if(tt->kind()==YACS::ENGINE::Struct)
273 t=(ENGINE::TypeCodeStruct*)tt;
277 std::string msg="Forward declaration must be a struct type but " + std::string(tt->name()) + " is not one" ;
278 throw Exception(msg);
283 t = (ENGINE::TypeCodeStruct*)currentProc->createStructTc(_id,_name);
285 std::vector<myprop>::const_iterator iter;
286 for(iter=_members.begin();iter!=_members.end();iter++)
288 DEBTRACE("member: " << iter->_name << " " <<iter->_value);
289 t->addMember(iter->_name,currentProc->typeMap[iter->_value]);