/* vi: set ts=2: +-------------------+ Christian Schlittchen | | Enno Rehling | Eressea PBEM host | Katja Zedel | (c) 1998 - 2003 | Henning Peters | | Ingo Wilken +-------------------+ Stefan Reich This program may not be used, modified or distributed without prior permission by the authors of Eressea. */ #include #include "xml.h" /* util includes */ #include "log.h" /* libc includes */ #include #include #include #include #include int xml_ivalue(xmlNodePtr node, const char * name, int dflt) { int i = dflt; xmlChar * property = xmlGetProp(node, BAD_CAST name); if (property!=NULL) { i = atoi((const char*)property); xmlFree(property); } return i; } boolean xml_bvalue(xmlNodePtr node, const char * name, boolean dflt) { boolean result = dflt; xmlChar * property = xmlGetProp(node, BAD_CAST name); if (property!=NULL) { if (strcmp((const char*)property, "yes")==0) result = true; if (strcmp((const char*)property, "true")==0) result = true; if (strcmp((const char*)property, "1")==0) { log_warning(("boolean value is '1': %s::%s\n", node->name, name)); result = true; } xmlFree(property); } return result; } double xml_fvalue(xmlNodePtr node, const char * name, double dflt) { double result = dflt; xmlChar * property = xmlGetProp(node, BAD_CAST name); if (property!=NULL) { result = atof((const char*)property); xmlFree(property); } return result; } /* new xml functions */ /* libxml includes */ #include #include #include typedef struct xml_reader { struct xml_reader * next; xml_callback callback; } xml_reader; static xml_reader * xmlReaders; void xml_register_callback(xml_callback callback) { xml_reader * reader = (xml_reader *)malloc(sizeof(xml_reader)); xml_reader ** insert = &xmlReaders; reader->callback = callback; reader->next = NULL; while (*insert) insert = &(*insert)->next; *insert = reader; } int read_xml(const char * filename) { xml_reader * reader = xmlReaders; xmlDocPtr doc; #ifdef XML_PARSE_XINCLUDE doc = xmlReadFile(filename, NULL, XML_PARSE_XINCLUDE); #else doc = xmlParseFile(filename); #endif if (doc==NULL) { log_error(("could not open %s\n", filename)); return -1; } xmlXIncludeProcess(doc); while (reader!=NULL) { int i = reader->callback(doc); if (i!=0) return i; reader = reader->next; } xmlFreeDoc(doc); return 0; }