2c1671e9afb9853811e88b1b62f037c00c86353a
[scilab.git] / scilab / modules / functions / macros / tree2code.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) 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
14 function C = tree2code(P, bprettyprintformat)
15     // Convert a tree returned by macr2tree() to a macro code
16     // Input:
17     // - P: 'program' tlist
18     // - bprettyprintformat: boolean value, if FALSE (default value), generated code is not formatted else it is
19     // Output:
20     // - C: character string matrix (colum vector)
21
22     // Verify good type for input
23     if typeof(P)<>"program" then
24         msg = gettext("%s: Wrong type for input argument #%d: ''%s'' expected.\n")
25         error(msprintf(msg, "tree2code", 2, "program tree"));
26     end
27
28     // Default value
29     rhs = argn(2);
30     if rhs==1 then
31         bprettyprintformat = %F
32     end
33
34     C=""
35
36     // Function prototype
37     lhsstr = ""
38     rhsstr = ""
39     if P.name<>"" then // Not a batch file
40         for k = 1:size(P.outputs)
41             lhsstr = [lhsstr, expression2code(P.outputs(k))]
42         end
43         if size(lhsstr,2)>1
44             lhsstr = "["+strcat(lhsstr(2:$),",")+"] = "
45         end
46
47         for k = 1:size(P.inputs)
48             rhsstr = [rhsstr, expression2code(P.inputs(k))]
49         end
50         if size(rhsstr,2)>1
51             rhsstr = strcat(rhsstr(2:$),",")
52         end
53         rhsstr = "(" + rhsstr + ")"
54
55         C = "function " + lhsstr + P.name + rhsstr;
56     end
57
58     I = P.statements
59
60     // To avoid to have some instructions on the first line (function prototype)
61     if I(1)<>list("EOL") then
62         C = cat_code(C, instruction2code(list("EOL"),%T));
63     end
64
65     // For each statement, generate corresponding code
66     header = ""
67     if bprettyprintformat then
68         header = "  "
69     end
70     for i = 1:size(I)-2 // -2 to ignore last return+EOL
71         C = cat_code(C, header + instruction2code(I(i), bprettyprintformat));
72         C = format_txt(C, I(i), bprettyprintformat, I(i+1));
73     end
74
75     if P.name<>"" then // Not a batch file
76         C = cat_code(C, "endfunction"); // Replace last return
77         C = cat_code(C, "");
78     end
79 endfunction
80