From 4f3760fc3b647fa166da4ab777eb612b14ac500b Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Wed, 15 Jul 2026 21:05:19 +0200 Subject: Umbau auf modernes C++ --- src/xml.cpp | 50 +++++++++++++++++++++++++++----------------------- 1 file changed, 27 insertions(+), 23 deletions(-) (limited to 'src/xml.cpp') diff --git a/src/xml.cpp b/src/xml.cpp index 44b423a..451ee18 100644 --- a/src/xml.cpp +++ b/src/xml.cpp @@ -1,18 +1,19 @@ // Standard C++ +#include #include #include +#include -// Projekt +// Project #include "xml.hpp" // Expat XML Parser -#define XML_STATIC // force static linkage #include "expat.h" using namespace std; void -XML::parse(istream& in) +XML::parse(istream& ins) { unique_ptr parser(XML_ParserCreate(nullptr), XML_ParserFree); @@ -22,54 +23,57 @@ XML::parse(istream& in) XML_SetCdataSectionHandler(parser.get(), cdata_start, cdata_end); XML_SetCharacterDataHandler(parser.get(), data); - char buffer[2048]; - for ( bool done = false; !done ; ) { - in.read(buffer, sizeof buffer); - done = (in.gcount() < sizeof buffer); + static const auto buffer_size = 2048; - if ( XML_Parse(parser.get(), buffer, static_cast(in.gcount()), done) != XML_STATUS_OK ) { + array buffer{}; + + for ( bool done = false; !done; ) { + ins.read(buffer.data(), buffer_size); + done = ins.gcount() < buffer_size; + + if ( XML_Parse(parser.get(), buffer.data(), static_cast(ins.gcount()), static_cast(done)) != XML_STATUS_OK ) { stringstream msg; msg << XML_ErrorString(XML_GetErrorCode(parser.get())); msg << " in line " << XML_GetCurrentLineNumber(parser.get()); - throw runtime_error( msg.str() ); + throw runtime_error(msg.str()); } } } void -XML::tag_start(void* me, const char* name, const char* attr[]) +XML::tag_start(void* self, const char* name, const char** attr) { - vector> attr_temp; + vector> attr_temp; - for ( size_t i = 0; attr[i]; i += 2 ) - attr_temp.push_back( make_pair(attr[i], attr[i+1]) ); + for ( auto i = 0; attr[i] != nullptr; i += 2 ) { + attr_temp.emplace_back(attr[i], attr[i + 1]); + } - reinterpret_cast(me)->handle_start(name, attr_temp); + static_cast(self)->handle_start(name, attr_temp); } void -XML::tag_end(void* me, const char* name) +XML::tag_end(void* self, const char* name) { - reinterpret_cast(me)->handle_end(name); + static_cast(self)->handle_end(name); } void -XML::cdata_start(void* me) +XML::cdata_start(void* self) { - reinterpret_cast(me)->handle_cdata_start(); + static_cast(self)->handle_cdata_start(); } void -XML::cdata_end(void* me) +XML::cdata_end(void* self) { - reinterpret_cast(me)->handle_cdata_end(); + static_cast(self)->handle_cdata_end(); } void -XML::data(void* me, const char* dat, int len) +XML::data(void* self, const char* dat, int len) { - reinterpret_cast(me)->handle_data(vector(dat, dat+len)); + static_cast(self)->handle_character_data({ dat, dat + len }); } - -- cgit v1.3