X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fxml%2Feasyxml.cxx;h=0779d872b38e9120a52cdb13db5e5dd1887f5590;hb=733e6fa14ff507a1022ecab8d55cc9bf587bee40;hp=8fc5ca15d1385cd233b60e9bbf1e3265d15f2005;hpb=5a9b08dec26d57abfcfa64077982a6ef8b13a084;p=simgear.git diff --git a/simgear/xml/easyxml.cxx b/simgear/xml/easyxml.cxx index 8fc5ca15..0779d872 100644 --- a/simgear/xml/easyxml.cxx +++ b/simgear/xml/easyxml.cxx @@ -1,14 +1,18 @@ -// 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 -#include #include // strcmp() #include "easyxml.hxx" #include "xmlparse.h" -#include STL_FSTREAM +#include +#include SG_USING_STD(ifstream); @@ -220,37 +224,41 @@ readXML (istream &input, XMLVisitor &visitor, const string &path) // 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 @@ -260,12 +268,12 @@ readXML (const string &path, XMLVisitor &visitor) 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), @@ -274,4 +282,29 @@ readXML (const string &path, XMLVisitor &visitor) 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