* Bug 15860 fixed: [,] with cblock had troubles 04/20604/4
Samuel GOUGEON [Wed, 31 Oct 2018 19:47:11 +0000 (20:47 +0100)]
  http://bugzilla.scilab.org/15860

  Requirements to merge first:
    https://codereview.scilab.org/20594
    https://codereview.scilab.org/20600

Change-Id: I72b48b6bdecf69357a61a7a94aca29edc7095b96

12 files changed:
scilab/CHANGES.md
scilab/modules/data_structures/tests/unit_tests/cblock_concat.tst [new file with mode: 0644]
scilab/modules/overloading/macros/%b_c_cblock.sci [new file with mode: 0644]
scilab/modules/overloading/macros/%c_c_cblock.sci [new file with mode: 0644]
scilab/modules/overloading/macros/%cblock_c_b.sci [new file with mode: 0644]
scilab/modules/overloading/macros/%cblock_c_c.sci [new file with mode: 0644]
scilab/modules/overloading/macros/%cblock_c_generic.sci [new file with mode: 0644]
scilab/modules/overloading/macros/%cblock_c_i.sci [new file with mode: 0644]
scilab/modules/overloading/macros/%cblock_c_s.sci
scilab/modules/overloading/macros/%generic_c_cblock.sci [new file with mode: 0644]
scilab/modules/overloading/macros/%i_c_cblock.sci [new file with mode: 0644]
scilab/modules/overloading/macros/%s_c_cblock.sci

index 9a3af75..7eceed5 100644 (file)
@@ -673,6 +673,7 @@ Known issues
 * [#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.
 * [#15859](http://bugzilla.scilab.org/show_bug.cgi?id=15859): `isempty` could not be overloaded for custom mlist or tlist typeof.
+* [#15860](http://bugzilla.scilab.org/show_bug.cgi?id=15860): Horizontal concatenations with cblock tables had troubles.
 * [#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_concat.tst b/scilab/modules/data_structures/tests/unit_tests/cblock_concat.tst
new file mode 100644 (file)
index 0000000..7621a51
--- /dev/null
@@ -0,0 +1,44 @@
+// =============================================================================
+// 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 [,] and [;] with cblocks and other columns of regular types
+
+T = msscanf(-1,["Alain 19";"Pierre 15";"Tom 12"],'%s %d');
+e = mlist('cblock');
+b = rand(3,2)<0.5;
+i = int8(grand(3,1,"uin",-9,9));
+d = (1:3)'*1.1;
+t = ["Toulouse" "Lyon" "Le Mans"]';
+
+assert_checkequal([e T], T);
+assert_checkequal([T e], T);
+assert_checkequal([e ; T], T);
+assert_checkequal([T ; e], T);
+
+assert_checkequal([[] T], T);
+assert_checkequal([T []], T);
+assert_checkequal([[] ; T], T);
+assert_checkfalse(execstr("[T ; []]","errcatch")==0);
+
+for o = list(b, i, d, t)
+    so = size(o,2);
+    r = [o T];
+    assert_checkequal(size(r), [3 2+so]);
+    assert_checkequal(r(:,1), o(:,1));
+    assert_checkequal(r(:,$-1:$), T);
+    r = [T o];
+    assert_checkequal(size(r), [3 2+so]);
+    assert_checkequal(r(:,$), o(:,$));
+    assert_checkequal(r(:,1:2), T);
+end
+
+r = [T T];
+assert_checkequal(size(r), [3 4]);
+assert_checkequal(r(:,1), r(:,3));
+assert_checkequal(r(:,2), r(:,4));
diff --git a/scilab/modules/overloading/macros/%b_c_cblock.sci b/scilab/modules/overloading/macros/%b_c_cblock.sci
new file mode 100644 (file)
index 0000000..8df28d2
--- /dev/null
@@ -0,0 +1,14 @@
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// 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.
+// This file was originally licensed under the terms of the CeCILL v2.1,
+// 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 b = %b_c_cblock(a, b)
+    CallingOverloadName = "%b_c_cblock"
+    b = %generic_c_cblock(a, b)
+endfunction
diff --git a/scilab/modules/overloading/macros/%c_c_cblock.sci b/scilab/modules/overloading/macros/%c_c_cblock.sci
new file mode 100644 (file)
index 0000000..9dca3be
--- /dev/null
@@ -0,0 +1,14 @@
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// 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.
+// This file was originally licensed under the terms of the CeCILL v2.1,
+// 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 b = %c_c_cblock(a, b)
+    CallingOverloadName = "%c_c_cblock"
+    b = %generic_c_cblock(a, b)
+endfunction
diff --git a/scilab/modules/overloading/macros/%cblock_c_b.sci b/scilab/modules/overloading/macros/%cblock_c_b.sci
new file mode 100644 (file)
index 0000000..abcd016
--- /dev/null
@@ -0,0 +1,14 @@
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// 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.
+// This file was originally licensed under the terms of the CeCILL v2.1,
+// 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 a = %cblock_c_b(a, b)
+    CallingOverloadName = "%cblock_c_b"
+    a = %cblock_c_generic(a, b)
+endfunction
diff --git a/scilab/modules/overloading/macros/%cblock_c_c.sci b/scilab/modules/overloading/macros/%cblock_c_c.sci
new file mode 100644 (file)
index 0000000..69e2ccf
--- /dev/null
@@ -0,0 +1,14 @@
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// 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.
+// This file was originally licensed under the terms of the CeCILL v2.1,
+// 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 a = %cblock_c_c(a, b)
+    CallingOverloadName = "%cblock_c_c"
+    a = %cblock_c_generic(a, b)
+endfunction
diff --git a/scilab/modules/overloading/macros/%cblock_c_generic.sci b/scilab/modules/overloading/macros/%cblock_c_generic.sci
new file mode 100644 (file)
index 0000000..7eea49e
--- /dev/null
@@ -0,0 +1,27 @@
+// 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.
+// This file was originally licensed under the terms of the CeCILL v2.1,
+// 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 a = %cblock_c_generic(a, b)
+    if b==[] then return,end
+    v = getfield($,a)
+
+    emptyTable = v=='cblock'
+    if ~emptyTable & size(v,1)<>size(b,1) then
+        msg = _("%s: Arguments #%d and #%d: Incompatible sizes.\n")
+        error(msprintf(msg, CallingOverloadName, 1, 2))
+    end
+    if ~emptyTable & type(b)==type(v) then
+        a = setfield($,[v b],a)
+    else
+        a = setfield($+1,b,a)
+    end
+endfunction
diff --git a/scilab/modules/overloading/macros/%cblock_c_i.sci b/scilab/modules/overloading/macros/%cblock_c_i.sci
new file mode 100644 (file)
index 0000000..93fbfae
--- /dev/null
@@ -0,0 +1,14 @@
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// 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.
+// This file was originally licensed under the terms of the CeCILL v2.1,
+// 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 a = %cblock_c_i(a, b)
+    CallingOverloadName = "%cblock_c_i"
+    a = %cblock_c_generic(a, b)
+endfunction
index c1c1748..6876256 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.
 // For more information, see the COPYING file which you should have received
 // along with this program.
 
-function a=%cblock_c_s(a,b)
-    if b==[] then return,end
-    v = getfield($,a)
-
-    if size(v,1)<>size(b,1) then
-        msg = _("%s: Arguments #%d and #%d: Incompatible sizes.\n")
-        error(msprintf(msg, "%cblock_c_s", 1, 2))
-    end
-    if type(b)==type(v) then
-        a = setfield($,[v b],a)
-    else
-        a = setfield($+1,b,a)
-    end
+function a = %cblock_c_s(a, b)
+    CallingOverloadName = "%cblock_c_s"
+    a = %cblock_c_generic(a, b)
 endfunction
diff --git a/scilab/modules/overloading/macros/%generic_c_cblock.sci b/scilab/modules/overloading/macros/%generic_c_cblock.sci
new file mode 100644 (file)
index 0000000..aed84e4
--- /dev/null
@@ -0,0 +1,31 @@
+// 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.
+// This file was originally licensed under the terms of the CeCILL v2.1,
+// 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 b = %generic_c_cblock(a, b)
+    if a==[] then return,end
+    emptyTable = prod(size(b))==0
+    if ~emptyTable
+        v = getfield(2, b)
+        if size(v,1) <> size(a,1) then
+            msg = _("%s: Arguments #%d and #%d: Incompatible sizes.\n")
+            error(msprintf(msg, CallingOverloadName, 1, 2))
+        end
+        if type(a)==type(v) then
+            b = setfield(2, [a v], b)
+        else
+            b = setfield(0, "cblock",b)
+            b = setfield(2, a, b);
+        end
+    else
+        b = setfield(2, a, b)
+    end
+endfunction
diff --git a/scilab/modules/overloading/macros/%i_c_cblock.sci b/scilab/modules/overloading/macros/%i_c_cblock.sci
new file mode 100644 (file)
index 0000000..0de7045
--- /dev/null
@@ -0,0 +1,14 @@
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// 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.
+// This file was originally licensed under the terms of the CeCILL v2.1,
+// 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 b = %i_c_cblock(a, b)
+    CallingOverloadName = "%i_c_cblock"
+    b = %generic_c_cblock(a, b)
+endfunction
index dd18ceb..38283a8 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.
 // For more information, see the COPYING file which you should have received
 // along with this program.
 
-function b=%s_c_cblock(a,b)
-    if a==[] then return,end
-    v2=getfield(2,b)
-
-    if size(a,1)<>size(v2,1) then
-        msg = _("%s: Arguments #%d and #%d: Same numbers of rows expected.\n")
-        error(msprintf(msg, "%s_c_cblock", 1, 2))
-    end
-    if type(a)==type(v2) then
-        b=setfield(2,[a v2],b)
-    else
-        b=setfield(0,"cblock",b)
-        b=setfield(2,a,b);
-    end
+function b = %s_c_cblock(a, b)
+    CallingOverloadName = "%s_c_cblock"
+    b = %generic_c_cblock(a, b)
 endfunction