Add "load" function
[scilab.git] / scilab / modules / atoms / macros / atomsLoad.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) 2009 - DIGITEO - Pierre MARECHAL <pierre.marechal@scilab.org>
3 //
4 // This file must be used under the terms of the CeCILL.
5 // This source file is licensed as described in the file COPYING, which
6 // you should have received as part of this distribution.  The terms
7 // are also available at
8 // http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
9
10 // Load one or several toolboxes
11
12 function result = atomsLoad(name,version)
13         
14         // Init the output argument
15         // =========================================================================
16         result = [];
17         
18         // Check number of input arguments
19         // =========================================================================
20         rhs = argn(2);
21         if rhs <> 2 then
22                 error(msprintf(gettext("%s: Wrong number of input argument: %d expected.\n"),"atomsLoad",2));
23         end
24         
25         // Check input parameters type
26         // =========================================================================
27         
28         if type(name) <> 10 then
29                 error(msprintf(gettext("%s: Wrong type for input argument #%d: String array expected.\n"),"atomsLoad",1));
30         end
31         
32         if type(version) <> 10 then
33                 error(msprintf(gettext("%s: Wrong type for input argument #%d: String array expected.\n"),"atomsLoad",2));
34         end
35         
36         // name and version must have the same size
37         // =========================================================================
38         
39         if or( size(name) <> size(version) ) then
40                 error(msprintf(gettext("%s: Incompatible input arguments #%d and #%d: Same sizes expected.\n"),"atomsLoad",1,2));
41         end
42         
43         // Check if the packages to load are installed
44         // =========================================================================
45         
46         if or( ~ atomsIsInstalled(name,version) ) then
47                 for i=1:size(name,"*")
48                         if ~atomsIsInstalled(name(i),version(i)) then
49                                 error(msprintf(gettext("%s: the package ''%s - %s'' is not installed.\n"),"atomsLoad",name(i),version(i)));
50                         end
51                 end
52         end
53         
54         // Get path of the toolboxes
55         // =========================================================================
56         path = atomsGetInstalledPath(name,version);
57         
58         // Create the TMPDIR/atoms directory
59         // =========================================================================
60         if ~ isdir(TMPDIR+"/atoms") then
61                 status = mkdir( TMPDIR+"/atoms" );
62                 if status <> 1 then
63                         error(msprintf( ..
64                                 gettext("%s: The directory ""%s"" cannot been created, please check if you have write access on this directory.\n"), ..
65                                 "atomsLoad", ..
66                                 TMPDIR+"/atoms"));
67                 end
68         end
69         
70         // Define the path of the loaded file
71         // =========================================================================
72         loaded_file = pathconvert(TMPDIR+"/atoms/loaded",%F);
73         
74         // Does the loaded file exist, if yes load it
75         // =========================================================================
76         nbAdd = 0;
77         if fileinfo(loaded_file) <> [] then
78                 loaded = mgetl(loaded_file);
79         else
80                 loaded = [];
81         end
82         
83         // Libraries to resume
84         // =========================================================================
85         libs_resume = [];
86         
87         // Loop on packages
88         // =========================================================================
89         
90         for i=1:size(name,"*")
91                 
92                 // Get the list of lib
93                 // =====================================================================
94                 libs_before = librarieslist();
95                 
96                 // Exec the loader
97                 // =====================================================================
98                 
99                 loader_file = pathconvert(path(i)) + "loader.sce";
100                 
101                 if fileinfo(loader_file)==[] then
102                         error(msprintf(gettext("%s: The file ''%s'' doesn''t exist or is not read accessible.\n"),"atomsLoad",loader_file));
103                 end
104                 
105                 exec( loader_file );
106                 
107                 // Get the list of lib
108                 // =====================================================================
109                 libs_after = librarieslist();
110                 
111                 // Loop on libs_after
112                 // =====================================================================
113                 for j=1:size(libs_after,"*")
114                         
115                         if find(libs_after(j) == libs_before) == [] then
116                                 libs_resume = [ libs_resume ; libs_after(j) ];
117                         end
118                 end
119                 
120                 // Fill the output argument
121                 // =====================================================================
122                 result = [ result ; name(i) version(i) path(i) ];
123                 
124                 // fill the loaded matrix
125                 // =====================================================================
126                 if find(loaded == name(i)+" - "+version(i)) == [] then
127                         nbAdd  = nbAdd + 1;
128                         loaded = [ loaded ; name(i)+" - "+version(i) ];
129                 end
130                 
131         end
132         
133         // Apply changes
134         // =========================================================================
135         if nbAdd > 0 then
136                 mputl(loaded,loaded_file);
137         end
138         
139         // If libs_resume is empty, the job is done
140         // =========================================================================
141         if isempty(libs_resume) then
142                 return;
143         end
144         
145         // Build the resume cmd
146         // =========================================================================
147         
148         resume_cmd = "[";
149         
150         for i=1:size(libs_resume,"*")
151                 resume_cmd = resume_cmd + libs_resume(i);
152                 if i<size(libs_resume,"*") then
153                         resume_cmd = resume_cmd + ",";
154                 else
155                         resume_cmd = resume_cmd + "] = resume(";
156                 end
157         end
158         
159         for i=1:size(libs_resume,"*")
160                 resume_cmd = resume_cmd + libs_resume(i);
161                 if i<size(libs_resume,"*") then
162                         resume_cmd = resume_cmd + ",";
163                 else
164                         resume_cmd = resume_cmd + ");";
165                 end
166         end
167         
168         // Exec the resume cmd
169         // =========================================================================
170         execstr(resume_cmd,"errcatch");
171         
172 endfunction