2 ======================================================================
\r
5 Functions for reading basic LWO2 data types.
\r
7 Ernie Wright 17 Sep 00
\r
8 ====================================================================== */
\r
10 #include "../picointernal.h"
\r
15 ======================================================================
\r
18 This accumulates a count of the number of bytes read. Callers can set
\r
19 it at the beginning of a sequence of reads and then retrieve it to get
\r
20 the number of bytes actually read. If one of the I/O functions fails,
\r
21 flen is set to an error code, after which the I/O functions ignore
\r
22 read requests until flen is reset.
\r
23 ====================================================================== */
\r
25 #define INT_MIN (-2147483647 - 1) /* minimum (signed) int value */
\r
26 #define FLEN_ERROR INT_MIN
\r
30 void set_flen( int i ) { flen = i; }
\r
32 int get_flen( void ) { return flen; }
\r
37 =====================================================================
\r
40 Reverses byte order in place.
\r
44 elsize size of the underlying data type
\r
45 elcount number of elements to swap
\r
48 Reverses the byte order in each of elcount elements.
\r
50 This only needs to be defined on little-endian platforms, most
\r
51 notably Windows. lwo2.h replaces this with a #define on big-endian
\r
53 ===================================================================== */
\r
55 void revbytes( void *bp, int elsize, int elcount )
\r
57 register unsigned char *p, *q;
\r
59 p = ( unsigned char * ) bp;
\r
61 if ( elsize == 2 ) {
\r
63 while ( elcount-- ) {
\r
73 while ( elcount-- ) {
\r
88 void *getbytes( picoMemStream_t *fp, int size )
\r
92 if ( flen == FLEN_ERROR ) return NULL;
\r
97 data = _pico_alloc( size );
\r
102 if ( 1 != _pico_memstream_read( fp, data, size )) {
\r
104 _pico_free( data );
\r
113 void skipbytes( picoMemStream_t *fp, int n )
\r
115 if ( flen == FLEN_ERROR ) return;
\r
116 if ( _pico_memstream_seek( fp, n, PICO_SEEK_CUR ))
\r
123 int getI1( picoMemStream_t *fp )
\r
127 if ( flen == FLEN_ERROR ) return 0;
\r
128 i = _pico_memstream_getc( fp );
\r
133 if ( i > 127 ) i -= 256;
\r
139 short getI2( picoMemStream_t *fp )
\r
143 if ( flen == FLEN_ERROR ) return 0;
\r
144 if ( 1 != _pico_memstream_read( fp, &i, 2 )) {
\r
148 revbytes( &i, 2, 1 );
\r
154 int getI4( picoMemStream_t *fp )
\r
158 if ( flen == FLEN_ERROR ) return 0;
\r
159 if ( 1 != _pico_memstream_read( fp, &i, 4 )) {
\r
163 revbytes( &i, 4, 1 );
\r
169 unsigned char getU1( picoMemStream_t *fp )
\r
173 if ( flen == FLEN_ERROR ) return 0;
\r
174 i = _pico_memstream_getc( fp );
\r
184 unsigned short getU2( picoMemStream_t *fp )
\r
188 if ( flen == FLEN_ERROR ) return 0;
\r
189 if ( 1 != _pico_memstream_read( fp, &i, 2 )) {
\r
193 revbytes( &i, 2, 1 );
\r
199 unsigned int getU4( picoMemStream_t *fp )
\r
203 if ( flen == FLEN_ERROR ) return 0;
\r
204 if ( 1 != _pico_memstream_read( fp, &i, 4 )) {
\r
208 revbytes( &i, 4, 1 );
\r
214 int getVX( picoMemStream_t *fp )
\r
218 if ( flen == FLEN_ERROR ) return 0;
\r
220 c = _pico_memstream_getc( fp );
\r
223 c = _pico_memstream_getc( fp );
\r
228 c = _pico_memstream_getc( fp );
\r
230 c = _pico_memstream_getc( fp );
\r
232 c = _pico_memstream_getc( fp );
\r
237 if ( _pico_memstream_error( fp )) {
\r
245 float getF4( picoMemStream_t *fp )
\r
249 if ( flen == FLEN_ERROR ) return 0.0f;
\r
250 if ( 1 != _pico_memstream_read( fp, &f, 4 )) {
\r
254 revbytes( &f, 4, 1 );
\r
260 char *getS0( picoMemStream_t *fp )
\r
263 int i, c, len, pos;
\r
265 if ( flen == FLEN_ERROR ) return NULL;
\r
267 pos = _pico_memstream_tell( fp );
\r
268 for ( i = 1; ; i++ ) {
\r
269 c = _pico_memstream_getc( fp );
\r
270 if ( c <= 0 ) break;
\r
278 if ( _pico_memstream_seek( fp, pos + 2, PICO_SEEK_SET ))
\r
285 len = i + ( i & 1 );
\r
286 s = _pico_alloc( len );
\r
292 if ( _pico_memstream_seek( fp, pos, PICO_SEEK_SET )) {
\r
296 if ( 1 != _pico_memstream_read( fp, s, len )) {
\r
306 int sgetI1( unsigned char **bp )
\r
310 if ( flen == FLEN_ERROR ) return 0;
\r
312 if ( i > 127 ) i -= 256;
\r
319 short sgetI2( unsigned char **bp )
\r
323 if ( flen == FLEN_ERROR ) return 0;
\r
324 memcpy( &i, *bp, 2 );
\r
325 revbytes( &i, 2, 1 );
\r
332 int sgetI4( unsigned char **bp )
\r
336 if ( flen == FLEN_ERROR ) return 0;
\r
337 memcpy( &i, *bp, 4 );
\r
338 revbytes( &i, 4, 1 );
\r
345 unsigned char sgetU1( unsigned char **bp )
\r
349 if ( flen == FLEN_ERROR ) return 0;
\r
357 unsigned short sgetU2( unsigned char **bp )
\r
359 unsigned char *buf = *bp;
\r
362 if ( flen == FLEN_ERROR ) return 0;
\r
363 i = ( buf[ 0 ] << 8 ) | buf[ 1 ];
\r
370 unsigned int sgetU4( unsigned char **bp )
\r
374 if ( flen == FLEN_ERROR ) return 0;
\r
375 memcpy( &i, *bp, 4 );
\r
376 revbytes( &i, 4, 1 );
\r
383 int sgetVX( unsigned char **bp )
\r
385 unsigned char *buf = *bp;
\r
388 if ( flen == FLEN_ERROR ) return 0;
\r
390 if ( buf[ 0 ] != 0xFF ) {
\r
391 i = buf[ 0 ] << 8 | buf[ 1 ];
\r
396 i = ( buf[ 1 ] << 16 ) | ( buf[ 2 ] << 8 ) | buf[ 3 ];
\r
404 float sgetF4( unsigned char **bp )
\r
408 if ( flen == FLEN_ERROR ) return 0.0f;
\r
409 memcpy( &f, *bp, 4 );
\r
410 revbytes( &f, 4, 1 );
\r
417 char *sgetS0( unsigned char **bp )
\r
420 unsigned char *buf = *bp;
\r
423 if ( flen == FLEN_ERROR ) return NULL;
\r
425 len = strlen( buf ) + 1;
\r
432 s = _pico_alloc( len );
\r
438 memcpy( s, buf, len );
\r