1 // easyxml.cxx - implementation of EasyXML interfaces.
7 #include <simgear/compiler.h>
13 ////////////////////////////////////////////////////////////////////////
14 // Implementation of XMLAttributes.
15 ////////////////////////////////////////////////////////////////////////
17 XMLAttributes::XMLAttributes ()
21 XMLAttributes::~XMLAttributes ()
26 XMLAttributes::findAttribute (const char * name) const
29 for (int i = 0; i < s; i++) {
30 if (strcmp(name, getName(i)) == 0)
37 XMLAttributes::hasAttribute (const char * name) const
39 return (findAttribute(name) != -1);
43 XMLAttributes::getValue (const char * name) const
45 int pos = findAttribute(name);
53 ////////////////////////////////////////////////////////////////////////
54 // Implementation of XMLAttributesDefault.
55 ////////////////////////////////////////////////////////////////////////
57 XMLAttributesDefault::XMLAttributesDefault ()
61 XMLAttributesDefault::XMLAttributesDefault (const XMLAttributes &atts)
64 for (int i = 0; i < s; i++)
65 addAttribute(atts.getName(i), atts.getValue(i));
68 XMLAttributesDefault::~XMLAttributesDefault ()
73 XMLAttributesDefault::size () const
75 return _atts.size() / 2;
79 XMLAttributesDefault::getName (int i) const
81 return _atts[i*2].c_str();
85 XMLAttributesDefault::getValue (int i) const
87 return _atts[i*2+1].c_str();
91 XMLAttributesDefault::addAttribute (const char * name, const char * value)
93 _atts.push_back(name);
94 _atts.push_back(value);
98 XMLAttributesDefault::setName (int i, const char * name)
104 XMLAttributesDefault::setValue (int i, const char * name)
110 XMLAttributesDefault::setValue (const char * name, const char * value)
112 int pos = findAttribute(name);
115 setValue(pos, value);
117 addAttribute(name, value);
123 ////////////////////////////////////////////////////////////////////////
124 // Attribute list wrapper for Expat.
125 ////////////////////////////////////////////////////////////////////////
127 class ExpatAtts : public XMLAttributes
130 ExpatAtts (const char ** atts) : _atts(atts) {}
132 virtual int size () const;
133 virtual const char * getName (int i) const;
134 virtual const char * getValue (int i) const;
141 ExpatAtts::size () const
144 for (int i = 0; _atts[i] != 0; i += 2)
150 ExpatAtts::getName (int i) const
156 ExpatAtts::getValue (int i) const
163 ////////////////////////////////////////////////////////////////////////
164 // Static callback functions for Expat.
165 ////////////////////////////////////////////////////////////////////////
167 #define VISITOR (*((XMLVisitor*)userData))
170 start_element (void * userData, const char * name, const char ** atts)
172 VISITOR.startElement(name, ExpatAtts(atts));
176 end_element (void * userData, const char * name)
178 VISITOR.endElement(name);
182 character_data (void * userData, const char * s, int len)
184 VISITOR.data(s, len);
188 processing_instruction (void * userData,
192 VISITOR.pi(target, data);
199 ////////////////////////////////////////////////////////////////////////
200 // Implementation of XMLReader.
201 ////////////////////////////////////////////////////////////////////////
204 readXML (istream &input, XMLVisitor &visitor)
208 XML_Parser parser = XML_ParserCreate(0);
209 XML_SetUserData(parser, &visitor);
210 XML_SetElementHandler(parser, start_element, end_element);
211 XML_SetCharacterDataHandler(parser, character_data);
212 XML_SetProcessingInstructionHandler(parser, processing_instruction);
217 while (!input.eof()) {
219 input.read(buf,16384);
220 // TODO: deal with bad stream.
221 if (!XML_Parse(parser, buf, input.gcount(), false)) {
222 visitor.error(XML_ErrorString(XML_GetErrorCode(parser)),
223 XML_GetCurrentColumnNumber(parser),
224 XML_GetCurrentLineNumber(parser));
232 XML_ParserFree(parser);
237 // end of easyxml.cxx