6a761e08d6cde8c8403c8238ece53d4e0ffa0745
[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] = new_names(table);
70
71         //generate cpp interface file
72         t = [
73         "#include ""context.hxx""";
74         "#include """ + tname + ".hxx""";
75         "extern ""C""";
76         "{";
77         "#include """ + tname + ".h""";
78         "}";
79         "";
80         "#define MODULE_NAME L""" + tname + """";
81         "";
82         "int " + tname + "(wchar_t* _pwstFuncName)";
83         "{";
84         "    if(wcscmp(_pwstFuncName, L""" + table(:,1) + """) == 0){ " + "symbol::Context::getInstance()->addFunction(types::Function::createFunction(L""" + table(:,1) + """, &" + names(:) + ", MODULE_NAME)); }";
85         "";
86         "    return 1;";
87         "}"];
88
89         gateway_filename(1) = path + tname + ".cpp";
90         // first check if we have already a gateway
91         [fd, ierr] = mopen(gateway_filename(1), "rt");
92         if ierr == 0 then
93             // file already exists
94             t1 = mgetl(fd);
95             mclose(fd);
96             if or(t1 <> t) then
97                 mputl(t, gateway_filename(1));
98             end
99         else
100             // file does not exist we create it
101             mputl(t, gateway_filename(1)) ;
102         end
103
104         if ilib_verbose() > 1 then
105             disp(t);
106         end
107
108         //prepare .hxx file
109         TNAME = convstr(tname, "u");
110         t = [
111         "#ifndef __" + TNAME + "_GW_HXX__";
112         "#define __" + TNAME + "_GW_HXX__";
113         "";
114         "#include ""c_gateway_prototype.h""";
115         "#include ""cpp_gateway_prototype.hxx""";
116         "";
117         "#ifdef _MSC_VER";
118         "#ifdef " + TNAME + "_GW_EXPORTS";
119         "#define " + TNAME + "_GW_IMPEXP __declspec(dllexport)";
120         "#else";
121         "#define " + TNAME + "_GW_IMPEXP __declspec(dllimport)";
122         "#endif";
123         "#else";
124         "#define " + TNAME + "_GW_IMPEXP";
125         "#endif";
126         "";
127         "extern ""C"" " + TNAME + "_GW_IMPEXP int " + tname + "(wchar_t* _pwstFuncName);";
128         "";
129         gate(:, 2);
130         "";
131         "#endif /* __" + TNAME + "_GW_HXX__ */"];
132
133         gateway_filename(2) = path + tname + ".hxx";
134         // first check if we have already a gateway
135         [fd, ierr] = mopen(gateway_filename(2), "rt");
136         if ierr == 0 then
137             // file already exists
138             t1 = mgetl(fd);
139             mclose(fd);
140             if or(t1 <> t) then
141                 mputl(t, gateway_filename(2));
142             end
143         else
144             // file does not exist we create it
145             mputl(t, gateway_filename(2)) ;
146         end
147
148         //prepare .h file
149         TNAME = convstr(tname, "u");
150         t = [
151         "#ifndef __" + TNAME + "_GW_H__";
152         "#define __" + TNAME + "_GW_H__";
153         "";
154         "#include ""c_gateway_prototype.h""";
155         "";
156         gate(:, 1);
157         "";
158         "#endif /* __" + TNAME + "_GW_H__ */"];
159
160         gateway_filename(3) = path + tname + ".h";
161         // first check if we have already a gateway
162         [fd, ierr] = mopen(gateway_filename(3), "rt");
163         if ierr == 0 then
164             // file already exists
165             t1 = mgetl(fd);
166             mclose(fd);
167             if or(t1 <> t) then
168                 mputl(t, gateway_filename(3));
169             end
170         else
171             // file does not exist we create it
172             mputl(t, gateway_filename(3)) ;
173         end
174
175         if ilib_verbose() > 1 then
176             disp(t);
177         end
178     end
179 endfunction
180 //=============================================================================
181 // new_names only used by ilib_gen_gateway
182 //=============================================================================
183 function [gate,names] = new_names(table)
184     // change names according to types
185     [mt,nt] = size(table);
186     gate = [""];
187     gate = gate(ones(mt, 2));
188     names = " ";
189     names = names(ones(mt,1));
190     for i = 1:mt
191         select table(i,3)
192         case "cmex" then
193             names(i) = "mex_" + table(i,2);
194             gate(i, 1) = "C_GATEWAY_PROTOTYPE(" + names(i) + ");";
195         case "fmex" then
196             names(i) = "C2F(mex" + table(i,2) + ")";
197             gate(i, 1) = "C_GATEWAY_PROTOTYPE(" + names(i) + ");";
198         case "Fmex" then
199             names(i) = "C2F(mex" + table(i,2) + ")";
200             gate(i, 1) = "C_GATEWAY_PROTOTYPE(" + names(i) + ");";
201         case "csci"  then
202             names(i) = table(i,2);
203             gate(i, 1) = "C_GATEWAY_PROTOTYPE(" + names(i) + ");";
204         case "fsci"  then
205             names(i) = "C2F(" + table(i,2) + ")";
206             gate(i, 1) = "C_GATEWAY_PROTOTYPE(" + names(i) + ");";
207         case "cppsci"  then
208             names(i) = table(i,2);
209             gate(i, 2) = "CPP_GATEWAY_PROTOTYPE(" + names(i) + ");";
210         case "direct"  then
211             names(i) = table(i,2);
212             gate(i, 1) = "C_GATEWAY_PROTOTYPE(" + names(i) + ");";
213         else
214             error(999,"Wrong interface type " + table(i,3));
215         end
216     end
217 endfunction
218 //=============================================================================