6ce75793f369bd94abbf0f0a85fa299b80674962
[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 // 
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 res=mfile2sci(fil,res_path,Recmode,only_double,verbose_mode,prettyprint)
12 // This function performs translation of a single M-file
13 // - fil: file name
14 // - res_path: path to write translated file in (default value is fil path)
15 // - Recmode: recursive mode (default value is false)
16
17 // Get default arguments
18 [lhs,rhs]=argn(0)
19 if rhs<6 then prettyprint=%F,end
20 if rhs<5 then verbose_mode=3,end
21 if rhs<4 then only_double=%F,end
22 if rhs<3 then Recmode=%F,end
23 if rhs<2 then res_path="./",end
24 if rhs<1 then m2sci_gui();res=[];return;end
25 if MSDOS then
26   fil=strsubst(fil,filesep(),"/")
27   res_path=strsubst(res_path,"\","/")
28 end
29 if part(res_path,length(res_path))<>"/" then 
30   res_path=res_path+"/"
31 end
32 // Loads libraries related to m2sci
33 if exists("m2scikernellib")==0 then load("SCI/modules/m2sci/macros/kernel/lib"),end
34 if exists("m2scipercentlib")==0 then load("SCI/modules/m2sci/macros/percent/lib"),end
35 if exists("m2scisci_fileslib")==0 then load("SCI/modules/m2sci/macros/sci_files/lib"),end
36
37 if multi_fun_file(fil,res_path,Recmode,only_double,verbose_mode,prettyprint) then
38   res=1
39   return
40 end
41
42 // Get context
43 global("m2sci_infos")
44 global("mtlbref_fun")
45 global("mtlbtool_fun")
46 global("not_mtlb_fun")
47 [l,mac]=where()
48 Reclevel=size(find(mac=="mfile2sci"),"*")
49 tpcallpos=min(find(mac=="translatepaths"));
50 guicallpos=min(find(mac=="m2sci_gui"));
51 if size(find(mac=="m2sci_gui"),"*")==1 & tpcallpos<guicallpos then // Bug 679
52   Reclevel=Reclevel-1
53 end
54 if size(find(mac=="multi_fun_file"),"*")==1 then
55   Reclevel=Reclevel-1
56 end
57
58 if Reclevel==1 then
59   nametbl=[]
60 else
61   m2sci_infos_save=m2sci_infos
62 end
63 m2sci_infos=[%f %f]
64
65 margin=part(" ",ones(1,3*(Reclevel-1)))
66 margin="  "
67 rec=gettext("OFF");
68 dble=gettext("NO");
69 pretty=gettext("NO");
70 if prettyprint then pretty=gettext("YES");end
71 if Recmode then rec=gettext("ON");end
72 if only_double then dble=gettext("YES");end
73
74 res=[]
75
76 // Handle file path
77 // File name
78 k=strindex(fil,".")
79 if k<>[]
80   ke=k($)-1
81   base_name=part(fil,1:ke)
82 else
83   ke=length(fil)
84   base_name=fil
85 end
86 // File path
87 k=strindex(fil,"/")
88 if k==[] then
89   file_path="./"
90 else
91   file_path=part(fil,1:k($))
92 end
93 // Others M-files in directory
94 if exists("Paths")==0 then
95   Paths=file_path,
96   if MSDOS then
97     Paths=strsubst(Paths,"/","\")
98     mfiles=listfiles(Paths+"*.m")
99     sep=filesep()
100   else
101     mfiles=listfiles(Paths+"*.m")
102     sep=filesep()
103   end
104 end
105
106 // Function name
107 fnam=part(base_name,k($)+1:ke) // File name without extension
108
109 // logfile initialisation
110 if exists("logfile")==0 then
111   [tempfd1,ierr1]=file('open',pathconvert(TMPDIR)+"logfile.dat","old")
112   if ierr1==0 then
113     load(pathconvert(TMPDIR)+"logfile.dat")
114     file('close',tempfd1)
115     file('close',logfile)
116     mdelete(pathconvert(TMPDIR)+"logfile.dat")
117   end
118   logfile=file('open',res_path+"m2sci_"+fnam+".log","unknown")
119   save(pathconvert(TMPDIR)+"logfile.dat",logfile)
120 end
121
122 // Output beginning message
123 mss=[gettext("****** Beginning of mfile2sci() session ******");
124     gettext("File to convert:")+" "+fil;
125     gettext("Result file path:")+" "+res_path;
126     gettext("Recursive mode:")+" "+rec;
127     gettext("Only double values used in M-file:")+" "+dble;
128     gettext("Verbose mode:")+" "+string(verbose_mode);
129     gettext("Generate formated code:")+" "+pretty]
130 m2sci_info(mss,-1);
131
132 // Read in the file as text
133 m2sci_info(gettext("M-file reading..."),-1);
134 txt=mgetl(fil);
135 m2sci_info(gettext("M-file reading: Done"),-1);
136
137 //Replace TAB by SPACE
138 txt=strsubst(txt,code2str(-40),"")
139
140 if txt==[] then
141   m2sci_infos(msprintf(gettext("File %s is an empty file ! Nothing done..."),fil),-1);
142   return
143 end
144 tmptxt=txt
145
146 // Make minor changes on syntax
147 m2sci_info(gettext("Syntax modification..."),-1);
148 ierr=execstr("load(''"+pathconvert(TMPDIR)+fnam+ ".tree'',''txt'',''helppart'',''batch'')",'errcatch','n')
149 if ierr<>0 | exists('txt')==0 | exists('batch')==0 & strindex(res_path,TMPDIR)==[] then
150   [helppart,txt,batch]=m2sci_syntax(txt)
151 elseif ierr==0 & newest(fil,pathconvert(TMPDIR)+fnam+ ".tree")==1 then
152     [helppart,txt,batch]=m2sci_syntax(tmptxt)
153 end
154
155 m2sci_info(gettext("Syntax modification: Done"),-1);
156
157 // Write .cat file and update whatis
158 if helppart<>[] then
159   catfil=res_path+fnam+".cat"
160   whsfil=res_path+"whatis"
161   mputl(helppart,catfil)
162   if exists("whsfil_unit")==1 then
163     write(whsfil_unit,stripblanks(helppart(1))+" |"+fnam,"(a)")
164   end
165 end
166
167 if txt~=[] then
168   quote="''";
169   dquote="""";
170   kc=strindex(txt(1),"function");
171   kc=kc(1);
172
173   // Define Scilab function
174   fprot=funcprot();
175   funcprot(0);
176   
177   // Blanks in file name are replaced by _ for batch
178   // kc+9 because 'function '
179   ksc=min(strindex(txt(1),";")) // searching for a comment on first line after function prototype
180   if isempty(ksc) then 
181     ksc=length(txt(1))+1;
182     firstline=[]
183   else
184     firstline=part(txt(1),ksc+1:length(txt(1)));
185   end
186   
187   func_proto=part(txt(1),kc+9:ksc-1)
188   keq=min(strindex(func_proto,"="))
189   kpar=min(strindex(func_proto,"("))
190   if isempty(keq) then
191     keq=1
192   end
193   if isempty(kpar) then
194     kpar=length(func_proto)+1
195   end
196   func_proto=part(func_proto,1:keq)+..
197       strsubst(stripblanks(part(func_proto,keq+1:kpar-1))," ","_")+..
198       part(func_proto,kpar:length(func_proto))
199
200   deff(func_proto,[firstline;txt(2:$)],"n")
201   w=who("get");
202   mname=w(1);
203   nametbl=[nametbl;mname]
204   if fnam<>mname & ~batch then // warning is not displayed for a batch file
205     mss=msprintf(gettext("messages","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);
206     m2sci_info(mss,-1);
207   end
208
209   // Compilation
210   execstr("comp("+mname+",1)")
211   funcprot(fprot)
212
213   // Get Scilab pseudo code of the function
214   m2sci_info(gettext("Macro to tree conversion..."),-1); 
215   macr=evstr(mname)
216   mtlbtree=macr2tree(macr);
217   if ~batch then
218     mtlbtree.name=mname;
219   else
220     mtlbtree.name="";
221   end
222   
223   //Transfom a equal instructions(if lhs are multi_operation insert and expression is a funcall) in the matlab tree to sup_equal instructions
224   global("tmpvarnb")
225   tmpvarnb=0;
226   level=[0,0];
227   ninstr=1;
228   while ninstr<=size(mtlbtree.statements)-3
229     mtlbtree.statements(ninstr)=transformtree(mtlbtree.statements(ninstr))
230     ninstr=ninstr+1
231   end
232
233   // Perform the translation
234   [scitree,trad,hdr,crp]=m2sci(mtlbtree,w(1),Recmode,prettyprint)
235
236   //Creation of fname_resume.log file
237  // if mtlbref_fun<>[]|not_mtlb_fun<>[]|mtlbtool_fun<>[] then
238     //resume_logfile initialisation
239     if exists("resume_logfile")==0 then
240       [tempfd2,ierr2]=file('open',pathconvert(TMPDIR)+gettext("resumelogfile.dat"),"old")
241       if ierr2==0 then
242         load(pathconvert(TMPDIR)+gettext("resumelogfile.dat"))
243         file('close',tempfd2)
244         file('close',resume_logfile)
245         mdelete(pathconvert(TMPDIR)+gettext("resumelogfile.dat"))
246       end
247       resume_logfile=file('open',res_path+gettext("resume")+"_m2sci_"+fnam+".log",'unknown')
248       save(pathconvert(TMPDIR)+gettext("resumelogfile.dat"),resume_logfile)
249     end
250        
251     //number of matlab reference functions, matlab toolboxes functions, not matlab functions
252     size1=size(mtlbref_fun,1)
253     size2=size(mtlbtool_fun,1)
254     size3=size(not_mtlb_fun,1)
255     
256     if size(mtlbref_fun,"*")<>0 then
257       mtlbref_fun(:,1)=""""+mtlbref_fun(:,1)+""""
258     end
259     if size(mtlbtool_fun,"*")<>0 then
260       mtlbtool_fun(:,1)=""""+mtlbtool_fun(:,1)+""""
261     end
262     if size(not_mtlb_fun,"*")<>0 then
263       not_mtlb_fun(:,1)=""""+not_mtlb_fun(:,1)+""""
264     end
265
266     info_resume=[msprintf(gettext("****** %s: Functions of mfile2sci() session ******"),fnam);
267         "*";
268         msprintf(gettext("%d Matlab Function(s) not yet converted, original calling sequence used:"),size1);
269         mtlbref_fun(:,1)+mtlbref_fun(:,2);
270         "*";
271         msprintf(gettext("%d Matlab Toolbox(es) Functions, original calling sequence used :"),size2);
272         mtlbtool_fun(:,1)+mtlbtool_fun(:,2);
273         "*";
274         msprintf(gettext("%d Unknown Function(s), original calling sequence used :"),size3);
275         not_mtlb_fun(:,1)+not_mtlb_fun(:,2);
276         "*"]
277
278     write(resume_logfile,margin+info_resume)
279     file("close",resume_logfile)
280     mdelete(pathconvert(TMPDIR)+gettext("resumelogfile.dat"))
281   //end
282   
283   m2sci_info(gettext("Macro to tree conversion: Done"),-1);
284
285   crp(1)=""; // Delete function prototype
286   if isempty(firstline) then
287     res=[hdr;crp]
288   else
289     hdr(1)=hdr(1)+" "+crp(2);
290     crp(2)=[];
291     res=[hdr;crp];
292   end
293
294   // Strip last return and blank lines
295   n=size(res,1)
296   while res(n)==part(" ",1:length(res(n))) then 
297     n=n-1
298   end
299   res=res(1:n)
300
301   // Write sci-file
302   ext=".sci"
303   scifil=res_path+fnam+ext
304   mputl(res,scifil)
305
306   // Write sci_<mname>.sci translation file
307   if trad<>[] then
308     sci_fil=res_path+"sci_"+mname+".sci"
309     mputl(trad,sci_fil)
310     res=1
311   else
312     res=0
313   end
314
315   // Output summary information
316   infos=[]
317   if m2sci_infos(1) then
318     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.");
319   end
320   if m2sci_infos(2) then
321     infos=[infos;gettext("Translation may be wrong (see the //!! comments).")]
322   end
323
324   nametbl($)=[]
325
326 else
327   infos=gettext("File contains no instruction, no translation made...");
328 end
329
330 // End of translation messages
331 mss=gettext("****** End of mfile2sci() session ******");
332
333 m2sci_info([infos;mss],-1);
334
335 if Reclevel>1 then
336   m2sci_infos=m2sci_infos_save
337 end
338
339 file("close",logfile)
340 clearglobal m2sci_infos
341 clearglobal mtlbref_fun
342 clearglobal mtlbtool_fun
343 clearglobal not_mtlb_fun
344 // For execution called by translatepaths()
345 //nametbl=resume(nametbl)
346 mdelete(pathconvert(TMPDIR)+fnam+ ".tree")
347 mdelete(pathconvert(TMPDIR)+"logfile.dat")
348
349 endfunction