* Bug 15858 fixed: size(cblock) had troubles 00/20600/3
Samuel GOUGEON [Wed, 31 Oct 2018 11:28:15 +0000 (12:28 +0100)]
  http://bugzilla.scilab.org/15858

Change-Id: I12baa30f499d22336396e30761d94e70726255ba

scilab/CHANGES.md
scilab/modules/data_structures/tests/unit_tests/cblock_size.tst [new file with mode: 0644]
scilab/modules/overloading/macros/%cblock_size.sci

index 0c0cf16..8254a28 100644 (file)
@@ -668,6 +668,7 @@ Known issues
 * [#15850](http://bugzilla.scilab.org/show_bug.cgi?id=15850): Adding a space after a string increases its size.
 * [#15853](http://bugzilla.scilab.org/show_bug.cgi?id=15853): `mlist("cblock")` displayed endlessly "operation +: Warning adding..."
 * [#15854](http://bugzilla.scilab.org/show_bug.cgi?id=15854): `horner(1:$,4)` yielded an error. Extractions from `cblock` tables were impacted.
+* [#15858](http://bugzilla.scilab.org/show_bug.cgi?id=15858): `size(cblock,'r'|'c'|'*'|1|2)` did not take the option into account. `size()` of an empty cblock table yielded an error.
 * [#15878](http://bugzilla.scilab.org/show_bug.cgi?id=15878): `sgrid` and `evans` were broken.
 * [#15880](http://bugzilla.scilab.org/show_bug.cgi?id=15880): `sgrid` needed some improvements: Labeling was sometimes ambiguous ; large circles were not labeled ; data_bounds did not always take the input wn into account ; named and #RRGGBB colors specifications could not be used. `evans` needed some improvements: the block of legends hid data ; asymptotes were too visible.
 * [#15886](http://bugzilla.scilab.org/show_bug.cgi?id=15886): Display of polynomials was broken.
diff --git a/scilab/modules/data_structures/tests/unit_tests/cblock_size.tst b/scilab/modules/data_structures/tests/unit_tests/cblock_size.tst
new file mode 100644 (file)
index 0000000..9f24e67
--- /dev/null
@@ -0,0 +1,32 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2018 - Samuel GOUGEON
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- CLI SHELL MODE -->
+// <-- NO CHECK REF -->
+
+// Unit tests for size(cblock)
+
+T = mlist('cblock');
+assert_checkequal(size(T), [0 0]);
+assert_checkequal(size(T,1), 0);
+assert_checkequal(size(T,2), 0);
+assert_checkequal(size(T,"r"), 0);
+assert_checkequal(size(T,"c"), 0);
+assert_checkequal(size(T,"*"), 0);
+[m, n] = size(T);
+assert_checkequal(m, 0);
+assert_checkequal(n, 0);
+
+T = msscanf(-1,["Alain 19";"Pierre 15";"Tom 12"],'%s %d');
+assert_checkequal(size(T), [3 2]);
+assert_checkequal(size(T,1), 3);
+assert_checkequal(size(T,2), 2);
+assert_checkequal(size(T,"r"), 3);
+assert_checkequal(size(T,"c"), 2);
+assert_checkequal(size(T,"*"), 6);
+[m, n] = size(T);
+assert_checkequal(m, 3);
+assert_checkequal(n, 2);
index b688158..860e317 100644 (file)
@@ -1,7 +1,7 @@
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 // Copyright (C) INRIA
-//
 // Copyright (C) 2012 - 2016 - Scilab Enterprises
+// Copyright (C) 2018 - Samuel GOUGEON
 //
 // This file is hereby licensed under the terms of the GNU GPL v2.0,
 // pursuant to article 5.3.4 of the CeCILL v.2.1.
@@ -9,12 +9,38 @@
 // and continues to be available under such terms.
 // For more information, see the COPYING file which you should have received
 // along with this program.
-function [m,n]=%cblock_size(M)
-    n=size(definedfields(M),"*")-1;
-    m=size(getfield(2,M),1);
-    n=0
-    for k=2:size(definedfields(M),"*")
-        n=n+size(getfield(k,M),2);
+
+function [m,n] = %cblock_size(M, o)
+    n = size(definedfields(M),"*")-1;
+    if ~isdef("o","l") then
+        o = -1    // [m, n]
+    elseif o=="r" | o==1
+        o = 1
+    elseif o=="c" | o==2
+        o = 2
+    elseif o=="*" | o==0
+        o = 0
+    else // 
+        o = -1
+    end
+    if n==0 then
+        m = 0
+    else
+        m = size(getfield(2,M),1);
+        if o~=1
+            n = 0
+            for k = 2:size(definedfields(M),"*")
+                n = n + size(getfield(k,M),2);
+            end
+        end
+    end
+    if argn(1)==1 then
+        if o==0
+            m = m*n
+        elseif o==2
+            m = n
+        elseif o==-1
+            m = [m,n]
+        end
     end
-    if argn(2)==1 then m=[m,n],end
 endfunction