#ifndef PARSEE_XML_H #define PARSEE_XML_H #include #include #include typedef struct XMLexer XMLexer; typedef struct XMLEvent { enum { XML_LEXER_UNKNOWN = 0, XML_LEXER_STARTELEM, XML_LEXER_DATA, XML_LEXER_ELEM, /* Empty attr */ XML_LEXER_ENDELEM, XML_RELAX } type; int line, col; size_t offset; /* The element name */ char *element; /* Attributes hashmap */ HashMap *attrs; /* The decoded data */ char *data; } XMLEvent; extern XMLexer * XMLCreateLexer(Stream *, bool); extern XMLEvent * XMLCrank(XMLexer *); extern void XMLFreeEvent(XMLEvent *); extern void XMLFreeLexer(XMLexer *); typedef struct XMLElement { enum { XML_ELEMENT_UNKNOWN = 0, XML_ELEMENT_TAG, XML_ELEMENT_DATA, XML_ELEMENT_PI, XML_ELEMENT_CDATA } type; /* Only set when the type is a TAG. */ char *name; HashMap *attrs; Array *children; /* Only set when the type is DATA or * CDATA */ char *data; } XMLElement; /* Decodes 1 element off a stream. */ extern XMLElement * XMLCDecode(Stream *stream, bool autofree, bool html); #define XMLDecode(stream, autofree) XMLCDecode(stream, autofree, false) extern XMLElement * XMLCopy(XMLElement *original); extern XMLElement * XMLCreateTag(char *name); extern XMLElement * XMLCreateText(char *data); extern void XMLAddAttr(XMLElement *element, char *key, char *val); extern void XMLAddChild(XMLElement *element, XMLElement *child); extern XMLElement * XMLookForUnique(XMLElement *parent, char *tag); extern XMLElement * XMLookForTKV(XMLElement *parent, char *tag, char *k, char *v); /* Frees an XML element properly. */ extern void XMLFreeElement(XMLElement *element); /* Encodes an XML element to a stream */ extern void XMLEncode(Stream *stream, XMLElement *element); #endif