localization (compatibility_functions module)
[scilab.git] / scilab / modules / compatibility_functions / macros / loadmatfile.sci
1 function loadmatfile(varargin)
2 // Loads variables in a Matlab binary or ASCII file into Scilab
3 // This function has been developped following the 'MAT-File Format' description:
4 // www.mathworks.com/access/helpdesk/help/pdf_doc/matlab/matfile_format.pdf 
5 // Copyright INRIA
6 // Authors: SS, VC
7
8 // Verify that all inputs are character strings
9 for k=1:size(varargin)
10   if type(varargin(k))<>10 then
11     error(gettext("errors","compatibility_functions_error_9"));
12   end
13 end
14
15 [lhs,rhs]=argn(0)
16
17 fil=[]
18 bin=[]
19 varnames=[]
20
21 if rhs==1 then // Compatibility with old loadmatfile version
22   bin=%T
23   fil=varargin(1)
24 else // Try to find type binary or ASCII ?
25   // Filename is the first parameter: loadmatfile(filename[,opts])
26   // or the second parameter: loadmatfile(filetype,filename[,opts]) with filetype equal to -ascii or -mat
27   // filetype can also be included in opts
28   k=1
29   while k<=lstsize(varargin)
30     select varargin(k)
31     case "-mat"
32       bin=%T
33       k=k+1
34     case "-ascii"
35       bin=%F
36       k=k+1
37     case "-regexp"
38       warning(msprintf(gettext("messages","compatibility_functions_message_1"),"-regexp"));
39       while k<=lstsize(varargin) & and(varargin(k)<>["-mat","-ascii"])
40         k=k+1
41       end
42     else 
43       if isempty(fil) then // Filename
44         fil=varargin(k)
45         if fileparts(fil,"extension")==".mat" & isempty(bin) then // extension .mat and bin not already fixed by options
46           bin=%T
47         elseif isempty(bin) then
48           bin=%F
49         end
50       else // Variable names
51         varnames=[varnames;varargin(k)]
52       end
53       k=k+1
54     end
55   end
56   if isempty(bin) then
57     bin=%T
58   end
59 end
60
61 if fileparts(fil,"extension")=="" then
62   fil=fil+".mat"
63 end
64
65 // --- BINARY FILE ---
66 if bin then 
67   ReadmiMatrix=ReadmiMatrix; // Loads the matfile functions (ReadmiMatrix.sci) 
68
69   // Try to read file as a level 5 binary file
70   // File opening
71   fd=open_matfile(fil)
72   // Reads the file header
73   ierr=execstr("[head,version,endian]=matfile_header(fd)","errcatch")
74   
75   if ierr<>0 then
76     errmsg=lasterror()
77     // This line has to be mofified according to error message in 'matfile_header' function
78     if stripblanks(errmsg)==gettext("errors","compatibility_functions_error_13") then 
79       // Level 4 binary file ?
80       level=4;
81     else
82       // Wrong file
83       error(errmsg);
84     end
85   else
86     // Level 5 binary file
87     level=5;
88   end
89   
90   // --- LEVEL 5 BINARY FILE (This part already existed in old version) ---
91   if level==5 then
92     //--set constants
93     exec(LoadMatConstants,-1);
94     
95     //--loop on the stored variables
96     Name='';Names=[];Matrices=list()
97     while %t 
98       ierr=execstr('[Matrix,Name]=ReadmiMatrix(fd)','errcatch') //read next variable
99       if ierr<>0 then mclose(fd),disp(lasterror()),return,end 
100       if meof(fd) then  break,end //EOF reached 
101       
102       // Old version compatibility | Name has been given
103       if isempty(varnames) | or(Name==varnames) then
104         Names=[Names,Name];Matrices($+1)=Matrix
105       end
106       
107     end
108     //--file closing
109     mclose(fd)
110     
111     //return variables in the calling context
112     execstr('['+strcat(Names,',')+']=resume(Matrices(:))')
113   
114   // --- LEVEL 4 BINARY FILE (Copy/Paste from mtlb_load.sci) ---
115   elseif level==4 then
116     l_flags=['dl','fl','ll','sl','uls','uc']
117     b_flags=['db','fb','lb','sb','ubs','uc']
118     deff('Error(msg)',['mclose(fd)' ;'error(msg)'])
119     [fd,err]=mopen(fil,'rb',0)
120     if err<>0 then error(msprintf(gettext("errors","compatibility_functions_error_19"),fil)),end
121     
122     vars=list() //list to store loaded variables
123     names=[]  // vector of variables names
124     
125     while %t 
126       offset=mtell(fd)
127       mopt=mget(1,'uil',fd)
128       if meof(fd)<>0 then break,end
129       if mopt>5000 then
130         mseek(offset,fd)
131         mopt=mget(1,'uib',fd)
132         
133         if mopt>5000 then
134           Error(gettext("errors","compatibility_functions_error_20"));
135         end
136       end
137       MOPT=[]
138       for k=1:4
139         r=mopt-10*int(mopt/10);
140         mopt=int((mopt-r)/10);
141         MOPT=[r MOPT];
142       end
143       select MOPT(1)
144       case 0
145         fl='uil'
146         flag=l_flags(MOPT(3)+1)
147       case 1
148         fl='uib'
149         flag=b_flags(MOPT(3)+1)
150       case 2
151         Error(gettext("errors","compatibility_functions_error_21"));
152       case 3
153         Error(gettext("errors","compatibility_functions_error_22"));
154       case 4
155         Error(gettext("errors","compatibility_functions_error_23"));
156       else
157         Error(gettext("errors","compatibility_functions_error_24"));
158       end
159       t=mget(4,fl,fd);
160       if meof(fd)<>0 then Error(gettext("errors","compatibility_functions_error_20")),end
161       m=t(1);n=t(2);it=t(3),namelen=t(4)
162       name=mget(namelen,"c",fd);
163       if meof(fd)<>0 then Error(gettext("errors","compatibility_functions_error_20")),end
164       name=ascii(name(1:namelen-1))
165       
166       // Old version compatibility | Name has been given
167       if isempty(varnames) | or(name==varnames) then
168         names=[names name]
169       end
170       
171       if MOPT(4)==0 then  // regular matrix
172         v=mget((it+1)*m*n,flag,fd);
173         if meof(fd)<>0 then Error(gettext("errors","compatibility_functions_error_20")),end
174         if it==0 then
175           mat=matrix(v,m,n);
176         elseif it==1
177           mat=matrix(v(1:m*n),m,n)+%i*matrix(v(m*n+1:$),m,n)
178         end
179       elseif MOPT(4)==1 // vector of strings
180         v=mget(m*n,flag,fd);
181         if meof(fd)<>0 then Error(gettext("errors","compatibility_functions_error_20")),end
182         mat=matrix(v(1:m*n),m,n);
183         w=mat;
184         mat=[];
185         for k=1:m
186           mat=[mat;ascii(w(k,:))]
187         end
188       elseif MOPT(4)==2 //sparse matrix
189         //sparse
190         Nnz=m-1;
191         it=n-3;if it<>0&it<>1 then Error(gettext("errors","compatibility_functions_error_25")),end
192         ir=mget(Nnz,flag,fd);m=mget(1,"d",fd);
193         jc=mget(Nnz,flag,fd);n=mget(1,"d",fd);
194         v=mget(Nnz,flag,fd);junk=mget(1,"d",fd);
195         if meof(fd)<>0 then Error(gettext("errors","compatibility_functions_error_20")),end
196         if it==1 then
197           //complex
198           v=v+%i*mget(Nnz,flag,fd);
199         end
200         mat=sparse([ir;jc]',v,[m n]);
201       end
202       // Old version compatibility | Name has been given
203       if isempty(varnames) | or(name==varnames) then
204         vars($+1)=mat
205       end
206     end
207     mclose(fd);
208     //form execstr instruction to resume variables in the calling environment
209     execstr('['+strcat(names,',')+']=resume(vars(:))')  
210   else
211     error(gettext("errors","compatibility_functions_error_26"));
212   end
213    
214 // --- ASCII FILE (Copy/Paste from mtlb_load.sci) ---
215 else
216   ke=strindex(fil,'.')
217   if ke==[] then ke=length(fil),else ke=ke($)-1,end
218   kp=strindex(fil,['/','\'])
219   if kp==[] then kp=1,else kp=kp($)+1,end
220   name=part(fil,kp:ke)
221   mat=evstr(mgetl(fil))
222   execstr(name+'= resume(mat)')
223 end
224 endfunction
225