[*_restore] Use a little wrapper class for the expat XML_Parser to ensure it gets destroyed.
This commit is contained in:
@@ -5,7 +5,6 @@
|
||||
#include "base/xml_utils.h"
|
||||
|
||||
#include <boost/lexical_cast.hpp>
|
||||
#include <expat.h>
|
||||
|
||||
using namespace caching;
|
||||
using namespace persistent_data;
|
||||
@@ -239,12 +238,10 @@ caching::create_xml_emitter(ostream &out)
|
||||
void
|
||||
caching::parse_xml(istream &in, emitter::ptr e)
|
||||
{
|
||||
XML_Parser parser = XML_ParserCreate(NULL);
|
||||
if (!parser)
|
||||
throw runtime_error("couldn't create xml parser");
|
||||
xml_parser p;
|
||||
|
||||
XML_SetUserData(parser, e.get());
|
||||
XML_SetElementHandler(parser, start_tag, end_tag);
|
||||
XML_SetUserData(p.get_parser(), e.get());
|
||||
XML_SetElementHandler(p.get_parser(), start_tag, end_tag);
|
||||
|
||||
while (!in.eof()) {
|
||||
char buffer[4096];
|
||||
@@ -252,12 +249,12 @@ caching::parse_xml(istream &in, emitter::ptr e)
|
||||
size_t len = in.gcount();
|
||||
int done = in.eof();
|
||||
|
||||
if (!XML_Parse(parser, buffer, len, done)) {
|
||||
if (!XML_Parse(p.get_parser(), buffer, len, done)) {
|
||||
ostringstream out;
|
||||
out << "Parse error at line "
|
||||
<< XML_GetCurrentLineNumber(parser)
|
||||
<< XML_GetCurrentLineNumber(p.get_parser())
|
||||
<< ":\n"
|
||||
<< XML_ErrorString(XML_GetErrorCode(parser))
|
||||
<< XML_ErrorString(XML_GetErrorCode(p.get_parser()))
|
||||
<< endl;
|
||||
throw runtime_error(out.str());
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user