1 // lowlevel.hxx -- routines to handle lowlevel compressed binary IO of
4 // Shamelessly adapted from plib (plib.sourceforge.net) January 2001
6 // Original version Copyright (C) 2000 the plib team
7 // Local changes Copyright (C) 2000 Curtis L. Olson - curt@flightgear.org
9 // This program is free software; you can redistribute it and/or modify
10 // it under the terms of the GNU General Public License as published by
11 // the Free Software Foundation; either version 2 of the License, or
12 // (at your option) any later version.
14 // This program is distributed in the hope that it will be useful,
15 // but WITHOUT ANY WARRANTY; without even the implied warranty of
16 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 // GNU General Public License for more details.
19 // You should have received a copy of the GNU General Public License
20 // along with this program; if not, write to the Free Software
21 // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
26 #include "lowlevel.hxx"
28 static int read_error = false ;
29 static int write_error = false ;
31 void sgClearReadError() { read_error = false; }
32 void sgClearWriteError() { write_error = false; }
33 int sgReadError() { return read_error ; }
34 int sgWriteError() { return write_error ; }
37 void sgReadChar ( gzFile fd, char *var )
39 if ( gzread ( fd, var, sizeof(char) ) == sizeof(char) ) return ;
44 void sgWriteChar ( gzFile fd, const char var )
46 if ( gzwrite ( fd, (void *)(&var), sizeof(char) ) == sizeof(char) ) return ;
51 void sgReadFloat ( gzFile fd, float *var )
53 if ( gzread ( fd, var, sizeof(float) ) == sizeof(float) ) return ;
58 void sgWriteFloat ( gzFile fd, const float var )
60 if ( gzwrite ( fd, (void *)(&var), sizeof(float) ) == sizeof(float) )
66 void sgReadDouble ( gzFile fd, double *var )
68 if ( gzread ( fd, var, sizeof(double) ) == sizeof(double) ) return ;
73 void sgWriteDouble ( gzFile fd, const double var )
75 if ( gzwrite ( fd, (void *)(&var), sizeof(double) ) == sizeof(double) )
81 void sgReadUInt ( gzFile fd, unsigned int *var )
83 if ( gzread ( fd, var, sizeof(unsigned int) ) == sizeof(unsigned int) )
89 void sgWriteUInt ( gzFile fd, const unsigned int var )
91 if ( gzwrite ( fd, (void *)(&var), sizeof(unsigned int) )
92 == sizeof(unsigned int) )
98 void sgReadInt ( gzFile fd, int *var )
100 if ( gzread ( fd, var, sizeof(int) ) == sizeof(int) ) return ;
105 void sgWriteInt ( gzFile fd, const int var )
107 if ( gzwrite ( fd, (void *)(&var), sizeof(int) ) == sizeof(int) ) return ;
112 void sgReadLong ( gzFile fd, long int *var )
114 if ( gzread ( fd, var, sizeof(long int) ) == sizeof(long int) ) return ;
119 void sgWriteLong ( gzFile fd, const long int var )
121 if ( gzwrite ( fd, (void *)(&var), sizeof(long int) ) == sizeof(long int) )
127 void sgReadUShort ( gzFile fd, unsigned short *var )
129 if ( gzread ( fd, var, sizeof(unsigned short) ) == sizeof(unsigned short) )
135 void sgWriteUShort ( gzFile fd, const unsigned short var )
137 if ( gzwrite ( fd, (void *)(&var), sizeof(unsigned short) )
138 == sizeof(unsigned short) )
144 void sgReadShort ( gzFile fd, short *var )
146 if ( gzread ( fd, var, sizeof(short) ) == sizeof(short) ) return ;
151 void sgWriteShort ( gzFile fd, const short var )
153 if ( gzwrite ( fd, (void *)(&var), sizeof(short) ) == sizeof(short) ) return ;
158 void sgReadFloat ( gzFile fd, const unsigned int n, float *var )
160 if ( gzread ( fd, var, sizeof(float) * n ) == (int)(sizeof(float) * n) )
166 void sgWriteFloat ( gzFile fd, const unsigned int n, const float *var )
168 if ( gzwrite ( fd, (void *)var, sizeof(float) * n )
169 == (int)(sizeof(float) * n) )
174 void sgReadDouble ( gzFile fd, const unsigned int n, double *var )
176 if ( gzread ( fd, var, sizeof(double) * n ) == (int)(sizeof(double) * n) )
182 void sgWriteDouble ( gzFile fd, const unsigned int n, const double *var )
184 if ( gzwrite ( fd, (void *)var, sizeof(double) * n )
185 == (int)(sizeof(double) * n) ) return ;
189 void sgReadBytes ( gzFile fd, const unsigned int n, void *var )
193 if ( gzread ( fd, var, n ) == (int)n )
198 void sgWriteBytes ( gzFile fd, const unsigned int n, const void *var )
202 if ( gzwrite ( fd, (void *)var, n ) == (int)n )
208 void sgReadUShort ( gzFile fd, const unsigned int n, unsigned short *var )
210 if ( gzread ( fd, var, sizeof(unsigned short) * n )
211 == (int)(sizeof(unsigned short) * n) )
217 void sgWriteUShort ( gzFile fd, const unsigned int n, const unsigned short *var )
219 if ( gzwrite ( fd, (void *)var, sizeof(unsigned short) * n )
220 == (int)(sizeof(unsigned short) * n) )
227 void sgReadShort ( gzFile fd, const unsigned int n, short *var )
229 if ( gzread ( fd, var, sizeof(short) * n )
230 == (int)(sizeof(short) * n) )
236 void sgWriteShort ( gzFile fd, const unsigned int n, const short *var )
238 if ( gzwrite ( fd, (void *)var, sizeof(short) * n )
239 == (int)(sizeof(short) * n) )
245 void sgReadUInt ( gzFile fd, const unsigned int n, unsigned int *var )
247 if ( gzread ( fd, var, sizeof(unsigned int) * n )
248 == (int)(sizeof(unsigned int) * n) )
254 void sgWriteUInt ( gzFile fd, const unsigned int n, const unsigned int *var )
256 if ( gzwrite ( fd, (void *)var, sizeof(unsigned int) * n )
257 == (int)(sizeof(unsigned int) * n) )
264 void sgReadInt ( gzFile fd, const unsigned int n, int *var )
266 if ( gzread ( fd, var, sizeof(int) * n )
267 == (int)(sizeof(int) * n) )
273 void sgWriteInt ( gzFile fd, const unsigned int n, const int *var )
275 if ( gzwrite ( fd, (void *)var, sizeof(int) * n )
276 == (int)(sizeof(int) * n) )
283 #define MAX_ENTITY_NAME_LENGTH 1024
285 void sgReadString ( gzFile fd, char **var )
288 char s [ MAX_ENTITY_NAME_LENGTH ] ;
290 for ( i = 0 ; i < MAX_ENTITY_NAME_LENGTH ; i++ ) {
291 int c = gzgetc ( fd ) ;
298 if ( i >= MAX_ENTITY_NAME_LENGTH-1 )
299 s [ MAX_ENTITY_NAME_LENGTH-1 ] = '\0' ;
305 *var = new char [ strlen(s)+1 ] ;
311 void sgWriteString ( gzFile fd, const char *var )
314 if ( gzwrite ( fd, (void *)var, strlen(var) + 1 ) ==
315 (int)(strlen(var) + 1) )
323 void sgReadVec2 ( gzFile fd, sgVec2 var ) { sgReadFloat ( fd, 2, var ) ; }
324 void sgWriteVec2 ( gzFile fd, const sgVec2 var ) {
325 sgWriteFloat ( fd, 2, var ) ;
328 void sgReadVec3 ( gzFile fd, sgVec3 var ) { sgReadFloat ( fd, 3, var ) ; }
329 void sgWriteVec3 ( gzFile fd, const sgVec3 var ) {
330 sgWriteFloat ( fd, 3, var ) ;
333 void sgReaddVec3 ( gzFile fd, sgdVec3 var ) { sgReadDouble ( fd, 3, var ) ; }
334 void sgWritedVec3 ( gzFile fd, const sgdVec3 var ) {
335 sgWriteDouble ( fd, 3, var ) ;
338 void sgReadVec4 ( gzFile fd, sgVec4 var ) { sgReadFloat ( fd, 4, var ) ; }
339 void sgWriteVec4 ( gzFile fd, const sgVec4 var ) {
340 sgWriteFloat ( fd, 4, var ) ;
343 void sgReadMat4 ( gzFile fd, sgMat4 var ) {
344 sgReadFloat ( fd, 16, (float *)var ) ;
346 void sgWriteMat4 ( gzFile fd, const sgMat4 var ) {
347 sgWriteFloat ( fd, 16, (float *)var ) ;