typedef struct _Eina_Simple_XML_Node_Data Eina_Simple_XML_Node_CData;
typedef struct _Eina_Simple_XML_Node_Data Eina_Simple_XML_Node_Processing;
typedef struct _Eina_Simple_XML_Node_Data Eina_Simple_XML_Node_Doctype;
+typedef struct _Eina_Simple_XML_Node_Data Eina_Simple_XML_Node_Doctype_Child; /**< @since 1.8 */
typedef struct _Eina_Simple_XML_Node_Data Eina_Simple_XML_Node_Comment;
typedef struct _Eina_Simple_XML_Attribute Eina_Simple_XML_Attribute;
EINA_SIMPLE_XML_NODE_CDATA,
EINA_SIMPLE_XML_NODE_PROCESSING,
EINA_SIMPLE_XML_NODE_DOCTYPE,
- EINA_SIMPLE_XML_NODE_COMMENT
+ EINA_SIMPLE_XML_NODE_COMMENT,
+ EINA_SIMPLE_XML_NODE_DOCTYPE_CHILD, /**< @since 1.8 */
} Eina_Simple_XML_Node_Type;
struct _Eina_Simple_XML_Node
EINA_SIMPLE_XML_PROCESSING, /*!< \<?xml ... ?\> \<?php .. ?\> */
EINA_SIMPLE_XML_DOCTYPE, /*!< \<!DOCTYPE html */
EINA_SIMPLE_XML_COMMENT, /*!< \<!-- something --\> */
- EINA_SIMPLE_XML_IGNORED /*!< whatever is ignored by parser, like whitespace */
+ EINA_SIMPLE_XML_IGNORED, /*!< whatever is ignored by parser, like whitespace */
+ EINA_SIMPLE_XML_DOCTYPE_CHILD /*!< \<!DOCTYPE_CHILD @since 1.8 */
} Eina_Simple_XML_Type;
typedef Eina_Bool (*Eina_Simple_XML_Cb)(void *data, Eina_Simple_XML_Type type, const char *content, unsigned offset, unsigned length);
/**
+ * Create new doctype child. If parent is provided, it is automatically appended.
+ *
+ * @param parent if provided, will be set in the resulting structure
+ * as well as the doctype child will be appended to children list.
+ * @param contents String to be used. Must not be @c NULL.
+ * @param length size in bytes of @a content.
+ *
+ * @return Newly allocated memory or @c NULL on error. This memory should be
+ * released with eina_simple_xml_node_doctype_child_free() or indirectly
+ * with eina_simple_xml_node_tag_free() of the parent.
+ *
+ * @since 1.8
+ */
+EAPI Eina_Simple_XML_Node_Doctype_Child * eina_simple_xml_node_doctype_child_new(Eina_Simple_XML_Node_Tag *parent, const char *contents, size_t length);
+
+/**
+ * Remove doctype child from parent and delete it.
+ *
+ * @param node to release memory.
+ *
+ * @since 1.8
+ */
+EAPI void eina_simple_xml_node_doctype_child_free(Eina_Simple_XML_Node_Data *node);
+
+
+/**
* Create new processing. If parent is provided, it is automatically appended.
*
* @param parent if provided, will be set in the resulting structure
return NULL;
}
+static inline const char *
+_eina_simple_xml_tag_doctype_child_end_find(const char *itr, const char *itr_end)
+{
+ for (; itr < itr_end; itr++)
+ if (*itr == '>')
+ return itr;
+ return NULL;
+}
+
/**
* @endcond
*/
type = EINA_SIMPLE_XML_CDATA;
toff = sizeof("![CDATA[") - 1;
}
+ else if ((itr + sizeof("<!>") - 1 < itr_end) &&
+ (!memcmp(itr + 2, "",
+ sizeof("") - 1)))
+ {
+ type = EINA_SIMPLE_XML_DOCTYPE_CHILD;
+ toff = sizeof("!") - 1;
+ }
else
{
type = EINA_SIMPLE_XML_OPEN;
if (type == EINA_SIMPLE_XML_CDATA)
p = _eina_simple_xml_tag_cdata_end_find(itr + 1 + toff, itr_end);
+ else if (type == EINA_SIMPLE_XML_DOCTYPE_CHILD)
+ p = _eina_simple_xml_tag_doctype_child_end_find(itr + 1 + toff, itr_end);
else if (type == EINA_SIMPLE_XML_COMMENT)
p = _eina_simple_xml_tag_comment_end_find(itr + 1 + toff, itr_end);
else
case EINA_SIMPLE_XML_DATA:
case EINA_SIMPLE_XML_ERROR:
case EINA_SIMPLE_XML_DOCTYPE:
+ case EINA_SIMPLE_XML_DOCTYPE_CHILD:
case EINA_SIMPLE_XML_IGNORED:
break;
}
_eina_simple_xml_node_data_free(node);
}
+EAPI Eina_Simple_XML_Node_Doctype_Child *
+eina_simple_xml_node_doctype_child_new(Eina_Simple_XML_Node_Tag *parent, const char *contents, size_t length)
+{
+ return _eina_simple_xml_node_data_new
+ (parent, EINA_SIMPLE_XML_NODE_DOCTYPE_CHILD, contents, length);
+}
+
+EAPI void
+eina_simple_xml_node_doctype_child_free(Eina_Simple_XML_Node_Data *node)
+{
+ if (!node)
+ return;
+
+ EINA_MAGIC_CHECK_DATA(&node->base);
+ if (node->base.type != EINA_SIMPLE_XML_NODE_DOCTYPE_CHILD)
+ {
+ ERR("expected node of type: doctype child!");
+ return;
+ }
+ _eina_simple_xml_node_data_free(node);
+}
+
EAPI Eina_Simple_XML_Node_Processing *
eina_simple_xml_node_processing_new(Eina_Simple_XML_Node_Tag *parent, const char *contents, size_t length)
{
case EINA_SIMPLE_XML_DOCTYPE:
return !!eina_simple_xml_node_doctype_new
(ctx->current, content, length);
+ case EINA_SIMPLE_XML_DOCTYPE_CHILD:
+ return !!eina_simple_xml_node_doctype_child_new
+ (ctx->current, content, length);
case EINA_SIMPLE_XML_COMMENT:
return !!eina_simple_xml_node_comment_new
(ctx->current, content, length);
}
break;
+ case EINA_SIMPLE_XML_NODE_DOCTYPE_CHILD:
+ {
+ Eina_Simple_XML_Node_Data *n = (Eina_Simple_XML_Node_Data *)node;
+
+ if (indent) _eina_simple_xml_node_dump_indent(buf, indent, level);
+ eina_strbuf_append_length(buf, "<!", sizeof("<!") - 1);
+ eina_strbuf_append_length(buf, n->data, n->length);
+ eina_strbuf_append_length(buf, ">", sizeof(">") - 1);
+ if (indent) eina_strbuf_append_char(buf, '\n');
+ }
+ break;
+
case EINA_SIMPLE_XML_NODE_COMMENT:
{
Eina_Simple_XML_Node_Data *n = (Eina_Simple_XML_Node_Data *)node;