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 2012-07-01 Vincent Torri
* Remove --enable-coverage from configure options, * Remove --enable-coverage from configure options.
2012-07-04 Vincent Torri 2012-07-04 Vincent Torri
@ -348,3 +348,7 @@
* Add check if given arguments (distance and coordinates) in eina_tiler * Add check if given arguments (distance and coordinates) in eina_tiler
and eina_rectangle are not below zero and eina_rectangle are not below zero
* Documentation for eina list specified and eina stringshare fixed * 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: Changes since Eina 1.7.0:
------------------------- -------------------------
Additions:
* Add DOCTYPE children parsing in eina_simple_xml
Improvements: Improvements:
* Speedup Eina Rbtree Iterator by recycling memory instead of massively calling malloc/free. * 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_CData;
typedef struct _Eina_Simple_XML_Node_Data Eina_Simple_XML_Node_Processing; 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;
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_Node_Data Eina_Simple_XML_Node_Comment;
typedef struct _Eina_Simple_XML_Attribute Eina_Simple_XML_Attribute; 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_CDATA,
EINA_SIMPLE_XML_NODE_PROCESSING, EINA_SIMPLE_XML_NODE_PROCESSING,
EINA_SIMPLE_XML_NODE_DOCTYPE, 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; } Eina_Simple_XML_Node_Type;
struct _Eina_Simple_XML_Node struct _Eina_Simple_XML_Node
@ -208,7 +210,8 @@ typedef enum _Eina_Simple_XML_Type
EINA_SIMPLE_XML_PROCESSING, /*!< \<?xml ... ?\> \<?php .. ?\> */ EINA_SIMPLE_XML_PROCESSING, /*!< \<?xml ... ?\> \<?php .. ?\> */
EINA_SIMPLE_XML_DOCTYPE, /*!< \<!DOCTYPE html */ EINA_SIMPLE_XML_DOCTYPE, /*!< \<!DOCTYPE html */
EINA_SIMPLE_XML_COMMENT, /*!< \<!-- something --\> */ 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; } 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); 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); 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. * 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; 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 * @endcond
*/ */
@ -352,6 +361,13 @@ eina_simple_xml_parse(const char *buf, unsigned buflen, Eina_Bool strip, Eina_Si
type = EINA_SIMPLE_XML_CDATA; type = EINA_SIMPLE_XML_CDATA;
toff = sizeof("![CDATA[") - 1; 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 else
{ {
type = EINA_SIMPLE_XML_OPEN; 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) if (type == EINA_SIMPLE_XML_CDATA)
p = _eina_simple_xml_tag_cdata_end_find(itr + 1 + toff, itr_end); 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) else if (type == EINA_SIMPLE_XML_COMMENT)
p = _eina_simple_xml_tag_comment_end_find(itr + 1 + toff, itr_end); p = _eina_simple_xml_tag_comment_end_find(itr + 1 + toff, itr_end);
else 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_DATA:
case EINA_SIMPLE_XML_ERROR: case EINA_SIMPLE_XML_ERROR:
case EINA_SIMPLE_XML_DOCTYPE: case EINA_SIMPLE_XML_DOCTYPE:
case EINA_SIMPLE_XML_DOCTYPE_CHILD:
case EINA_SIMPLE_XML_IGNORED: case EINA_SIMPLE_XML_IGNORED:
break; break;
} }
@ -758,6 +777,28 @@ eina_simple_xml_node_cdata_free(Eina_Simple_XML_Node_Data *node)
_eina_simple_xml_node_data_free(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 * EAPI Eina_Simple_XML_Node_Processing *
eina_simple_xml_node_processing_new(Eina_Simple_XML_Node_Tag *parent, const char *contents, size_t length) 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: case EINA_SIMPLE_XML_DOCTYPE:
return !!eina_simple_xml_node_doctype_new return !!eina_simple_xml_node_doctype_new
(ctx->current, content, length); (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: case EINA_SIMPLE_XML_COMMENT:
return !!eina_simple_xml_node_comment_new return !!eina_simple_xml_node_comment_new
(ctx->current, content, length); (ctx->current, content, length);
@ -1081,6 +1125,18 @@ _eina_simple_xml_node_dump(Eina_Strbuf *buf, Eina_Simple_XML_Node *node, const c
} }
break; 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: case EINA_SIMPLE_XML_NODE_COMMENT:
{ {
Eina_Simple_XML_Node_Data *n = (Eina_Simple_XML_Node_Data *)node; Eina_Simple_XML_Node_Data *n = (Eina_Simple_XML_Node_Data *)node;