* modulo() and pmodulo() support integers & hypermatrices
[scilab.git] / scilab / modules / elementary_functions / macros / modulo.sci
index 63d6056..1058ec6 100644 (file)
@@ -2,6 +2,7 @@
 // Copyright (C) INRIA
 // Copyright (C) DIGITEO - 2011 - Allan CORNET
 // Copyright (C) 2012 - Scilab Enterprises - Adeline CARNIS
+// Copyright (C) 2013 - Samuel GOUGEON : Bug 13002 : extension to hypermatrices & integers
 //
 // This file must be used under the terms of the CeCILL.
 // This source file is licensed as described in the file COPYING, which
 // http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
 
 function i = modulo(n, m)
-    //i=modulo(n,m) returns  n modulo m.
 
     [lhs, rhs] = argn(0);
     if rhs <> 2 then
-        error(msprintf(gettext("%s: Wrong number of input argument(s): %d expected.\n"),"modulo", 2));
+        msg = _("%s: Wrong number of input argument(s): %d expected.\n")
+        error(msprintf(msg, "modulo", 2))
     end
 
-    if and(typeof(n) <> ["constant", "polynomial"]) | ~isreal(n) then
-        error(msprintf(gettext("%s: Wrong type for input argument #%d: A real expected.\n"), "modulo", 1));
+    mt = type(m($))
+    nt = type(n($))
+    // -----------------------  Checking arguments --------------------------
+
+    if or(type(n)==[15 16]) | and(nt <> [1 2 8]) | (nt==1 & ~isreal(n))
+        msg = _("%s: Wrong type for input argument #%d: Reals, encoded integers or polynomials expected.\n")
+        error(msprintf(msg, "modulo", 1))
+    end
+
+    if or(type(m)==[15 16]) |  and(mt <> [1 2 8]) | (mt==1 & ~isreal(m))
+        msg = _("%s: Wrong type for input argument #%d: Reals, encoded integers or polynomials expected.\n")
+        error(msprintf(msg, "modulo", 2))
     end
 
-    if typeof(m) <> "constant" & typeof(m) <> "polynomial" | ~isreal(m) then
-        error(msprintf(gettext("%s: Wrong type for input argument #%d: A real expected.\n"), "modulo", 2));
+    if (nt==8 | mt==8)  & nt~=mt
+        msg = _("%s: Incompatible input arguments #%d and #%d: Same types expected.\n")
+        error(msprintf(msg, "modulo", 1, 2))
     end
 
-    if typeof(m) =="constant" & typeof(n) =="constant" then
-        if size(n,"*")==1 then
-            i = zeros(m);
-            k = find(m==0);
-            i(k) = n - int(n ./ m(k)) .* m(k);
-            k = find(m~=0);
-            i(k) = n-int(n./m(k)).*m(k);
-        elseif size(m,"*")==1 then
-            i = zeros(n);
-            if m == 0 then
-                i = n - int(n ./ m) .* m;
-            else
-                i = n-int(n./m).*m;
-            end
+    // --------------------------  Processing ----------------------------
+
+    if or(mt==[1 8]) & mt==nt then
+        ms = size(m)
+        ns = size(n)
+        m = m(:)
+        n = n(:)
+        if length(n)>1 & length(m)>1 & or(ns <> ms) then
+            msg = _("%s: Wrong size for input arguments: Same size expected.\n")
+            error(msprintf(msg, "modulo"))
+        end
+        i = n - int(n ./ m) .* m
+        i = iconvert(i, inttype(n))
+        if length(m)>1 then
+            s = ms
         else
-            if or(size(n) <> size(m)) then
-                error(msprintf(gettext("%s: Wrong size for input arguments: Same size expected.\n"),"modulo"));
-            end
-            i = zeros(n);
-            k = find(m==0);
-            i(k) = n(k) - int(n(k) ./ m(k)) .* m(k);
-            k = find(m~=0);
-            i(k) = n(k) - int(n(k)./m(k)).*m(k);
+            s = ns
         end
+        i = matrix(i, s)
     else
-        [i,q]=pdiv(n,m);
+        [i,q] = pdiv(n, m)
     end
-endfunction
-
-
-
-
-
 
+endfunction