Remove references to MALLOC.lib + old useless Makefile.in
[scilab.git] / scilab / modules / dynamic_link / macros / ilib_gen_loader.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) INRIA/ENPC
3 // Copyright (C) DIGITEO - 2009-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-en.txt
10 //=============================================================================
11 function ilib_gen_loader(varargin)
12   // varargin (max) name, tables, libs, libname, flag, loadername
13   [lhs, rhs] = argn(0);
14
15   if and(rhs <> [2 3 6]) then
16     error(msprintf(_("%s: Wrong number of input argument(s): %d,%d or %d expected.\n"), "ilib_gen_loader", 2, 3, 6));
17   end
18
19   name = varargin(1);
20   tables = varargin(2);
21
22   if rhs > 2 then
23     libs = varargin(3);
24   else
25     libs = [];
26   end
27
28   if rhs > 3 then
29     libname = varargin(4);
30   else
31     libname = '';
32   end
33
34   if rhs > 4 then
35     flag = varargin(5);
36   else
37     flag = '';
38   end
39
40   if rhs > 5 then
41     loadername = varargin(6);
42     if isempty(loadername) then
43       loadername = 'loader.sce';
44     end
45   else
46     loadername = 'loader.sce';
47   end
48
49   if type(name) <> 10 then
50     error(999, msprintf(_("%s: Wrong type for input argument #%d: A string expected.\n"), 'ilib_gen_loader', 1));
51   end
52
53   if tables <> [] then
54     if type(tables) <> 10 then
55       error(999, msprintf(_("%s: Wrong type for input argument #%d: String matrix expected.\n"), 'ilib_gen_loader', 2));
56     end
57   else
58     backupTables = tables;
59     if ( typeof(tables) <> 'list') then
60       tables = list(tables);
61     end
62     L = length(tables);
63     for it = 1:L
64       [mt, nt] = size(tables(it));
65
66       if ((mt == 0) & (nt == 0)) then
67         break;
68       end
69
70       if ( (nt <> 3) & ( nt <> 2) ) then
71         error(msprintf(gettext("%s: Wrong size for input argument #%d.\n"),"ilib_gen_loader", 2));
72       end
73     end
74     tables = backupTables;
75   end
76
77   if libs <> [] & type(libs) <> 10 then
78     error(999, msprintf(_("%s: Wrong type for input argument #%d: String matrix expected.\n"), 'ilib_gen_loader', 3));
79   end
80
81   if type(libname) <> 10 then
82     error(999, msprintf(_("%s: Wrong type for input argument #%d: A string expected.\n"), 'ilib_gen_loader', 4));
83   end
84
85   if size(libname,'*') <> 1 then
86     error(999, msprintf(_("%s: Wrong size for input argument #%d: A string expected.\n"), 'ilib_gen_loader', 4));
87   end
88
89   if type(flag) <> 10 then
90     error(999, msprintf(_("%s: Wrong type for input argument #%d: A string expected.\n"), 'ilib_gen_loader', 5));
91   end
92
93   if size(flag,'*') <> 1 then
94     error(999, msprintf(_("%s: Wrong size for input argument #%d: A string expected.\n"), 'ilib_gen_loader', 5));
95   end
96
97   if type(loadername) <> 10 then
98     error(999, msprintf(_("%s: Wrong type for input argument #%d: A string expected.\n"), 'ilib_gen_loader', 6));
99   end
100
101   if size(loadername,'*') <> 1 then
102     error(999, msprintf(_("%s: Wrong size for input argument #%d: A string expected.\n"), 'ilib_gen_loader', 6));
103   end
104
105   if libname == '' then
106     libname = name(1);
107   end
108
109   generateLoader(name, tables, libs, libname, flag, loadername);
110
111 endfunction
112 //=============================================================================
113 function bOK = generateLoader(name, tables, libs, libname, flag, loadername)
114   bOK = %F;
115
116   if ( length(libname) + length("_path") ) > 24 then
117     shortlibname_path = part(libname,1:(24 - length("_path")));
118   else
119    shortlibname_path = libname;
120   end
121
122   [fd, err] = mopen(loadername, "wt");
123   if err <> 0 then
124     warning(msprintf(_("%s: Cannot open file %s.\n"), "mopen", loadername));
125     bOK = %F;
126     return
127   end
128
129   mfprintf(fd, "// This file is released under the 3-clause BSD license. See COPYING-BSD.\n");
130   mfprintf(fd, "// Generated by builder.sce : Please, do not edit this file\n");
131   mfprintf(fd, "// ----------------------------------------------------------------------------\n");
132   mfprintf(fd, "//\n");
133
134   // Bug 5737
135   if getos() == 'Windows' then
136     if win64() then
137       mfprintf(fd, "if ~win64() then\n");
138       mfprintf(fd, "  warning(_(""This module requires a Windows x64 platform.""));\n");
139     else
140       mfprintf(fd, "if win64() then\n");
141       mfprintf(fd, "  warning(_(""This module requires a Windows x86 platform.""));\n");
142     end
143     mfprintf(fd, "  return\n");
144     mfprintf(fd, "end\n");
145     mfprintf(fd, "//\n");
146   end
147
148   // remove path
149   filenamewithext = fileparts(loadername,'fname') + fileparts(loadername, 'extension');
150
151   mfprintf(fd, "%s_path = get_absolute_file_path(''%s'');\n", shortlibname_path, filenamewithext);
152   mfprintf(fd, "//\n");
153
154   // bug 4515 - unlink previous function with same name
155   name = name(:)';
156   n = size(name, '*');
157   mfprintf(fd, "// ulink previous function with same name\n");
158   for i = 1:n
159     mfprintf(fd, "[bOK, ilib] = c_link(''%s'');\n", name(i));
160     mfprintf(fd, "if bOK then\n");
161     mfprintf(fd, "  ulink(ilib);\n");
162     mfprintf(fd, "end\n");
163     mfprintf(fd, "//\n");
164   end
165
166   nl = size(libs ,'*');
167   for i = 1:nl
168     // Add the relative path only if the lib has a relative path
169     isabspath = is_absolute_path(libs(i));
170     libfile = libs(i);
171     if libfile <> '' then
172       if isabspath then
173         mfprintf(fd, "link(''%s'' + getdynlibext());\n", libfile);
174       else
175         mfprintf(fd, "link(%s_path + filesep() + ''%s'' + getdynlibext());\n", shortlibname_path, libfile);
176       end
177     end
178   end
179
180   if tables <> [] then
181     //
182     // addinter
183     //
184     if ( typeof(tables) <> 'list') then
185        tables = list(tables);
186     end
187     L = length(tables);
188     if L == 1 then
189       // direct call to addinter
190       table = tables(1);
191       mfprintf(fd, "list_functions = [ ");
192       withoutSpace = %T;
193       for x = table(1:$,1)'
194         if withoutSpace then
195           withoutSpace = %F;
196           mfprintf(fd, "''%s'';\n", x);
197         else
198           mfprintf(fd, "                   ''%s'';\n", x);
199         end
200       end
201       mfprintf(fd, "];\n");
202
203       mfprintf(fd, "addinter(%s_path + filesep() + ''%s'' + getdynlibext(), ''%s'', list_functions);\n", shortlibname_path, ..
204                 name, name);
205     else
206       // on link then a set of addinter
207       mfprintf(fd, "ilib = link(%s_path + filesep() + ''%s'' + getdynlibext());\n", shortlibname_path, ..
208                   name);
209       for itable =1 :L
210         // loop on a list of tables
211         table = tables(itable);
212
213         mfprintf(fd, "list_functions = [ ''%s'';\n", table(1,1));
214         for x = table(2:$, 1)'
215           mfprintf(fd, "                  ''%s'';\n", x);
216         end
217         mfprintf(fd, "];\n");
218
219         mfprintf(fd, "addinter(ilib, ''%s'', list_functions);\n", ..
220                   name + string(itable));
221       end
222     end
223
224   else
225     //
226     // link
227     //
228     mfprintf(fd,"link(%s_path + ''lib%s'' + getdynlibext(), [", shortlibname_path, libname);
229
230     for i = 1:n
231       mfprintf(fd, "''%s''", name(i));
232       if i <> n then
233         mfprintf(fd, ",");
234       else
235         mfprintf(fd, "],");
236       end
237     end
238     mfprintf(fd,"''%s'');\n",flag);
239   end
240
241   mfprintf(fd, "// remove temp. variables on stack\n");
242   mfprintf(fd,"clear %s_path;\n", shortlibname_path);
243   mfprintf(fd,"clear bOK;\n");
244   mfprintf(fd,"clear ilib;\n");
245
246   if tables <> [] then
247     mfprintf(fd, "clear list_functions;\n");
248   end
249
250   mfprintf(fd, "// ----------------------------------------------------------------------------\n");
251   mclose(fd);
252
253   if ilib_verbose() > 1 then
254     disp(mgetl(loadername));
255   end
256
257   bOK = %T;
258 endfunction
259 //=============================================================================