* bug 15070 fixed: bitset() failed for bit pos as encoded integer 96/19196/3
Samuel GOUGEON [Sat, 18 Mar 2017 13:23:32 +0000 (14:23 +0100)]
  http://bugzilla.scilab.org/15070

Change-Id: I8ae89895adaaec628a379bb305747c9436117a28

scilab/CHANGES.md
scilab/modules/elementary_functions/macros/bitset.sci
scilab/modules/elementary_functions/tests/nonreg_tests/bug_15070.tst [new file with mode: 0644]

index 0bc9d7d..b86b0f0 100644 (file)
@@ -386,6 +386,7 @@ the [development mailing list](dev@lists.scilab.org) for a particular toolbox.
 * [#15057](http://bugzilla.scilab.org/show_bug.cgi?id=15057): Matplot .data assignation did not take care of >2 dimension
 * [#15060](http://bugzilla.scilab.org/show_bug.cgi?id=15060): `fplot3d` did not draw because of an addition with an empty matrix which now returns an empty matrix.
 * [#15063](http://bugzilla.scilab.org/show_bug.cgi?id=15063): `fort` wasn't properly removed.
+* [#15070](http://bugzilla.scilab.org/show_bug.cgi?id=15070): `bitset` failed when the bit position is an encoded integer.
 * [#15072](http://bugzilla.scilab.org/show_bug.cgi?id=15072): The context was stored as a root diagram attribute instead of being stored on each Superblock layer.
 * [#15079](http://bugzilla.scilab.org/show_bug.cgi?id=15079): When all children of a graphic handle have not the same number of sub-children, any vectorized extraction or insertion in subchildren failed.
 * [#15107](http://bugzilla.scilab.org/show_bug.cgi?id=15107): failed to build with ocaml 4.04.0.
index 50c6e9f..8fa11a8 100644 (file)
@@ -25,13 +25,15 @@ function y = bitset(x,pos,v)
     rhs = argn(2);
 
     if rhs < 2 then
-        error(msprintf(gettext("%s: Wrong number of input argument(s): At least %d expected.\n"),"bitset",2));
+        msg = _("%s: Wrong number of input argument(s): At least %d expected.\n")
+        error(msprintf(msg, "bitset", 2));
     end
 
     // case empty matrix
     if isempty(x)
         if ~isempty(pos) & prod(size(pos))<>1
-            error(msprintf(gettext("%s: Wrong size for input arguments: Same sizes expected.\n"),"bitset"));
+            msg = _("%s: Wrong size for input arguments: Same sizes expected.\n")
+            error(msprintf(msg, "bitset"));
         else
             y=[]
             return
@@ -40,14 +42,16 @@ function y = bitset(x,pos,v)
 
     // check v value
     if rhs == 3 & or(v <> 0 & v <> 1) then
-        error(msprintf(gettext("%s: Wrong value for input argument #%d: 0 or 1 expected.\n"),"bitset",3));
+        msg = _("%s: Wrong value for input argument #%d: 0 or 1 expected.\n")
+        error(msprintf(msg, "bitset",3));
     elseif rhs == 2 then
         v = ones(x);
     end
 
     // check size
     if or(size(x) <> size(pos)) | or(size(v) <> size(x)) then
-        error(msprintf(gettext("%s: Wrong size for input arguments: Same sizes expected.\n"),"bitset"));
+        msg = _("%s: Wrong size for input arguments: Same sizes expected.\n")
+        error(msprintf(msg, "bitset"));
     end
 
     // check type
@@ -55,14 +59,16 @@ function y = bitset(x,pos,v)
         | (type(x) == 8  & (inttype(x) < 10)) ..
         | (typeof(x) == "hypermat" & (or(x-floor(x) <> 0) | or(x < 0))) ..
         | (type(x) <> 1 & type(x) <> 8 & typeof(x) <> "hypermat") then
-        error(msprintf(gettext("%s: Wrong type for input argument #%d: Scalar/matrix/hypermatrix of unsigned integers expected.\n"),"bitset",1));
+        msg = _("%s: Wrong type for input argument #%d: Scalar/matrix/hypermatrix of unsigned integers expected.\n")
+        error(msprintf(msg, "bitset",1));
     end
 
     if (type(pos) == 1  & (or(pos-floor(pos) <> 0) | or(pos < 0))) ..
         | (type(pos) == 8  & (inttype(pos) < 10)) ..
         | (typeof(pos) == "hypermat" & (or(pos-floor(pos) <> 0) | or(pos < 0))) ..
         | (type(pos) <> 1 & type(pos) <> 8 & typeof(pos) <> "hypermat") then
-        error(msprintf(gettext("%s: Wrong type for input argument #%d: Scalar/matrix/hypermatrix of unsigned integers expected.\n"),"bitset",2));
+        msg = _("%s: Wrong type for input argument #%d: Scalar/matrix/hypermatrix of unsigned integers expected.\n")
+        error(msprintf(msg, "bitset",2));
     end
 
     // check pos value
@@ -74,7 +80,8 @@ function y = bitset(x,pos,v)
     end
 
     if or(pos > posmax) | or(pos < 1) then
-        error(msprintf(gettext("%s: Wrong value for input argument #%d: Must be between %d and %d.\n"),"bitset",2,1,posmax));
+        msg = _("%s: Wrong value for input argument #%d: Must be between %d and %d.\n")
+        error(msprintf(msg, "bitset", 2, 1, posmax));
     end
 
     // Algorithm
@@ -95,11 +102,10 @@ function y = bitset(x,pos,v)
     if type(x(1)) == 8 then
 
         select inttype(x(1))
-        case 11 then mask = uint8(2^(pos(:)-1));
-        case 12 then mask = uint16(2^(pos(:)-1));
-        case 14 then mask = uint32(2^(pos(:)-1));
+        case 11 then mask = 2^uint8((pos(:)-1));
+        case 12 then mask = 2^uint16((pos(:)-1));
+        case 14 then mask = 2^uint32((pos(:)-1));
         end
-
         mask = matrix(mask, sz);
         y(vZero) = x(vZero) & (~mask(vZero));
         y(vOne) = x(vOne) | mask(vOne);
diff --git a/scilab/modules/elementary_functions/tests/nonreg_tests/bug_15070.tst b/scilab/modules/elementary_functions/tests/nonreg_tests/bug_15070.tst
new file mode 100644 (file)
index 0000000..951c77e
--- /dev/null
@@ -0,0 +1,29 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2017 - Samuel GOUGEON
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- CLI SHELL MODE -->
+// <-- NO CHECK REF -->
+//
+// <-- Non-regression test for bug 15070 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/15070
+//
+// <-- Short Description -->
+//    bitset() failed when the bit position was specified as an encoded integer
+
+for v_enc = [11 12 14]           // value encoding
+    j = 0;
+    for bp_enc = [11 12 14]      // bit position encoding
+        value0 = iconvert(0, v_enc);
+        ind = iconvert((1:8)+(v_enc-11)*8, bp_enc);
+        for bp = ind
+          value = bitset(value0, bp);
+          assert_checkequal(value, value0 + 2^iconvert(bp-1, v_enc));
+          value0 = value;
+        end
+    end
+end