* Bug #9004 fixed - bitcmp function called with one input argument returned an error. 96/11296/2
Charlotte HECQUET [Tue, 16 Apr 2013 16:03:04 +0000 (18:03 +0200)]
Change-Id: Ib717cfa09d4744b01754af6b5051aab5e8d3b126

scilab/CHANGES_5.5.X
scilab/modules/elementary_functions/help/en_US/bitwise/bitcmp.xml
scilab/modules/elementary_functions/macros/bitcmp.sci
scilab/modules/elementary_functions/tests/nonreg_tests/bug_9004.dia.ref [new file with mode: 0644]
scilab/modules/elementary_functions/tests/nonreg_tests/bug_9004.tst [new file with mode: 0644]
scilab/modules/elementary_functions/tests/unit_tests/bitcmp.dia.ref [new file with mode: 0644]
scilab/modules/elementary_functions/tests/unit_tests/bitcmp.tst [new file with mode: 0644]

index bf3b476..04fc6b7 100644 (file)
@@ -85,6 +85,8 @@ Bug fixes
 
 * Bug #8824 fixed - taucs_chfact returned a segfault (not the case in mode nwni).
 
+* Bug #9004 fixed - bitcmp function called with one input argument returned an error.
+
 * Bug #9059 fixed - tbx_build_macros and genlib do not stop on error.
 
 * Bug #9691 fixed - "imp" option of optim was poorly documented.
index 1cff108..685f296 100644 (file)
@@ -19,6 +19,7 @@
     <refsynopsisdiv>
         <title>Calling Sequence</title>
         <synopsis>
+            y = bitcmp(x)
             y = bitcmp(x, bitnum)
         </synopsis>
     </refsynopsisdiv>
@@ -45,7 +46,7 @@
                         or a <literal>m</literal>-by-<literal>n</literal> matrix of unsigned integers (<literal>uint8</literal>, <literal>uint16</literal> or <literal>uint32</literal>).
                         The input <literal>n</literal> must be in the range 1, 2, ..., <literal>bitmax</literal>
                         where <literal>bitmax</literal> is the maximum number of bits in <varname>x</varname>.
-                        <varname>bitnum</varname> must contain positive integer values.
+                        <varname>bitnum</varname> must contain positive integer values. The default value for <varname>bitnum</varname> is <literal>bitmax</literal>.
                     </para>
                 </listitem>
             </varlistentry>
@@ -77,6 +78,9 @@
             complementary in order to have <literal>bitmax</literal> number (8, 16 or 32) for the
             complementary.
         </para>
+        <para>
+            If only one input argument is given, <varname>x</varname> must be a matrix of unsigned integers.
+        </para>
     </refsection>
     <refsection>
         <title>Examples</title>
index 20da391..3fd4582 100644 (file)
 // http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
 
 function y = bitcmp(x,n)
-       
-       // BITCMP function
-       //
-       // Given an unsigned integer x, this function returns the unsigned integer
-       // which is the integer corresponding to the complementary of the binary
-       // form of x
-       //
-       // If the bits number of the x binary representation is less than the
-       // bitmax number (8,16 or 32) then the bits '1' are added to the
-       // complementary in order to have bitmax number (8, 16 or 32) for the
-       // complementary
-       //
-       // for example for the type uint8 (bitmax=8), the complementary of '1101' is not '0010' but '11110010'
-       // The integer n sets the bits max number
-       // -Inputs :
-       //  x : an unsigned integer
-       //  n : a positive integer between 1 and the bitmax of the x type
-       //
-       // -Output :
-       //  y : an unsigned integer
-       //
-       // P. Marechal, 5 Feb 2008
-       //   - Add argument check
-       
-       // Check input arguments
-       // =========================================================================
-       
-       rhs = argn(2);
-       
-       // check number input argument
-       
-       rhs = argn(2);
-       if (type(x) == 1) & (rhs == 1) then
-               error(msprintf(gettext("%s: Wrong number of input argument(s): %d expected.\n"),"bitcmp",2));
-       elseif rhs == 0 then
-               error(msprintf(gettext("%s: Wrong number of input argument(s): At least %d expected.\n"),"bitcmp",1));
-       end
-       
-       // check type
-       
-       if    (type(x)==1  & (x-floor(x)<>0 | x<0)) ..
-               | (type(x)==8  & (inttype(x)<10)) ..
-               | (type(x)<>1  & type(x)<>8) then
-               
-               error(msprintf(gettext("%s: Wrong input argument #%d: Scalar/matrix of unsigned integers expected.\n"),"bitcmp",1));
-       end
-       
-       if  (rhs == 2) & ( ..
-                       (type(n)==1  & (n-floor(n)<>0 | x<0)) ..
-                       | (type(n)==8  & (inttype(n)<10)) ..
-                       | (type(n)<>1  & type(n)<>8) ..
-                       | (size(n,"*")<>1) ) then
-               
-               error(msprintf(gettext("%s: Wrong input argument #%d: An unsigned integer expected.\n"),"bitcmp",2));
-       end
-       
-       // check n value
-       
-       if rhs>1 then
-               
-               select inttype(x)
-                       case 0  then nmax = 52;
-                       case 11 then nmax = 8;
-                       case 12 then nmax = 16;
-                       case 14 then nmax = 32;
-               end
-               
-               if (n>nmax) | (n<1) then
-                       error(msprintf(gettext("%s: Wrong value for input argument #%d: Must be between %d and %d.\n"),"bitcmp",2,1,nmax));
-               end
-               
-       else
-               n = nmax;
-       end
-       
-       // Algorithm
-       // =========================================================================
-       
-       // empty matrix shortcut
-       
-       if isempty(x) then
-               y = [];
-               return;
-       end
-       
-       // unit8, uint16 and uint32 shortcut
-       
-       if type(x)==8 then
-               y = ~x;
-               if rhs > 1 then
-                       select inttype(x)
-                               case 11 then y = y & uint8(  2^n - 1);
-                               case 12 then y = y & uint16( 2^n - 1);
-                               case 14 then y = y & uint32( 2^n - 1);
-                       end
-               end
-               return;
-       end
-       
-       n = ones(x)*n;
-       
-       if type(x) == 1 then
-               
-               a     = 2^32;
-               
-               y_LSB = uint32( x - double(uint32(x/a)) * a ); // LSB Less Significant Bits
-               y_MSB = uint32( x/a );                         // MSB Most Significant Bits
-               
-               y_LSB = ~y_LSB;
-               y_MSB = ~y_MSB;
-               
-               if n <= 32 then
-                       y_LSB = y_LSB & uint32( 2^n - 1);
-                       y_MSB = uint32(0);
-               else
-                       y_MSB = y_MSB & uint32( 2^(n-32) - 1);
-               end
-               
-               y = double( a * y_MSB + y_LSB );
-       end
-       
+
+    // BITCMP function
+    //
+    // Given an unsigned integer x, this function returns the unsigned integer
+    // which is the integer corresponding to the complementary of the binary
+    // form of x
+    //
+    // If the bits number of the x binary representation is less than the
+    // bitmax number (8,16 or 32) then the bits '1' are added to the
+    // complementary in order to have bitmax number (8, 16 or 32) for the
+    // complementary
+    //
+    // for example for the type uint8 (bitmax=8), the complementary of '1101' is not '0010' but '11110010'
+    // The integer n sets the bits max number
+    // -Inputs :
+    //  x : an unsigned integer
+    //  n : a positive integer between 1 and the bitmax of the x type
+    //
+    // -Output :
+    //  y : an unsigned integer
+    //
+    // P. Marechal, 5 Feb 2008
+    //   - Add argument check
+
+    // Check input arguments
+    // =========================================================================
+
+    rhs = argn(2);
+
+    // check number input argument
+
+    rhs = argn(2);
+    if rhs == 0 then
+        error(msprintf(gettext("%s: Wrong number of input argument(s): At least %d expected.\n"),"bitcmp",1));
+    elseif (type(x) == 1) & (rhs == 1) then
+        error(msprintf(gettext("%s: Wrong number of input argument(s): %d expected.\n"),"bitcmp",2));
+    end
+
+    // check type
+
+    if    (type(x)==1  & (x-floor(x)<>0 | x<0)) ..
+        | (type(x)==8  & (inttype(x)<10)) ..
+        | (type(x)<>1  & type(x)<>8) then
+
+        error(msprintf(gettext("%s: Wrong input argument #%d: Scalar/matrix of unsigned integers expected.\n"),"bitcmp",1));
+    end
+
+    if  (rhs == 2) & ( ..
+        (type(n)==1  & (n-floor(n)<>0 | x<0)) ..
+        | (type(n)==8  & (inttype(n)<10)) ..
+        | (type(n)<>1  & type(n)<>8) ..
+        | (size(n,"*")<>1) ) then
+
+        error(msprintf(gettext("%s: Wrong input argument #%d: An unsigned integer expected.\n"),"bitcmp",2));
+    end
+
+    // check n value
+    
+        select inttype(x)
+        case 0  then nmax = 52;
+        case 11 then nmax = 8;
+        case 12 then nmax = 16;
+        case 14 then nmax = 32;
+        end
+
+    if rhs>1 then
+
+        if (n>nmax) | (n<1) then
+            error(msprintf(gettext("%s: Wrong value for input argument #%d: Must be between %d and %d.\n"),"bitcmp",2,1,nmax));
+        end
+
+    else
+        n = nmax;
+    end
+
+    // Algorithm
+    // =========================================================================
+
+    // empty matrix shortcut
+
+    if isempty(x) then
+        y = [];
+        return;
+    end
+
+    // unit8, uint16 and uint32 shortcut
+
+    if type(x)==8 then
+        y = ~x;
+        if rhs > 1 then
+            select inttype(x)
+            case 11 then y = y & uint8(  2^n - 1);
+            case 12 then y = y & uint16( 2^n - 1);
+            case 14 then y = y & uint32( 2^n - 1);
+            end
+        end
+        return;
+    end
+
+    n = ones(x)*n;
+
+    if type(x) == 1 then
+
+        a     = 2^32;
+
+        y_LSB = uint32( x - double(uint32(x/a)) * a ); // LSB Less Significant Bits
+        y_MSB = uint32( x/a );                         // MSB Most Significant Bits
+
+        y_LSB = ~y_LSB;
+        y_MSB = ~y_MSB;
+
+        if n <= 32 then
+            y_LSB = y_LSB & uint32( 2^n - 1);
+            y_MSB = uint32(0);
+        else
+            y_MSB = y_MSB & uint32( 2^(n-32) - 1);
+        end
+
+        y = double( a * y_MSB + y_LSB );
+    end
+
 endfunction
diff --git a/scilab/modules/elementary_functions/tests/nonreg_tests/bug_9004.dia.ref b/scilab/modules/elementary_functions/tests/nonreg_tests/bug_9004.dia.ref
new file mode 100644 (file)
index 0000000..17d3564
--- /dev/null
@@ -0,0 +1,17 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Charlotte HECQUET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+//
+// <-- Non-regression test for bug 9004 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=9004
+//
+// <-- Short Description -->
+// bitcmp(uint8(99)) returns an error
+assert_checkequal(bitcmp(uint8(99)),bitcmp(uint8(99),8));
diff --git a/scilab/modules/elementary_functions/tests/nonreg_tests/bug_9004.tst b/scilab/modules/elementary_functions/tests/nonreg_tests/bug_9004.tst
new file mode 100644 (file)
index 0000000..17d3564
--- /dev/null
@@ -0,0 +1,17 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Charlotte HECQUET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+//
+// <-- Non-regression test for bug 9004 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=9004
+//
+// <-- Short Description -->
+// bitcmp(uint8(99)) returns an error
+assert_checkequal(bitcmp(uint8(99)),bitcmp(uint8(99),8));
diff --git a/scilab/modules/elementary_functions/tests/unit_tests/bitcmp.dia.ref b/scilab/modules/elementary_functions/tests/unit_tests/bitcmp.dia.ref
new file mode 100644 (file)
index 0000000..0cfc717
--- /dev/null
@@ -0,0 +1,36 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Charlotte HECQUET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- CLI SHELL MODE -->
+// unit test for bitcmp function
+// =============================================================================
+// Tests for one input argument
+assert_checkequal(bitcmp(uint8(99)),uint8(156));
+assert_checkequal(bitcmp(uint16(99)),uint16(65436));
+assert_checkequal(bitcmp(uint32(99)),uint32(4294967196));
+assert_checkequal(bitcmp(uint8([13,99])),uint8([242,156]));
+assert_checkequal(bitcmp(uint16([13,99])),uint16([65522,65436]));
+assert_checkequal(bitcmp(uint32([13,99])),uint32([4294967282,4294967196]));
+// Tests for two input arguments
+assert_checktrue(bitcmp(99,8)==uint8(156));
+assert_checktrue(bitcmp(99,16)==uint16(65436));
+assert_checktrue(bitcmp(99,32)==uint32(4294967196));
+assert_checktrue(bitcmp([13,99],8)==uint8([242,156]));
+assert_checktrue(bitcmp([13,99],16)==uint16([65522,65436]));
+assert_checktrue(bitcmp([13,99],32)==uint32([4294967282,4294967196]));
+// Error messages
+errmsg = msprintf(_("%s: Wrong number of input argument(s): At least %d expected.\n"),"bitcmp",1);
+assert_checkerror("bitcmp()",errmsg); //no input argument
+errmsg2 = msprintf(_("Wrong number of input arguments."));
+assert_checkerror("bitcmp(3,3,3)",errmsg2,58); //too many input arguments
+errmsg3 = msprintf(_("%s: Wrong number of input argument(s): %d expected.\n"),"bitcmp",2);
+assert_checkerror("bitcmp(99)",errmsg3); //First (and only) argument is not an unsigned integer
+errmsg4 = msprintf(_("%s: Wrong input argument #%d: Scalar/matrix of unsigned integers expected.\n"),"bitcmp",1);
+assert_checkerror("bitcmp(""s"")",errmsg4); //input argument is a char
+errmsg5 = msprintf(_("%s: Wrong value for input argument #%d: Must be between %d and %d.\n"),"bitcmp",2,1,8);
+assert_checkerror("bitcmp(uint8(99),16)",errmsg5); //wrong value for second input argument
+errmsg6 = msprintf(_("%s: Wrong input argument #%d: An unsigned integer expected.\n"),"bitcmp",2);
+assert_checkerror("bitcmp(uint8(99),5.5)",errmsg6); //second argument is a double
diff --git a/scilab/modules/elementary_functions/tests/unit_tests/bitcmp.tst b/scilab/modules/elementary_functions/tests/unit_tests/bitcmp.tst
new file mode 100644 (file)
index 0000000..2ca2b76
--- /dev/null
@@ -0,0 +1,43 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Charlotte HECQUET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+// <-- CLI SHELL MODE -->
+
+// unit test for bitcmp function
+// =============================================================================
+
+// Tests for one input argument
+assert_checkequal(bitcmp(uint8(99)),uint8(156));
+assert_checkequal(bitcmp(uint16(99)),uint16(65436));
+assert_checkequal(bitcmp(uint32(99)),uint32(4294967196));
+
+assert_checkequal(bitcmp(uint8([13,99])),uint8([242,156]));
+assert_checkequal(bitcmp(uint16([13,99])),uint16([65522,65436]));
+assert_checkequal(bitcmp(uint32([13,99])),uint32([4294967282,4294967196]));
+
+// Tests for two input arguments
+assert_checktrue(bitcmp(99,8)==uint8(156));
+assert_checktrue(bitcmp(99,16)==uint16(65436));
+assert_checktrue(bitcmp(99,32)==uint32(4294967196));
+
+assert_checktrue(bitcmp([13,99],8)==uint8([242,156]));
+assert_checktrue(bitcmp([13,99],16)==uint16([65522,65436]));
+assert_checktrue(bitcmp([13,99],32)==uint32([4294967282,4294967196]));
+
+// Error messages
+errmsg = msprintf(_("%s: Wrong number of input argument(s): At least %d expected.\n"),"bitcmp",1);
+assert_checkerror("bitcmp()",errmsg); //no input argument
+errmsg2 = msprintf(_("Wrong number of input arguments."));
+assert_checkerror("bitcmp(3,3,3)",errmsg2,58); //too many input arguments
+errmsg3 = msprintf(_("%s: Wrong number of input argument(s): %d expected.\n"),"bitcmp",2);
+assert_checkerror("bitcmp(99)",errmsg3); //First (and only) argument is not an unsigned integer
+errmsg4 = msprintf(_("%s: Wrong input argument #%d: Scalar/matrix of unsigned integers expected.\n"),"bitcmp",1);
+assert_checkerror("bitcmp(""s"")",errmsg4); //input argument is a char
+errmsg5 = msprintf(_("%s: Wrong value for input argument #%d: Must be between %d and %d.\n"),"bitcmp",2,1,8);
+assert_checkerror("bitcmp(uint8(99),16)",errmsg5); //wrong value for second input argument
+errmsg6 = msprintf(_("%s: Wrong input argument #%d: An unsigned integer expected.\n"),"bitcmp",2);
+assert_checkerror("bitcmp(uint8(99),5.5)",errmsg6); //second argument is a double