X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fnetradiant.git;a=blobdiff_plain;f=libs%2Fpicomodel%2Flwo%2Flwio.c;h=0964273e747f926c3b8087a80eb66380f1e9f0f9;hp=9853c55a3db80a9ac7888ffad8deaa713d1a048a;hb=dac8329952745dbb494bad1c301e44bab05ec0db;hpb=12b372f89ce109a4db9d510884fbe7d05af79870 diff --git a/libs/picomodel/lwo/lwio.c b/libs/picomodel/lwo/lwio.c index 9853c55a..0964273e 100644 --- a/libs/picomodel/lwo/lwio.c +++ b/libs/picomodel/lwo/lwio.c @@ -1,28 +1,28 @@ /* -====================================================================== -lwio.c + ====================================================================== + lwio.c -Functions for reading basic LWO2 data types. + Functions for reading basic LWO2 data types. -Ernie Wright 17 Sep 00 -====================================================================== */ + Ernie Wright 17 Sep 00 + ====================================================================== */ #include "../picointernal.h" #include "lwo2.h" /* -====================================================================== -flen + ====================================================================== + 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. -====================================================================== */ + 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 INT_MIN ( -2147483647 - 1 ) /* minimum (signed) int value */ #define FLEN_ERROR INT_MIN static int flen; @@ -34,409 +34,438 @@ int get_flen( void ) { return flen; } #ifndef __BIG_ENDIAN__ /* -===================================================================== -revbytes() + ===================================================================== + revbytes() -Reverses byte order in place. + Reverses byte order in place. -INPUTS + INPUTS bp bytes to reverse elsize size of the underlying data type elcount number of elements to swap -RESULTS + 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; - } + 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 *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; +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; +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; +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; + 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; +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; + 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; +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; + 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; +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; + 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; +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; + 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; +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; +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; + 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; +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; +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; + 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; +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; + 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; +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; + 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; +unsigned char sgetU1( unsigned char **bp ){ + unsigned char c; - if ( flen == FLEN_ERROR ) return 0; - c = **bp; - flen += 1; - *bp++; - return 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; +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; + 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; +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; + 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; +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; +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; + 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; +char *sgetS0( unsigned char **bp ){ + char *s; + unsigned char *buf = *bp; + int len; + + if ( flen == FLEN_ERROR ) { + return NULL; + } + + len = strlen( (const char *) 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; }