From 507c2e7b609548709f1c650dee74aebeb91aff81 Mon Sep 17 00:00:00 2001 From: Vincent Torri Date: Fri, 14 Sep 2012 16:47:48 +0000 Subject: [PATCH] Eina: add DOCTYPE children parsing in eina_xml SVN revision: 76683 --- legacy/eina/ChangeLog | 6 +- legacy/eina/NEWS | 3 + .../eina/src/include/eina_simple_xml_parser.h | 33 ++++++++++- legacy/eina/src/lib/eina_simple_xml_parser.c | 56 +++++++++++++++++++ 4 files changed, 95 insertions(+), 3 deletions(-) diff --git a/legacy/eina/ChangeLog b/legacy/eina/ChangeLog index 6b9f822daf..ecac6a25a1 100644 --- a/legacy/eina/ChangeLog +++ b/legacy/eina/ChangeLog @@ -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. diff --git a/legacy/eina/NEWS b/legacy/eina/NEWS index 21665d77f8..699d5e58b7 100644 --- a/legacy/eina/NEWS +++ b/legacy/eina/NEWS @@ -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. diff --git a/legacy/eina/src/include/eina_simple_xml_parser.h b/legacy/eina/src/include/eina_simple_xml_parser.h index 0c72c4a8e8..8f83c1e01a 100644 --- a/legacy/eina/src/include/eina_simple_xml_parser.h +++ b/legacy/eina/src/include/eina_simple_xml_parser.h @@ -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, /*!< \ \ */ EINA_SIMPLE_XML_DOCTYPE, /*!< \ */ - 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 /*!< \') + 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, "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;