management of --std=c++11 for toolboxes.
[scilab.git] / scilab / modules / dynamic_link / macros / ilib_gen_gateway.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) INRIA/ENPC
3 // Copyright (C) DIGITEO - 2010 - Allan CORNET
4 //
5 // This file must be used under the terms of the CeCILL.
6 // This source file is licensed as described in the file COPYING, which
7 // you should have received as part of this distribution.  The terms
8 // are also available at
9 // http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
10
11 //=============================================================================
12 // ilib_gen_gateway_cpp used by ilib_build
13 //=============================================================================
14 // generate an interface gateway named name
15 // from table table taking into account
16 // attributes of function i.e mex fmex or scilab interface
17 // if name is a full path just extract the filename
18
19 function gateway_filename = ilib_gen_gateway(name,tables)
20
21     [lhs,rhs] = argn(0);
22     if rhs <> 2 then
23         error(msprintf(gettext("%s: Wrong number of input argument(s).\n"), "ilib_gen_gateway"));
24         return
25     end
26
27     gateway_filename = ["","",""];
28     k = strindex(name,["/","\"]);
29     if k~=[] then
30         path = part(name,1:k($));
31         name = part(name,k($)+1:length(name));
32     else
33         path="";
34     end
35
36     [path_name, file_name, ext_name] = fileparts(name);
37     if ext_name == ".c" then
38         name = path_name + file_name;
39     else
40         name = path_name + file_name + ext_name;
41     end
42
43     if typeof(tables)<>"list" then
44         tables = list(tables);
45     end
46
47     L = length(tables);
48
49     for itable = 1:L
50         // loop on a list of tables
51         if L <> 1 then
52             tname = name +string(itable);
53         else
54             tname = name ;
55         end
56
57         table = tables(itable);
58         [mt,nt] = size(table);
59
60         if (nt == 2) then
61             col = "csci";
62             table = [table, col(ones(mt,1))];
63             nt = 3;
64         end
65
66         if ( nt <> 3 ) then
67             error(msprintf(gettext("%s: Wrong size for input argument #%d: %d expected.\n"),"ilib_gen_gateway",2,3));
68         end
69         [gate,names,cppCompilation] = new_names(table);
70         global cppCompilation;
71         //generate cpp interface file
72         if  cppCompilation then
73             t = [
74             "#include ""context.hxx""";
75             "#include ""cpp_gateway_prototype.hxx""";
76             "#include """ + tname + ".hxx""";
77             "extern ""C""";
78             "{";
79             "#include """ + tname + ".h""";
80             "}";
81             "";
82             "#define MODULE_NAME L""" + tname + """";
83             "";
84             "int " + tname + "(wchar_t* _pwstFuncName)";
85             "{";
86             "    if(wcscmp(_pwstFuncName, L""" + table(:,1) + """) == 0){ " + "symbol::Context::getInstance()->addFunction(types::Function::createFunction(L""" + table(:,1) + """, &" + names(:) + ", MODULE_NAME)); }";
87             "";
88             "    return 1;";
89             "}"];
90         else
91             t = [
92             "#include <wchar.h>";
93             "#include """ + tname + ".hxx""";
94             "extern ""C""";
95             "{";
96             "#include """ + tname + ".h""";
97             "#include ""addfunction.h""";
98             "}";
99             "";
100             "#define MODULE_NAME L""" + tname + """";
101             "";
102             "int " + tname + "(wchar_t* _pwstFuncName)";
103             "{";
104             "    if(wcscmp(_pwstFuncName, L""" + table(:,1) + """) == 0){ " + "addCFunction(L""" + table(:,1) + """, &" + names(:) + ", MODULE_NAME); }";
105             "";
106             "    return 1;";
107             "}"];
108         end
109
110         gateway_filename(1) = path + tname + ".cpp";
111         // first check if we have already a gateway
112         [fd, ierr] = mopen(gateway_filename(1), "rt");
113         if ierr == 0 then
114             // file already exists
115             t1 = mgetl(fd);
116             mclose(fd);
117             if or(t1 <> t) then
118                 mputl(t, gateway_filename(1));
119             end
120         else
121             // file does not exist we create it
122             mputl(t, gateway_filename(1)) ;
123         end
124
125         if ilib_verbose() > 1 then
126             disp(t);
127         end
128
129         //prepare .hxx file
130         TNAME = convstr(tname, "u");
131         t = [
132         "#ifndef __" + TNAME + "_GW_HXX__";
133         "#define __" + TNAME + "_GW_HXX__";
134         "";
135         "#ifdef _MSC_VER";
136         "#ifdef " + TNAME + "_GW_EXPORTS";
137         "#define " + TNAME + "_GW_IMPEXP __declspec(dllexport)";
138         "#else";
139         "#define " + TNAME + "_GW_IMPEXP __declspec(dllimport)";
140         "#endif";
141         "#else";
142         "#define " + TNAME + "_GW_IMPEXP";
143         "#endif";
144         "";
145         "extern ""C"" " + TNAME + "_GW_IMPEXP int " + tname + "(wchar_t* _pwstFuncName);";
146         "";
147         gate(:, 2);
148         "";
149         "#endif /* __" + TNAME + "_GW_HXX__ */"];
150
151         gateway_filename(2) = path + tname + ".hxx";
152         // first check if we have already a gateway
153         [fd, ierr] = mopen(gateway_filename(2), "rt");
154         if ierr == 0 then
155             // file already exists
156             t1 = mgetl(fd);
157             mclose(fd);
158             if or(t1 <> t) then
159                 mputl(t, gateway_filename(2));
160             end
161         else
162             // file does not exist we create it
163             mputl(t, gateway_filename(2)) ;
164         end
165
166         //prepare .h file
167         TNAME = convstr(tname, "u");
168         t = [
169         "#ifndef __" + TNAME + "_GW_H__";
170         "#define __" + TNAME + "_GW_H__";
171         "";
172         "#include ""c_gateway_prototype.h""";
173         "";
174         gate(:, 1);
175         "";
176         "#endif /* __" + TNAME + "_GW_H__ */"];
177
178         gateway_filename(3) = path + tname + ".h";
179         // first check if we have already a gateway
180         [fd, ierr] = mopen(gateway_filename(3), "rt");
181         if ierr == 0 then
182             // file already exists
183             t1 = mgetl(fd);
184             mclose(fd);
185             if or(t1 <> t) then
186                 mputl(t, gateway_filename(3));
187             end
188         else
189             // file does not exist we create it
190             mputl(t, gateway_filename(3)) ;
191         end
192
193         if ilib_verbose() > 1 then
194             disp(t);
195         end
196     end
197 endfunction
198 //=============================================================================
199 // new_names only used by ilib_gen_gateway
200 //=============================================================================
201 function [gate,names,cppCompilation] = new_names(table)
202     // change names according to types
203     cppCompilation = %f;
204     [mt,nt] = size(table);
205     gate = [""];
206     gate = gate(ones(mt, 2));
207     names = " ";
208     names = names(ones(mt,1));
209     for i = 1:mt
210         select table(i,3)
211         case "cmex" then
212             names(i) = "mex_" + table(i,2);
213             gate(i, 1) = "C_GATEWAY_PROTOTYPE(" + names(i) + ");";
214         case "fmex" then
215             names(i) = "C2F(mex" + table(i,2) + ")";
216             gate(i, 1) = "C_GATEWAY_PROTOTYPE(" + names(i) + ");";
217         case "Fmex" then
218             names(i) = "C2F(mex" + table(i,2) + ")";
219             gate(i, 1) = "C_GATEWAY_PROTOTYPE(" + names(i) + ");";
220         case "csci"  then
221             names(i) = table(i,2);
222             gate(i, 1) = "C_GATEWAY_PROTOTYPE(" + names(i) + ");";
223         case "fsci"  then
224             names(i) = "C2F(" + table(i,2) + ")";
225             gate(i, 1) = "C_GATEWAY_PROTOTYPE(" + names(i) + ");";
226         case "cppsci"  then
227             cppCompilation = %t;
228             names(i) = table(i,2);
229             gate(i, 2) = "CPP_GATEWAY_PROTOTYPE(" + names(i) + ");";
230         case "direct"  then
231             names(i) = table(i,2);
232             gate(i, 1) = "C_GATEWAY_PROTOTYPE(" + names(i) + ");";
233         else
234             error(999,"Wrong interface type " + table(i,3));
235         end
236     end
237 endfunction
238 //=============================================================================