XML: add a function xmlAppend 97/9397/4
Calixte DENIZET [Tue, 9 Oct 2012 15:54:43 +0000 (17:54 +0200)]
Change-Id: I94831582d52740f18bd9f48f728a9c3196719af4

14 files changed:
scilab/modules/xml/Makefile.am
scilab/modules/xml/Makefile.in
scilab/modules/xml/help/en_US/xmlAppend.xml [new file with mode: 0644]
scilab/modules/xml/includes/gw_xml.h
scilab/modules/xml/sci_gateway/c/gw_xml.c
scilab/modules/xml/sci_gateway/cpp/sci_xmlAppend.cpp [new file with mode: 0644]
scilab/modules/xml/sci_gateway/xml_gateway.xml
scilab/modules/xml/src/cpp/XMLElement.cpp
scilab/modules/xml/src/cpp/XMLElement.hxx
scilab/modules/xml/src/cpp/XMLList.hxx
scilab/modules/xml/tests/unit_tests/xmlAppend.dia.ref [new file with mode: 0644]
scilab/modules/xml/tests/unit_tests/xmlAppend.tst [new file with mode: 0644]
scilab/modules/xml/xml.vcxproj
scilab/modules/xml/xml.vcxproj.filters

index 861f4b4..f2ba347 100644 (file)
@@ -80,7 +80,8 @@ GATEWAY_CXX_SOURCES = sci_gateway/cpp/sci_xmlRead.cpp \
                      sci_gateway/cpp/sci_xmlAsText.cpp \
                      sci_gateway/cpp/sci_xmlRemove.cpp \
                      sci_gateway/cpp/sci_xmlSetAttributes.cpp \
-                     sci_gateway/cpp/sci_xmlName.cpp
+                     sci_gateway/cpp/sci_xmlName.cpp \
+                     sci_gateway/cpp/sci_xmlAppend.cpp
 
 libscixml_la_CPPFLAGS = -I$(srcdir)/includes/ \
     -I$(srcdir)/src/cpp/ \
index ce6aa86..165d871 100644 (file)
@@ -184,7 +184,9 @@ am__objects_5 = libscixml_la-sci_xmlRead.lo \
        libscixml_la-sci_xmlAsNumber.lo libscixml_la-sci_xmlAsText.lo \
        libscixml_la-sci_xmlRemove.lo \
        libscixml_la-sci_xmlSetAttributes.lo \
-       libscixml_la-sci_xmlName.lo
+       libscixml_la-sci_xmlName.lo \
+       libscixml_la-sci_xmlAppend.lo
+
 am_libscixml_la_OBJECTS = $(am__objects_4) $(am__objects_5)
 libscixml_la_OBJECTS = $(am_libscixml_la_OBJECTS)
 libscixml_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
@@ -615,7 +617,11 @@ GATEWAY_CXX_SOURCES = sci_gateway/cpp/sci_xmlRead.cpp \
                      sci_gateway/cpp/sci_xmlAsText.cpp \
                      sci_gateway/cpp/sci_xmlRemove.cpp \
                      sci_gateway/cpp/sci_xmlSetAttributes.cpp \
+<<<<<<< HEAD
                      sci_gateway/cpp/sci_xmlName.cpp
+=======
+                     sci_gateway/cpp/sci_xmlAppend.cpp
+>>>>>>> 97a99f3... XML: add a function xmlAppend
 
 libscixml_la_CPPFLAGS = -I$(srcdir)/includes/ \
     -I$(srcdir)/src/cpp/ \
@@ -765,6 +771,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscixml_la-sci_percent_s_i_XMLList.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscixml_la-sci_print.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscixml_la-sci_xmlAddNs.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscixml_la-sci_xmlAppend.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscixml_la-sci_xmlAsNumber.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscixml_la-sci_xmlAsText.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscixml_la-sci_xmlDelete.Plo@am__quote@
@@ -1179,12 +1186,21 @@ libscixml_la-sci_xmlSetAttributes.lo: sci_gateway/cpp/sci_xmlSetAttributes.cpp
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@ $(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscixml_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libscixml_la-sci_xmlSetAttributes.lo `test -f 'sci_gateway/cpp/sci_xmlSetAttributes.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_xmlSetAttributes.cpp
 
+<<<<<<< HEAD
 libscixml_la-sci_xmlName.lo: sci_gateway/cpp/sci_xmlName.cpp
 @am__fastdepCXX_TRUE@  $(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscixml_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libscixml_la-sci_xmlName.lo -MD -MP -MF $(DEPDIR)/libscixml_la-sci_xmlName.Tpo -c -o libscixml_la-sci_xmlName.lo `test -f 'sci_gateway/cpp/sci_xmlName.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_xmlName.cpp
 @am__fastdepCXX_TRUE@  $(am__mv) $(DEPDIR)/libscixml_la-sci_xmlName.Tpo $(DEPDIR)/libscixml_la-sci_xmlName.Plo
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@     source='sci_gateway/cpp/sci_xmlName.cpp' object='libscixml_la-sci_xmlName.lo' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@ $(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscixml_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libscixml_la-sci_xmlName.lo `test -f 'sci_gateway/cpp/sci_xmlName.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_xmlName.cpp
+=======
+libscixml_la-sci_xmlAppend.lo: sci_gateway/cpp/sci_xmlAppend.cpp
+@am__fastdepCXX_TRUE@  $(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscixml_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libscixml_la-sci_xmlAppend.lo -MD -MP -MF $(DEPDIR)/libscixml_la-sci_xmlAppend.Tpo -c -o libscixml_la-sci_xmlAppend.lo `test -f 'sci_gateway/cpp/sci_xmlAppend.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_xmlAppend.cpp
+@am__fastdepCXX_TRUE@  $(am__mv) $(DEPDIR)/libscixml_la-sci_xmlAppend.Tpo $(DEPDIR)/libscixml_la-sci_xmlAppend.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     source='sci_gateway/cpp/sci_xmlAppend.cpp' object='libscixml_la-sci_xmlAppend.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscixml_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libscixml_la-sci_xmlAppend.lo `test -f 'sci_gateway/cpp/sci_xmlAppend.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_xmlAppend.cpp
+>>>>>>> 97a99f3... XML: add a function xmlAppend
 
 mostlyclean-libtool:
        -rm -f *.lo
diff --git a/scilab/modules/xml/help/en_US/xmlAppend.xml b/scilab/modules/xml/help/en_US/xmlAppend.xml
new file mode 100644 (file)
index 0000000..4da5d50
--- /dev/null
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+* Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+* Copyright (C) 2012 - Scilab Enterprises - Calixte DENIZET
+*
+* This file must be used under the terms of the CeCILL.
+* This source file is licensed as described in the file COPYING, which
+* you should have received as part of this distribution.  The terms
+* are also available at
+* http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+*
+-->
+<refentry xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svg="http://www.w3.org/2000/svg" xmlns:ns5="http://www.w3.org/1999/xhtml" xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:db="http://docbook.org/ns/docbook" xmlns:scilab="http://www.scilab.org" xml:id="xmlAppend" xml:lang="en">
+    <refnamediv>
+        <refname>xmlAppend</refname>
+        <refpurpose>Append an element to the parent children</refpurpose>
+    </refnamediv>
+    <refsynopsisdiv>
+        <title>Calling Sequence</title>
+        <synopsis>
+            xmlAppend(parent, child)
+        </synopsis>
+    </refsynopsisdiv>
+    <refsection>
+        <title>Arguments</title>
+        <variablelist>
+            <varlistentry>
+                <term>parent</term>
+                <listitem>
+                    <para>a mlist typed XMLElem</para>
+                </listitem>
+            </varlistentry>
+            <varlistentry>
+                <term>child</term>
+                <listitem>
+                    <para>a mlist typed XMLElem</para>
+                </listitem>
+            </varlistentry>
+        </variablelist>
+    </refsection>
+    <refsection>
+        <title>Description</title>
+        <para>Append an element to the children of another element.</para>
+    </refsection>
+    <refsection>
+        <title>Examples</title>
+        <programlisting role="example"><![CDATA[
+    doc = xmlDocument();
+    root = xmlElement(doc, "root");
+    doc.root = root;
+
+    for i=1:5
+        xmlAppend(doc.root, xmlElement(doc, "child_" + string(i)));
+    end;
+    
+    xmlDump(doc)
+    xmlDelete(doc);
+    ]]></programlisting>
+    </refsection>
+    <refsection role="see also">
+        <title>See Also</title>
+        <simplelist type="inline">
+            <member>
+                <link linkend="XMLObjects">XML Objects</link>
+            </member>
+            <member>
+                <link linkend="xmlElement">xmlElement</link>
+            </member>
+        </simplelist>
+    </refsection>
+    <refsection>
+        <title>History</title>
+        <revhistory>
+            <revision>
+                <revnumber>5.4.1</revnumber>
+                <revremark>XML module updated.</revremark>
+            </revision>
+        </revhistory>
+    </refsection>
+</refentry>
index 57a9a15..1cba23f 100644 (file)
@@ -73,6 +73,7 @@ int sci_xmlAsText(char *fname, unsigned long fname_len);
 int sci_xmlRemove(char *fname, unsigned long fname_len);
 int sci_xmlSetAttributes(char *fname, unsigned long fname_len);
 int sci_xmlName(char *fname, unsigned long fname_len);
+int sci_xmlAppend(char *fname, unsigned long fname_len);
 
 /*--------------------------------------------------------------------------*/
 #endif /* __GW_XML_H__ */
index 49aa9f5..c86e0c4 100644 (file)
@@ -97,7 +97,8 @@ static gw_generic_table Tab[] =
     {sci_xmlAsText, "xmlAsText"},
     {sci_xmlRemove, "xmlRemove"},
     {sci_xmlSetAttributes, "xmlSetAttributes"},
-    {sci_xmlName, "xmlName"}
+    {sci_xmlName, "xmlName"},
+    {sci_xmlAppend, "xmlAppend"}
 };
 
 /*--------------------------------------------------------------------------*/
diff --git a/scilab/modules/xml/sci_gateway/cpp/sci_xmlAppend.cpp b/scilab/modules/xml/sci_gateway/cpp/sci_xmlAppend.cpp
new file mode 100644 (file)
index 0000000..ff393f1
--- /dev/null
@@ -0,0 +1,91 @@
+/*
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2012 - Scilab Enterprises - Calixte DENIZET
+ *
+ * This file must be used under the terms of the CeCILL.
+ * This source file is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution.  The terms
+ * are also available at
+ * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+ *
+ */
+
+#include "XMLObject.hxx"
+#include "XMLDocument.hxx"
+#include "XMLElement.hxx"
+
+extern "C"
+{
+#include "gw_xml.h"
+#include "Scierror.h"
+#include "api_scilab.h"
+#include "xml_mlist.h"
+#include "libxml/tree.h"
+#include "localization.h"
+}
+
+using namespace org_modules_xml;
+
+/*--------------------------------------------------------------------------*/
+int sci_xmlAppend(char *fname, unsigned long fname_len)
+{
+    XMLElement *parent = 0;
+    XMLElement *elem = 0;
+    SciErr err;
+    int *addr = 0;
+    char *name = 0;
+
+    CheckLhs(1, 1);
+    CheckRhs(2, 2);
+
+    err = getVarAddressFromPosition(pvApiCtx, 1, &addr);
+    if (err.iErr)
+    {
+        printError(&err, 0);
+        Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 1);
+        return 0;
+    }
+
+    if (!isXMLElem(addr, pvApiCtx))
+    {
+        Scierror(999, gettext("%s: Wrong type for input argument #%d: A %s expected.\n"), fname, 1, "XMLElement");
+        return 0;
+    }
+
+    parent = XMLObject::getFromId < org_modules_xml::XMLElement > (getXMLObjectId(addr, pvApiCtx));
+    if (!parent)
+    {
+        Scierror(999, gettext("%s: XML Document does not exist.\n"), fname);
+        return 0;
+    }
+
+    err = getVarAddressFromPosition(pvApiCtx, 2, &addr);
+    if (err.iErr)
+    {
+        printError(&err, 0);
+        Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 2);
+        return 0;
+    }
+
+    if (!isXMLElem(addr, pvApiCtx))
+    {
+        Scierror(999, gettext("%s: Wrong type for input argument #%d: A %s expected.\n"), fname, 2, "XMLElement");
+        return 0;
+    }
+
+    elem = XMLObject::getFromId < org_modules_xml::XMLElement > (getXMLObjectId(addr, pvApiCtx));
+    if (!elem)
+    {
+        Scierror(999, gettext("%s: XML Document does not exist.\n"), fname);
+        return 0;
+    }
+
+    parent->append(*elem);
+
+    LhsVar(1) = 0;
+    PutLhsVar();
+
+    return 0;
+}
+
+/*--------------------------------------------------------------------------*/
index c7af05c..c23abc6 100644 (file)
     <PRIMITIVE gatewayId="68" primitiveId="77" primitiveName="xmlRemove" />
     <PRIMITIVE gatewayId="68" primitiveId="78" primitiveName="xmlSetAttributes" />
     <PRIMITIVE gatewayId="68" primitiveId="79" primitiveName="xmlName" />
+    <PRIMITIVE gatewayId="68" primitiveId="80" primitiveName="xmlAppend" />
 </GATEWAY>
index d1e0058..2d9fcd7 100644 (file)
@@ -26,265 +26,279 @@ extern "C"
 namespace org_modules_xml
 {
 
-    XMLElement::XMLElement(const XMLDocument & _doc, xmlNode * _node):XMLObject(), doc(_doc)
-    {
-        node = _node;
-        scope->registerPointers(node, this);
-        scilabType = XMLELEMENT;
-        id = scope->getVariableId(*this);
-    }
+XMLElement::XMLElement(const XMLDocument & _doc, xmlNode * _node): XMLObject(), doc(_doc)
+{
+    node = _node;
+    scope->registerPointers(node, this);
+    scilabType = XMLELEMENT;
+    id = scope->getVariableId(*this);
+}
 
-    XMLElement::XMLElement(const XMLDocument & _doc, const char *name):XMLObject(), doc(_doc)
-    {
-        node = xmlNewNode(0, (const xmlChar *)name);
-        scope->registerPointers(node, this);
-        scilabType = XMLELEMENT;
-        id = scope->getVariableId(*this);
-    }
+XMLElement::XMLElement(const XMLDocument & _doc, const char *name): XMLObject(), doc(_doc)
+{
+    node = xmlNewNode(0, (const xmlChar *)name);
+    scope->registerPointers(node, this);
+    scilabType = XMLELEMENT;
+    id = scope->getVariableId(*this);
+}
 
-    XMLElement::~XMLElement()
-    {
-        scope->unregisterPointer(node);
-        scope->removeId(id);
-    }
+XMLElement::~XMLElement()
+{
+    scope->unregisterPointer(node);
+    scope->removeId(id);
+}
 
-    void *XMLElement::getRealXMLPointer() const
-    {
-        return static_cast < void *>(node);
-    }
+void *XMLElement::getRealXMLPointer() const
+{
+    return static_cast < void *>(node);
+}
 
-    void XMLElement::remove() const
-    {
-        xmlUnlinkNode(node);
-        xmlFreeNode(node);
-    }
+void XMLElement::remove() const
+{
+    xmlUnlinkNode(node);
+    xmlFreeNode(node);
+}
 
-    const XMLObject *XMLElement::getXMLObjectParent() const
-    {
-        return &doc;
-    }
+const XMLObject *XMLElement::getXMLObjectParent() const
+{
+    return &doc;
+}
 
-    const char *XMLElement::getNodeContent() const
-    {
-        return (const char *)xmlNodeGetContent(node);
-    }
+const char *XMLElement::getNodeContent() const
+{
+    return (const char *)xmlNodeGetContent(node);
+}
 
-    void XMLElement::setNodeName(const std::string & name) const
-    {
-        xmlNodeSetName(node, (const xmlChar *)name.c_str());
-    }
+void XMLElement::setNodeName(const std::string & name) const
+{
+    xmlNodeSetName(node, (const xmlChar *)name.c_str());
+}
 
-    void XMLElement::setNodeNameSpace(const XMLNs & ns) const
+void XMLElement::setNodeNameSpace(const XMLNs & ns) const
+{
+    xmlNs *n = ns.getRealNs();
+    if (n)
     {
-        xmlNs *n = ns.getRealNs();
-        if (n)
+        if (!n->prefix || !xmlSearchNs(doc.getRealDocument(), node, n->prefix))
         {
-            if (!n->prefix || !xmlSearchNs(doc.getRealDocument(), node, n->prefix))
-            {
-                n = xmlNewNs(node, (const xmlChar *)ns.getHref(), (const xmlChar *)ns.getPrefix());
-            }
-            xmlSetNs(node, n);
+            n = xmlNewNs(node, (const xmlChar *)ns.getHref(), (const xmlChar *)ns.getPrefix());
         }
+        xmlSetNs(node, n);
     }
+}
 
-    void XMLElement::setNodeContent(const std::string & content) const
-    {
-        xmlNodeSetContent(node, (const xmlChar *)content.c_str());
-    }
+void XMLElement::setNodeContent(const std::string & content) const
+{
+    xmlNodeSetContent(node, (const xmlChar *)content.c_str());
+}
 
-    void XMLElement::setAttributes(const XMLAttr & attrs) const
+void XMLElement::setAttributes(const XMLAttr & attrs) const
+{
+    xmlNode *attrNode = attrs.getElement().getRealNode();
+    if (node != attrNode)
     {
-        xmlNode *attrNode = attrs.getElement().getRealNode();
-        if (node != attrNode)
-        {
-            xmlFreePropList(node->properties);
-            node->properties = 0;
-            xmlCopyPropList(node, attrNode->properties);
-        }
+        xmlFreePropList(node->properties);
+        node->properties = 0;
+        xmlCopyPropList(node, attrNode->properties);
     }
+}
+
+void XMLElement::setAttributeValue(const char **prefix, const char **name, const char **value, int size) const
+{
+    XMLAttr::setAttributeValue(node, prefix, name, value, size);
+}
+
+void XMLElement::setAttributeValue(const char **name, const char **value, int size) const
+{
+    XMLAttr::setAttributeValue(node, name, value, size);
+}
 
-    void XMLElement::setAttributeValue(const char **prefix, const char **name, const char **value, int size) const
+void XMLElement::append(const XMLElement & elem) const
+{
+    XMLNodeList * list = 0;
+    xmlNode *cpy = xmlCopyNode(elem.getRealNode(), 1);
+    xmlUnlinkNode(cpy);
+    xmlAddChild(node, cpy);
+
+    list = scope->getXMLNodeListFromLibXMLPtr(node->children);
+    if (list)
     {
-        XMLAttr::setAttributeValue(node, prefix, name, value, size);
+        list->incrementSize();
     }
+}
 
-    void XMLElement::setAttributeValue(const char **name, const char **value, int size) const
+void XMLElement::setChildren(const XMLElement & elem) const
+{
+    xmlNode *n = elem.getRealNode();
+    if (n && n->parent != node)
     {
-        XMLAttr::setAttributeValue(node, name, value, size);
+        xmlNode *cpy = xmlCopyNode(n, 1);
+        xmlUnlinkNode(cpy);
+        xmlUnlinkNode(node->children);
+        xmlFreeNodeList(node->children);
+        node->children = 0;
+        xmlAddChild(node, cpy);
     }
+}
 
-    void XMLElement::setChildren(const XMLElement & elem) const
+void XMLElement::setChildren(const XMLNodeList & list) const
+{
+    xmlNode *n = list.getRealNode();
+    if (n && n->parent != node)
     {
-        xmlNode *n = elem.getRealNode();
-        if (n && n->parent != node)
-        {
-            xmlNode *cpy = xmlCopyNode(n, 1);
-              xmlUnlinkNode(cpy);
-              xmlUnlinkNode(node->children);
-              xmlFreeNodeList(node->children);
-              node->children = 0;
-              xmlAddChild(node, cpy);
-        }
+        xmlNode *cpy = xmlCopyNodeList(n);
+        xmlUnlinkNode(node->children);
+        xmlFreeNodeList(node->children);
+        node->children = 0;
+        xmlAddChildList(node, cpy);
     }
+}
+
+void XMLElement::setChildren(const std::string & xmlCode) const
+{
+    std::string error;
+    XMLDocument document = XMLDocument(xmlCode, false, &error);
 
-    void XMLElement::setChildren(const XMLNodeList & list) const
+    if (error.empty())
     {
-        xmlNode *n = list.getRealNode();
-        if (n && n->parent != node)
-        {
-            xmlNode *cpy = xmlCopyNodeList(n);
-              xmlUnlinkNode(node->children);
-              xmlFreeNodeList(node->children);
-              node->children = 0;
-              xmlAddChildList(node, cpy);
-        }
+        setChildren(*document.getRoot());
     }
-
-    void XMLElement::setChildren(const std::string & xmlCode) const
+    else
     {
-        std::string error;
-        XMLDocument document = XMLDocument(xmlCode, false, &error);
-
-        if (error.empty())
-        {
-            setChildren(*document.getRoot());
-        }
-        else
-        {
-            xmlNode *n = xmlNewText((xmlChar *) xmlCode.c_str());
+        xmlNode *n = xmlNewText((xmlChar *) xmlCode.c_str());
 
-            setChildren(XMLElement(doc, n));
-        }
+        setChildren(XMLElement(doc, n));
     }
+}
 
-    void XMLElement::addNamespace(const XMLNs & ns) const
+void XMLElement::addNamespace(const XMLNs & ns) const
+{
+    xmlNewNs(node, (const xmlChar *)ns.getHref(), (const xmlChar *)ns.getPrefix());
+}
+
+const XMLNs *XMLElement::getNamespaceByPrefix(const char *prefix) const
+{
+    xmlNs *ns = xmlSearchNs(doc.getRealDocument(), node, (const xmlChar *)prefix);
+    XMLObject *obj = scope->getXMLObjectFromLibXMLPtr(ns);
+    if (obj)
     {
-        xmlNewNs(node, (const xmlChar *)ns.getHref(), (const xmlChar *)ns.getPrefix());
+        return static_cast < XMLNs * >(obj);
     }
 
-    const XMLNs *XMLElement::getNamespaceByPrefix(const char *prefix) const
-    {
-        xmlNs *ns = xmlSearchNs(doc.getRealDocument(), node, (const xmlChar *)prefix);
-        XMLObject *obj = scope->getXMLObjectFromLibXMLPtr(ns);
-        if (obj)
-        {
-            return static_cast < XMLNs * >(obj);
-        }
+    return new XMLNs(*this, ns);
+}
 
-        return new XMLNs(*this, ns);
+const XMLNs *XMLElement::getNamespaceByHref(const char *href) const
+{
+    xmlNs *ns = xmlSearchNsByHref(doc.getRealDocument(), node, (const xmlChar *)href);
+    XMLObject *obj = scope->getXMLObjectFromLibXMLPtr(ns);
+    if (obj)
+    {
+        return static_cast < XMLNs * >(obj);
     }
 
-    const XMLNs *XMLElement::getNamespaceByHref(const char *href) const
+    return new XMLNs(*this, ns);
+}
+
+const std::string XMLElement::dump(bool indent) const
+{
+    xmlBufferPtr buffer = xmlBufferCreate();
+    xmlNodeDump(buffer, doc.getRealDocument(), node, 0, indent ? 1 : 0);
+    std::string str = std::string((const char *)buffer->content);
+    xmlBufferFree(buffer);
+
+    return str;
+}
+
+const std::string XMLElement::toString() const
+{
+    std::ostringstream oss;
+    std::string ns = "";
+    std::string prefix = "";
+
+    if (node->ns)
     {
-        xmlNs *ns = xmlSearchNsByHref(doc.getRealDocument(), node, (const xmlChar *)href);
-        XMLObject *obj = scope->getXMLObjectFromLibXMLPtr(ns);
-        if (obj)
+        if (node->ns->href)
         {
-            return static_cast < XMLNs * >(obj);
+            ns = std::string((const char *)node->ns->href);
         }
 
-        return new XMLNs(*this, ns);
+        if (node->ns->prefix)
+        {
+            prefix = std::string((const char *)node->ns->prefix);
+        }
     }
 
-    const std::string XMLElement::dump(bool indent) const
-    {
-        xmlBufferPtr buffer = xmlBufferCreate();
-          xmlNodeDump(buffer, doc.getRealDocument(), node, 0, indent ? 1 : 0);
-          std::string str = std::string((const char *)buffer->content);
-          xmlBufferFree(buffer);
+    oss << "XML Element" << std::endl;
+    oss << "name: " << getNodeName() << std::endl;
+    oss << "namespace href: " << ns << std::endl;
+    oss << "namespace prefix: " << prefix << std::endl;
+    oss << "type: " << nodes_type[getNodeType() - 1] << std::endl;
+    oss << "definition line: " << node->line;
 
-          return str;
-    }
+    return oss.str();
+}
 
-    const std::string XMLElement::toString() const
-    {
-        std::ostringstream oss;
-        std::string ns = "";
-        std::string prefix = "";
+int XMLElement::getDefinitionLine() const
+{
+    return node->line;
+}
 
-        if (node->ns)
+const XMLNs *XMLElement::getNodeNameSpace() const
+{
+    if (node->ns)
+    {
+        XMLObject *obj = scope->getXMLObjectFromLibXMLPtr(node->ns);
+        if (obj)
         {
-            if (node->ns->href)
-            {
-                ns = std::string((const char *)node->ns->href);
-            }
-
-            if (node->ns->prefix)
-            {
-                prefix = std::string((const char *)node->ns->prefix);
-            }
+            return static_cast < XMLNs * >(obj);
         }
 
-        oss << "XML Element" << std::endl;
-        oss << "name: " << getNodeName() << std::endl;
-        oss << "namespace href: " << ns << std::endl;
-        oss << "namespace prefix: " << prefix << std::endl;
-        oss << "type: " << nodes_type[getNodeType() - 1] << std::endl;
-        oss << "definition line: " << node->line;
-
-        return oss.str();
+        return new XMLNs(*this, node->ns);
     }
-
-    int XMLElement::getDefinitionLine() const
+    else
     {
-        return node->line;
+        return 0;
     }
+}
 
-    const XMLNs *XMLElement::getNodeNameSpace() const
+const XMLNodeList *XMLElement::getChildren() const
+{
+    XMLNodeList *obj = scope->getXMLNodeListFromLibXMLPtr(node->children);
+    if (obj)
     {
-        if (node->ns)
-        {
-            XMLObject *obj = scope->getXMLObjectFromLibXMLPtr(node->ns);
-            if (obj)
-            {
-                return static_cast < XMLNs * >(obj);
-            }
-
-            return new XMLNs(*this, node->ns);
-        }
-        else
-        {
-            return 0;
-        }
+        return obj;
     }
 
-    const XMLNodeList *XMLElement::getChildren() const
-    {
-        XMLNodeList *obj = scope->getXMLNodeListFromLibXMLPtr(node->children);
-        if (obj)
-        {
-            return obj;
-        }
+    return new XMLNodeList(doc, node);
+}
 
-        return new XMLNodeList(doc, node);
+const XMLAttr *XMLElement::getAttributes() const
+{
+    XMLObject *obj = scope->getXMLObjectFromLibXMLPtr(node->properties);
+    if (obj)
+    {
+        return static_cast < XMLAttr * >(obj);
     }
 
-    const XMLAttr *XMLElement::getAttributes() const
+    return new XMLAttr(*this);
+}
+
+const XMLElement *XMLElement::getParentElement() const
+{
+    if (node->parent && node->parent->type == XML_ELEMENT_NODE)
     {
-        XMLObject *obj = scope->getXMLObjectFromLibXMLPtr(node->properties);
+        XMLObject *obj = scope->getXMLObjectFromLibXMLPtr(node->parent);
         if (obj)
         {
-            return static_cast < XMLAttr * >(obj);
+            return static_cast < XMLElement * >(obj);
         }
 
-        return new XMLAttr(*this);
+        return new XMLElement(doc, node->parent);
     }
-
-    const XMLElement *XMLElement::getParentElement() const
+    else
     {
-        if (node->parent && node->parent->type == XML_ELEMENT_NODE)
-        {
-            XMLObject *obj = scope->getXMLObjectFromLibXMLPtr(node->parent);
-            if (obj)
-            {
-                return static_cast < XMLElement * >(obj);
-            }
-
-            return new XMLElement(doc, node->parent);
-        }
-        else
-        {
-            return 0;
-        }
+        return 0;
     }
 }
+}
index a6bc7cd..91b9c27 100644 (file)
 
 namespace org_modules_xml
 {
-    class XMLObject;
-    class XMLDocument;
-    class XMLNodeList;
-    class XMLNs;
-    class XMLAttr;
+class XMLObject;
+class XMLDocument;
+class XMLNodeList;
+class XMLNs;
+class XMLAttr;
+
+/**
+ * @file
+ * @author Calixte DENIZET <calixte.denizet@scilab.org>
+ *
+ * Class to wrap a xmlNode
+ * @see http://xmlsoft.org/html/libxml-tree.html#xmlNode
+ */
+class XMLElement: public XMLObject, public XMLRemovable
+{
+    xmlNode *node;
+    const XMLDocument & doc;
+
+public:
 
     /**
-     * @file
-     * @author Calixte DENIZET <calixte.denizet@scilab.org>
-     *
-     * Class to wrap a xmlNode
-     * @see http://xmlsoft.org/html/libxml-tree.html#xmlNode
+     * @param doc the owner document of this XMLElement
+     * @param node the xmlNode to wrap
      */
-    class XMLElement:public XMLObject, public XMLRemovable
+    XMLElement(const XMLDocument & doc, xmlNode * node);
+
+    /**
+     * @param doc the owner document of this XMLElement
+     * @param name the name of the XMLElement
+     */
+    XMLElement(const XMLDocument & doc, const char *name);
+
+    ~XMLElement();
+
+    void *getRealXMLPointer() const;
+
+    void remove() const;
+
+    /**
+     * @return the node name
+     */
+    const char *getNodeName(void) const
     {
-        xmlNode *node;
-        const XMLDocument & doc;
+        return node->name ? (const char *)node->name : "";
+    }
 
-public:
+    /**
+     * Sets the node name
+     * @param name the node name
+     */
+    void setNodeName(const std::string & name) const;
 
-        /**
-         * @param doc the owner document of this XMLElement
-         * @param node the xmlNode to wrap
-         */
-          XMLElement(const XMLDocument & doc, xmlNode * node);
-
-        /**
-         * @param doc the owner document of this XMLElement
-         * @param name the name of the XMLElement
-         */
-          XMLElement(const XMLDocument & doc, const char *name);
-
-         ~XMLElement();
-
-        void *getRealXMLPointer() const;
-
-        void remove() const;
-
-        /**
-         * @return the node name
-         */
-        const char *getNodeName(void) const
-        {
-            return node->name ? (const char *)node->name : "";
-        }
-
-        /**
-         * Sets the node name
-         * @param name the node name
-         */
-        void setNodeName(const std::string & name) const;
-
-        /**
-         * @return the namespace associated to this node
-         */
-        const XMLNs *getNodeNameSpace() const;
-
-        /**
-         * Sets the namespace of this node
-         * @param ns the namespace
-         */
-        void setNodeNameSpace(const XMLNs & ns) const;
-
-        /**
-         * Gets the node contents
-         * @see http://xmlsoft.org/html/libxml-tree.html#xmlNodeGetContent
-         * @return the node content
-         */
-        const char *getNodeContent() const;
-
-        /**
-         * Sets the node content
-         * @param content the new node contents
-         */
-        void setNodeContent(const std::string & content) const;
-
-        /**
-         * @return the node type
-         * @see http://xmlsoft.org/html/libxml-tree.html#xmlElementType
-         */
-        int getNodeType(void) const
-        {
-            return node->type;
-        }
-
-        /**
-         * @return the attributes of this node
-         */
-        const XMLAttr *getAttributes(void) const;
-
-        /**
-         * Sets the attributes of this node
-         * @param attrs the new attributes
-         */
-        void setAttributes(const XMLAttr & attrs) const;
-
-        /**
-         * @return the parent XMLElement
-         */
-        const XMLElement *getParentElement() const;
-
-        /**
-         * @return a list of the children of this node
-         */
-        const XMLNodeList *getChildren() const;
-
-        /**
-         * Replaces the children of this node by an XMLElement
-         * @param elem the new child
-         */
-        void setChildren(const XMLElement & elem) const;
-
-        /**
-         * Replaces the children of this node by a list of nodes
-         * @param list the new children
-         */
-        void setChildren(const XMLNodeList & list) const;
-
-        /**
-         * Replaces the children of this node by a new one given by a XML code
-         * @param xmlCode the XML code of the new child
-         */
-        void setChildren(const std::string & xmlCode) const;
-
-        /**
-         * Adds a namespace to this node which can be used by the children
-         * @param ns the namespace to add
-         */
-        void addNamespace(const XMLNs & ns) const;
-
-        /**
-         * Gets the namespace which has a given prefix. If it is not found in this
-         * node, then it will be searched in the parents.
-         * @see http://xmlsoft.org/html/libxml-tree.html#xmlSearchNs
-         * @param prefix the prefix
-         * @return the corresponding namespace or 0 if not found
-         */
-        const XMLNs *getNamespaceByPrefix(const char *prefix) const;
-
-        /**
-         * Gets the namespace which has a given href. If it is not found in this
-         * node, then it will be searched in the parents.
-         * @see http://xmlsoft.org/html/libxml-tree.html#xmlSearchNsByHref
-         * @param href the href
-         * @return the corresponding namespace or 0 if not found
-         */
-        const XMLNs *getNamespaceByHref(const char *href) const;
-
-        /**
-         * @return the libxml node behind this object
-         */
-        xmlNode *getRealNode() const
-        {
-            return node;
-        }
-
-        /**
-         * @return the XMLDocument which is the parent or this XMLElement
-         */
-        const XMLDocument & getXMLDocument() const
-        {
-            return doc;
-        }
-
-        /**
-         * @return the defintion line of this XMLElement
-         */
-        int getDefinitionLine() const;
-
-        void setAttributeValue(const char **prefix, const char **name, const char **value, int size) const;
-        void setAttributeValue(const char **name, const char **value, int size) const;
-        const XMLObject *getXMLObjectParent() const;
-        const std::string dump(bool indent) const;
-        const std::string toString() const;
-    };
+    /**
+     * @return the namespace associated to this node
+     */
+    const XMLNs *getNodeNameSpace() const;
+
+    /**
+     * Sets the namespace of this node
+     * @param ns the namespace
+     */
+    void setNodeNameSpace(const XMLNs & ns) const;
+
+    /**
+     * Gets the node contents
+     * @see http://xmlsoft.org/html/libxml-tree.html#xmlNodeGetContent
+     * @return the node content
+     */
+    const char *getNodeContent() const;
+
+    /**
+     * Sets the node content
+     * @param content the new node contents
+     */
+    void setNodeContent(const std::string & content) const;
+
+    /**
+     * @return the node type
+     * @see http://xmlsoft.org/html/libxml-tree.html#xmlElementType
+     */
+    int getNodeType(void) const
+    {
+        return node->type;
+    }
+
+    /**
+     * @return the attributes of this node
+     */
+    const XMLAttr *getAttributes(void) const;
+
+    /**
+     * Sets the attributes of this node
+     * @param attrs the new attributes
+     */
+    void setAttributes(const XMLAttr & attrs) const;
+
+    /**
+     * @return the parent XMLElement
+     */
+    const XMLElement *getParentElement() const;
+
+    /**
+     * @return a list of the children of this node
+     */
+    const XMLNodeList *getChildren() const;
+
+    /**
+     * Replaces the children of this node by an XMLElement
+     * @param elem the new child
+     */
+    void setChildren(const XMLElement & elem) const;
+
+    /**
+     * Replaces the children of this node by a list of nodes
+     * @param list the new children
+     */
+    void setChildren(const XMLNodeList & list) const;
+
+    /**
+     * Replaces the children of this node by a new one given by a XML code
+     * @param xmlCode the XML code of the new child
+     */
+    void setChildren(const std::string & xmlCode) const;
+
+    /**
+     * Adds a namespace to this node which can be used by the children
+     * @param ns the namespace to add
+     */
+    void addNamespace(const XMLNs & ns) const;
+
+    /**
+     * Gets the namespace which has a given prefix. If it is not found in this
+     * node, then it will be searched in the parents.
+     * @see http://xmlsoft.org/html/libxml-tree.html#xmlSearchNs
+     * @param prefix the prefix
+     * @return the corresponding namespace or 0 if not found
+     */
+    const XMLNs *getNamespaceByPrefix(const char *prefix) const;
+
+    /**
+     * Gets the namespace which has a given href. If it is not found in this
+     * node, then it will be searched in the parents.
+     * @see http://xmlsoft.org/html/libxml-tree.html#xmlSearchNsByHref
+     * @param href the href
+     * @return the corresponding namespace or 0 if not found
+     */
+    const XMLNs *getNamespaceByHref(const char *href) const;
+
+    /**
+     * @return the libxml node behind this object
+     */
+    xmlNode *getRealNode() const
+    {
+        return node;
+    }
+
+    /**
+     * @return the XMLDocument which is the parent or this XMLElement
+     */
+    const XMLDocument & getXMLDocument() const
+    {
+        return doc;
+    }
+
+    /**
+     * @return the defintion line of this XMLElement
+     */
+    int getDefinitionLine() const;
+
+    void setAttributeValue(const char **prefix, const char **name, const char **value, int size) const;
+    void setAttributeValue(const char **name, const char **value, int size) const;
+    void append(const XMLElement & elem) const;
+    const XMLObject *getXMLObjectParent() const;
+    const std::string dump(bool indent) const;
+    const std::string toString() const;
+};
 }
 
 #endif
index 66ad12b..b02b6f0 100644 (file)
@@ -52,6 +52,11 @@ public:
         return size;
     }
 
+    void incrementSize()
+    {
+        size++;
+    }
+
     /**
      * Get the content of each node of the list
      * @return an array of strings
@@ -88,11 +93,17 @@ protected:
             {
                 if (index < *prev)
                 {
-                    for (int i = *prev; i > index; i--, *prevElem = (*prevElem)->prev) ;
+                    for (int i = *prev; i > index; i--, *prevElem = (*prevElem)->prev)
+                    {
+                        ;
+                    }
                 }
                 else
                 {
-                    for (int i = *prev; i < index; i++, *prevElem = (*prevElem)->next) ;
+                    for (int i = *prev; i < index; i++, *prevElem = (*prevElem)->next)
+                    {
+                        ;
+                    }
                 }
                 *prev = index;
             }
diff --git a/scilab/modules/xml/tests/unit_tests/xmlAppend.dia.ref b/scilab/modules/xml/tests/unit_tests/xmlAppend.dia.ref
new file mode 100644 (file)
index 0000000..bf2fc1a
--- /dev/null
@@ -0,0 +1,18 @@
+// ===========================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2012 - Scilab Enterprises - Calixte DENIZET
+//
+//  This file is distributed under the same license as the Scilab package.
+// ===========================================================================
+doc = xmlDocument();
+root = xmlElement(doc, "root");
+doc.root = root;
+for i=1:5
+xmlAppend(doc.root, xmlElement(doc, "child_" + string(i)));
+end;
+assert_checkequal(doc.root.children(1).name,"child_1");
+assert_checkequal(doc.root.children(2).name,"child_2");
+assert_checkequal(doc.root.children(3).name,"child_3");
+assert_checkequal(doc.root.children(4).name,"child_4");
+assert_checkequal(doc.root.children(5).name,"child_5");
+xmlDelete(doc);
diff --git a/scilab/modules/xml/tests/unit_tests/xmlAppend.tst b/scilab/modules/xml/tests/unit_tests/xmlAppend.tst
new file mode 100644 (file)
index 0000000..ecae8dc
--- /dev/null
@@ -0,0 +1,22 @@
+// ===========================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2012 - Scilab Enterprises - Calixte DENIZET
+//
+//  This file is distributed under the same license as the Scilab package.
+// ===========================================================================
+
+
+doc = xmlDocument();
+root = xmlElement(doc, "root");
+doc.root = root;
+for i=1:5
+xmlAppend(doc.root, xmlElement(doc, "child_" + string(i)));
+end;
+
+assert_checkequal(doc.root.children(1).name,"child_1");
+assert_checkequal(doc.root.children(2).name,"child_2");
+assert_checkequal(doc.root.children(3).name,"child_3");
+assert_checkequal(doc.root.children(4).name,"child_4");
+assert_checkequal(doc.root.children(5).name,"child_5");
+
+xmlDelete(doc);
index aef8c94..a90b323 100644 (file)
     <ClCompile Include="sci_gateway\cpp\sci_percent_XMLList_size.cpp" />
     <ClCompile Include="sci_gateway\cpp\sci_print.cpp" />
     <ClCompile Include="sci_gateway\cpp\sci_xmlAddNs.cpp" />
+    <ClCompile Include="sci_gateway\cpp\sci_xmlAppend.cpp" />
     <ClCompile Include="sci_gateway\cpp\sci_xmlAsNumber.cpp" />
     <ClCompile Include="sci_gateway\cpp\sci_xmlAsText.cpp" />
     <ClCompile Include="sci_gateway\cpp\sci_xmlDelete.cpp" />
index 9523a2d..807cc2c 100644 (file)
     <ClCompile Include="sci_gateway\cpp\sci_xmlName.cpp">
       <Filter>Source Files</Filter>
     </ClCompile>
+    <ClCompile Include="sci_gateway\cpp\sci_xmlAppend.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
   </ItemGroup>
 </Project>
\ No newline at end of file