Eina: add DOCTYPE children parsing in eina_xml
SVN revision: 76683
This commit is contained in:
parent
cb63d40a90
commit
507c2e7b60
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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.
|
||||
*
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue