From 1ae51ff94d0f1f27a4e4cc657371578db13c3ca1 Mon Sep 17 00:00:00 2001 From: Bent Bisballe Nyeng Date: Fri, 8 Feb 2019 20:26:14 +0100 Subject: Make code compile again (fix bitrot dating back from 2013). --- src/saxparser.cc | 246 ++++++++++++++++++++++++++++++++----------------------- 1 file changed, 144 insertions(+), 102 deletions(-) (limited to 'src/saxparser.cc') diff --git a/src/saxparser.cc b/src/saxparser.cc index 42b1bfd..ae0adff 100644 --- a/src/saxparser.cc +++ b/src/saxparser.cc @@ -33,157 +33,199 @@ static void character_hndl(void *p, const XML_Char *s, int len) { - SAXParser *parser = (SAXParser*)XML_GetUserData(p); - std::string chars; - chars.append(s, len); - parser->characterData(chars); + SAXParser *parser = (SAXParser*)XML_GetUserData(p); + std::string chars; + chars.append(s, len); + parser->characterData(chars); } static void start_hndl(void *p, const char *el, const char **attr) { - SAXParser *parser = (SAXParser*)XML_GetUserData(p); + SAXParser *parser = (SAXParser*)XML_GetUserData(p); - // Convert to comfy C++ values... - std::string name = el; - std::map< std::string, std::string > attributes; + // Convert to comfy C++ values... + std::string name = el; + std::map< std::string, std::string > attributes; - while(*attr) { - std::string at_name = *attr; - attr++; - std::string at_value = *attr; - attr++; + while(*attr) + { + std::string at_name = *attr; + attr++; + std::string at_value = *attr; + attr++; - attributes.insert(make_pair(at_name, at_value)); - } + attributes.insert(make_pair(at_name, at_value)); + } - if(parser->outertag == "") parser->outertag = name; + if(parser->outertag == "") + { + parser->outertag = name; + } - parser->startTag(name, attributes); + parser->startTag(name, attributes); } static void end_hndl(void *p, const char *el) { - SAXParser *parser = (SAXParser*)XML_GetUserData(p); - std::string name = el; + SAXParser *parser = (SAXParser*)XML_GetUserData(p); + std::string name = el; - if(name == parser->outertag) parser->done = true; + if(name == parser->outertag) + { + parser->done = true; + } - parser->endTag(name); + parser->endTag(name); } SAXParser::SAXParser() { - p = XML_ParserCreate(NULL); - if(!p) { - ERR(sax, "Couldn't allocate memory for parser\n"); - // throw Exception(...); - return; - } - - // XML_SetEncoding(p, "UTF-8"); - XML_SetUserData(p, this); - XML_UseParserAsHandlerArg(p); - XML_SetElementHandler(p, start_hndl, end_hndl); - XML_SetCharacterDataHandler(p, character_hndl); - - bufferbytes = 0; - totalbytes = 0; - done = false; - + p = XML_ParserCreate(NULL); + if(!p) + { + ERR(sax, "Couldn't allocate memory for parser\n"); + // throw Exception(...); + return; + } + + // XML_SetEncoding(p, "UTF-8"); + XML_SetUserData(p, this); + XML_UseParserAsHandlerArg(p); + XML_SetElementHandler(p, start_hndl, end_hndl); + XML_SetCharacterDataHandler(p, character_hndl); + + bufferbytes = 0; + totalbytes = 0; + done = false; } SAXParser::~SAXParser() { - if(p) XML_ParserFree(p); + if(p) + { + XML_ParserFree(p); + } } int SAXParser::parse() { - char buf[32]; - int len; - - do { - len = readData(buf, sizeof(buf) - 1); - if (! XML_Parse(p, buf, len, len == 0)) { - parseError(buf, len, XML_ErrorString(XML_GetErrorCode(p)), - (int)XML_GetCurrentLineNumber(p)); - return 1; - } - - memset(buf, 0, sizeof(buf)); - } while(len); - - return 0; + char buf[32]; + int len; + + do + { + len = readData(buf, sizeof(buf) - 1); + if(! XML_Parse(p, buf, len, len == 0)) + { + parseError(buf, len, XML_ErrorString(XML_GetErrorCode(p)), + (int)XML_GetCurrentLineNumber(p)); + return 1; + } + + memset(buf, 0, sizeof(buf)); + } + while(len); + + return 0; } static bool iswhitespace(const char *buf, size_t size) { - for(size_t i = 0; i < size; i++) - if(buf[i] != ' ' && buf[i] != '\n' && buf[i] != '\t' && buf[i] != '\r') - return false; - return true; + for(size_t i = 0; i < size; i++) + { + if(buf[i] != ' ' && buf[i] != '\n' && buf[i] != '\t' && buf[i] != '\r') + { + return false; + } + } + return true; } bool SAXParser::parse(const char *data, size_t size) { - std::string xml; - xml.append(data, size); - DEBUG(sax, "parse %d bytes [%s]\n", (int)size, xml.c_str()); - - if(data == NULL || size == 0) return done; - - bufferbytes = size; - totalbytes += bufferbytes; - - if(! XML_Parse(p, data, size, false) ) { - if(XML_GetErrorCode(p) == XML_ERROR_JUNK_AFTER_DOC_ELEMENT) return true; - if(XML_GetErrorCode(p) == XML_ERROR_FINISHED && - iswhitespace(data, size)) return true; - if(done && XML_GetErrorCode(p) == XML_ERROR_UNCLOSED_TOKEN) return true; - parseError(data, size, XML_ErrorString(XML_GetErrorCode(p)), - (int)XML_GetCurrentLineNumber(p)); - return false; - } - - if(done) { - if(! XML_Parse(p, data, 0, true) ) { - if(XML_GetErrorCode(p) == XML_ERROR_JUNK_AFTER_DOC_ELEMENT) return true; - if(XML_GetErrorCode(p) == XML_ERROR_FINISHED && - iswhitespace(data, size)) return true; - if(XML_GetErrorCode(p) == XML_ERROR_UNCLOSED_TOKEN) return true; - parseError(data, 0, XML_ErrorString(XML_GetErrorCode(p)), - (int)XML_GetCurrentLineNumber(p)); - return false; - } - } - - if(done) { - DEBUG(sax, "Got END_OF_DOCUMENT [%s] at %ld\n", - outertag.c_str(), XML_GetCurrentByteIndex(p)); - } - - return done; + std::string xml; + xml.append(data, size); + DEBUG(sax, "parse %d bytes [%s]\n", (int)size, xml.c_str()); + + if(data == NULL || size == 0) + { + return done; + } + + bufferbytes = size; + totalbytes += bufferbytes; + + if(! XML_Parse(p, data, size, false)) + { + if(XML_GetErrorCode(p) == XML_ERROR_JUNK_AFTER_DOC_ELEMENT) + { + return true; + } + if(XML_GetErrorCode(p) == XML_ERROR_FINISHED && + iswhitespace(data, size)) + { + return true; + } + if(done && XML_GetErrorCode(p) == XML_ERROR_UNCLOSED_TOKEN) + { + return true; + } + parseError(data, size, XML_ErrorString(XML_GetErrorCode(p)), + (int)XML_GetCurrentLineNumber(p)); + return false; + } + + if(done) + { + if(!XML_Parse(p, data, 0, true)) + { + if(XML_GetErrorCode(p) == XML_ERROR_JUNK_AFTER_DOC_ELEMENT) + { + return true; + } + if(XML_GetErrorCode(p) == XML_ERROR_FINISHED && + iswhitespace(data, size)) + { + return true; + } + if(XML_GetErrorCode(p) == XML_ERROR_UNCLOSED_TOKEN) + { + return true; + } + parseError(data, 0, XML_ErrorString(XML_GetErrorCode(p)), + (int)XML_GetCurrentLineNumber(p)); + return false; + } + } + + if(done) + { + DEBUG(sax, "Got END_OF_DOCUMENT [%s] at %ld\n", + outertag.c_str(), XML_GetCurrentByteIndex(p)); + } + + return done; } void SAXParser::parseError(const char *buf, size_t len, std::string error, int lineno) { - fprintf(stderr, "SAXParser error at line %d: %s\n", lineno, error.c_str()); - fprintf(stderr, "\tBuffer %u bytes: [", (int)len); - if(fwrite(buf, len, 1, stderr) != len) {} - fprintf(stderr, "]\n"); - fflush(stderr); + fprintf(stderr, "SAXParser error at line %d: %s\n", lineno, error.c_str()); + fprintf(stderr, "\tBuffer %u bytes: [", (int)len); + if(fwrite(buf, len, 1, stderr) != len) {} + fprintf(stderr, "]\n"); + fflush(stderr); } unsigned int SAXParser::usedBytes() { - return bufferbytes + (XML_GetCurrentByteIndex(p) - totalbytes); + return bufferbytes + (XML_GetCurrentByteIndex(p) - totalbytes); } int SAXParser::readData(char *, size_t) { - return 0; + return 0; } void SAXParser::endTag(std::string) -- cgit v1.2.3