9cbcca255f23598290d60b954a831c2468296eb5
[scilab.git] / scilab / modules / fileio / src / c / mget.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2007 - INRIA
4  * ...
5  * 
6  * This file must be used under the terms of the CeCILL.
7  * This source file is licensed as described in the file COPYING, which
8  * you should have received as part of this distribution.  The terms
9  * are also available at    
10  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
11  *
12  */
13 /*--------------------------------------------------------------------------*/
14 #include <string.h>
15 #include "mget.h"
16 #include "filesmanagement.h"
17 #include "../../../libs/libst/misc.h"
18 #include "sciprint.h"
19 #include "islittleendian.h"
20 #include "machine.h"
21 #include "localization.h"
22 /*--------------------------------------------------------------------------*/
23 struct soundstream ftf;
24 int swap = 0;
25 /*--------------------------------------------------------------------------*/
26 /* =================================================
27 * reads data and store them without type conversion 
28 * =================================================*/
29 #define MGET_CHAR_NC(Type) \
30 {\
31         Type *val = (Type *) res ;\
32         items=(int)fread(val,sizeof(Type),n,fa);\
33 }
34 /*--------------------------------------------------------------------------*/
35 #define MGET_NC(Type,Fswap) \
36 {\
37         Type *val = (Type *) res ;\
38         items=(int)fread(val,sizeof(Type),n,fa);\
39         if (swap) \
40         for (i=0;i<items;i++) \
41         val[i]=Fswap(val[i]);\
42 }
43 /*--------------------------------------------------------------------------*/
44 #define MGET_GEN_NC(NumType,Fswap,cf)\
45 { \
46         switch (cf) { \
47                 case ' ': \
48                   MGET_NC(NumType,Fswap);break; \
49                 case 'b': \
50                   swap = (islittleendian()==1)? 1:0; \
51                   MGET_NC(NumType,Fswap); break; \
52           case 'l': \
53             swap = (islittleendian()==1) ? 0:1; \
54             MGET_NC(NumType,Fswap);  break; \
55           default: \
56             sciprint(_("%s: Wrong value for fourth input argument: '%s' or '%s' or '%s' expected.\n"),"mget"," ","b","l"); \
57             *ierr=1; return; \
58         } \
59 }
60 /*--------------------------------------------------------------------------*/
61 void C2F(mgetnc)(integer *fd, void * res, integer *n1, char *type, integer *ierr)
62 {  
63         char c1,c2;
64         int i,items=*n1,n=*n1;
65         FILE *fa;
66
67
68         *ierr=0;
69         if ((fa = GetFileOpenedInScilab(*fd)) ==NULL) {
70                 sciprint(_("%s: No input file associated to logical unit %d.\n"),"mget",*fd);
71                 *ierr=3;
72                 return;
73         }
74         swap = GetSwapStatus(*fd);
75         c1 = ( strlen(type) > 1) ? type[1] : ' '; 
76         c2 = ( strlen(type) > 2) ? type[2] : ' '; 
77         switch ( type[0] )
78         {
79         case 'i' : MGET_GEN_NC(int,swapi,c1);break;
80         case 'l' : MGET_GEN_NC(long,swapl,c1);break;
81         case 's' : MGET_GEN_NC(short,swapw,c1);break;
82         case 'c' : MGET_CHAR_NC(char) ; break;
83         case 'd' : MGET_GEN_NC(double,swapd,c1);break;
84         case 'f' : MGET_GEN_NC(float,swapf,c1);break;
85         case 'u' :
86                 switch ( c1 )
87                 {
88                 case 'i' :  MGET_GEN_NC(unsigned int,swapi,c2); break;
89                 case 'l' :  MGET_GEN_NC(unsigned long,swapl,c2); break;
90                 case 's' :  MGET_GEN_NC(unsigned short,swapw,c2); break;
91                 case ' ' :  MGET_GEN_NC(unsigned int,swapi,' '); break;
92                 case 'c' :  MGET_CHAR_NC(unsigned char); break;
93                 default : *ierr=1; return; break;
94                 }
95                 break;
96         default :
97                 *ierr=1;
98                 return ;
99         }
100         if ( items != n ) 
101         {
102                 *ierr = -(items) -1 ;
103                 /** sciprint("Read %d out of\n",items,n); **/
104         }
105         return;
106 }
107 /*--------------------------------------------------------------------------*/
108 /* =================================================
109 * reads data and store them in double
110 * =================================================*/
111
112 /* conversion macro  */
113 #define CONVGD(Type) \
114 {\
115         Type *val = (Type *) res ;\
116         for ( i = items-1 ; i >=0 ; i--)  \
117         res[i] = val[i]; \
118 }
119 /*--------------------------------------------------------------------------*/
120 #define MGET_GEN(NumType,Fswap,cf)  MGET_GEN_NC(NumType,Fswap,cf); CONVGD(NumType);
121 #define MGET_CHAR(NumType)  MGET_CHAR_NC(NumType); CONVGD(NumType); 
122 /*--------------------------------------------------------------------------*/
123 /* reads data and store them in double  */
124 void mget2(FILE *fa, integer swap2, double *res, integer n, char *type, integer *ierr)
125 {  
126         char c1,c2;
127         int i,items=n;
128         ft_t ft = &ftf; 
129         *ierr=0;
130         ft->fp = fa;
131         c1 = ( strlen(type) > 1) ? type[1] : ' '; 
132         c2 = ( strlen(type) > 2) ? type[2] : ' '; 
133         switch ( type[0] )
134         {
135         case 'i' : MGET_GEN(int,swapi,c1);break;
136         case 'l' : MGET_GEN(long,swapl,c1);break;
137         case 's' : MGET_GEN(short,swapw,c1);break;
138         case 'c' : MGET_CHAR(char) ; break;
139         case 'd' : MGET_GEN(double,swapd,c1);break;
140         case 'f' : MGET_GEN(float,swapf,c1);break;
141         case 'u' :
142                 switch ( c1 )
143                 {
144                 case 'i' :  MGET_GEN(unsigned int,swapi,c2); break;
145                 case 'l' :  MGET_GEN(unsigned long,swapl,c2); break;
146                 case 's' :  MGET_GEN(unsigned short,swapw,c2); break;
147                 case ' ' :  MGET_GEN(unsigned int,swapi,' '); break;
148                 case 'c' :  MGET_CHAR(unsigned char); break;
149                 default : *ierr=1; return; break;
150                 }
151                 break;
152         default :
153                 *ierr=1;
154                 return ;
155         }
156         if ( items != n ) 
157         {
158                 *ierr = -(items) -1 ;
159                 /** sciprint("Read %d out of\n",items,n); **/
160         }
161         return;
162 }
163 /*--------------------------------------------------------------------------*/
164 void C2F(mget) (integer *fd, double *res, integer *n, char *type, integer *ierr)
165 {  
166         int nc,swap2;
167         FILE *fa;
168         nc=(int)strlen(type);
169         *ierr=0;
170         if ( nc == 0) 
171         {
172                 sciprint(_("%s: Wrong size for fourth input argument: Non-empty string expected.\n"),"mput",type);
173                 *ierr=2;
174                 return;
175         }
176         fa = GetFileOpenedInScilab(*fd);
177         if (fa ) 
178         {
179                 swap2 = GetSwapStatus(*fd);
180                 mget2(fa,swap2,res,*n,type,ierr);
181                 if (*ierr > 0) sciprint(_("%s: Wrong value for fourth input argument: Format not recognized.\n"),"mget");
182         }
183         else 
184         {
185                 sciprint(_("%s: No input file associated to logical unit %d.\n"),"mget",*fd);
186                 *ierr=3;
187         }
188 }
189 /*--------------------------------------------------------------------------*/