/** * Copyright (c) 2012 ooxi/xml.c * https://github.com/ooxi/xml.c * * This software is provided 'as-is', without any express or implied warranty. * In no event will the authors be held liable for any damages arising from the * use of this software. * * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software in a * product, an acknowledgment in the product documentation would be * appreciated but is not required. * * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * * 3. This notice may not be removed or altered from any source distribution. */ #ifndef HEADER_XML #define HEADER_XML /** * Includes */ #include #include /** * Opaque structure holding the parsed xml document */ struct xml_document; struct xml_node; /** * Internal character sequence representation */ struct xml_string; /** * Tries to parse the XML fragment in buffer * * @param buffer Chunk to parse * @param length Size of the buffer * * @warning `buffer` will be referenced by the document, you may not free it * until you free the xml_document * @warning You have to call xml_document_free after you finished using the * document * * @return The parsed xml fragment iff parsing was successful, 0 otherwise */ struct xml_document* xml_parse_document(uint8_t* buffer, size_t length); /** * Tries to read an XML document from disk * * @param source File that will be read into an xml document. Will be closed * * @warning You have to call xml_document_free with free_buffer = true after you * finished using the document * * @return The parsed xml fragment iff parsing was successful, 0 otherwise */ struct xml_document* xml_open_document(FILE* source); /** * Frees all resources associated with the document. All xml_node and xml_string * references obtained through the document will be invalidated * * @param document xml_document to free * @param free_buffer iff true the internal buffer supplied via xml_parse_buffer * will be freed with the `free` system call */ void xml_document_free(struct xml_document* document, _Bool free_buffer); /** * @return xml_node representing the document root */ struct xml_node* xml_document_root(struct xml_document* document); /** * @return The xml_node's tag name */ struct xml_string* xml_node_name(struct xml_node* node); /** * @return The xml_node's string content (if available, otherwise NULL) */ struct xml_string* xml_node_content(struct xml_node* node); /** * @return Number of child nodes */ size_t xml_node_children(struct xml_node* node); /** * @return The n-th child or 0 if out of range */ struct xml_node* xml_node_child(struct xml_node* node, size_t child); /** * @return The node described by the path or 0 if child cannot be found * @warning Each element on the way must be unique * @warning Last argument must be 0 */ struct xml_node* xml_easy_child(struct xml_node* node, uint8_t const* child, ...); /** * @return 0-terminated copy of node name * @warning User must free the result */ uint8_t* xml_easy_name(struct xml_node* node); /** * @return 0-terminated copy of node content * @warning User must free the result */ uint8_t* xml_easy_content(struct xml_node* node); /** * @return Length of the string */ size_t xml_string_length(struct xml_string* string); /** * Copies the string into the supplied buffer * * @warning String will not be 0-terminated * @warning Will write at most length bytes, even if the string is longer */ void xml_string_copy(struct xml_string* string, uint8_t* buffer, size_t length); #endif