16 #if defined(LCF_SUPPORT_XML)
18 static void StartElementHandler(
void* closure,
const XML_Char* name,
const XML_Char** atts) {
19 ((
XmlReader*) closure)->StartElement(name, atts);
22 static void EndElementHandler(
void* closure,
const XML_Char* name) {
26 static void CharacterDataHandler(
void* closure,
const XML_Char* s,
int len) {
27 ((
XmlReader*) closure)->CharacterData(s, len);
36 #if defined(LCF_SUPPORT_XML)
37 parser = XML_ParserCreate(
"UTF-8");
39 XML_SetUserData(
parser, (
void*)
this);
40 XML_SetElementHandler(
parser, StartElementHandler, EndElementHandler);
41 XML_SetCharacterDataHandler(
parser, CharacterDataHandler);
48 #if defined(LCF_SUPPORT_XML)
62 vfprintf(stderr, fmt, ap);
68 #if defined(LCF_SUPPORT_XML)
69 static const int bufsize = 4096;
72 int len =
stream.read(
reinterpret_cast<char*
>(
buffer),bufsize).gcount();
73 int result = XML_ParseBuffer(
parser, len, len <= 0);
75 Error(
"%s", XML_ErrorString(XML_GetErrorCode(
parser)));
87 handlers.back()->StartElement(*
this, name, atts);
101 handlers.back()->EndElement(*
this, name);
107 void XmlReader::Read<bool>(
bool& val,
const std::string&
data) {
108 std::istringstream s(
data);
115 void XmlReader::Read<int32_t>(int32_t& val,
const std::string&
data) {
116 std::istringstream s(
data);
121 void XmlReader::Read<int8_t>(int8_t& val,
const std::string&
data) {
122 std::istringstream s(
data);
129 void XmlReader::Read<uint8_t>(uint8_t& val,
const std::string&
data) {
130 std::istringstream s(
data);
137 void XmlReader::Read<int16_t>(int16_t& val,
const std::string&
data) {
138 std::istringstream s(
data);
143 void XmlReader::Read<uint32_t>(uint32_t& val,
const std::string&
data) {
144 std::istringstream s(
data);
149 void XmlReader::Read<double>(
double& val,
const std::string&
data) {
150 std::istringstream s(
data);
155 void XmlReader::Read<std::string>(std::string& val,
const std::string&
data) {
156 static const std::string prefix(
"\xee\x80");
158 if (
data.find(prefix) == std::string::npos) {
169 for (
size_t pos = 0; ; ) {
170 size_t next =
data.find(prefix, pos);
172 val.append(
data, pos, next - pos);
173 if (next == std::string::npos)
176 val.append(1,
data[pos] -
'\x80');
184 std::istringstream s(
data);
190 XmlReader::Read<T>(x, str);
199 void XmlReader::Read<std::vector<int32_t>>(std::vector<int32_t>& val,
const std::string&
data) {
200 ReadVector<int32_t>(val,
data);
204 void XmlReader::Read<std::vector<bool>>(std::vector<bool>& val,
const std::string&
data) {
205 ReadVector<bool>(val,
data);
209 void XmlReader::Read<std::vector<uint8_t>>(std::vector<uint8_t>& val,
const std::string&
data) {
210 ReadVector<uint8_t>(val,
data);
214 void XmlReader::Read<std::vector<int16_t>>(std::vector<int16_t>& val,
const std::string&
data) {
215 ReadVector<int16_t>(val,
data);
219 void XmlReader::Read<std::vector<uint32_t>>(std::vector<uint32_t>& val,
const std::string&
data) {
220 ReadVector<uint32_t>(val,
data);
224 void XmlReader::Read<std::vector<double>>(std::vector<double>& val,
const std::string&
data) {
225 ReadVector<double>(val,
data);
virtual void CharacterData(XmlReader &, const std::string &)
void StartElement(const char *name, const char **atts)
void SetHandler(XmlHandler *handler)
XmlReader(std::istream &filestream)
void CharacterData(const char *s, int len)
void EndElement(const char *name)
static void ReadVector(std::vector< T > &ref, const std::string &data)
std::vector< XmlHandler * > handlers
void Error(const char *fmt,...)