[scicos] last ++"|' routing to %c_a()
[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
24     // WARNING : translation does not work for codes like var=+'a'
25     // In this case, user have to modify M-file and replace +'a' by 0+'a' for example
26
27     // Overloading functions in $SCI/modules/m2sci/macros/compat_functions/:
28     // - %b_a_s.sci
29     // - %s_a_b.sci
30
31     // Binary operator: A+B
32     if size(tree.operands)==2 then
33         [A,B]=getoperands(tree)
34
35         // Matlab and Scilab addition do not match for Strings
36         if or(A.vtype==[String,Unknown]) then
37             A=convert2double(A)
38         end
39         if or(B.vtype==[String,Unknown]) then
40             B=convert2double(B)
41         end
42
43         // %b_a_b is not defined in Scilab
44         if A.vtype==Boolean & B.vtype==Boolean
45             A=convert2double(A)
46         end
47
48         tree.operands=list(A,B)
49
50         // Type inference
51         if is_real(A) & is_real(B) then
52             tree.out(1).type=Type(Double,Real)
53         else
54             tree.out(1).type=Type(Double,Unknown)
55         end
56
57         // When both operands are not [] Scilab and Matlab give the same results
58         if not_empty(A) & not_empty(B) then
59             if is_a_scalar(A) then
60                 tree.out(1).dims=B.dims
61             else
62                 tree.out(1).dims=A.dims
63             end
64             // If at least one operand is [] then Matlab result is [] but not Scilab one
65         elseif is_empty(A) | is_empty(B) then
66             set_infos(msprintf(gettext("At least one operand of %s is an empty matrix, Scilab equivalent is []."),expression2code(tree)),0)
67             tree=Cste([])
68         else
69             tree.out(1).dims=allunknown(A.dims)
70             tree=Funcall("mtlb_a",1,list(A,B),tree.out)
71         end
72     else
73         // This case can not exist because Scilab interpreter ignores unary +
74         A=getoperands(tree)
75         //A=convert2double(A)
76         tree.operands=list(A)
77         tree.out(1).infer=A.infer
78     end
79 endfunction