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