-// easyxml.cxx - implementation of EasyXML interfaces.
+/**
+ * \file easyxml.cxx - implementation of EasyXML interfaces.
+ * Written by David Megginson, 2000-2001
+ * This file is in the Public Domain, and comes with NO WARRANTY of any kind.
+ */
#include <simgear/compiler.h>
// FIXME: get proper error string from system
if (!input.good()) {
- XML_ParserFree(parser);
- throw sg_io_exception("Problem reading file",
+ sg_io_exception ex ("Problem reading file",
sg_location(path,
XML_GetCurrentLineNumber(parser),
XML_GetCurrentColumnNumber(parser)),
"SimGear XML Parser");
+ XML_ParserFree(parser);
+ throw ex;
}
input.read(buf,16384);
if (!XML_Parse(parser, buf, input.gcount(), false)) {
- XML_ParserFree(parser);
- throw sg_io_exception(XML_ErrorString(XML_GetErrorCode(parser)),
+ sg_io_exception ex (XML_ErrorString(XML_GetErrorCode(parser)),
sg_location(path,
XML_GetCurrentLineNumber(parser),
XML_GetCurrentColumnNumber(parser)),
"SimGear XML Parser");
+ XML_ParserFree(parser);
+ throw ex;
}
}
// Verify end of document.
if (!XML_Parse(parser, buf, 0, true)) {
- XML_ParserFree(parser);
- throw sg_io_exception(XML_ErrorString(XML_GetErrorCode(parser)),
+ sg_io_exception ex (XML_ErrorString(XML_GetErrorCode(parser)),
sg_location(path,
XML_GetCurrentLineNumber(parser),
XML_GetCurrentColumnNumber(parser)),
"SimGear XML Parser");
+ XML_ParserFree(parser);
+ throw ex;
}
XML_ParserFree(parser);
+ visitor.endXML();
}
void
if (input.good()) {
try {
readXML(input, visitor, path);
- } catch (sg_io_exception &e) {
+ } catch (sg_io_exception &) {
input.close();
- throw e;
- } catch (sg_throwable &t) {
+ throw;
+ } catch (sg_throwable &) {
input.close();
- throw t;
+ throw;
}
} else {
throw sg_io_exception("Failed to open file", sg_location(path),
input.close();
}
+void
+readXML (const char *buf, const int size, XMLVisitor &visitor)
+{
+ XML_Parser parser = XML_ParserCreate(0);
+ XML_SetUserData(parser, &visitor);
+ XML_SetElementHandler(parser, start_element, end_element);
+ XML_SetCharacterDataHandler(parser, character_data);
+ XML_SetProcessingInstructionHandler(parser, processing_instruction);
+
+ visitor.startXML();
+
+ if (!XML_Parse(parser, buf, size, false)) {
+ sg_io_exception ex (XML_ErrorString(XML_GetErrorCode(parser)),
+ sg_location("In-memory XML buffer",
+ XML_GetCurrentLineNumber(parser),
+ XML_GetCurrentColumnNumber(parser)),
+ "SimGear XML Parser");
+ XML_ParserFree(parser);
+ throw ex;
+ }
+
+ XML_ParserFree(parser);
+ visitor.endXML();
+}
+
// end of easyxml.cxx