Eina: add DOCTYPE children parsing in eina_xml
authorcaro <caro>
Fri, 14 Sep 2012 16:47:48 +0000 (16:47 +0000)
committercaro <caro@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Fri, 14 Sep 2012 16:47:48 +0000 (16:47 +0000)
git-svn-id: http://svn.enlightenment.org/svn/e/trunk/eina@76683 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

ChangeLog
NEWS
src/include/eina_simple_xml_parser.h
src/lib/eina_simple_xml_parser.c

index 6b9f822..ecac6a2 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
 
 2012-07-01  Vincent Torri
 
-        * Remove --enable-coverage from configure options,
+        * Remove --enable-coverage from configure options.
 
 2012-07-04  Vincent Torri
 
         * 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/NEWS b/NEWS
index 21665d7..699d5e5 100644 (file)
--- a/NEWS
+++ b/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.
 
index 0c72c4a..8f83c1e 100644 (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);
@@ -362,6 +365,32 @@ 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.
  *
  * @param parent if provided, will be set in the resulting structure
index 29c5ea1..eeb5a96 100644 (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;