Merge remote-tracking branch 'origin/6.1'
[scilab.git] / scilab / modules / m2sci / macros / translatepaths.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) 2002-2004 - INRIA - Vincent COUVERT
3 // Copyright (C) ???? - INRIA - Serge STEER
4 // Copyright (C) 2012 - 2016 - Scilab Enterprises
5 // Copyright (C) 2018 - Samuel GOUGEON
6 //
7 // This file is hereby licensed under the terms of the GNU GPL v2.0,
8 // pursuant to article 5.3.4 of the CeCILL v.2.1.
9 // This file was originally licensed under the terms of the CeCILL v2.1,
10 // and continues to be available under such terms.
11 // For more information, see the COPYING file which you should have received
12 // along with this program.
13
14 function transorder = translatepaths(Paths, res_path)
15     // Perform translation of Matlab M-files to Scilab for all M-files found in Paths
16
17     // Output :
18     //  -transorder : a vector which contains the files names with a determinated order
19     // Input :
20     //  -Paths : a vector of strings (paths of Matlab M-files to translate)
21     //  -res_paths : a string (results path of translated files)
22
23     // M2SCI kernel functions called:
24     //  -lst_funcall
25     //  -translateorder
26     //  - mfile2sci
27
28     // Get default arguments
29
30     [lhs,rhs] = argn(0)
31     if rhs<2 then
32         res_path = "."
33     end
34     if rhs<1 then
35         m2sci_gui()
36         transorder = []
37         return
38     end
39
40     // Loads libraries related to m2sci
41     if exists("m2skernellib")==0 then load("SCI/modules/m2sci/macros/kernel/lib"),end
42     if exists("m2spercentlib")==0 then load("SCI/modules/m2sci/macros/percent/lib"),end
43     if exists("m2ssci_fileslib")==0 then load("SCI/modules/m2sci/macros/sci_files/lib"),end
44
45     // Convert paths so that they can be used according to the platform
46     shortTMPDIR = getshortpathname(pathconvert(TMPDIR));
47     sep = filesep();
48     Paths = getshortpathname(pathconvert(stripblanks(Paths)));
49     res_path = getshortpathname(pathconvert(stripblanks(res_path)));
50
51     // Create a logfile and a whatis file
52     File = shortTMPDIR + gettext("unitfile.dat")
53     [tempfd,ierr] = file("open", File, "old");
54
55     if ierr==0 then
56         load(pathconvert(TMPDIR)+gettext("unitfile.dat"))
57         file("close",whsfil_unit);
58         file("close",tempfd);
59         mdelete(pathconvert(TMPDIR)+gettext("unitfile.dat"))
60     end
61     whsfil_unit = file("open",res_path+"whatis","unknown")
62     save(pathconvert(TMPDIR)+gettext("unitfile.dat"),"whsfil_unit")
63
64     // Find names of files to translate
65     // mfiles is a vector which contains the names (and the paths) of files to translate
66     mfiles=[]
67     for path = Paths(:)'
68         mfiles = [mfiles; ls(path+"*.m")];
69     end
70
71     // fnamvect is a vector which contains all M-files names (just the names) found in Paths
72     // filefuncallname is a list of vectors. The first component of each vector is the name of a M-file (found in the Path(s)) to translate, followed by the called functions by this M-file)
73     fnamvect=[]
74     filefuncallname=list()
75     for k1=1:size(mfiles,1)
76         kk=strindex(mfiles(k1),sep)
77         fnamvect=[fnamvect;part(mfiles(k1),kk($)+1:length(mfiles(k1))-2)]
78     end
79
80     for k1=1:size(mfiles,1)
81         mpath=mfiles(k1)
82         //    disp(gettext("********************lst_funcall**********************"))
83         //   disp(mpath)
84         filefuncallname($+1)=lst_funcall(mpath,fnamvect)
85     end
86
87     // Determination of a translation order for the M-files found in the Paths
88     // transorder is a vector containing the M-files names which are arranged to order to respect an priority order of translation
89     transorder=[]
90     for i=1:size(filefuncallname)
91         execstr(filefuncallname(i)(1)+"vect=filefuncallname(i)")
92     end
93
94     overfunname=[]
95     for i=1:size(filefuncallname)
96         execstr("transorder=translateorder(transorder,"+filefuncallname(i)(1)+"vect,overfunname)")
97     end
98
99     // funpath is a vector which contains the M-files names (ands their paths) to translate
100     funpath=[]
101     for i=1:size(transorder,1)
102         ind=find(transorder(i)==fnamvect)
103         if ind<>[] then
104             funpath=[funpath;mfiles(ind)]
105         end
106     end
107
108     // Translation is done only if M-file has changed
109     logtxt=[]
110     resumelogtxt="";
111
112     for i=1:size(funpath,1)
113         kk=strindex(funpath(i),sep)
114         mpath=funpath(i)
115         fnam=part(funpath(i),kk($)+1:length(funpath(i))-2)
116         scipath=res_path+fnam+".sci"
117         scepath=res_path+fnam+".sce"
118
119         if newest(mpath,scipath,scepath)==1 then
120             [fd,ierr] = file("open", shortTMPDIR + fnam+".m", "old");
121             if ierr==0 & strindex(mpath,TMPDIR)==[] then
122                 mfile2sci(pathconvert(TMPDIR)+fnam+".m",res_path, %t, %t)
123                 file("close",fd)
124                 mdelete(pathconvert(TMPDIR)+fnam+".m")
125                 rmdir(pathconvert(TMPDIR)+pathconvert(fnam),"s")
126             else
127                 mfile2sci(funpath(i),res_path, %t, %t)
128             end
129
130             tmp_sci_file = shortTMPDIR + "tmp_" + fnam + ".sci"
131             ierr=execstr("exec(tmp_sci_file)","errcatch");errclear();
132             if ierr==0 & strindex(mpath,TMPDIR)==[] then
133                 txt=[]
134                 txt=mgetl(scipath)
135                 txt=[txt;" ";mgetl(tmp_sci_file)]
136                 mputl(txt,scipath);
137                 mdelete(tmp_sci_file)
138             end
139
140             // LOG
141             tmp_m2sci_file = shortTMPDIR + "tmp_m2sci_" + fnam + ".log"
142             m2scipath = res_path + "m2sci_" + fnam + ".log"
143             logtxt = [logtxt ; " " ; " " ; mgetl(m2scipath)]
144             mdelete(m2scipath)
145
146             [fd,ierr] = file("open",tmp_m2sci_file, "old");
147             if ierr==0 & strindex(mpath,TMPDIR)==[] then
148                 logtxt=[logtxt;" ";mgetl(tmp_m2sci_file)]
149                 file("close",fd)
150                 mdelete(tmp_m2sci_file)
151             end
152
153             // RESUMELOG
154             tmp_resume_m2sci_file = shortTMPDIR + "tmp_resume_m2sci_"+fnam+".log"
155             resumem2scipath=res_path+"resume_m2sci_"+fnam+".log"
156             if fileinfo(resumem2scipath)<>[] then
157                 resumelogtxt=[resumelogtxt;" ";" ";mgetl(resumem2scipath)]
158                 mdelete(resumem2scipath)
159             end
160
161             [fd,ierr]=file("open",tmp_resume_m2sci_file,"old");
162             if ierr==0 & strindex(mpath,TMPDIR)==[] then
163                 resumelogtxt=[resumelogtxt;" ";mgetl(tmp_resume_m2sci_file)]
164                 file("close",fd)
165                 mdelete(tmp_resume_m2sci_file)
166             end
167         end
168         if isempty(logtxt) then
169             logtxt = ""
170         end
171         mputl(logtxt,res_path+"log");
172         if isempty(resumelogtxt) then
173             resumelogtxt = ""
174         end
175         mputl(resumelogtxt,res_path+"resumelog");
176     end
177
178     // File closing
179     file("close",whsfil_unit);
180     mdelete(pathconvert(TMPDIR)+gettext("unitfile.dat"))
181
182     // create builder.sce and loader.sce files
183     // get the directory name where the Scilab functions are written
184     if or(res_path==["./" ".\"]) then
185         res_path = pathconvert(pwd());
186     end
187     namelib = basename(pathconvert(res_path, %f)) + "lib"
188
189     //builder.sce
190     buildertxt=[]
191     buildertxt($+1)="path=get_absolute_file_path(""builder.sce"")"
192     buildertxt($+1)="genlib("""+namelib+""",path)"
193     builderfile = res_path+"builder.sce"
194     mputl(buildertxt,builderfile);
195     //loader.sce
196     loadertxt=[]
197     loadertxt($+1)="path=get_absolute_file_path(""loader.sce"")"
198     loadertxt($+1)="load(path+"+"""lib"")"
199     loaderfile = res_path+"loader.sce"
200     mputl(loadertxt,loaderfile);
201
202 endfunction
203
204 // ---------------------------------------------------------------------------
205
206 function  [transorder]=translateorder(transorder,funtxt,overfunname)
207     // PRIVATE UTILITY FUNCTION called only by translatepath() and itself (recursive)
208     //
209     //  TRANSLATEORDER Recursive function
210     //  Determinates a translate order of the M-files found in Paths (used by "translatepaths" function)
211     //  Output-Input
212     //  -transorder : a vector containing the M-files names which are arranged in order to respect an priority order of translation
213     //  Input
214     //  -funtxt : a vector which contains the name of a M-file found in the Paths (its first component: funtxt(1)), and the called functions by this file (the others components : funtxt(2:$))
215     //  -overfunname : a vector which contains the files names being passed like argument of     "translateorder" function
216
217     // the file is already in the list
218     if or(transorder==funtxt(1)) then
219         return
220     end
221
222     if size(funtxt,"*")>1 then
223         for i=2:size(funtxt,1)
224             // the called function is already in the list
225             if find(funtxt(i)==transorder)<>[] then
226                 continue
227                 // the called function is already passed in argument of "translateorder" function (a loop)
228             elseif find(funtxt(i)==overfunname)<>[] then
229                 disp([overfunname;funtxt(i)],"loop: ")
230                 //return
231                 continue
232                 // order the under level, also we call translateorder (recursive)
233             else
234                 overfunname($+1)=funtxt(1)
235                 execstr("[transorder]=translateorder(transorder,"+funtxt(i)+"vect,overfunname)")
236             end
237         end
238         transorder($+1)=funtxt(1)
239     else
240         // no called function by the M-file, also we put the M-file name in the transorder vector
241         transorder($+1)=funtxt(1)
242     end
243
244 endfunction