Eina: add DOCTYPE children parsing in eina_xml

SVN revision: 76683
This commit is contained in:
Vincent Torri 2012-09-14 16:47:48 +00:00
parent cb63d40a90
commit 507c2e7b60
4 changed files with 95 additions and 3 deletions

View File

@ -305,7 +305,7 @@
2012-07-01 Vincent Torri
* Remove --enable-coverage from configure options,
* Remove --enable-coverage from configure options.
2012-07-04 Vincent Torri
@ -348,3 +348,7 @@
* Add check if given arguments (distance and coordinates) in eina_tiler
and eina_rectangle are not below zero
* Documentation for eina list specified and eina stringshare fixed
2012-07-01 Vincent Torri
* Add DOCTYPE children to be parse in eina_simple_xml.

View File

@ -3,6 +3,9 @@ Eina 1.8.0
Changes since Eina 1.7.0:
-------------------------
Additions:
* Add DOCTYPE children parsing in eina_simple_xml
Improvements:
* Speedup Eina Rbtree Iterator by recycling memory instead of massively calling malloc/free.

View File

@ -146,6 +146,7 @@ typedef struct _Eina_Simple_XML_Node_Data Eina_Simple_XML_Node_Data;
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;
@ -167,7 +168,8 @@ typedef enum _Eina_Simple_XML_Node_Type
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
@ -208,7 +210,8 @@ typedef enum _Eina_Simple_XML_Type
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);
@ -361,6 +364,32 @@ EAPI Eina_Simple_XML_Node_CData * eina_simple_xml_node_cdata_new(Eina_Simple_XML
EAPI void eina_simple_xml_node_cdata_free(Eina_Simple_XML_Node_Data *node);
/**
* 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.
*

View File

@ -181,6 +181,15 @@ _eina_simple_xml_tag_cdata_end_find(const char *itr, const char *itr_end)
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
*/
@ -352,6 +361,13 @@ eina_simple_xml_parse(const char *buf, unsigned buflen, Eina_Bool strip, Eina_Si
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;
@ -366,6 +382,8 @@ eina_simple_xml_parse(const char *buf, unsigned buflen, Eina_Bool strip, Eina_Si
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
@ -407,6 +425,7 @@ eina_simple_xml_parse(const char *buf, unsigned buflen, Eina_Bool strip, Eina_Si
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;
}
@ -758,6 +777,28 @@ eina_simple_xml_node_cdata_free(Eina_Simple_XML_Node_Data *node)
_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)
{
@ -908,6 +949,9 @@ _eina_simple_xml_node_parse(void *data, Eina_Simple_XML_Type type, const char *c
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);
@ -1081,6 +1125,18 @@ _eina_simple_xml_node_dump(Eina_Strbuf *buf, Eina_Simple_XML_Node *node, const c
}
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;