-/*\r
-======================================================================\r
-lwio.c\r
-\r
-Functions for reading basic LWO2 data types.\r
-\r
-Ernie Wright 17 Sep 00\r
-====================================================================== */\r
-\r
-#include "../picointernal.h"\r
-#include "lwo2.h"\r
-\r
-\r
-/*\r
-======================================================================\r
-flen\r
-\r
-This accumulates a count of the number of bytes read. Callers can set\r
-it at the beginning of a sequence of reads and then retrieve it to get\r
-the number of bytes actually read. If one of the I/O functions fails,\r
-flen is set to an error code, after which the I/O functions ignore\r
-read requests until flen is reset.\r
-====================================================================== */\r
-\r
-#define INT_MIN (-2147483647 - 1) /* minimum (signed) int value */\r
-#define FLEN_ERROR INT_MIN\r
-\r
-static int flen;\r
-\r
-void set_flen( int i ) { flen = i; }\r
-\r
-int get_flen( void ) { return flen; }\r
-\r
-\r
-#ifdef _WIN32\r
-/*\r
-=====================================================================\r
-revbytes()\r
-\r
-Reverses byte order in place.\r
-\r
-INPUTS\r
- bp bytes to reverse\r
- elsize size of the underlying data type\r
- elcount number of elements to swap\r
-\r
-RESULTS\r
- Reverses the byte order in each of elcount elements.\r
-\r
-This only needs to be defined on little-endian platforms, most\r
-notably Windows. lwo2.h replaces this with a #define on big-endian\r
-platforms.\r
-===================================================================== */\r
-\r
-void revbytes( void *bp, int elsize, int elcount )\r
-{\r
- register unsigned char *p, *q;\r
-\r
- p = ( unsigned char * ) bp;\r
-\r
- if ( elsize == 2 ) {\r
- q = p + 1;\r
- while ( elcount-- ) {\r
- *p ^= *q;\r
- *q ^= *p;\r
- *p ^= *q;\r
- p += 2;\r
- q += 2;\r
- }\r
- return;\r
- }\r
-\r
- while ( elcount-- ) {\r
- q = p + elsize - 1;\r
- while ( p < q ) {\r
- *p ^= *q;\r
- *q ^= *p;\r
- *p ^= *q;\r
- ++p;\r
- --q;\r
- }\r
- p += elsize >> 1;\r
- }\r
-}\r
-#endif\r
-\r
-\r
-void *getbytes( picoMemStream_t *fp, int size )\r
-{\r
- void *data;\r
-\r
- if ( flen == FLEN_ERROR ) return NULL;\r
- if ( size < 0 ) {\r
- flen = FLEN_ERROR;\r
- return NULL;\r
- }\r
- data = _pico_alloc( size );\r
- if ( !data ) {\r
- flen = FLEN_ERROR;\r
- return NULL;\r
- }\r
- if ( 1 != _pico_memstream_read( fp, data, size )) {\r
- flen = FLEN_ERROR;\r
- _pico_free( data );\r
- return NULL;\r
- }\r
-\r
- flen += size;\r
- return data;\r
-}\r
-\r
-\r
-void skipbytes( picoMemStream_t *fp, int n )\r
-{\r
- if ( flen == FLEN_ERROR ) return;\r
- if ( _pico_memstream_seek( fp, n, PICO_SEEK_CUR ))\r
- flen = FLEN_ERROR;\r
- else\r
- flen += n;\r
-}\r
-\r
-\r
-int getI1( picoMemStream_t *fp )\r
-{\r
- int i;\r
-\r
- if ( flen == FLEN_ERROR ) return 0;\r
- i = _pico_memstream_getc( fp );\r
- if ( i < 0 ) {\r
- flen = FLEN_ERROR;\r
- return 0;\r
- }\r
- if ( i > 127 ) i -= 256;\r
- flen += 1;\r
- return i;\r
-}\r
-\r
-\r
-short getI2( picoMemStream_t *fp )\r
-{\r
- short i;\r
-\r
- if ( flen == FLEN_ERROR ) return 0;\r
- if ( 1 != _pico_memstream_read( fp, &i, 2 )) {\r
- flen = FLEN_ERROR;\r
- return 0;\r
- }\r
- revbytes( &i, 2, 1 );\r
- flen += 2;\r
- return i;\r
-}\r
-\r
-\r
-int getI4( picoMemStream_t *fp )\r
-{\r
- int i;\r
-\r
- if ( flen == FLEN_ERROR ) return 0;\r
- if ( 1 != _pico_memstream_read( fp, &i, 4 )) {\r
- flen = FLEN_ERROR;\r
- return 0;\r
- }\r
- revbytes( &i, 4, 1 );\r
- flen += 4;\r
- return i;\r
-}\r
-\r
-\r
-unsigned char getU1( picoMemStream_t *fp )\r
-{\r
- int i;\r
-\r
- if ( flen == FLEN_ERROR ) return 0;\r
- i = _pico_memstream_getc( fp );\r
- if ( i < 0 ) {\r
- flen = FLEN_ERROR;\r
- return 0;\r
- }\r
- flen += 1;\r
- return i;\r
-}\r
-\r
-\r
-unsigned short getU2( picoMemStream_t *fp )\r
-{\r
- unsigned short i;\r
-\r
- if ( flen == FLEN_ERROR ) return 0;\r
- if ( 1 != _pico_memstream_read( fp, &i, 2 )) {\r
- flen = FLEN_ERROR;\r
- return 0;\r
- }\r
- revbytes( &i, 2, 1 );\r
- flen += 2;\r
- return i;\r
-}\r
-\r
-\r
-unsigned int getU4( picoMemStream_t *fp )\r
-{\r
- unsigned int i;\r
-\r
- if ( flen == FLEN_ERROR ) return 0;\r
- if ( 1 != _pico_memstream_read( fp, &i, 4 )) {\r
- flen = FLEN_ERROR;\r
- return 0;\r
- }\r
- revbytes( &i, 4, 1 );\r
- flen += 4;\r
- return i;\r
-}\r
-\r
-\r
-int getVX( picoMemStream_t *fp )\r
-{\r
- int i, c;\r
-\r
- if ( flen == FLEN_ERROR ) return 0;\r
-\r
- c = _pico_memstream_getc( fp );\r
- if ( c != 0xFF ) {\r
- i = c << 8;\r
- c = _pico_memstream_getc( fp );\r
- i |= c;\r
- flen += 2;\r
- }\r
- else {\r
- c = _pico_memstream_getc( fp );\r
- i = c << 16;\r
- c = _pico_memstream_getc( fp );\r
- i |= c << 8;\r
- c = _pico_memstream_getc( fp );\r
- i |= c;\r
- flen += 4;\r
- }\r
-\r
- if ( _pico_memstream_error( fp )) {\r
- flen = FLEN_ERROR;\r
- return 0;\r
- }\r
- return i;\r
-}\r
-\r
-\r
-float getF4( picoMemStream_t *fp )\r
-{\r
- float f;\r
-\r
- if ( flen == FLEN_ERROR ) return 0.0f;\r
- if ( 1 != _pico_memstream_read( fp, &f, 4 )) {\r
- flen = FLEN_ERROR;\r
- return 0.0f;\r
- }\r
- revbytes( &f, 4, 1 );\r
- flen += 4;\r
- return f;\r
-}\r
-\r
-\r
-char *getS0( picoMemStream_t *fp )\r
-{\r
- char *s;\r
- int i, c, len, pos;\r
-\r
- if ( flen == FLEN_ERROR ) return NULL;\r
-\r
- pos = _pico_memstream_tell( fp );\r
- for ( i = 1; ; i++ ) {\r
- c = _pico_memstream_getc( fp );\r
- if ( c <= 0 ) break;\r
- }\r
- if ( c < 0 ) {\r
- flen = FLEN_ERROR;\r
- return NULL;\r
- }\r
-\r
- if ( i == 1 ) {\r
- if ( _pico_memstream_seek( fp, pos + 2, PICO_SEEK_SET ))\r
- flen = FLEN_ERROR;\r
- else\r
- flen += 2;\r
- return NULL;\r
- }\r
-\r
- len = i + ( i & 1 );\r
- s = _pico_alloc( len );\r
- if ( !s ) {\r
- flen = FLEN_ERROR;\r
- return NULL;\r
- }\r
-\r
- if ( _pico_memstream_seek( fp, pos, PICO_SEEK_SET )) {\r
- flen = FLEN_ERROR;\r
- return NULL;\r
- }\r
- if ( 1 != _pico_memstream_read( fp, s, len )) {\r
- flen = FLEN_ERROR;\r
- return NULL;\r
- }\r
-\r
- flen += len;\r
- return s;\r
-}\r
-\r
-\r
-int sgetI1( unsigned char **bp )\r
-{\r
- int i;\r
-\r
- if ( flen == FLEN_ERROR ) return 0;\r
- i = **bp;\r
- if ( i > 127 ) i -= 256;\r
- flen += 1;\r
- *bp++;\r
- return i;\r
-}\r
-\r
-\r
-short sgetI2( unsigned char **bp )\r
-{\r
- short i;\r
-\r
- if ( flen == FLEN_ERROR ) return 0;\r
- memcpy( &i, *bp, 2 );\r
- revbytes( &i, 2, 1 );\r
- flen += 2;\r
- *bp += 2;\r
- return i;\r
-}\r
-\r
-\r
-int sgetI4( unsigned char **bp )\r
-{\r
- int i;\r
-\r
- if ( flen == FLEN_ERROR ) return 0;\r
- memcpy( &i, *bp, 4 );\r
- revbytes( &i, 4, 1 );\r
- flen += 4;\r
- *bp += 4;\r
- return i;\r
-}\r
-\r
-\r
-unsigned char sgetU1( unsigned char **bp )\r
-{\r
- unsigned char c;\r
-\r
- if ( flen == FLEN_ERROR ) return 0;\r
- c = **bp;\r
- flen += 1;\r
- *bp++;\r
- return c;\r
-}\r
-\r
-\r
-unsigned short sgetU2( unsigned char **bp )\r
-{\r
- unsigned char *buf = *bp;\r
- unsigned short i;\r
-\r
- if ( flen == FLEN_ERROR ) return 0;\r
- i = ( buf[ 0 ] << 8 ) | buf[ 1 ];\r
- flen += 2;\r
- *bp += 2;\r
- return i;\r
-}\r
-\r
-\r
-unsigned int sgetU4( unsigned char **bp )\r
-{\r
- unsigned int i;\r
-\r
- if ( flen == FLEN_ERROR ) return 0;\r
- memcpy( &i, *bp, 4 );\r
- revbytes( &i, 4, 1 );\r
- flen += 4;\r
- *bp += 4;\r
- return i;\r
-}\r
-\r
-\r
-int sgetVX( unsigned char **bp )\r
-{\r
- unsigned char *buf = *bp;\r
- int i;\r
-\r
- if ( flen == FLEN_ERROR ) return 0;\r
-\r
- if ( buf[ 0 ] != 0xFF ) {\r
- i = buf[ 0 ] << 8 | buf[ 1 ];\r
- flen += 2;\r
- *bp += 2;\r
- }\r
- else {\r
- i = ( buf[ 1 ] << 16 ) | ( buf[ 2 ] << 8 ) | buf[ 3 ];\r
- flen += 4;\r
- *bp += 4;\r
- }\r
- return i;\r
-}\r
-\r
-\r
-float sgetF4( unsigned char **bp )\r
-{\r
- float f;\r
-\r
- if ( flen == FLEN_ERROR ) return 0.0f;\r
- memcpy( &f, *bp, 4 );\r
- revbytes( &f, 4, 1 );\r
- flen += 4;\r
- *bp += 4;\r
- return f;\r
-}\r
-\r
-\r
-char *sgetS0( unsigned char **bp )\r
-{\r
- char *s;\r
- unsigned char *buf = *bp;\r
- int len;\r
-\r
- if ( flen == FLEN_ERROR ) return NULL;\r
-\r
- len = strlen( buf ) + 1;\r
- if ( len == 1 ) {\r
- flen += 2;\r
- *bp += 2;\r
- return NULL;\r
- }\r
- len += len & 1;\r
- s = _pico_alloc( len );\r
- if ( !s ) {\r
- flen = FLEN_ERROR;\r
- return NULL;\r
- }\r
-\r
- memcpy( s, buf, len );\r
- flen += len;\r
- *bp += len;\r
- return s;\r
-}\r
+/*
+======================================================================
+lwio.c
+
+Functions for reading basic LWO2 data types.
+
+Ernie Wright 17 Sep 00
+====================================================================== */
+
+#include "../picointernal.h"
+#include "lwo2.h"
+
+
+/*
+======================================================================
+flen
+
+This accumulates a count of the number of bytes read. Callers can set
+it at the beginning of a sequence of reads and then retrieve it to get
+the number of bytes actually read. If one of the I/O functions fails,
+flen is set to an error code, after which the I/O functions ignore
+read requests until flen is reset.
+====================================================================== */
+
+#define INT_MIN (-2147483647 - 1) /* minimum (signed) int value */
+#define FLEN_ERROR INT_MIN
+
+static int flen;
+
+void set_flen( int i ) { flen = i; }
+
+int get_flen( void ) { return flen; }
+
+
+#ifdef _WIN32
+/*
+=====================================================================
+revbytes()
+
+Reverses byte order in place.
+
+INPUTS
+ bp bytes to reverse
+ elsize size of the underlying data type
+ elcount number of elements to swap
+
+RESULTS
+ Reverses the byte order in each of elcount elements.
+
+This only needs to be defined on little-endian platforms, most
+notably Windows. lwo2.h replaces this with a #define on big-endian
+platforms.
+===================================================================== */
+
+void revbytes( void *bp, int elsize, int elcount )
+{
+ register unsigned char *p, *q;
+
+ p = ( unsigned char * ) bp;
+
+ if ( elsize == 2 ) {
+ q = p + 1;
+ while ( elcount-- ) {
+ *p ^= *q;
+ *q ^= *p;
+ *p ^= *q;
+ p += 2;
+ q += 2;
+ }
+ return;
+ }
+
+ while ( elcount-- ) {
+ q = p + elsize - 1;
+ while ( p < q ) {
+ *p ^= *q;
+ *q ^= *p;
+ *p ^= *q;
+ ++p;
+ --q;
+ }
+ p += elsize >> 1;
+ }
+}
+#endif
+
+
+void *getbytes( picoMemStream_t *fp, int size )
+{
+ void *data;
+
+ if ( flen == FLEN_ERROR ) return NULL;
+ if ( size < 0 ) {
+ flen = FLEN_ERROR;
+ return NULL;
+ }
+ data = _pico_alloc( size );
+ if ( !data ) {
+ flen = FLEN_ERROR;
+ return NULL;
+ }
+ if ( 1 != _pico_memstream_read( fp, data, size )) {
+ flen = FLEN_ERROR;
+ _pico_free( data );
+ return NULL;
+ }
+
+ flen += size;
+ return data;
+}
+
+
+void skipbytes( picoMemStream_t *fp, int n )
+{
+ if ( flen == FLEN_ERROR ) return;
+ if ( _pico_memstream_seek( fp, n, PICO_SEEK_CUR ))
+ flen = FLEN_ERROR;
+ else
+ flen += n;
+}
+
+
+int getI1( picoMemStream_t *fp )
+{
+ int i;
+
+ if ( flen == FLEN_ERROR ) return 0;
+ i = _pico_memstream_getc( fp );
+ if ( i < 0 ) {
+ flen = FLEN_ERROR;
+ return 0;
+ }
+ if ( i > 127 ) i -= 256;
+ flen += 1;
+ return i;
+}
+
+
+short getI2( picoMemStream_t *fp )
+{
+ short i;
+
+ if ( flen == FLEN_ERROR ) return 0;
+ if ( 1 != _pico_memstream_read( fp, &i, 2 )) {
+ flen = FLEN_ERROR;
+ return 0;
+ }
+ revbytes( &i, 2, 1 );
+ flen += 2;
+ return i;
+}
+
+
+int getI4( picoMemStream_t *fp )
+{
+ int i;
+
+ if ( flen == FLEN_ERROR ) return 0;
+ if ( 1 != _pico_memstream_read( fp, &i, 4 )) {
+ flen = FLEN_ERROR;
+ return 0;
+ }
+ revbytes( &i, 4, 1 );
+ flen += 4;
+ return i;
+}
+
+
+unsigned char getU1( picoMemStream_t *fp )
+{
+ int i;
+
+ if ( flen == FLEN_ERROR ) return 0;
+ i = _pico_memstream_getc( fp );
+ if ( i < 0 ) {
+ flen = FLEN_ERROR;
+ return 0;
+ }
+ flen += 1;
+ return i;
+}
+
+
+unsigned short getU2( picoMemStream_t *fp )
+{
+ unsigned short i;
+
+ if ( flen == FLEN_ERROR ) return 0;
+ if ( 1 != _pico_memstream_read( fp, &i, 2 )) {
+ flen = FLEN_ERROR;
+ return 0;
+ }
+ revbytes( &i, 2, 1 );
+ flen += 2;
+ return i;
+}
+
+
+unsigned int getU4( picoMemStream_t *fp )
+{
+ unsigned int i;
+
+ if ( flen == FLEN_ERROR ) return 0;
+ if ( 1 != _pico_memstream_read( fp, &i, 4 )) {
+ flen = FLEN_ERROR;
+ return 0;
+ }
+ revbytes( &i, 4, 1 );
+ flen += 4;
+ return i;
+}
+
+
+int getVX( picoMemStream_t *fp )
+{
+ int i, c;
+
+ if ( flen == FLEN_ERROR ) return 0;
+
+ c = _pico_memstream_getc( fp );
+ if ( c != 0xFF ) {
+ i = c << 8;
+ c = _pico_memstream_getc( fp );
+ i |= c;
+ flen += 2;
+ }
+ else {
+ c = _pico_memstream_getc( fp );
+ i = c << 16;
+ c = _pico_memstream_getc( fp );
+ i |= c << 8;
+ c = _pico_memstream_getc( fp );
+ i |= c;
+ flen += 4;
+ }
+
+ if ( _pico_memstream_error( fp )) {
+ flen = FLEN_ERROR;
+ return 0;
+ }
+ return i;
+}
+
+
+float getF4( picoMemStream_t *fp )
+{
+ float f;
+
+ if ( flen == FLEN_ERROR ) return 0.0f;
+ if ( 1 != _pico_memstream_read( fp, &f, 4 )) {
+ flen = FLEN_ERROR;
+ return 0.0f;
+ }
+ revbytes( &f, 4, 1 );
+ flen += 4;
+ return f;
+}
+
+
+char *getS0( picoMemStream_t *fp )
+{
+ char *s;
+ int i, c, len, pos;
+
+ if ( flen == FLEN_ERROR ) return NULL;
+
+ pos = _pico_memstream_tell( fp );
+ for ( i = 1; ; i++ ) {
+ c = _pico_memstream_getc( fp );
+ if ( c <= 0 ) break;
+ }
+ if ( c < 0 ) {
+ flen = FLEN_ERROR;
+ return NULL;
+ }
+
+ if ( i == 1 ) {
+ if ( _pico_memstream_seek( fp, pos + 2, PICO_SEEK_SET ))
+ flen = FLEN_ERROR;
+ else
+ flen += 2;
+ return NULL;
+ }
+
+ len = i + ( i & 1 );
+ s = _pico_alloc( len );
+ if ( !s ) {
+ flen = FLEN_ERROR;
+ return NULL;
+ }
+
+ if ( _pico_memstream_seek( fp, pos, PICO_SEEK_SET )) {
+ flen = FLEN_ERROR;
+ return NULL;
+ }
+ if ( 1 != _pico_memstream_read( fp, s, len )) {
+ flen = FLEN_ERROR;
+ return NULL;
+ }
+
+ flen += len;
+ return s;
+}
+
+
+int sgetI1( unsigned char **bp )
+{
+ int i;
+
+ if ( flen == FLEN_ERROR ) return 0;
+ i = **bp;
+ if ( i > 127 ) i -= 256;
+ flen += 1;
+ *bp++;
+ return i;
+}
+
+
+short sgetI2( unsigned char **bp )
+{
+ short i;
+
+ if ( flen == FLEN_ERROR ) return 0;
+ memcpy( &i, *bp, 2 );
+ revbytes( &i, 2, 1 );
+ flen += 2;
+ *bp += 2;
+ return i;
+}
+
+
+int sgetI4( unsigned char **bp )
+{
+ int i;
+
+ if ( flen == FLEN_ERROR ) return 0;
+ memcpy( &i, *bp, 4 );
+ revbytes( &i, 4, 1 );
+ flen += 4;
+ *bp += 4;
+ return i;
+}
+
+
+unsigned char sgetU1( unsigned char **bp )
+{
+ unsigned char c;
+
+ if ( flen == FLEN_ERROR ) return 0;
+ c = **bp;
+ flen += 1;
+ *bp++;
+ return c;
+}
+
+
+unsigned short sgetU2( unsigned char **bp )
+{
+ unsigned char *buf = *bp;
+ unsigned short i;
+
+ if ( flen == FLEN_ERROR ) return 0;
+ i = ( buf[ 0 ] << 8 ) | buf[ 1 ];
+ flen += 2;
+ *bp += 2;
+ return i;
+}
+
+
+unsigned int sgetU4( unsigned char **bp )
+{
+ unsigned int i;
+
+ if ( flen == FLEN_ERROR ) return 0;
+ memcpy( &i, *bp, 4 );
+ revbytes( &i, 4, 1 );
+ flen += 4;
+ *bp += 4;
+ return i;
+}
+
+
+int sgetVX( unsigned char **bp )
+{
+ unsigned char *buf = *bp;
+ int i;
+
+ if ( flen == FLEN_ERROR ) return 0;
+
+ if ( buf[ 0 ] != 0xFF ) {
+ i = buf[ 0 ] << 8 | buf[ 1 ];
+ flen += 2;
+ *bp += 2;
+ }
+ else {
+ i = ( buf[ 1 ] << 16 ) | ( buf[ 2 ] << 8 ) | buf[ 3 ];
+ flen += 4;
+ *bp += 4;
+ }
+ return i;
+}
+
+
+float sgetF4( unsigned char **bp )
+{
+ float f;
+
+ if ( flen == FLEN_ERROR ) return 0.0f;
+ memcpy( &f, *bp, 4 );
+ revbytes( &f, 4, 1 );
+ flen += 4;
+ *bp += 4;
+ return f;
+}
+
+
+char *sgetS0( unsigned char **bp )
+{
+ char *s;
+ unsigned char *buf = *bp;
+ int len;
+
+ if ( flen == FLEN_ERROR ) return NULL;
+
+ len = strlen( buf ) + 1;
+ if ( len == 1 ) {
+ flen += 2;
+ *bp += 2;
+ return NULL;
+ }
+ len += len & 1;
+ s = _pico_alloc( len );
+ if ( !s ) {
+ flen = FLEN_ERROR;
+ return NULL;
+ }
+
+ memcpy( s, buf, len );
+ flen += len;
+ *bp += len;
+ return s;
+}