010a31658941fb1f43f11a5b29a3fe529b999ac2
[scilab.git] / scilab / modules / compatibility_functions / macros / mtlb_load.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) ???? - INRIA - Scilab
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 function mtlb_load(thefile,opt)
11 //loads matlab 4.x  binary (.mat) or ascii files
12 //
13 warning(msprintf(gettext("This function is obsolete, use %s instead."),"loadmatfile"));
14
15 l_flags=['dl','fl','ll','sl','uls','uc']
16 b_flags=['db','fb','lb','sb','ubs','uc']
17 deff('Error(msg)',['mclose(fd)' ;'error(msg)'])
18 [lhs,rhs]=argn(0)
19 // look for file type
20 if rhs==2 then
21   if convstr(opt)=='-ascii' then
22     bin=%f
23   else
24     error(msprintf(gettext("%s: Unknown option."),opt));
25   end
26 else
27   k=strindex(thefile,'.')
28   if k==[] then  //no extension given
29     thefile=thefile+'.mat'
30     bin=%t
31   else
32     if part(thefile,k($):length(thefile))=='.mat' then 
33       bin=%t,
34     else
35       bin=%f
36     end
37   end
38 end
39
40 if bin then
41   [fd,err]=mopen(thefile,'rb',0)
42   if err<>0 then error(msprintf(gettext("File %s cannot be opened for reading."),thefile)),end
43
44   vars=list() //list to store loaded variables
45   names=[]  // vector of variables names
46
47
48   while %t 
49     offset=mtell(fd)
50     mopt=mget(1,'uil',fd)
51     if meof(fd)<>0 then break,end
52     if mopt>5000 then
53       mseek(offset,fd)
54       mopt=mget(1,'uib',fd)
55
56       if mopt>5000 then
57         Error(gettext("Incorrect file."))
58       end
59     end
60     MOPT=[]
61     for k=1:4
62       r=mopt-10*int(mopt/10);
63       mopt=int((mopt-r)/10);
64       MOPT=[r MOPT];
65     end
66     select MOPT(1)
67     case 0
68       fl='uil'
69       flag=l_flags(MOPT(3)+1)
70     case 1
71       fl='uib'
72       flag=b_flags(MOPT(3)+1)
73     case 2
74       Error(gettext("VAX D-float not handled."))
75     case 3
76       Error(gettext("VAX G-float not handled."))
77     case 4
78       Error(gettext("Cray encoding not handled."))
79     else
80       Error(gettext("Unknown binary number format."))
81     end
82     t=mget(4,fl,fd);
83     if meof(fd)<>0 then Error(gettext("Incorrect file.")),end
84     m=t(1);n=t(2);it=t(3),namelen=t(4)
85     name=mget(namelen,"c",fd);
86     if meof(fd)<>0 then Error(gettext("Incorrect file.")),end
87     name=ascii(name(1:namelen-1))
88     names=[names name]
89     
90     
91     if MOPT(4)==0 then  // regular matrix
92       v=mget((it+1)*m*n,flag,fd);
93       if meof(fd)<>0 then Error(gettext("Incorrect file.")),end
94       if it==0 then
95         mat=matrix(v,m,n);
96       elseif it==1
97         mat=matrix(v(1:m*n),m,n)+%i*matrix(v(m*n+1:$),m,n)
98       end
99     elseif MOPT(4)==1 // vector of strings
100       v=mget(m*n,flag,fd);
101       if meof(fd)<>0 then Error(gettext("Incorrect file.")),end
102       mat=matrix(v(1:m*n),m,n);
103       w=mat;
104       mat=[];
105       for k=1:m
106         mat=[mat;ascii(w(k,:))]
107       end
108     elseif MOPT(4)==2 //sparse matrix
109       //sparse
110       Nnz=m-1;
111       it=n-3;if it<>0&it<>1 then Error(gettext("Unknown sparse type.")),end
112       ir=mget(Nnz,flag,fd);m=mget(1,"d",fd);
113       jc=mget(Nnz,flag,fd);n=mget(1,"d",fd);
114       v=mget(Nnz,flag,fd);junk=mget(1,"d",fd);
115       if meof(fd)<>0 then Error(gettext("Incorrect file.")),end
116       if it==1 then
117         //complex
118         v=v+%i*mget(Nnz,flag,fd);
119       end
120       mat=sparse([ir;jc]',v,[m n]);
121     end
122     vars($+1)=mat
123   end
124   mclose(fd);
125   //form execstr instruction to resume variables in the calling environment
126   execstr('['+strcat(names,',')+']=resume(vars(:))')
127 else
128   ke=strindex(thefile,'.')
129   if ke==[] then ke=length(thefile),else ke=ke($)-1,end
130   kp=strindex(thefile,['/','\'])
131   if kp==[] then kp=1,else kp=kp($)+1,end
132   name=part(thefile,kp:ke)
133   mat=evstr(mgetl(thefile))
134   execstr(name+'= resume(mat)')
135 end
136 endfunction