1 // lowlevel.cxx -- 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"
29 static int read_error = false ;
30 static int write_error = false ;
32 void sgClearReadError() { read_error = false; }
33 void sgClearWriteError() { write_error = false; }
34 int sgReadError() { return read_error ; }
35 int sgWriteError() { return write_error ; }
38 void sgReadChar ( gzFile fd, char *var )
40 if ( gzread ( fd, var, sizeof(char) ) != sizeof(char) ) {
46 void sgWriteChar ( gzFile fd, const char var )
48 if ( gzwrite ( fd, (void *)(&var), sizeof(char) ) != sizeof(char) ) {
54 void sgReadFloat ( gzFile fd, float *var )
56 if ( gzread ( fd, var, sizeof(float) ) != sizeof(float) ) {
59 if ( sgIsBigEndian() ) {
60 sgEndianSwap( (unsigned int*)var);
65 void sgWriteFloat ( gzFile fd, const float var )
67 if ( sgIsBigEndian() ) {
68 sgEndianSwap( (unsigned int*)&var);
70 if ( gzwrite ( fd, (void *)(&var), sizeof(float) ) != sizeof(float) ) {
76 void sgReadDouble ( gzFile fd, double *var )
78 if ( gzread ( fd, var, sizeof(double) ) != sizeof(double) ) {
81 if ( sgIsBigEndian() ) {
82 sgEndianSwap( (unsigned long long*)var);
87 void sgWriteDouble ( gzFile fd, const double var )
89 if ( sgIsBigEndian() ) {
90 sgEndianSwap( (unsigned long long*)&var);
92 if ( gzwrite ( fd, (void *)(&var), sizeof(double) ) != sizeof(double) ) {
98 void sgReadUInt ( gzFile fd, unsigned int *var )
100 if ( gzread ( fd, var, sizeof(unsigned int) ) != sizeof(unsigned int) ) {
103 if ( sgIsBigEndian() ) {
104 sgEndianSwap( (unsigned int*)var);
109 void sgWriteUInt ( gzFile fd, const unsigned int var )
111 if ( sgIsBigEndian() ) {
112 sgEndianSwap( (unsigned int*)&var);
114 if ( gzwrite ( fd, (void *)(&var), sizeof(unsigned int) )
115 != sizeof(unsigned int) )
122 void sgReadInt ( gzFile fd, int *var )
124 if ( gzread ( fd, var, sizeof(int) ) != sizeof(int) ) {
127 if ( sgIsBigEndian() ) {
128 sgEndianSwap( (unsigned int*)var);
133 void sgWriteInt ( gzFile fd, const int var )
135 if ( sgIsBigEndian() ) {
136 sgEndianSwap( (unsigned int*)&var);
138 if ( gzwrite ( fd, (void *)(&var), sizeof(int) ) != sizeof(int) ) {
144 void sgReadLong ( gzFile fd, long int *var )
146 if ( gzread ( fd, var, sizeof(long int) ) != sizeof(long int) ) {
149 if ( sgIsBigEndian() ) {
150 sgEndianSwap( (unsigned int*)var);
155 void sgWriteLong ( gzFile fd, const long int var )
157 if ( sgIsBigEndian() ) {
158 sgEndianSwap( (unsigned int*)&var);
160 if ( gzwrite ( fd, (void *)(&var), sizeof(long int) )
161 != sizeof(long int) )
168 void sgReadLongLong ( gzFile fd, long long int *var )
170 if ( gzread ( fd, var, sizeof(long long int) ) != sizeof(long long int) ) {
173 if ( sgIsBigEndian() ) {
174 sgEndianSwap( (unsigned long long int*)var);
179 void sgWriteLongLong ( gzFile fd, const long long int var )
181 if ( sgIsBigEndian() ) {
182 sgEndianSwap( (unsigned long long*)&var);
184 if ( gzwrite ( fd, (void *)(&var), sizeof(long long int) )
185 != sizeof(long long int) )
192 void sgReadUShort ( gzFile fd, unsigned short *var )
194 if ( gzread ( fd, var, sizeof(unsigned short) ) != sizeof(unsigned short) ){
197 if ( sgIsBigEndian() ) {
198 sgEndianSwap( (unsigned short int*)var);
203 void sgWriteUShort ( gzFile fd, const unsigned short var )
205 if ( sgIsBigEndian() ) {
206 sgEndianSwap( (unsigned short*)&var);
208 if ( gzwrite ( fd, (void *)(&var), sizeof(unsigned short) )
209 != sizeof(unsigned short) )
216 void sgReadShort ( gzFile fd, short *var )
218 if ( gzread ( fd, var, sizeof(short) ) != sizeof(short) ) {
221 if ( sgIsBigEndian() ) {
222 sgEndianSwap( (unsigned short int*)var);
227 void sgWriteShort ( gzFile fd, const short var )
229 if ( sgIsBigEndian() ) {
230 sgEndianSwap( (unsigned short*)&var);
232 if ( gzwrite ( fd, (void *)(&var), sizeof(short) ) != sizeof(short) ) {
238 void sgReadFloat ( gzFile fd, const unsigned int n, float *var )
240 if ( gzread ( fd, var, sizeof(float) * n ) != (int)(sizeof(float) * n) ) {
243 if ( sgIsBigEndian() ) {
244 for ( unsigned int i = 0; i < n; ++i ) {
245 sgEndianSwap( (unsigned int*)var++);
251 void sgWriteFloat ( gzFile fd, const unsigned int n, const float *var )
253 if ( sgIsBigEndian() ) {
254 float *swab = new float[n];
256 memcpy( swab, var, sizeof(float) * n );
257 for ( unsigned int i = 0; i < n; ++i ) {
258 sgEndianSwap( (unsigned int*)ptr++);
262 if ( gzwrite ( fd, (void *)var, sizeof(float) * n )
263 != (int)(sizeof(float) * n) )
269 void sgReadDouble ( gzFile fd, const unsigned int n, double *var )
271 if ( gzread ( fd, var, sizeof(double) * n ) != (int)(sizeof(double) * n) ) {
274 if ( sgIsBigEndian() ) {
275 for ( unsigned int i = 0; i < n; ++i ) {
276 sgEndianSwap( (unsigned long long*)var++);
282 void sgWriteDouble ( gzFile fd, const unsigned int n, const double *var )
284 if ( sgIsBigEndian() ) {
285 double *swab = new double[n];
287 memcpy( swab, var, sizeof(double) * n );
288 for ( unsigned int i = 0; i < n; ++i ) {
289 sgEndianSwap( (unsigned long long*)ptr++);
293 if ( gzwrite ( fd, (void *)var, sizeof(double) * n )
294 != (int)(sizeof(double) * n) )
300 void sgReadBytes ( gzFile fd, const unsigned int n, void *var )
303 if ( gzread ( fd, var, n ) != (int)n ) {
308 void sgWriteBytes ( gzFile fd, const unsigned int n, const void *var )
311 if ( gzwrite ( fd, (void *)var, n ) != (int)n ) {
317 void sgReadUShort ( gzFile fd, const unsigned int n, unsigned short *var )
319 if ( gzread ( fd, var, sizeof(unsigned short) * n )
320 != (int)(sizeof(unsigned short) * n) )
324 if ( sgIsBigEndian() ) {
325 for ( unsigned int i = 0; i < n; ++i ) {
326 sgEndianSwap( (unsigned short int*)var++);
332 void sgWriteUShort ( gzFile fd, const unsigned int n, const unsigned short *var )
334 if ( sgIsBigEndian() ) {
335 unsigned short *swab = new unsigned short[n];
336 unsigned short *ptr = swab;
337 memcpy( swab, var, sizeof(unsigned short) * n );
338 for ( unsigned int i = 0; i < n; ++i ) {
339 sgEndianSwap( (unsigned short*)ptr++);
343 if ( gzwrite ( fd, (void *)var, sizeof(unsigned short) * n )
344 != (int)(sizeof(unsigned short) * n) )
352 void sgReadShort ( gzFile fd, const unsigned int n, short *var )
354 if ( gzread ( fd, var, sizeof(short) * n )
355 != (int)(sizeof(short) * n) )
359 if ( sgIsBigEndian() ) {
360 for ( unsigned int i = 0; i < n; ++i ) {
361 sgEndianSwap( (unsigned short int*)var++);
367 void sgWriteShort ( gzFile fd, const unsigned int n, const short *var )
369 if ( sgIsBigEndian() ) {
370 short *swab = new short[n];
372 memcpy( swab, var, sizeof(short) * n );
373 for ( unsigned int i = 0; i < n; ++i ) {
374 sgEndianSwap( (unsigned short*)ptr++);
378 if ( gzwrite ( fd, (void *)var, sizeof(short) * n )
379 != (int)(sizeof(short) * n) )
386 void sgReadUInt ( gzFile fd, const unsigned int n, unsigned int *var )
388 if ( gzread ( fd, var, sizeof(unsigned int) * n )
389 != (int)(sizeof(unsigned int) * n) )
393 if ( sgIsBigEndian() ) {
394 for ( unsigned int i = 0; i < n; ++i ) {
395 sgEndianSwap( (unsigned int*)var++);
401 void sgWriteUInt ( gzFile fd, const unsigned int n, const unsigned int *var )
403 if ( sgIsBigEndian() ) {
404 unsigned int *swab = new unsigned int[n];
405 unsigned int *ptr = swab;
406 memcpy( swab, var, sizeof(unsigned int) * n );
407 for ( unsigned int i = 0; i < n; ++i ) {
408 sgEndianSwap( (unsigned int*)ptr++);
412 if ( gzwrite ( fd, (void *)var, sizeof(unsigned int) * n )
413 != (int)(sizeof(unsigned int) * n) )
421 void sgReadInt ( gzFile fd, const unsigned int n, int *var )
423 if ( gzread ( fd, var, sizeof(int) * n )
424 != (int)(sizeof(int) * n) )
428 if ( sgIsBigEndian() ) {
429 for ( unsigned int i = 0; i < n; ++i ) {
430 sgEndianSwap( (unsigned int*)var++);
436 void sgWriteInt ( gzFile fd, const unsigned int n, const int *var )
438 if ( sgIsBigEndian() ) {
439 int *swab = new int[n];
441 memcpy( swab, var, sizeof(int) * n );
442 for ( unsigned int i = 0; i < n; ++i ) {
443 sgEndianSwap( (unsigned int*)ptr++);
447 if ( gzwrite ( fd, (void *)var, sizeof(int) * n )
448 != (int)(sizeof(int) * n) )
456 #define MAX_ENTITY_NAME_LENGTH 1024
458 void sgReadString ( gzFile fd, char **var )
461 char s [ MAX_ENTITY_NAME_LENGTH ] ;
463 for ( i = 0 ; i < MAX_ENTITY_NAME_LENGTH ; i++ ) {
464 int c = gzgetc ( fd ) ;
471 if ( i >= MAX_ENTITY_NAME_LENGTH-1 )
472 s [ MAX_ENTITY_NAME_LENGTH-1 ] = '\0' ;
478 *var = new char [ strlen(s)+1 ] ;
484 void sgWriteString ( gzFile fd, const char *var )
487 if ( gzwrite ( fd, (void *)var, strlen(var) + 1 ) ==
488 (int)(strlen(var) + 1) )