Merge remote-tracking branch 'origin/6.1'
[scilab.git] / scilab / modules / m2sci / macros / mfile2sci.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 res = mfile2sci(fil, results_path, Recmode, only_double, verbose_mode, prettyprintoutput)
15     // This function performs translation of a single M-file
16     // - fil: file name
17     // - results_path: path to write translated file in (default value is fil path)
18     // - Recmode: recursive mode (default value is false)
19
20     // Get default arguments
21     [lhs,rhs] = argn(0)
22     if ~isdef("prettyprintoutput","l"), prettyprintoutput = %F, end
23     if ~isdef("verbose_mode","l"),      verbose_mode = 3,       end
24     if ~isdef("only_double","l"),       only_double = %F,       end
25     if ~isdef("Recmode","l"),           Recmode = %F,           end
26     if ~isdef("results_path","l"),      results_path = ".",     end
27     if rhs<1 then
28         m2sci_gui();
29         res = [];
30         return
31     end
32     fil = strsubst(fil,filesep(),"/")
33     results_path = getshortpathname(pathconvert(results_path));
34     results_path = strsubst(results_path,"\","/")
35     res_path = results_path  // res_path: environment variable in some called functions
36
37     // Loads libraries related to m2sci
38     if exists("m2scikernellib")==0 then load("SCI/modules/m2sci/macros/kernel/lib"),end
39     if exists("m2scipercentlib")==0 then load("SCI/modules/m2sci/macros/percent/lib"),end
40     if exists("m2scisci_fileslib")==0 then load("SCI/modules/m2sci/macros/sci_files/lib"),end
41
42     if multi_fun_file(fil,results_path,Recmode,only_double,verbose_mode,prettyprintoutput) then
43         res = 1
44         return
45     end
46
47     // Get context
48     global("m2sci_infos")
49     global("mtlbref_fun")
50     global("mtlbtool_fun")
51     global("not_mtlb_fun")
52     [l,mac] = where()
53     Reclevel = size(find(mac=="mfile2sci"),"*")
54     tpcallpos = min(find(mac=="translatepaths"));
55     guicallpos = min(find(mac=="m2sci_gui"));
56     if size(find(mac=="m2sci_gui"),"*")==1 & tpcallpos<guicallpos then // Bug 679
57         Reclevel = Reclevel-1
58     end
59     if size(find(mac=="multi_fun_file"),"*")==1 then
60         Reclevel = Reclevel-1
61     end
62
63     if Reclevel==1 then
64         nametbl = []
65     else
66         m2sci_infos_save = m2sci_infos
67     end
68     m2sci_infos = [%f %f]
69
70     margin = part(" ",ones(1,3*(Reclevel-1)))
71     margin = "  "
72     rec = gettext("OFF");
73     dble = gettext("NO");
74     pretty = gettext("NO");
75     if prettyprintoutput then pretty = gettext("YES");end
76     if Recmode then rec = gettext("ON");end
77     if only_double then dble = gettext("YES");end
78
79     res = []
80
81     // Handle file path
82     // File name
83     k = strindex(fil,".")
84     if k<>[]
85         ke = k($)-1
86         base_name = part(fil,1:ke)
87     else
88         ke = length(fil)
89         base_name = fil
90     end
91     // File path
92     k = strindex(fil,"/")
93     if k==[] then
94         file_path = "./"
95     else
96         file_path = part(fil,1:k($))
97     end
98     // Others M-files in directory
99     if exists("Paths")==0 then
100         Paths = file_path,
101         if getos() == "Windows" then
102             Paths = strsubst(Paths,"/","\")
103             mfiles = listfiles(Paths+"*.m")
104             sep = filesep()
105         else
106             mfiles = listfiles(Paths+"*.m")
107             sep = filesep()
108         end
109     end
110
111     // Function name
112     if k~=[] then
113         fnam = part(base_name,k($)+1:ke) // File name without extension
114     else
115         fnam = base_name
116     end
117
118     // logfile initialisation
119     if exists("logfile")==0 then
120         File = getshortpathname(pathconvert(TMPDIR))+"logfile.dat"
121         [tempfd1,ierr1] = file("open",File,"old")
122         if ierr1==0 then
123             load(File)
124             file("close",tempfd1)
125             file("close",logfile)
126             mdelete(File)
127         end
128         logfile = file("open",results_path+"m2sci_"+fnam+".log","unknown")
129         save(File, "logfile")
130     end
131
132     // Output beginning message
133     mss = [gettext("****** Beginning of mfile2sci() session ******");
134     gettext("File to convert:")+" "+fil;
135     gettext("Result file path:")+" "+results_path;
136     gettext("Recursive mode:")+" "+rec;
137     gettext("Only double values used in M-file:")+" "+dble;
138     gettext("Verbose mode:")+" "+string(verbose_mode);
139     gettext("Generate formatted code:")+" "+pretty]
140     m2sci_info(mss,-1);
141
142     // Read in the file as text
143     m2sci_info(gettext("M-file reading..."),-1);
144     txt = mgetl(fil);
145     m2sci_info(gettext("M-file reading: Done"),-1);
146
147     //Replace TAB by SPACE
148     txt = strsubst(txt, ascii(9), "");
149
150     if txt==[] then
151         m2sci_infos(msprintf(gettext("File %s is an empty file.\n"),fil),-1);
152         return
153     end
154     tmptxt = txt
155
156     // Setting octave_mode
157     // -------------------
158     if ~isdef("octave","l") then
159         if ~isdef("octave_mode")
160             octave_mode = %F    // To replace with an optional argin
161         else
162             octave_mode = octave_mode
163         end
164     else
165         octave_mode = octave
166     end
167
168
169     // Make changes on syntax, to make the file scilab-compilable
170     // ==========================================================
171     m2sci_info(gettext("Syntax modification..."),-1);
172     ierr = execstr("load(''"+pathconvert(TMPDIR)+fnam+ ".tree'',''txt'',''helppart'',''batch'')","errcatch","n")
173     if ierr<>0 | exists("txt")==0 | exists("batch")==0 & ..
174                  strindex(results_path,getshortpathname(TMPDIR))==[] then
175         [helppart, txt, batch] = m2sci_syntax(txt)
176     elseif ierr==0 & newest(fil,pathconvert(TMPDIR)+fnam+ ".tree")==1 then
177         [helppart, txt, batch] = m2sci_syntax(tmptxt)
178     end
179
180     m2sci_info(gettext("Syntax modification: Done"),-1);
181
182     // Write .cat file and update whatis
183     // ---------------------------------
184     if helppart<>[] then
185         catfil = results_path + fnam+".cat"
186         whsfil = results_path + "whatis"
187         mputl(helppart,catfil);
188         if exists("whsfil_unit")==1 then
189             write(whsfil_unit,stripblanks(helppart(1))+" |"+fnam,"(a)")
190         end
191     end
192
193     if txt~=[] then
194         quote = "''";
195         dquote = """";
196         kc = strindex(txt(1),"function");
197         kc = kc(1);
198
199         // Define Scilab function
200         fprot = funcprot();
201         funcprot(0);
202
203         // Blanks in file name are replaced by _ for batch
204         // kc+9 because 'function '
205         ksc = min(strindex(txt(1),";")) // searching for a comment on first line after function prototype
206         if isempty(ksc) then
207             ksc = length(txt(1))+1;
208             firstline = []
209         else
210             firstline = part(txt(1),ksc+1:length(txt(1)));
211         end
212
213         // Extraction of the macro's name
214         func_proto = part(txt(1),kc+9:ksc-1)
215         keq = min(strindex(func_proto,"="))
216         kpar = min(strindex(func_proto,"("))
217         if isempty(keq) then
218             keq = 1
219         end
220         if isempty(kpar) then
221             kpar = length(func_proto)+1
222         end
223
224         func_proto = part(func_proto,1:keq)+strsubst(stripblanks(part(func_proto,keq+1:kpar-1))," ","_")+part(func_proto,kpar:length(func_proto))
225
226         mname = getMacroNameFromPrototype(func_proto)
227         if mname=="" | mname==[]
228             msg = _("%s: ""%s"" does not exist or is not the macro name.\n");
229             error(msprintf(msg,"mfile2sci", mname))
230         end
231         w = mname;
232         nametbl = [nametbl;mname]
233         if fnam<>mname & ~batch then // warning is not displayed for a batch file
234             mss = msprintf(gettext("Warning: file %s defines function %s instead of %s\n         %s.sci, %s.cat and sci_%s.sci will be generated !"),fil,mname,fnam,mname,mname,mname);
235             m2sci_info(mss,-1);
236         end
237
238         txt($+1) = "endfunction"
239         // Compilation
240         txt = [part(txt(1),kc:ksc-1);firstline;txt(2:$)]
241         mputl(txt, TMPDIR+"/"+mname+".sci");
242         err = exec(TMPDIR+"/"+mname+".sci", "errcatch", -1);
243         if err~=0
244             // Maybe a final {end} closing {function} => try without it
245             txt($) = []   // removing "endfunction"
246             while size(txt,1)>0 & stripblanks(txt($))==""
247                 txt($) = []
248             end
249             if size(txt,1)>0 & stripblanks(txt($))=="end" then
250                 txt($) = []
251                 txt = [txt ; "endfunction"]
252                 mputl(txt, TMPDIR+"/"+mname+".sci");
253             end
254             exec(TMPDIR+"/"+mname+".sci", -1);
255         end
256         funcprot(fprot);
257         mdelete(TMPDIR+"/"+mname+".sci");
258
259         // Get Scilab pseudo code of the function
260         m2sci_info(gettext("Macro to tree conversion..."),-1);
261         macr = evstr(mname)
262         mtlbtree = macr2tree(macr);
263         if ~batch then
264             mtlbtree.name = mname;
265         else
266             mtlbtree.name = "";
267         end
268
269         //Transfom a equal instructions(if lhs are multi_operation insert and expression is a funcall) in the matlab tree to sup_equal instructions
270         global("tmpvarnb")
271         tmpvarnb = 0;
272         level = [0,0];
273         ninstr = 1;
274         while ninstr<=size(mtlbtree.statements)-3
275             mtlbtree.statements(ninstr) = transformtree(mtlbtree.statements(ninstr))
276             ninstr = ninstr+1
277         end
278
279         // Perform the translation
280         [scitree,trad,hdr,crp] = m2sci(mtlbtree,w(1),Recmode,prettyprintoutput)
281
282         //Creation of fname_resume.log file
283         // if mtlbref_fun<>[]|not_mtlb_fun<>[]|mtlbtool_fun<>[] then
284         //resume_logfile initialisation
285         if exists("resume_logfile")==0 then
286             File = getshortpathname(pathconvert(TMPDIR))+gettext("resumelogfile.dat")
287             [tempfd2,ierr2] = file("open",File,"old")
288             if ierr2==0 then
289                 load(pathconvert(TMPDIR)+gettext("resumelogfile.dat"))
290                 file("close", tempfd2)
291                 file("close", resume_logfile)
292                 mdelete(pathconvert(TMPDIR)+gettext("resumelogfile.dat"))
293             end
294             resume_logfile = results_path+gettext("resume")+"_m2sci_"+fnam+".log"
295             resume_logfile = file("open", resume_logfile, "unknown")
296             save(pathconvert(TMPDIR)+gettext("resumelogfile.dat"), "resume_logfile")
297         end
298
299         //number of matlab reference functions, matlab toolboxes functions, not matlab functions
300         size1=size(mtlbref_fun,1)
301         size2=size(mtlbtool_fun,1)
302         size3=size(not_mtlb_fun,1)
303
304         if size(mtlbref_fun,"*")<>0 then
305             mtlbref_fun(:,1) = """"+mtlbref_fun(:,1)+"""";
306             mtlbref_fun12 = mtlbref_fun(:,1) + mtlbref_fun(:,2);
307         else
308             mtlbref_fun12 = [];
309         end
310         if size(mtlbtool_fun,"*")<>0 then
311             mtlbtool_fun(:,1) = """"+mtlbtool_fun(:,1)+"""";
312             mtlbtool_fun12 = mtlbtool_fun(:,1) + mtlbtool_fun(:,2);
313         else
314             mtlbtool_fun12 = [];
315         end
316         if size(not_mtlb_fun,"*")<>0 then
317             not_mtlb_fun(:,1) = """"+not_mtlb_fun(:,1)+"""";
318             not_mtlb_fun12 = not_mtlb_fun(:,1) + not_mtlb_fun(:,2);
319         else
320             not_mtlb_fun12 = [];
321         end
322
323         info_resume = [msprintf(gettext("****** %s: Functions of mfile2sci() session ******"),fnam);
324         "*";
325         msprintf(gettext("%d Matlab Function(s) not yet converted, original calling sequence used:"),size1);
326         mtlbref_fun12;
327         "*";
328         msprintf(gettext("%d Matlab Toolbox(es) Functions, original calling sequence used :"),size2);
329         mtlbtool_fun12;
330         "*";
331         msprintf(gettext("%d Unknown Function(s), original calling sequence used :"),size3);
332         not_mtlb_fun12;
333         "*"]
334
335         write(resume_logfile,margin+info_resume)
336         file("close",resume_logfile)
337         mdelete(pathconvert(TMPDIR)+gettext("resumelogfile.dat"))
338         //end
339
340         m2sci_info(gettext("Macro to tree conversion: Done"),-1);
341
342         crp(1) = ""; // Delete function prototype
343         if isempty(firstline) then
344             res = [hdr;crp]
345         else
346             hdr(1) = hdr(1)+" "+crp(2);
347             crp(2) = [];
348             res = [hdr;crp];
349         end
350
351         // Strip last return and blank lines
352         n = size(res,1)
353         while res(n)==part(" ",1:length(res(n))) then
354             n = n-1
355         end
356         res = res(1:n)
357
358         // Write sci-file
359         ext = ".sci"
360         scifil = results_path + fnam + ext
361         mputl(res, scifil);
362
363         // Write sci_<mname>.sci translation file
364         if trad<>[] then
365             sci_fil = results_path + "sci_" + mname + ".sci"
366             mputl(trad,sci_fil);
367             res = 1
368         else
369             res = 0
370         end
371
372         // Output summary information
373         infos = []
374         if m2sci_infos(1) then
375             infos = gettext("Translation may be improved: see the //! comments and for all mtlb_<funname> function call\n  Type help mtlb_<funname> in Scilab command window to get information about improvements.");
376         end
377         if m2sci_infos(2) then
378             infos = [infos ; gettext("Translation may be wrong (see the //!! comments).")]
379         end
380
381         nametbl($) = []
382
383     else
384         infos = gettext("File contains no instruction, no translation made...");
385     end
386
387     // End of translation messages
388     mss = gettext("****** End of mfile2sci() session ******");
389
390     m2sci_info([infos;mss],-1);
391
392     if Reclevel>1 then
393         m2sci_infos = m2sci_infos_save
394     end
395
396     file("close", logfile)
397     clearglobal m2sci_infos  mtlbref_fun  mtlbtool_fun  not_mtlb_fun
398     clearglobal m2sci_Mtoolboxes_funs_db
399     
400     // For execution called by translatepaths()
401     //nametbl = resume(nametbl)
402     mdelete(pathconvert(TMPDIR)+fnam+ ".tree")
403     mdelete(pathconvert(TMPDIR)+"logfile.dat")
404
405 endfunction
406
407 // ---------------------------------------------------------------------------
408
409 function funcname = getMacroNameFromPrototype(proto)
410     // PRIVATE UTILITY FUNCTION called only by mfile2sci()
411     //
412     // Extraction of the macro's name
413     tmp = tokens(proto,["(" "=" ")"]);
414     if size(tmp,1)>1
415         [?,?,?,funcname] = regexp(proto, "/(?:.*?=(.*?)\(|(.*?)\(|[^(]+?=\s*([^(]+))/","o");
416         funcname = stripblanks(funcname);
417         funcname(funcname=="") = [];
418     else
419         funcname = proto;
420     end
421     // proto = "[b,hy] = fun2(bar=3)";
422     // proto = "fun3 (bar=3)";
423     // proto = "a = fun4 ()";
424     // proto = "fun5";
425     // proto = "a = fun6"; // from bug_2341 use case
426 endfunction
427
428 // ---------------------------------------------------------------------------
429
430 function instr = transformtree(instr)
431     // PRIVATE UTILITY FUNCTION called only by mfile2sci()
432     //
433     // Copyright (C) 2004-2006 - INRIA - Farid BELAHCENE
434     //
435     //TRANSFORMTREE function
436     //This function research and transform the equal instructions(if the lhs are a multi_operation and expression is a funcall)
437     //of the matlab tree to a sup_equal instructions
438     //sup_equal is a tlist : tlist([sup_equal,sup_instr,nb_op],sup_instr,nb_op)
439     //i.e : the equal instruction [a(1),b(2:3)] = f() is replaced by
440     //sup_equal, whith sup_intr list is composed to :
441     //[%v1,%v2] = f()
442     //a(1) = %v1
443     //b(2:3) = %v2
444     //and nb_op is: the number of insert operation (in this case 2)
445     //Input
446     //instr : instruction of matlab tree before tranformation
447     //Output
448     //instr : instruction of matlab tree after transformation
449
450     Unknown = -1;
451     // Browse all the instrucions of the matlab tree:
452     if typeof(instr)=="ifthenelse" then
453         for i = 1:size(instr.then)
454             instr.then(i) = transformtree((instr.then(i)))
455         end
456         for i = 1:size(instr.elseifs)
457             for k = 1:size(instr.elseifs(i).then)
458                 instr.elseifs(i).then(k) = transformtree((instr.elseifs(i).then(k)))
459             end
460         end
461         for i = 1:size(instr.else)
462         instr.else(i) = transformtree((instr.else(i)))
463         end
464     elseif typeof(instr)=="selectcase" then
465         for i = 1:size(instr.cases)
466             for j = 1:size(instr.cases(i).then)
467                 instr.cases(i).then(j) = transformtree((instr.cases(i).then(j)))
468             end
469         end
470         for i = 1:size(instr.else)
471         instr.else(i) = transformtree(instr.else(i))
472         end
473     elseif typeof(instr)=="while" then
474         for i = 1:size(instr.statements)
475             instr.statements(i) = transformtree(instr.statements(i))
476         end
477     elseif typeof(instr)=="for" then
478         for i = 1:size(instr.statements)
479             instr.statements(i) = transformtree(instr.statements(i))
480         end
481         //instruction is an equal instruction
482     elseif typeof(instr)=="equal" then
483         if typeof(instr.expression)=="funcall" then //expression is a funcall
484             nb_opr = 0;
485             for ind = 1:size(instr.lhs)
486                 if typeof(instr.lhs(ind))=="operation" then
487                     nb_opr = nb_opr+1
488                 end
489             end
490             if nb_opr>1 then //more than one lhs insert operation
491                 sup_instr = list("");
492                 lhstemp = list();
493                 for j = 1:size(instr.lhs)
494                     if typeof(instr.lhs(j))=="operation" then
495                         x = gettempvar();
496                         sup_instr($+1) = Equal(list(instr.lhs(j)),x);
497                         lhstemp(j) = x;
498                     else
499                         lhstemp(j) = instr.lhs(j)
500                     end
501                 end
502                 sup_instr(1) = Equal(lhstemp,instr.expression)
503                 //creation of the sup_equal
504                 instr = tlist(["sup_equal","sup_instr","nb_opr"],sup_instr,nb_opr)
505             end
506         end
507     end
508 endfunction
509
510 // ---------------------------------------------------------------------------
511
512 function bval = multi_fun_file(fil,res_path,Recmode,only_double,verbose_mode,prettyprintoutput)
513     // PRIVATE UTILITY FUNCTION called only by mfile2sci()
514     //
515     // This function converts M-Files containing more than one function
516     // Inputs are the same as mfile2sci()
517     // Outputs :
518     // - bval: boolean value, %t if file contains more than on function, %f else
519
520     sciparam();
521
522     // File name
523     k = strindex(fil,".")
524     if k<>[]
525         ke = k($)-1
526         base_name = part(fil,1:ke)
527     else
528         ke = length(fil)
529         base_name = fil
530     end
531     // File path
532     k = strindex(fil,"/")
533     if k==[] then
534         file_path = "./"
535     else
536         file_path = part(fil,1:k($))
537         base_name = part(base_name,k($)+1:ke)
538     end
539
540     txt = mgetl(fil);
541
542     kf = grep(txt,["function[","function "])
543
544     if isempty(kf) then
545         // Batch file
546         bval = %f
547     elseif size(kf,"*")==1 then
548         // Only one function defined
549         bval = %f
550     else
551         funcdecl = []
552         for kk = kf
553             ind = strindex(txt(kk),["function[";"function "])
554             if isacomment(txt(kk))==0 & ~isinstring(txt(kk),ind) & part(stripblanks(txt(kk),%T),1:8)=="function"  then // function prototype
555                 funcdecl = [funcdecl kk]
556             end
557         end
558
559         if isempty(funcdecl) then
560             // "function" only exists in comments and strings
561             bval = %f
562             return
563         elseif size(funcdecl,"*")==1 then
564             bval = %f
565             return
566         end
567
568         // Verify if the directory exists
569         dirnam = ls(pathconvert(TMPDIR)+base_name);
570
571         sep = filesep();
572
573         if or(dirnam<>"") then
574             rmdir(pathconvert(TMPDIR)+base_name,"s")
575         end
576         mkdir(pathconvert(TMPDIR),base_name)
577         write(%io(2),msprintf(gettext(" -- File %s contains more than one function -- "),fil));
578
579         bval= %t
580
581         // First split file into as many files as function declared
582         funcdecl = [funcdecl size(txt,"*")+1]
583
584         tmpfiles = []
585         for k = 1:size(funcdecl,"*")-1
586             functxt = txt(funcdecl(k):funcdecl(k+1)-1)
587             str=  strindex(txt(funcdecl(k)),"(")
588             if str==[] then
589                 funcname = stripblanks(part(txt(funcdecl(k)),strindex(txt(funcdecl(k)),["function[","function "])+8:length(txt(funcdecl(k)))))
590             else
591                 funcname = stripblanks(part(txt(funcdecl(k)),strindex(txt(funcdecl(k)),["function[","function "])+8:str(1)-1))
592             end
593
594             keq = strindex(funcname,"=")
595             if ~isempty(keq) then
596                 funcname = stripblanks(part(funcname,keq+1:length(funcname)))
597             end
598             tmpfiles = [tmpfiles;funcname]
599             mputl(functxt,pathconvert(TMPDIR)+base_name+sep+tmpfiles($)+".m");
600         end
601
602         write(%io(2),msprintf(gettext(" -- Each function converted separately: %s -- "),strcat(tmpfiles," ")));
603         write(%io(2),msprintf(gettext(" -- Temporary files put in: %s -- "),pathconvert(TMPDIR)));
604
605         // Conversion of each file
606
607         for k = 1:size(tmpfiles,"*")
608             txt = mgetl(pathconvert(TMPDIR)+base_name+sep+tmpfiles(k)+".m")
609             //mfile2sci(pathconvert(TMPDIR)+tmpfiles(k)+".m",res_path,Recmode,only_double,verbose_mode,prettyprintoutput)
610         end
611
612         translatepaths(pathconvert(TMPDIR)+base_name,pathconvert(TMPDIR)+base_name)
613
614         txt = []
615         if isfile(pathconvert(TMPDIR)+base_name+sep+"log") then
616             txt = mgetl(pathconvert(TMPDIR)+base_name+sep+"log")
617         end
618         mputl(txt,res_path+"log");
619         if isfile(pathconvert(TMPDIR)+base_name+sep+"resumelog") then
620             txt = mgetl(pathconvert(TMPDIR)+base_name+sep+"resumelog")
621         end
622         mputl(txt,res_path+"resumelog");
623
624         // Catenation of all .sci files to have only one output file
625         txt = []
626         for k = 1:size(tmpfiles,"*")
627             txt = [txt ;"";mgetl(pathconvert(TMPDIR)+base_name+sep+tmpfiles(k)+".sci")]
628         end
629
630         // Delete useless .sci files
631         //for k = 1:size(tmpfiles,"*")
632         //mdelete(res_path+tmpfiles(k)+".sci")
633         //end
634
635         mputl(txt,res_path+base_name+".sci");
636
637         // Catenation of all .log files to have only one output file
638         //if exists("logfile")==0 then
639         //txt = []
640         //for k = 1:size(tmpfiles,"*")
641         //txt = [txt ; mgetl(pathconvert(TMPDIR)+base_name+sep+"m2sci_"+tmpfiles(k)+".log")]
642         //end
643
644         // Delete useless .log files
645         //for k = 1:size(tmpfiles,"*")
646         //mdelete(pathconvert(TMPDIR)+base_name+sep+"m2sci_"+tmpfiles(k)+".log")
647         //end
648
649         //mputl(txt,res_path+"m2sci_"+base_name+".log");
650         //end
651
652         // Catenation of all resume.log files to have only one output file
653         //if exists("resume_logfile")==0 then
654         //txt = []
655         //for k = 1:size(tmpfiles,"*")
656         //txt = [txt ; mgetl(res_path+"m2sci_"+tmpfiles(k)+"_resume.log")]
657         //end
658
659         // Delete useless _resume.log files
660         //for k = 1:size(tmpfiles,"*")
661         //mdelete(res_path+"m2sci_"+tmpfiles(k)+"_resume.log")
662         //end
663
664         //mputl(txt,res_path+"m2sci_"+base_name+"_resume.log");
665         //end
666
667         // Delete useless .m files
668         //for k = 1:size(tmpfiles,"*")
669         //mdelete(pathconvert(TMPDIR)+tmpfiles(k)+".m")
670         //end
671
672         rmdir(pathconvert(TMPDIR)+base_name,"s")
673         for k = 1:size(tmpfiles,"*")
674             mdelete(pathconvert(TMPDIR)+tmpfiles(k)+".tree")
675         end
676     end
677
678 endfunction