add missing lib in windows installation since hdf5 update
[scilab.git] / scilab / modules / functions / macros / genlib.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) INRIA
3 // Copyright (C) ENPC
4 // Copyright (C) DIGITEO - 2012 - Allan CORNET
5 //
6 // This file must be used under the terms of the CeCILL.
7 // This source file is licensed as described in the file COPYING, which
8 // you should have received as part of this distribution.  The terms
9 // are also available at
10 // http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
11
12 function [success, funcs, success_files, failed_files] = genlib(nam, path, force, verbose, names)
13
14 // get all .sci files in the specified directory
15
16   if type(nam) <> 10 then
17     error(999, msprintf(_("%s: Wrong type for input argument #%d: A string expected.\n"), 'genlib', 1));
18   end
19
20   if size(nam, '*') <> 1 then
21     error(999, msprintf(_("%s: Wrong size for input argument #%d: A string expected.\n"), 'genlib', 1));
22   end
23
24   if exists('force', 'local') == 0 then
25     force = %f;
26   else
27     if type(force) <> 4 then
28       error(999, msprintf(_("%s: Wrong type for input argument #%d: A boolean expected.\n"), 'genlib', 3));
29     end
30
31     if size(force, '*') <> 1 then
32       error(999, msprintf(_("%s: Wrong size for input argument #%d: A boolean expected.\n"), 'genlib', 3));
33     end
34   end
35
36   if exists('verbose', 'local') == 0 then
37     verbose = %f;
38   else
39     if type(verbose) <> 4 then
40       error(999, msprintf(_("%s: Wrong type for input argument #%d: A boolean expected.\n"), 'genlib', 4));
41     end
42
43     if size(verbose, '*') <> 1 then
44       error(999, msprintf(_("%s: Wrong size for input argument #%d: A boolean expected.\n"), 'genlib', 4));
45     end
46   end
47
48   W          = who('get');
49   np         = predef();
50   predefined = or(W($-np+1:$) == nam);
51
52   success       = %t;
53   funcs         = [];
54   success_files = [];
55   failed_files  = [];
56
57   if verbose then
58     mprintf(gettext("-- Creation of [%s] (Macros) --\n"), nam);
59   end
60
61   updatelib = %f; //true if updating an already defined library
62
63   //check if a library with the same name exists
64
65   oldlib    = [];
66   old_path  = [];
67   old_names = [];
68
69   if exists(nam)==1 then
70     execstr('oldlib='+nam);
71     if typeof(oldlib)=='library' then
72       //yes, get its path and function list
73       old_names = string(oldlib);
74       clear oldlib;
75       old_path     = old_names(1);
76       old_names(1) = [];
77     end
78   end
79
80   if (exists('path', 'local') == 0) then
81     if (old_path <> []) then
82       path = old_path;
83       updatelib = %t;
84     else
85       path = pwd();
86     end
87   else
88     if type(path) <> 10 then
89       error(999, msprintf(_("%s: Wrong type for input argument #%d: A string expected.\n"), 'genlib', 2));
90     end
91
92     if size(path, '*') <> 1 then
93       error(999, msprintf(_("%s: Wrong size for input argument #%d: A string expected.\n"), 'genlib', 2));
94     end
95   end
96
97   // convert path according to getos() == 'Windows' flag
98   // without env variable substitution
99
100   path1 = pathconvert(path, %t, %f);
101   // with env subsitution
102   path = pathconvert(path, %t, %t);
103
104   if exists('names', 'local')==0 then
105     // list the sci files
106     files          = gsort(listfiles(path+"*.sci",%f), "r", "i");
107     files_filtered = [];
108
109     for i=1:size(files,"*")
110       if( regexp(files(i),"/\.sci$/") <> [] ) then
111         files_filtered = [files_filtered;files(i)];
112       end
113     end
114
115     files = files_filtered;
116     clear files_filtered;
117
118     if files==[] | files== "" then
119       warning(msprintf(gettext("%s: No files with extension %s found in %s\n"),"genlib",".sci", path));
120       return ;
121     end
122
123     names = basename(files,%f);
124
125   else
126     if type(names) <> 10 then
127       error(999, msprintf(_("%s: Wrong type for input argument #%d:  A matrix of string expected.\n"), 'genlib', 5));
128     end
129
130     files = path + names;
131     names = strsubst(names, "/\.sci$/", "", "r");
132   end
133
134   names_changed = %t;
135
136   if updatelib then
137     if and(gsort(names)==gsort(old_names)) then names_changed=%f,end
138   end
139
140   modified = %f;
141
142   if force == %t then
143     modified = %t;
144     for i=1:size(files,'*')  // loop on .sci files
145       scif = files(i);
146       if verbose then
147         mprintf(gettext("%s: %s file compilation forced\n"),"genlib",names(i)+".sci");
148       end
149       // getf sci file and save functions it defines as a .bin file
150       getsave(scif);
151     end
152   else
153     for i=1:size(files,'*')  // loop on .sci files
154       scif      = files(i);
155       binf      = strsubst(scif, "/\.sci$/",".bin","r");
156       binf_info = fileinfo(binf);
157       recompile = %f;
158
159       if binf_info == [] then
160         recompile = %t;
161       else
162         scif_info = fileinfo(scif);
163         if newest(scif,binf) == 1 then
164           recompile = %t ;
165         end
166       end
167
168       if recompile == %t then
169
170         if verbose then
171           mprintf(gettext("%s: Processing file: %s\n"), "genlib", names(i) + ".sci");
172         end
173
174         // getf sci file and save functions it defines as a .bin file
175         result = getsave(scif);
176         modified = %t;
177         if result <> [] then
178           success_files($+1) = scif
179           funcs = [funcs result]
180         else
181           failed_files($+1) = scif
182           success = %f
183         end
184       end
185     end
186   end
187
188   if modified then
189
190     if verbose then
191       mprintf(gettext("%s: Regenerate names and lib\n"),"genlib");
192     end
193
194     if names_changed
195       mputl(names,path+'names'); // write 'names' file in directory
196     end
197
198     // create library
199     execstr(nam+'=lib('''+getshortpathname(path1)+''')')
200     //save it
201
202     warnMode = warning("query");
203     warning("off");
204     if execstr('save('''+path1+'lib'''+','+nam+')','errcatch')<>0 then
205       success = %f;
206       warning(warnMode);
207       error(msprintf(gettext("%s: %s file cannot be created\n"),"genlib",path+'lib'));
208     end
209     warning(warnMode);
210   else
211     execstr(nam+'=lib('''+path1+''')')
212   end
213
214   if names_changed then
215     if ~predefined then
216       execstr(nam+'=resume('+nam+')')
217     else
218       mprintf(gettext("Library file %s has been updated,\nbut cannot be loaded into Scilab because %s is a protected variable.\n"),path1+'lib',nam);
219     end
220   end
221
222 endfunction
223
224 function result = getsave(scifile)
225
226   // utility function
227   // performs a exec on file scifile
228
229   result = %f;
230   prot   = funcprot();
231   nold   = size(who("get"),"*");
232
233   funcprot(0);
234
235   ierr=execstr("exec(scifile);","errcatch") // get functions defined in file 'scifile'
236
237   if ierr <> 0 then
238     clear ierr;
239     mprintf(gettext("%s: Warning: Error in file %s : %s. File ignored\n"),"genlib",scifile,lasterror());
240     result = %f;
241
242   else
243
244     clear ierr;
245
246     // lookfor names of the functions defined in file 'scifile'
247     new = who("get")
248     new = new(1:(size(new,"*")-nold-1))
249
250     // create output file name (just replace the ".sci" extension by ".bin"
251     binfile = strsubst(scifile,"/\.sci$/",".bin",'r')
252
253     // save all functions in the output file
254     [u,ierr]=mopen(binfile,"wb")
255     if ierr<>0 then
256       clear ierr;
257       nf = length(binfile);
258       if nf>40 then
259         binfile="..."+part(binfile,nf-40:nf);
260       end
261       error(msprintf(gettext("%s: Impossible to open file %s for writing\n"),"genlib",binfile));
262     end
263
264     clear ierr
265
266     if new<>[] then
267       result = new($:-1:1)';
268       warnMode = warning("query");
269       warning("off");
270       execstr('save(u,'+strcat(new($:-1:1),',')+')');
271       warning(warnMode);
272     else
273       msprintf(gettext("%s: File %s does not contain any function.\n"),"genlib",binfile)
274       result = %f;
275     end
276
277     mclose(u);
278   end
279
280   funcprot(prot);
281
282 endfunction