14 #if defined(LCF_SUPPORT_XML)
16 static void StartElementHandler(
void* closure,
const XML_Char* name,
const XML_Char** atts) {
17 ((
XmlReader*) closure)->StartElement(name, atts);
20 static void EndElementHandler(
void* closure,
const XML_Char* name) {
24 static void CharacterDataHandler(
void* closure,
const XML_Char* s,
int len) {
25 ((
XmlReader*) closure)->CharacterData(s, len);
43 #if defined(LCF_SUPPORT_XML)
45 parser = XML_ParserCreate(
"UTF-8");
47 XML_SetUserData(parser, (
void*)
this);
48 XML_SetElementHandler(parser, StartElementHandler, EndElementHandler);
49 XML_SetCharacterDataHandler(parser, CharacterDataHandler);
56 #if defined(LCF_SUPPORT_XML)
74 vfprintf(stderr, fmt, ap);
80 #if defined(LCF_SUPPORT_XML)
81 static const int bufsize = 4096;
84 int len = fread(buffer, 1, bufsize,
stream);
85 int result = XML_ParseBuffer(
parser, len, len <= 0);
87 Error(
"%s", XML_ErrorString(XML_GetErrorCode(
parser)));
99 handlers.back()->StartElement(*
this, name, atts);
113 handlers.back()->EndElement(*
this, name);
119 void XmlReader::Read<bool>(
bool& val,
const std::string&
data) {
120 std::istringstream s(
data);
127 void XmlReader::Read<int>(
int& val,
const std::string&
data) {
128 std::istringstream s(
data);
133 void XmlReader::Read<uint8_t>(uint8_t& val,
const std::string&
data) {
134 std::istringstream s(
data);
141 void XmlReader::Read<int16_t>(int16_t& val,
const std::string&
data) {
142 std::istringstream s(
data);
147 void XmlReader::Read<uint32_t>(uint32_t& val,
const std::string&
data) {
148 std::istringstream s(
data);
153 void XmlReader::Read<double>(
double& val,
const std::string&
data) {
154 std::istringstream s(
data);
159 void XmlReader::Read<std::string>(std::string& val,
const std::string&
data) {
160 static const std::string prefix(
"\xee\x80");
162 if (
data.find(prefix) == std::string::npos) {
173 for (
size_t pos = 0; ; ) {
174 size_t next =
data.find(prefix, pos);
176 val.append(
data, pos, next - pos);
177 if (next == std::string::npos)
180 val.append(1,
data[pos] -
'\x80');
188 std::istringstream s(data);
194 XmlReader::Read<T>(x, str);
203 void XmlReader::Read<std::vector<int> >(std::vector<int>& val,
const std::string&
data) {
204 ReadVector<int>(val,
data);
208 void XmlReader::Read<std::vector<bool> >(std::vector<bool>& val,
const std::string&
data) {
209 ReadVector<bool>(val,
data);
213 void XmlReader::Read<std::vector<uint8_t> >(std::vector<uint8_t>& val,
const std::string&
data) {
214 ReadVector<uint8_t>(val,
data);
218 void XmlReader::Read<std::vector<int16_t> >(std::vector<int16_t>& val,
const std::string&
data) {
219 ReadVector<int16_t>(val,
data);
223 void XmlReader::Read<std::vector<uint32_t> >(std::vector<uint32_t>& val,
const std::string&
data) {
224 ReadVector<uint32_t>(val,
data);
228 void XmlReader::Read<std::vector<double> >(std::vector<double>& val,
const std::string&
data) {
229 ReadVector<double>(val,
data);
void SetHandler(XmlHandler *handler)
void Error(const char *fmt,...)
virtual void CharacterData(XmlReader &, const std::string &)
static void ReadVector(std::vector< T > &ref, const std::string &data)
void StartElement(const char *name, const char **atts)
void CharacterData(const char *s, int len)
std::vector< XmlHandler * > handlers
void EndElement(const char *name)
XmlReader(const std::string &filename)