// -*- mode: C++; tab-width: 4; indent-tabs-mode: t; -*- vim:ts=4:sw=4 // // Copyright (C) 2004,2005 David Lau (skunix) // Chong Kai Xiong (descender) // // This file is part of The Plains of Usata. // // The Plains of Usata is licensed under the GNU General Public // License (GPL) version 2. For details, please see the COPYING file // included in the software distribution, or visit // http://www.fsf.org/licenses/gpl.html. // // $Id: parser.cpp,v 1.1 2005/02/16 06:30:02 skunix Exp $ #define XML_INPUT_BUFFER_SIZE 1024 #include #include #include #include "parser.hpp" //#include "../log.hpp" #include namespace XML { struct ParserData { XML_Parser parser; ParserData(){parser=0;} }; void Parser::c_start_element_cb( void* user_data, const char* element, const char**attrib) { Parser *p = (Parser*)user_data; p->element_start(element, attrib); return; } void Parser::c_end_element_cb(void *user_data, const char* element) { Parser*p = (Parser*)user_data; p->element_end(element); return; } void Parser::reset() { if (mParserData->parser == 0) mParserData->parser = XML_ParserCreate(NULL); else XML_ParserReset(mParserData->parser, NULL); XML_SetUserData(mParserData->parser,static_cast(this)); XML_SetElementHandler(mParserData->parser, Parser::c_start_element_cb, Parser::c_end_element_cb); return; } Parser::Parser() : mParserData(new ParserData) { reset(); } bool Parser::parse_chunk(const char* buffer, unsigned len, bool last) { bool retval=true; XML_Status status = XML_Parse(mParserData->parser,buffer,len,last); if (status ==XML_STATUS_ERROR) { retval=false; } return retval; } bool Parser::parse_chunkb(unsigned len, bool last) { bool retval=true; XML_Status status = XML_ParseBuffer(mParserData->parser,len,last); if (status ==XML_STATUS_ERROR) { retval=false; } return retval; } std::string Parser::get_error() { XML_Error er = XML_GetErrorCode(mParserData->parser); return std::string(XML_ErrorString(er)); } void* Parser::get_buffer(unsigned len) { return XML_GetBuffer(mParserData->parser, len); } /* void Parser::parse(const std::string& filename_) { using namespace std; ifstream input; input.exceptions ( ifstream::failbit | ifstream::badbit ); input.open(filename_.c_str(),ios::binary); usata::log::BufferedStream plog; using boost::scoped_array; scoped_array buffer(new char [XML_INPUT_BUFFER_SIZE]); streamsize readlen; bool done(false); while (!done) { readlen = input.readsome(&buffer[0],XML_INPUT_BUFFER_SIZE); if (readlen < XML_INPUT_BUFFER_SIZE) done=true; XML_Status status = XML_Parse(mParserData->parser,&buffer[0],readlen, done); if (status == XML_STATUS_ERROR) { //std::cout << "error" << std::endl; XML_Error er = XML_GetErrorCode(mParserData->parser); plog << XML_ErrorString(er) << usata::log::commit; } } input.close(); return; } */ void Parser::content(const char * data, int len) { return; } Parser::~Parser() { // std::cout << "D" << std::endl; XML_ParserFree(mParserData->parser); } }