12#include "lcf/reader_lcf.h"
13#include "lcf/reader_xml.h"
14#include "lcf/dbstring.h"
19static void StartElementHandler(
void* closure,
const XML_Char* name,
const XML_Char** atts) {
20 ((lcf::XmlReader*) closure)->StartElement(name, atts);
23static void EndElementHandler(
void* closure,
const XML_Char* name) {
24 ((lcf::XmlReader*) closure)->EndElement(name);
27static void CharacterDataHandler(
void* closure,
const XML_Char* s,
int len) {
28 ((lcf::XmlReader*) closure)->CharacterData(s, len);
35XmlReader::XmlReader(std::istream& filestream) :
40 parser = XML_ParserCreate(
"UTF-8");
42 XML_SetUserData(parser, (
void*)
this);
43 XML_SetElementHandler(parser, StartElementHandler, EndElementHandler);
44 XML_SetCharacterDataHandler(parser, CharacterDataHandler);
46 handlers.push_back(NULL);
50XmlReader::~XmlReader() {
53 XML_ParserFree(parser);
58bool XmlReader::IsOk()
const {
59 return (stream.good() && parser != NULL);
62void XmlReader::Error(
const char* fmt, ...) {
65 vfprintf(stderr, fmt, ap);
70void XmlReader::Parse() {
72 static const int bufsize = 4096;
73 while (IsOk() && !stream.eof()) {
74 void* buffer = XML_GetBuffer(parser, bufsize);
75 int len = stream.read(
reinterpret_cast<char*
>(buffer),bufsize).gcount();
76 int result = XML_ParseBuffer(parser, len, len <= 0);
78 Error(
"%s", XML_ErrorString(XML_GetErrorCode(parser)));
83void XmlReader::SetHandler(XmlHandler* handler) {
84 handlers.back() = handler;
87void XmlReader::StartElement(
const char* name,
const char** atts) {
88 XmlHandler* handler = handlers.back();
89 handlers.push_back(handler);
90 handlers.back()->StartElement(*
this, name, atts);
94void XmlReader::CharacterData(
const char* s,
int len) {
95 buffer.append(s, len);
98void XmlReader::EndElement(
const char* name) {
99 XmlHandler* handler = handlers.back();
100 handler->CharacterData(*
this, buffer);
102 if (handler != handlers.back())
104 handlers.back()->EndElement(*
this, name);
110void XmlReader::Read<bool>(
bool& val,
const std::string& data) {
111 std::istringstream s(data);
118void XmlReader::Read<int32_t>(int32_t& val,
const std::string& data) {
119 std::istringstream s(data);
124void XmlReader::Read<int8_t>(int8_t& val,
const std::string& data) {
125 std::istringstream s(data);
132void XmlReader::Read<uint8_t>(uint8_t& val,
const std::string& data) {
133 std::istringstream s(data);
140void XmlReader::Read<int16_t>(int16_t& val,
const std::string& data) {
141 std::istringstream s(data);
146void XmlReader::Read<uint32_t>(uint32_t& val,
const std::string& data) {
147 std::istringstream s(data);
152void XmlReader::Read<double>(
double& val,
const std::string& data) {
153 std::istringstream s(data);
158void XmlReader::Read<std::string>(std::string& val,
const std::string& data) {
159 static const std::string prefix(
"\xee\x80");
161 if (data.find(prefix) == std::string::npos) {
172 for (
size_t pos = 0; ; ) {
173 size_t next = data.find(prefix, pos);
175 val.append(data, pos, next - pos);
176 if (next == std::string::npos)
179 val.append(1, data[pos] -
'\x80');
185void XmlReader::Read<DBString>(DBString& val,
const std::string& data) {
188 val = DBString(sval);
192void XmlReader::Read<DBBitArray>(DBBitArray& val,
const std::string& data) {
194 std::vector<bool> tmp;
195 ReadVector(tmp, data);
196 val = DBBitArray(tmp.begin(), tmp.end());
200void XmlReader::ReadVector(std::vector<T>& val,
const std::string& data) {
202 std::istringstream s(data);
208 XmlReader::Read<T>(x, str);
217void XmlReader::ReadVector(DBArray<T>& val,
const std::string& data) {
220 ReadVector(tmp, data);
221 val = DBArray<T>(tmp.begin(), tmp.end());
225void XmlReader::Read<std::vector<int32_t>>(std::vector<int32_t>& val,
const std::string& data) {
226 ReadVector<int32_t>(val, data);
230void XmlReader::Read<std::vector<bool>>(std::vector<bool>& val,
const std::string& data) {
231 ReadVector<bool>(val, data);
235void XmlReader::Read<std::vector<uint8_t>>(std::vector<uint8_t>& val,
const std::string& data) {
236 ReadVector<uint8_t>(val, data);
240void XmlReader::Read<std::vector<int16_t>>(std::vector<int16_t>& val,
const std::string& data) {
241 ReadVector<int16_t>(val, data);
245void XmlReader::Read<std::vector<uint32_t>>(std::vector<uint32_t>& val,
const std::string& data) {
246 ReadVector<uint32_t>(val, data);
250void XmlReader::Read<std::vector<double>>(std::vector<double>& val,
const std::string& data) {
251 ReadVector<double>(val, data);
255void XmlReader::Read<DBArray<int32_t>>(DBArray<int32_t>& val,
const std::string& data) {
256 ReadVector<int32_t>(val, data);
260void XmlReader::Read<DBArray<bool>>(DBArray<bool>& val,
const std::string& data) {
261 ReadVector<bool>(val, data);
265void XmlReader::Read<DBArray<uint8_t>>(DBArray<uint8_t>& val,
const std::string& data) {
266 ReadVector<uint8_t>(val, data);
270void XmlReader::Read<DBArray<int16_t>>(DBArray<int16_t>& val,
const std::string& data) {
271 ReadVector<int16_t>(val, data);
275void XmlReader::Read<DBArray<uint32_t>>(DBArray<uint32_t>& val,
const std::string& data) {
276 ReadVector<uint32_t>(val, data);
280void XmlReader::Read<DBArray<double>>(DBArray<double>& val,
const std::string& data) {
281 ReadVector<double>(val, data);