diff options
Diffstat (limited to 'server/src/sax_parser.cc')
-rw-r--r-- | server/src/sax_parser.cc | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/server/src/sax_parser.cc b/server/src/sax_parser.cc new file mode 100644 index 0000000..dd0a7a3 --- /dev/null +++ b/server/src/sax_parser.cc @@ -0,0 +1,125 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/*************************************************************************** + * sax_parser.cc + * + * Mon Mar 24 14:40:15 CET 2008 + * Copyright 2008 Bent Bisballe Nyeng, Lars Bisballe Jensen and Peter Skaarup + * deva@aasimon.org, elsenator@gmail.com and piparum@piparum.dk + ****************************************************************************/ + +/* + * This file is part of Pracro. + * + * Pracro is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Pracro is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Pracro; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ +#include "sax_parser.h" + +static void start_hndl(void *p, const char *el, const char **attr) +{ + SAXParser *parser = (SAXParser*)XML_GetUserData(p); + + // 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++; + + attributes.insert(make_pair(at_name, at_value)); + } + + parser->startTag(name, attributes); +} + +static void end_hndl(void *p, const char *el) +{ + SAXParser *parser = (SAXParser*)XML_GetUserData(p); + std::string name = el; + parser->endTag(name); +} + + +SAXParser::SAXParser() +{ + p = XML_ParserCreate(NULL); + if(!p) { + fprintf(stderr, "Couldn't allocate memory for parser\n"); + // throw Exception(...); + return; + } + + XML_SetUserData(p, this); + XML_UseParserAsHandlerArg(p); + XML_SetElementHandler(p, start_hndl, end_hndl); +} + +int SAXParser::parse() +{ + char buf[32]; + int len; + + do { + len = readData(buf, sizeof(buf) - 1); + if (! XML_Parse(p, buf, len, len == 0)) { + fprintf(stderr, "Parse error at line %d:\n%s\n", + XML_GetCurrentLineNumber(p), + XML_ErrorString(XML_GetErrorCode(p))); + return -1; + } + + memset(buf, 0, sizeof(buf)); + } while(len); + + return 0; +} + +#ifdef TEST_SAXPARSER +/** + * Compile with: g++ -DTEST_SAXPARSER sax_parser.cc -lexpat -otext_saxparser + * Run with: ./test_saxparser [xmlfile] + */ +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> + +class MyParser :public SAXParser { +public: + MyParser(char *file) { + fd = open(file, O_RDONLY); + } + + int readData(char *data, size_t size) { + return read(fd, data, size); + } + + void startTag(std::string name, std::map< std::string, std::string> attributes) + { + printf("<%s>\n", name.c_str()); + } + +private: + int fd; +}; + +int main(int argc, char *argv[]) { + if(argc < 2) return 1; + MyParser parser(argv[1]); + parser.parse(); +} + +#endif/*TEST_SAXPARSER*/ |