b0070e7e6146b41a543d082df804feb242b73282
[scilab.git] / scilab / modules / m2sci / macros / percent / %a2sci.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) 2002-2004 - INRIA - Vincent COUVERT
3 //
4 // Copyright (C) 2012 - 2016 - Scilab Enterprises
5 //
6 // This file is hereby licensed under the terms of the GNU GPL v2.0,
7 // pursuant to article 5.3.4 of the CeCILL v.2.1.
8 // This file was originally licensed under the terms of the CeCILL v2.1,
9 // and continues to be available under such terms.
10 // For more information, see the COPYING file which you should have received
11 // along with this program.
12
13 function [tree]=%a2sci(tree)
14     // M2SCI function
15     // Conversion function for Matlab addition
16     // Input: tree = Matlab operation tree
17     // Output: tree = Scilab equivalent for tree
18     // Emulation function: mtlb_a()
19
20     // In Matlab only two matrices with the same size can be added unless one is a scalar
21     // So empty matrix can only be added to a scalar or an onther empty matrix
22     // For example : [1,2,3]+[] is not possible
23     // An other important difference with Scilab is that :
24     //  - Matlab gives : [1]+[]=[]
25     //  - Scilab gives : [1]+[]=[1]
26
27     // WARNING : translation does not work for codes like var=+'a'
28     // In this case, user have to modify M-file and replace +'a' by 0+'a' for example
29
30     // Overloading functions in $SCI/modules/m2sci/macros/compat_functions/:
31     // - %b_a_s.sci
32     // - %s_a_b.sci
33
34     // Binary operator: A+B
35     if size(tree.operands)==2 then
36         [A,B]=getoperands(tree)
37
38         // Matlab and Scilab addition do not match for Strings
39         if or(A.vtype==[String,Unknown]) then
40             A=convert2double(A)
41         end
42         if or(B.vtype==[String,Unknown]) then
43             B=convert2double(B)
44         end
45
46         // %b_a_b is not defined in Scilab
47         if A.vtype==Boolean & B.vtype==Boolean
48             A=convert2double(A)
49         end
50
51         tree.operands=list(A,B)
52
53         // Type inference
54         if is_real(A) & is_real(B) then
55             tree.out(1).type=Type(Double,Real)
56         else
57             tree.out(1).type=Type(Double,Unknown)
58         end
59
60         // When both operands are not [] Scilab and Matlab give the same results
61         if not_empty(A) & not_empty(B) then
62             if is_a_scalar(A) then
63                 tree.out(1).dims=B.dims
64             else
65                 tree.out(1).dims=A.dims
66             end
67             // If at least one operand is [] then Matlab result is [] but not Scilab one
68         elseif is_empty(A) | is_empty(B) then
69             set_infos(msprintf(gettext("At least one operand of %s is an empty matrix, Scilab equivalent is []."),expression2code(tree)),0)
70             tree=Cste([])
71         else
72             tree.out(1).dims=allunknown(A.dims)
73             tree=Funcall("mtlb_a",1,list(A,B),tree.out)
74         end
75     else
76         // This case can not exist because Scilab interpreter ignores unary +
77         A=getoperands(tree)
78         //A=convert2double(A)
79         tree.operands=list(A)
80         tree.out(1).infer=A.infer
81     end
82 endfunction