Localization (fileio)
[scilab.git] / scilab / modules / fileio / src / c / mput.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 "mput.h"
16 #include "filesmanagement.h"
17 #include "sciprint.h"
18 #include "islittleendian.h"
19 #include "../../../libs/libst/misc.h"
20 #include "machine.h"
21 #include "localization.h"
22 /*--------------------------------------------------------------------------*/
23 extern struct soundstream ftf; /* defined in mget.c */
24 extern int swap; /* defined in mget.c */
25 /*--------------------------------------------------------------------------*/
26 /*===============================================
27 * function to write data without type conversion
28 *===============================================*/
29 #define MPUT_CHAR_NC(Type) \
30 {\
31         Type *val = (Type *) res ; \
32         fwrite(val,sizeof(Type),n,fa); \
33 }
34 /*--------------------------------------------------------------------------*/
35 #define MPUT_NC(Type,Fswap) \
36 { \
37         Type *val = (Type *) res ; \
38         Type vali; \
39         for ( i=0; i< n; i++)  \
40                    { \
41                    vali = *val++; \
42                    if ( swap) vali = Fswap(vali); \
43                    fwrite(&vali,sizeof(Type),1,fa); \
44                 } \
45 }
46 /*--------------------------------------------------------------------------*/
47 #define MPUT_GEN_NC(Type,Fswap,cf) \
48 switch ( cf )  \
49 { \
50   case ' ': \
51     MPUT_NC(Type,Fswap); break; \
52   case 'b': \
53     swap = (islittleendian()==1) ? 1 : 0; \
54     MPUT_NC(Type,Fswap); break; \
55         case 'l': \
56           swap = (islittleendian()==1) ? 0 : 1; \
57           MPUT_NC(Type,Fswap); break; \
58         default: \
59         sciprint(_("%s: Wrong value for input argument #%d (%s): '%s' or '%s' or '%s' expected.\n"),"mput",4,type," ","b","l"); \
60           *ierr=1;return; \
61 }
62 /*--------------------------------------------------------------------------*/
63 void C2F(mputnc) (integer *fd, void * res, integer *n1, char *type, integer *ierr)
64 {  
65         char c1,c2;
66         int i,swap2,n;
67         FILE *fa;
68         n=*n1;
69         *ierr=0;
70         if ((fa = GetFileOpenedInScilab(*fd)) ==NULL) {
71                 sciprint(_("%s: No input file associated to logical unit %d.\n"),"mput",*fd);
72                 *ierr=3;
73                 return;
74         }
75         swap2 = GetSwapStatus(*fd);
76
77         c1 = ( strlen(type) > 1) ? type[1] : ' '; 
78         c2 = ( strlen(type) > 2) ? type[2] : ' '; 
79         switch ( type[0] )
80         {
81         case 'i' : MPUT_GEN_NC(int,swapi,c1);       break;
82         case 'l' : MPUT_GEN_NC(long,swapl,c1);      break;
83         case 's' : MPUT_GEN_NC(short,swapw,c1);     break;
84         case 'c' : MPUT_CHAR_NC(char) ;          break;
85         case 'd' : MPUT_GEN_NC(double,swapd,c1);    break;
86         case 'f' : MPUT_GEN_NC(float,swapf,c1);     break;
87         case 'u' :
88                 switch ( c1 )
89                 {
90                 case 'i' :  MPUT_GEN_NC(unsigned int,swapi,c2); break;
91                 case 'l' :  MPUT_GEN_NC(unsigned long,swapl,c2); break;
92                 case 's' :  MPUT_GEN_NC(unsigned short,swapw,c2); break;
93                 case ' ' :  MPUT_GEN_NC(unsigned int,swapi,' '); break;
94                 case 'c' :  MPUT_CHAR_NC(unsigned char); break;
95                 default :  *ierr=1;return ;
96                 }
97                 break;
98         default : *ierr=1; break;
99         }
100 }
101 /*--------------------------------------------------------------------------*/
102 /*================================================
103 * function to write data stored in double
104 *================================================*/
105 /** used for char **/
106 #define MPUT_CHAR(Type) \
107         for ( i=0; i< n; i++)  \
108 { \
109         Type  val = (char) *res++; \
110         fwrite(&val,sizeof(Type),1,fa); \
111 }
112 /*--------------------------------------------------------------------------*/
113 /** write in a machine independant way : i.e data 
114 is swaped if necessary to output little-endian 
115 data **/
116
117 #define MPUT(Type,Fswap) for ( i=0; i< n; i++)  \
118 { \
119         Type val; \
120         val =(Type) *res++; \
121         if ( swap) val = Fswap(val); \
122         fwrite(&val,sizeof(Type),1,fa); \
123 }
124 /*--------------------------------------------------------------------------*/
125 /** The output mode is controlled by type[1] **/
126 #define MPUT_GEN(Type,Fswap,cf) \
127 switch ( cf )  \
128 { \
129   case ' ': \
130     MPUT(Type,Fswap); break; \
131   case 'b': \
132         swap = (islittleendian()==1) ? 1 : 0; \
133         MPUT(Type,Fswap); break; \
134   case 'l': \
135           swap = (islittleendian()==1) ? 0 : 1; \
136           MPUT(Type,Fswap); break; \
137   default: \
138   sciprint(_("%s: Wrong value for input argument #%d (%s): '%s' or '%s' or '%s' expected.\n"),"mput",4,type," ","b","l"); \
139           *ierr=1;return; \
140 }
141 /*--------------------------------------------------------------------------*/
142 void mput2 (FILE *fa, integer swap2, double *res, integer n, char *type, integer *ierr)
143 {  
144         char c1,c2;
145         int i;
146         ft_t ft = &ftf;
147         *ierr=0;
148         ft->fp = fa;
149         c1 = ( strlen(type) > 1) ? type[1] : ' '; 
150         c2 = ( strlen(type) > 2) ? type[2] : ' '; 
151         switch ( type[0] )
152         {
153         case 'i' : MPUT_GEN(int,swapi,c1);       break;
154         case 'l' : MPUT_GEN(long,swapl,c1);      break;
155         case 's' : MPUT_GEN(short,swapw,c1);     break;
156         case 'c' : MPUT_CHAR(char) ;          break;
157         case 'd' : MPUT_GEN(double,swapd,c1);    break;
158         case 'f' : MPUT_GEN(float,swapf,c1);     break;
159         case 'u' :
160                 switch ( c1 )
161                 {
162                 case 'i' :  MPUT_GEN(unsigned int,swapi,c2); break;
163                 case 'l' :  MPUT_GEN(unsigned long,swapl,c2); break;
164                 case 's' :  MPUT_GEN(unsigned short,swapw,c2); break;
165                 case ' ' :  MPUT_GEN(unsigned int,swapi,' '); break;
166                 case 'c' :  MPUT_CHAR(unsigned char); break;
167                 default :  *ierr=1;return ;
168                 }
169                 break;
170         default : *ierr=1; break;
171         }
172 }
173 /*--------------------------------------------------------------------------*/
174 void C2F(mput) (integer *fd, double *res, integer *n, char *type, integer *ierr)
175 {
176         int nc,swap2;
177         FILE *fa;
178         *ierr=0;
179         if ((nc = (int)strlen(type)) == 0) 
180         {
181                 sciprint(_("%s: Wrong size for input argument #%d ('%s'): Non-empty string expected.\n"),"mput",4,type);
182                 *ierr=2;
183                 return;
184         }
185         if ((fa = GetFileOpenedInScilab(*fd)) !=NULL)
186         {
187                 swap2 = GetSwapStatus(*fd);
188                 mput2(fa,swap2,res,*n,type,ierr);
189                 if (*ierr > 0) sciprint(_("%s: Wrong value for input argument #%d ('%s'): Format not recognized.\n"),"mput",4,type);
190         }
191         else 
192         {
193                 sciprint(_("%s: Error while opening, reading or writing '%s'.\n"),"mput",GetFileNameOpenedInScilab(*fd));
194                 *ierr=3;
195         }
196 }
197 /*--------------------------------------------------------------------------*/
198
199