* Bug #12927 fix integer input in ones, rand, eye, zeros after https://codereview... 94/12594/4
Paul BIGNIER [Thu, 19 Sep 2013 09:54:10 +0000 (11:54 +0200)]
Change-Id: I5a77f9af4eedeabf8568b682eb94c461bf60f32e

scilab/CHANGES_5.5.X
scilab/modules/elementary_functions/sci_gateway/fortran/sci_f_eye.f
scilab/modules/elementary_functions/sci_gateway/fortran/sci_f_ones.f
scilab/modules/elementary_functions/sci_gateway/fortran/sci_f_rand.f
scilab/modules/elementary_functions/sci_gateway/fortran/sci_f_zeros.f
scilab/modules/elementary_functions/tests/nonreg_tests/bug_12927.dia.ref [new file with mode: 0644]
scilab/modules/elementary_functions/tests/nonreg_tests/bug_12927.tst [new file with mode: 0644]

index 2f8106b..eb7ca3c 100644 (file)
@@ -723,3 +723,5 @@ Bug Fixes
 * Bug #12911 fixed - Matlab to Scilab dictionary help page updated for eig.
 
 * Bug #12916 fixed - power help page improved.
+
+* Bug #12927 fixed - ones function could not take integer type input.
index 129fb0d..0e939e8 100644 (file)
@@ -12,7 +12,7 @@ c
       integer id(nsiz)
       logical  getmat
 
-      integer tops
+      integer tops, u1, v1
       double precision s
       integer iadr,sadr, mattyp1, areadr1, aimadr1
 c
@@ -56,20 +56,27 @@ c     eye(matrice)
 c     eye(m,n)
          call getdimfromvar(top,2,n)
          if(err.gt.0.or.err1.gt.0) return
+         il=iadr(lstk(top))
+         if(istk(il).eq.1.or.istk(il).eq.-1) then
+            if (.not.getmat('eye', tops, top, 
+     +            mattyp1, u1, v1, areadr1, aimadr1)) return !To have the dimensions of argument #2 
+            if(u1.eq.-1.or.v1.eq.-1) then !detect ':' or eye
+               call error(21)
+               return
+            endif
+         endif
+         
          top=top-1
          call getdimfromvar(top,1,m)
          if(err.gt.0.or.err1.gt.0) return
-         if (.not.getmat('eye', tops, top-rhs+2, 
+         il=iadr(lstk(top))
+         if(istk(il).eq.1.or.istk(il).eq.-1) then
+            if (.not.getmat('eye', tops, top, 
      +            mattyp1, u1, v1, areadr1, aimadr1)) return !To have the dimensions of argument #1 
-         if(u1.ne.u1.and.v1.ne.v1) then !detect nan because isanan does not work here
-            call error(21) !To avoid eye(:,5)
-            return
-         endif
-         if (.not.getmat('eye', tops, top-rhs+3, 
-     +            mattyp1, u1, v1, areadr1, aimadr1)) return !To have the dimensions of argument #2
-         if(u1.ne.u1.and.v1.ne.v1) then !detect nan because isanan does not work here
-            call error(21) !To avoid eye(5,:)
-            return
+            if(u1.eq.-1.or.v1.eq.-1) then !detect ':' or eye
+               call error(21)
+               return
+            endif
          endif
       endif
 c
index 6048654..c227cf9 100644 (file)
@@ -12,7 +12,7 @@ c
       integer id(nsiz)
       logical  getmat
 
-      integer tops
+      integer tops, u1, v1
       double precision s
       integer iadr,sadr, mattyp1, areadr1, aimadr1
 c
@@ -58,20 +58,27 @@ c     ones(matrice)
 c     ones(m,n)
          call getdimfromvar(top,2,n)
          if(err.gt.0.or.err1.gt.0) return
+         il=iadr(lstk(top))
+         if(istk(il).eq.1.or.istk(il).eq.-1) then
+            if (.not.getmat('ones', tops, top, 
+     +            mattyp1, u1, v1, areadr1, aimadr1)) return !To have the dimensions of argument #2 
+            if(u1.eq.-1.or.v1.eq.-1) then !detect ':' or eye
+               call error(21)
+               return
+            endif
+         endif
+         
          top=top-1
          call getdimfromvar(top,1,m)
          if(err.gt.0.or.err1.gt.0) return
-         if (.not.getmat('ones', tops, top-rhs+2, 
+         il=iadr(lstk(top))
+         if(istk(il).eq.1.or.istk(il).eq.-1) then
+            if (.not.getmat('ones', tops, top, 
      +            mattyp1, u1, v1, areadr1, aimadr1)) return !To have the dimensions of argument #1 
-         if(u1.ne.u1.and.v1.ne.v1) then !detect nan because isanan does not work here
-            call error(21) !To avoid ones(:,5)
-            return
-         endif
-         if (.not.getmat('ones', tops, top-rhs+3, 
-     +            mattyp1, u1, v1, areadr1, aimadr1)) return !To have the dimensions of argument #2
-         if(u1.ne.u1.and.v1.ne.v1) then !detect nan because isanan does not work here
-            call error(21) !To avoid ones(5,:)
-            return
+            if(u1.eq.-1.or.v1.eq.-1) then !detect ':' or eye
+               call error(21)
+               return
+            endif
          endif
       endif
 c
@@ -99,4 +106,3 @@ c     to avoid integer overflow
       return
       end
 c     -------------------------------
-      
index a0c69e0..f9ff028 100644 (file)
@@ -18,7 +18,7 @@ c     Interface for rand function
       double precision urand
       logical checkrhs,checklhs,getsmat,getscalar,cremat
       logical cresmat2, getmat
-      integer gettype
+      integer gettype, u1, v1
       character*(20) randtype
       logical phase
       integer iadr, mattyp1, areadr1, aimadr1
@@ -139,36 +139,27 @@ C
       itres=0
       if( rhs-irt.eq.2) then
 c     . rand(n1,n2)
-         call getdimfromvar(top,rhs-irt,n)
+         call getdimfromvar(top,2,n)
          if(err.gt.0.or.err1.gt.0) return
-         top=top-1
-         call getdimfromvar(top,rhs-irt-1,m)
-         if(err.gt.0.or.err1.gt.0) return
-         if(rhs.eq.2) then
-            if (.not.getmat('rand', tops, top-rhs-irt+2, 
-     +            mattyp1, u1, v1, areadr1, aimadr1)) return !To have the dimensions of argument #1 
-            if(u1.ne.u1.and.v1.ne.v1) then !detect nan because isanan does not work here
-               call error(21) !To avoid rand(:,5)
-               return
-            endif
-            if (.not.getmat('rand', tops, top-rhs-irt+3, 
-     +            mattyp1, u1, v1, areadr1, aimadr1)) return !To have the dimensions of argument #2
-            if(u1.ne.u1.and.v1.ne.v1) then !detect nan because isanan does not work here
-               call error(21) !To avoid rand(5,:)
+         il=iadr(lstk(top))
+         if(istk(il).eq.1.or.istk(il).eq.-1) then
+            if (.not.getmat('rand', tops, top, 
+     +            mattyp1, u1, v1, areadr1, aimadr1)) return !To have the dimensions of argument #2 
+            if(u1.eq.-1.or.v1.eq.-1) then !detect ':' or eye
+               call error(21)
                return
             endif
          endif
-         if(rhs.eq.3) then
-            if (.not.getmat('rand', tops, top-rhs-irt+4, 
+         
+         top=top-1
+         call getdimfromvar(top,1,m)
+         if(err.gt.0.or.err1.gt.0) return
+         il=iadr(lstk(top))
+         if(istk(il).eq.1.or.istk(il).eq.-1) then
+            if (.not.getmat('rand', tops, top, 
      +            mattyp1, u1, v1, areadr1, aimadr1)) return !To have the dimensions of argument #1 
-            if(u1.ne.u1.and.v1.ne.v1) then !detect nan because isanan does not work here
-               call error(21) !To avoid rand(:,5)
-               return
-            endif
-            if (.not.getmat('rand', tops, top-rhs-irt+5, 
-     +            mattyp1, u1, v1, areadr1, aimadr1)) return !To have the dimensions of argument #2
-            if(u1.ne.u1.and.v1.ne.v1) then !detect nan because isanan does not work here
-               call error(21) !To avoid rand(5,:)
+            if(u1.eq.-1.or.v1.eq.-1) then !detect ':' or eye
+               call error(21)
                return
             endif
          endif
index 0782ca4..1e747c8 100644 (file)
@@ -12,7 +12,7 @@ c
       integer id(nsiz)
       logical  getmat
 
-      integer tops
+      integer tops, v1, u1
       double precision s
       integer iadr,sadr, mattyp1, areadr1, aimadr1
 c
@@ -58,20 +58,27 @@ c     ones(matrice)
 c     ones(m,n)
          call getdimfromvar(top,2,n)
          if(err.gt.0.or.err1.gt.0) return
+         il=iadr(lstk(top))
+         if(istk(il).eq.1.or.istk(il).eq.-1) then
+            if (.not.getmat('zeros', tops, top, 
+     +            mattyp1, u1, v1, areadr1, aimadr1)) return !To have the dimensions of argument #2 
+            if(u1.eq.-1.or.v1.eq.-1) then !detect ':' or eye
+               call error(21)
+               return
+            endif
+         endif
+         
          top=top-1
          call getdimfromvar(top,1,m)
          if(err.gt.0.or.err1.gt.0) return
-         if (.not.getmat('zeros', tops, top-rhs+2, 
+         il=iadr(lstk(top))
+         if(istk(il).eq.1.or.istk(il).eq.-1) then
+            if (.not.getmat('zeros', tops, top, 
      +            mattyp1, u1, v1, areadr1, aimadr1)) return !To have the dimensions of argument #1 
-         if(u1.ne.u1.and.v1.ne.v1) then !detect nan because isanan does not work here
-            call error(21) !To avoid zeros(:,5)
-            return
-         endif
-         if (.not.getmat('zeros', tops, top-rhs+3, 
-     +            mattyp1, u1, v1, areadr1, aimadr1)) return !To have the dimensions of argument #2
-         if(u1.ne.u1.and.v1.ne.v1) then !detect nan because isanan does not work here
-            call error(21) !To avoid zeros(5,:)
-            return
+            if(u1.eq.-1.or.v1.eq.-1) then !detect ':' or eye
+               call error(21)
+               return
+            endif
          endif
       endif
 c
diff --git a/scilab/modules/elementary_functions/tests/nonreg_tests/bug_12927.dia.ref b/scilab/modules/elementary_functions/tests/nonreg_tests/bug_12927.dia.ref
new file mode 100644 (file)
index 0000000..db4b441
--- /dev/null
@@ -0,0 +1,87 @@
+// =============================================================================
+// 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 12927 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=12927
+//
+// <-- Short Description -->
+// fix integer input in ones, rand, eye, zeros
+//check errors
+refMsg = msprintf(_("Wrong size for argument #%d.\n"), 1);
+assert_checkerror("ones(int32([5 5]), 4)", refMsg);
+refMsg = msprintf(_("Wrong size for argument #%d.\n"), 2);
+assert_checkerror("ones(4, int32([5 5]))", refMsg);
+refMsg = msprintf(_("Wrong size for argument #%d.\n"), 1);
+assert_checkerror("zeros(int32([5 5]), 4)", refMsg);
+refMsg = msprintf(_("Wrong size for argument #%d.\n"), 2);
+assert_checkerror("zeros(4, int32([5 5]))", refMsg);
+refMsg = msprintf(_("Wrong size for argument #%d.\n"), 1);
+assert_checkerror("rand(int32([5 5]), 4)", refMsg);
+refMsg = msprintf(_("Wrong size for argument #%d.\n"), 2);
+assert_checkerror("rand(4, int32([5 5]))", refMsg);
+refMsg = msprintf(_("Wrong size for argument #%d.\n"), 1);
+assert_checkerror("eye(int32([5 5]), 4)", refMsg);
+refMsg = msprintf(_("Wrong size for argument #%d.\n"), 2);
+assert_checkerror("eye(4, int32([5 5]))", refMsg);
+//return []
+assert_checkequal(ones(4, -int32(5)), []);
+assert_checkequal(ones(-4, int32(5)), []);
+assert_checkequal(ones(-4, -int32(5)), []);
+assert_checkequal(ones(int32(5), -4), []);
+assert_checkequal(ones(-int32(5), 4), []);
+assert_checkequal(ones(-int32(5), -4), []);
+assert_checkequal(ones(-int32(5), -int32(5)), []);
+assert_checkequal(zeros(4, -int32(5)), []);
+assert_checkequal(zeros(-4, int32(5)), []);
+assert_checkequal(zeros(-4, -int32(5)), []);
+assert_checkequal(zeros(int32(5), -4), []);
+assert_checkequal(zeros(-int32(5), 4), []);
+assert_checkequal(zeros(-int32(5), -4), []);
+assert_checkequal(zeros(-int32(5), -int32(5)), []);
+assert_checkequal(rand(4, -int32(5)), []);
+assert_checkequal(rand(-4, int32(5)), []);
+assert_checkequal(rand(-4, -int32(5)), []);
+assert_checkequal(rand(int32(5), -4), []);
+assert_checkequal(rand(-int32(5), 4), []);
+assert_checkequal(rand(-int32(5), -4), []);
+assert_checkequal(rand(-int32(5), -int32(5)), []);
+assert_checkequal(eye(4, -int32(5)), []);
+assert_checkequal(eye(-4, int32(5)), []);
+assert_checkequal(eye(-4, -int32(5)), []);
+assert_checkequal(eye(int32(5), -4), []);
+assert_checkequal(eye(-int32(5), 4), []);
+assert_checkequal(eye(-int32(5), -4), []);
+assert_checkequal(eye(-int32(5), -int32(5)), []);
+//
+dblX = 5;
+dblY = 5;
+intX = int32(dblX);
+intY = int32(dblY);
+assert_checkequal(ones(intX, dblY), ones(dblX, dblY));
+assert_checkequal(ones(dblX, intY), ones(dblX, dblY));
+assert_checkequal(ones(intX, intY), ones(dblX, dblY));
+assert_checkequal(zeros(intX, dblY), zeros(dblX, dblY));
+assert_checkequal(zeros(dblX, intY), zeros(dblX, dblY));
+assert_checkequal(zeros(intX, intY), zeros(dblX, dblY));
+rand("seed", 0)
+randInt1 = rand(intX, dblY);
+randInt2 = rand(dblX, intY);
+randInt3 = rand(intX, intY);
+rand("seed", 0)
+randDbl1 = rand(dblX, dblY);
+randDbl2 = rand(dblX, dblY);
+randDbl3 = rand(dblX, dblY);
+assert_checkequal(randInt1, randDbl1);
+assert_checkequal(randInt2, randDbl2);
+assert_checkequal(randInt3, randDbl3);
+assert_checkequal(eye(intX, dblY), eye(dblX, dblY));
+assert_checkequal(eye(dblX, intY), eye(dblX, dblY));
+assert_checkequal(eye(intX, intY), eye(dblX, dblY));
diff --git a/scilab/modules/elementary_functions/tests/nonreg_tests/bug_12927.tst b/scilab/modules/elementary_functions/tests/nonreg_tests/bug_12927.tst
new file mode 100644 (file)
index 0000000..264a8ab
--- /dev/null
@@ -0,0 +1,105 @@
+// =============================================================================
+// 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 12927 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=12927
+//
+// <-- Short Description -->
+// fix integer input in ones, rand, eye, zeros
+
+
+//check errors
+refMsg = msprintf(_("Wrong size for argument #%d.\n"), 1);
+assert_checkerror("ones(int32([5 5]), 4)", refMsg);
+refMsg = msprintf(_("Wrong size for argument #%d.\n"), 2);
+assert_checkerror("ones(4, int32([5 5]))", refMsg);
+
+refMsg = msprintf(_("Wrong size for argument #%d.\n"), 1);
+assert_checkerror("zeros(int32([5 5]), 4)", refMsg);
+refMsg = msprintf(_("Wrong size for argument #%d.\n"), 2);
+assert_checkerror("zeros(4, int32([5 5]))", refMsg);
+
+refMsg = msprintf(_("Wrong size for argument #%d.\n"), 1);
+assert_checkerror("rand(int32([5 5]), 4)", refMsg);
+refMsg = msprintf(_("Wrong size for argument #%d.\n"), 2);
+assert_checkerror("rand(4, int32([5 5]))", refMsg);
+
+refMsg = msprintf(_("Wrong size for argument #%d.\n"), 1);
+assert_checkerror("eye(int32([5 5]), 4)", refMsg);
+refMsg = msprintf(_("Wrong size for argument #%d.\n"), 2);
+assert_checkerror("eye(4, int32([5 5]))", refMsg);
+
+//return []
+assert_checkequal(ones(4, -int32(5)), []);
+assert_checkequal(ones(-4, int32(5)), []);
+assert_checkequal(ones(-4, -int32(5)), []);
+assert_checkequal(ones(int32(5), -4), []);
+assert_checkequal(ones(-int32(5), 4), []);
+assert_checkequal(ones(-int32(5), -4), []);
+assert_checkequal(ones(-int32(5), -int32(5)), []);
+
+assert_checkequal(zeros(4, -int32(5)), []);
+assert_checkequal(zeros(-4, int32(5)), []);
+assert_checkequal(zeros(-4, -int32(5)), []);
+assert_checkequal(zeros(int32(5), -4), []);
+assert_checkequal(zeros(-int32(5), 4), []);
+assert_checkequal(zeros(-int32(5), -4), []);
+assert_checkequal(zeros(-int32(5), -int32(5)), []);
+
+assert_checkequal(rand(4, -int32(5)), []);
+assert_checkequal(rand(-4, int32(5)), []);
+assert_checkequal(rand(-4, -int32(5)), []);
+assert_checkequal(rand(int32(5), -4), []);
+assert_checkequal(rand(-int32(5), 4), []);
+assert_checkequal(rand(-int32(5), -4), []);
+assert_checkequal(rand(-int32(5), -int32(5)), []);
+
+assert_checkequal(eye(4, -int32(5)), []);
+assert_checkequal(eye(-4, int32(5)), []);
+assert_checkequal(eye(-4, -int32(5)), []);
+assert_checkequal(eye(int32(5), -4), []);
+assert_checkequal(eye(-int32(5), 4), []);
+assert_checkequal(eye(-int32(5), -4), []);
+assert_checkequal(eye(-int32(5), -int32(5)), []);
+
+//
+dblX = 5;
+dblY = 5;
+intX = int32(dblX);
+intY = int32(dblY);
+
+assert_checkequal(ones(intX, dblY), ones(dblX, dblY));
+assert_checkequal(ones(dblX, intY), ones(dblX, dblY));
+assert_checkequal(ones(intX, intY), ones(dblX, dblY));
+
+assert_checkequal(zeros(intX, dblY), zeros(dblX, dblY));
+assert_checkequal(zeros(dblX, intY), zeros(dblX, dblY));
+assert_checkequal(zeros(intX, intY), zeros(dblX, dblY));
+
+rand("seed", 0)
+randInt1 = rand(intX, dblY);
+randInt2 = rand(dblX, intY);
+randInt3 = rand(intX, intY);
+rand("seed", 0)
+randDbl1 = rand(dblX, dblY);
+randDbl2 = rand(dblX, dblY);
+randDbl3 = rand(dblX, dblY);
+
+assert_checkequal(randInt1, randDbl1);
+assert_checkequal(randInt2, randDbl2);
+assert_checkequal(randInt3, randDbl3);
+
+
+assert_checkequal(eye(intX, dblY), eye(dblX, dblY));
+assert_checkequal(eye(dblX, intY), eye(dblX, dblY));
+assert_checkequal(eye(intX, intY), eye(dblX, dblY));
+
+