diff options
Diffstat (limited to 'src/xml.c')
-rw-r--r-- | src/xml.c | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/src/xml.c b/src/xml.c new file mode 100644 index 0000000..68a72ed --- /dev/null +++ b/src/xml.c @@ -0,0 +1,62 @@ +#include <string.h> +#include <stdio.h> +#include <expat.h> +#include "xml.h" +#include "logging.h" + +inline int +xml_check_tag(const char *found, const char *expected) +{ + return strcmp(found, expected) != 0; +} + +inline void +xml_unexpected_start_tag(XML_Parser p, const char *found, const char *expected) +{ + warn("Found \"%s\" start tag where expected one of \"%s\" in map", + found, expected); + XML_StopParser(p, XML_FALSE); +} + +inline void +xml_unexpected_end_tag(XML_Parser p, const char *found, const char *expected) +{ + warn("Found \"%s\" end tag where expected one of \"%s\" in map", + found, expected); + XML_StopParser(p, XML_FALSE); +} + +void +xml_get_int_attr(XML_Parser p, const char **attr, const char *name, + int *dest, int req) +{ + for (; attr[0] != NULL; attr += 2) { + if (strcmp(attr[0], name) == 0) { + if (sscanf(attr[1], "%d", dest) == 1) { + return; + } else if (req) { + warn("Invalid \"%s\" attribute value", name); + XML_StopParser(p, XML_FALSE); + } + } + } + if (req) { + warn("Required attribute \"%s\" not found", name); + XML_StopParser(p, XML_FALSE); + } +} + +void +xml_get_string_attr(XML_Parser p, const char **attr, const char *name, + char **dest, int req) +{ + for (; attr[0] != NULL; attr += 2) { + if (strcmp(attr[0], name) == 0) { + *dest = strdup(attr[1]); + } + } + if (req) { + warn("Required attribute \"%s\" not found", name); + XML_StopParser(p, XML_FALSE); + } +} |