4a5dbbe0215db44f91d1a8451a9374ad6aeb8fd4
[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 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         prototype = "(char* fname, int* _piKey);";
67         addGWFunction = "addGatewayInContext";
68         if isdef("ismex") & ismex == %t then
69             prototype = "(int nlhs, int* plhs[], int nrhs, int* prhs[]);";
70             addGWFunction = "addMexGatewayInContext";
71         end
72
73
74         if ( nt <> 3 ) then
75             error(msprintf(gettext("%s: Wrong size for input argument #%d: %d expected.\n"),"ilib_gen_gateway",2,3));
76         end
77         [gate,names] = new_names(table);
78         t = [
79         "#ifdef __cpluplus";
80         "extern ""C"" {"
81         "#endif"
82         "#include <wchar.h> ";
83         "#include ""mex.h"" ";
84         "#include ""sci_gateway.h""";
85         "#include ""api_scilab.h""";
86         "#include ""MALLOC.h""";
87         "#include ""addGatewayInContext.h""";
88         "";
89         "#define MODULE_NAME L""" + tname + """";
90         "";
91         "extern int " + names(:) + prototype;
92         "";
93         "int " + tname + "(wchar_t* _pwstName)";
94         "{";
95         "   if(wcscmp(_pwstName, L""" + table(:,1) + """) == 0){" + addGWFunction + "(L""" + table(:,1) + """, &" + names(:) + ", MODULE_NAME);}";
96         "}";
97         "#ifdef __cplusplus";
98         "}";
99         "#endif"];
100
101         gateway_filename = path + tname + ".c";
102         // first check if we have already a gateway
103         [fd, ierr] = mopen(gateway_filename, "rt");
104         if ierr == 0 then
105             // file already exists
106             t1 = mgetl(fd);
107             mclose(fd);
108             if or(t1 <> t) then
109                 mputl(t, gateway_filename);
110             end
111         else
112             // file does not exist we create it
113             mputl(t, gateway_filename) ;
114         end
115
116         if ilib_verbose() > 1 then
117             disp(t);
118         end
119     end
120 endfunction
121 //=============================================================================
122 // new_names only used by ilib_gen_gateway
123 //=============================================================================
124 function [gate,names] = new_names(table)
125     // change names according to types
126     [mt,nt] = size(table);
127     gate = "mex_gateway";
128     gate = gate(ones(mt,1));
129     names = " ";
130     names = names(ones(mt,1));
131     for i = 1:mt
132         select table(i,3)
133         case "cmex" then
134             names(i) = "mex_" + table(i,2) ;
135         case "fmex" then
136             gate(i) = "(Myinterfun)fortran_mex_gateway" ;
137             names(i) = "C2F(mex" + table(i,2) + ")" ;
138         case "Fmex" then
139             gate(i) = "(Myinterfun)fortran_mex_gateway" ;
140             names(i) = "C2F(mex" + table(i,2) + ")" ;
141         case "csci"  then
142             if isdef("WITHOUT_AUTO_PUTLHSVAR") then
143                 if (WITHOUT_AUTO_PUTLHSVAR == %T) then
144                     gate(i) = "(Myinterfun)sci_gateway_without_putlhsvar" ;
145                 else
146                     gate(i) = "(Myinterfun)sci_gateway" ;
147                 end
148             else
149                 gate(i) = "(Myinterfun)sci_gateway" ;
150             end
151             names(i) = table(i,2) ;
152         case "fsci"  then
153             if isdef("WITHOUT_AUTO_PUTLHSVAR") then
154                 if (WITHOUT_AUTO_PUTLHSVAR == %T) then
155                     gate(i) = "(Myinterfun)sci_gateway_without_putlhsvar" ;
156                 else
157                     gate(i) = "(Myinterfun)sci_gateway" ;
158                 end
159             else
160                 gate(i) = "(Myinterfun)sci_gateway" ;
161             end
162             names(i) = "C2F(" + table(i,2) + ")" ;
163         case "direct"  then
164             gate(i) = "(Myinterfun)direct_gateway" ;
165             names(i) = "C2F(" + table(i,2) + ")" ;
166         else
167             error(999,"Wrong interface type " + table(i,3));
168         end
169     end
170 endfunction
171 //=============================================================================