Bug 10594 fixed: size could not be used with two arguments on XMLList 63/6063/3
Calixte DENIZET [Thu, 26 Jan 2012 10:11:31 +0000 (11:11 +0100)]
Change-Id: I917d430a76f0102ee0108c32bdda0376d60d4401

scilab/CHANGES_5.4.X
scilab/modules/xml/sci_gateway/cpp/sci_percent_XMLAttr_size.cpp
scilab/modules/xml/sci_gateway/cpp/sci_percent_XMLList_size.cpp
scilab/modules/xml/tests/unit_tests/size.dia.ref [new file with mode: 0644]
scilab/modules/xml/tests/unit_tests/size.tst [new file with mode: 0644]

index 9076107..55ce75b 100644 (file)
@@ -15,6 +15,8 @@ XML
 
 * Bug #10185 fixed - Add xmlDelete("all") in xml.quit.
 
+* Bug #10594 fixed - size could not be used with two arguments on XMLList.
+
 
 Help
 ====
index e482dff..8562d60 100644 (file)
@@ -21,6 +21,7 @@ extern "C"
 #include "api_scilab.h"
 #include "xml_mlist.h"
 #include "localization.h"
+#include <string.h>
 }
 
 using namespace org_modules_xml;
@@ -31,11 +32,13 @@ int sci_percent_XMLAttr_size(char *fname, unsigned long fname_len)
     int id;
     SciErr err;
     double d[2] = { 1, 0 };
-    int *addr = 0;
-    XMLAttr *attrs;
+    int * addr = 0;
+    XMLAttr * attrs;
+    int size;
+    char * option = 0;
 
     CheckLhs(1, 1);
-    CheckRhs(1, 1);
+    CheckRhs(1, 2);
 
     err = getVarAddressFromPosition(pvApiCtx, 1, &addr);
     if (err.iErr)
@@ -53,15 +56,65 @@ int sci_percent_XMLAttr_size(char *fname, unsigned long fname_len)
     }
 
     id = getXMLObjectId(addr, pvApiCtx);
-    attrs = XMLObject::getFromId < XMLAttr > (id);
+    attrs = XMLObject::getFromId<XMLAttr>(id);
     if (!attrs)
     {
-        Scierror(999, gettext("%s: XML Attributes does not exist.\n"), fname);
+        Scierror(999, gettext("%s: XMLList does not exist.\n"), fname);
         return 0;
     }
 
-    d[1] = (double)attrs->getSize();
-    err = createMatrixOfDouble(pvApiCtx, Rhs + 1, 1, 2, d);
+    if (Rhs == 2)
+    {
+        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 (!isStringType(pvApiCtx, addr))
+        {
+            Scierror(999, gettext("%s: Wrong type for input argument #%d: A string expected.\n"), fname, 2);
+            return 0;
+        }
+        getAllocatedSingleString(pvApiCtx, addr, &option);
+
+        if (strcmp(option, "r") && strcmp(option, "c") && strcmp(option, "*"))
+        {
+            freeAllocatedSingleString(option);
+            Scierror(44, _("%s: Wrong value for input argument #%d: '%s', '%s' or '%s' expected.\n"), fname, 2, "r", "c", "*");
+            return 0;
+        }
+    }
+
+    size = (double)attrs->getSize();
+    if (Rhs == 1)
+    {
+        d[1] = size;
+        if (size == 0)
+        {
+            d[0] = 0;
+        }
+        err = createMatrixOfDouble(pvApiCtx, Rhs + 1, 1, 2, d);
+    }
+    else
+    {
+        if (option[0] == 'r')
+        {
+            if (size == 0)
+            {
+                d[0] = 0;
+            }
+        }
+        else
+        {
+            d[0] = size;
+        }
+        freeAllocatedSingleString(option);
+        err = createMatrixOfDouble(pvApiCtx, Rhs + 1, 1, 1, d);
+    }
+
     if (err.iErr)
     {
         printError(&err, 0);
index b76529c..40a0a66 100644 (file)
@@ -21,6 +21,7 @@ extern "C"
 #include "api_scilab.h"
 #include "xml_mlist.h"
 #include "localization.h"
+#include <string.h>
 }
 
 using namespace org_modules_xml;
@@ -31,11 +32,13 @@ int sci_percent_XMLList_size(char *fname, unsigned long fname_len)
     int id;
     SciErr err;
     double d[2] = { 1, 0 };
-    int *addr = 0;
-    XMLList *list;
+    int * addr = 0;
+    XMLList * list;
+    int size;
+    char * option = 0;
 
     CheckLhs(1, 1);
-    CheckRhs(1, 1);
+    CheckRhs(1, 2);
 
     err = getVarAddressFromPosition(pvApiCtx, 1, &addr);
     if (err.iErr)
@@ -49,19 +52,68 @@ int sci_percent_XMLList_size(char *fname, unsigned long fname_len)
     {
         Scierror(999, gettext("%s: Wrong type for input argument #%d: XMLList or XMLSet expected.\n"), fname, 1);
         return 0;
-
     }
 
     id = getXMLObjectId(addr, pvApiCtx);
-    list = XMLObject::getFromId < XMLList > (id);
+    list = XMLObject::getFromId<XMLList>(id);
     if (!list)
     {
         Scierror(999, gettext("%s: XMLList does not exist.\n"), fname);
         return 0;
     }
 
-    d[1] = (double)list->getSize();
-    err = createMatrixOfDouble(pvApiCtx, Rhs + 1, 1, 2, d);
+    if (Rhs == 2)
+    {
+        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 (!isStringType(pvApiCtx, addr))
+        {
+            Scierror(999, gettext("%s: Wrong type for input argument #%d: A string expected.\n"), fname, 2);
+            return 0;
+        }
+        getAllocatedSingleString(pvApiCtx, addr, &option);
+
+        if (strcmp(option, "r") && strcmp(option, "c") && strcmp(option, "*"))
+        {
+            freeAllocatedSingleString(option);
+            Scierror(44, _("%s: Wrong value for input argument #%d: '%s', '%s' or '%s' expected.\n"), fname, 2, "r", "c", "*");
+            return 0;
+        }
+    }
+
+    size = (double)list->getSize();
+    if (Rhs == 1)
+    {
+        d[1] = size;
+        if (size == 0)
+        {
+            d[0] = 0;
+        }
+        err = createMatrixOfDouble(pvApiCtx, Rhs + 1, 1, 2, d);
+    }
+    else
+    {
+        if (option[0] == 'r')
+        {
+            if (size == 0)
+            {
+                d[0] = 0;
+            }
+        }
+        else
+        {
+            d[0] = size;
+        }
+        freeAllocatedSingleString(option);
+        err = createMatrixOfDouble(pvApiCtx, Rhs + 1, 1, 1, d);
+    }
+
     if (err.iErr)
     {
         printError(&err, 0);
diff --git a/scilab/modules/xml/tests/unit_tests/size.dia.ref b/scilab/modules/xml/tests/unit_tests/size.dia.ref
new file mode 100644 (file)
index 0000000..6419573
--- /dev/null
@@ -0,0 +1,16 @@
+// ===========================================================================
+// 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 = xmlReadStr("<root><a b=""b"" c=""c"" d=""d""><b>b</b></a><c>c</c></root>");
+assert_checkequal(size(doc.root.children), [1 2]);
+assert_checkequal(size(doc.root.children, "r"), 1);
+assert_checkequal(size(doc.root.children, "c"), 2);
+assert_checkequal(size(doc.root.children, "*"), 2);
+assert_checkequal(size(doc.root.children(1).attributes), [1 3]);
+assert_checkequal(size(doc.root.children(1).attributes, "r"), 1);
+assert_checkequal(size(doc.root.children(1).attributes, "c"), 3);
+assert_checkequal(size(doc.root.children(1).attributes, "*"), 3);
+xmlDelete(doc);
diff --git a/scilab/modules/xml/tests/unit_tests/size.tst b/scilab/modules/xml/tests/unit_tests/size.tst
new file mode 100644 (file)
index 0000000..1a49410
--- /dev/null
@@ -0,0 +1,20 @@
+// ===========================================================================
+// 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 = xmlReadStr("<root><a b=""b"" c=""c"" d=""d""><b>b</b></a><c>c</c></root>");
+assert_checkequal(size(doc.root.children), [1 2]);
+assert_checkequal(size(doc.root.children, "r"), 1);
+assert_checkequal(size(doc.root.children, "c"), 2);
+assert_checkequal(size(doc.root.children, "*"), 2);
+
+assert_checkequal(size(doc.root.children(1).attributes), [1 3]);
+assert_checkequal(size(doc.root.children(1).attributes, "r"), 1);
+assert_checkequal(size(doc.root.children(1).attributes, "c"), 3);
+assert_checkequal(size(doc.root.children(1).attributes, "*"), 3);
+
+xmlDelete(doc);
\ No newline at end of file