12 #include "lcf/reader_lcf.h"
13 #include "lcf/reader_xml.h"
14 #include "lcf/dbstring.h"
19 static void StartElementHandler(
void* closure,
const XML_Char* name,
const XML_Char** atts) {
20 ((lcf::XmlReader*) closure)->StartElement(name, atts);
23 static void EndElementHandler(
void* closure,
const XML_Char* name) {
24 ((lcf::XmlReader*) closure)->EndElement(name);
27 static void CharacterDataHandler(
void* closure,
const XML_Char* s,
int len) {
28 ((lcf::XmlReader*) closure)->CharacterData(s, len);
35 XmlReader::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);
50 XmlReader::~XmlReader() {
53 XML_ParserFree(parser);
58 bool XmlReader::IsOk()
const {
59 return (stream.good() && parser != NULL);
62 void XmlReader::Error(
const char* fmt, ...) {
65 vfprintf(stderr, fmt, ap);
70 void 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)));
83 void XmlReader::SetHandler(XmlHandler* handler) {
84 handlers.back() = handler;
87 void 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);
94 void XmlReader::CharacterData(
const char* s,
int len) {
95 buffer.append(s, len);
98 void 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);
110 void XmlReader::Read<bool>(
bool& val,
const std::string& data) {
111 std::istringstream s(data);
118 void XmlReader::Read<int32_t>(int32_t& val,
const std::string& data) {
119 std::istringstream s(data);
124 void XmlReader::Read<int8_t>(int8_t& val,
const std::string& data) {
125 std::istringstream s(data);
132 void XmlReader::Read<uint8_t>(uint8_t& val,
const std::string& data) {
133 std::istringstream s(data);
140 void XmlReader::Read<int16_t>(int16_t& val,
const std::string& data) {
141 std::istringstream s(data);
146 void XmlReader::Read<uint32_t>(uint32_t& val,
const std::string& data) {
147 std::istringstream s(data);
152 void XmlReader::Read<double>(
double& val,
const std::string& data) {
153 std::istringstream s(data);
158 void 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');
185 void XmlReader::Read<DBString>(DBString& val,
const std::string& data) {
188 val = DBString(sval);
192 void 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());
200 void XmlReader::ReadVector(std::vector<T>& val,
const std::string& data) {
202 std::istringstream s(data);
208 XmlReader::Read<T>(x, str);
217 void XmlReader::ReadVector(DBArray<T>& val,
const std::string& data) {
220 ReadVector(tmp, data);
221 val = DBArray<T>(tmp.begin(), tmp.end());
225 void XmlReader::Read<std::vector<int32_t>>(std::vector<int32_t>& val,
const std::string& data) {
226 ReadVector<int32_t>(val, data);
230 void XmlReader::Read<std::vector<bool>>(std::vector<bool>& val,
const std::string& data) {
231 ReadVector<bool>(val, data);
235 void XmlReader::Read<std::vector<uint8_t>>(std::vector<uint8_t>& val,
const std::string& data) {
236 ReadVector<uint8_t>(val, data);
240 void XmlReader::Read<std::vector<int16_t>>(std::vector<int16_t>& val,
const std::string& data) {
241 ReadVector<int16_t>(val, data);
245 void XmlReader::Read<std::vector<uint32_t>>(std::vector<uint32_t>& val,
const std::string& data) {
246 ReadVector<uint32_t>(val, data);
250 void XmlReader::Read<std::vector<double>>(std::vector<double>& val,
const std::string& data) {
251 ReadVector<double>(val, data);
255 void XmlReader::Read<DBArray<int32_t>>(DBArray<int32_t>& val,
const std::string& data) {
256 ReadVector<int32_t>(val, data);
260 void XmlReader::Read<DBArray<bool>>(DBArray<bool>& val,
const std::string& data) {
261 ReadVector<bool>(val, data);
265 void XmlReader::Read<DBArray<uint8_t>>(DBArray<uint8_t>& val,
const std::string& data) {
266 ReadVector<uint8_t>(val, data);
270 void XmlReader::Read<DBArray<int16_t>>(DBArray<int16_t>& val,
const std::string& data) {
271 ReadVector<int16_t>(val, data);
275 void XmlReader::Read<DBArray<uint32_t>>(DBArray<uint32_t>& val,
const std::string& data) {
276 ReadVector<uint32_t>(val, data);
280 void XmlReader::Read<DBArray<double>>(DBArray<double>& val,
const std::string& data) {
281 ReadVector<double>(val, data);