]> de.git.xonotic.org Git - xonotic/netradiant.git/blobdiff - libs/picomodel/lwo/lwio.c
eol style
[xonotic/netradiant.git] / libs / picomodel / lwo / lwio.c
index eea380bf8e990d58c5723b60d6db6c7990bba024..ec74932f4a494d539d602552464aa5bd6ba94847 100644 (file)
-/*\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;
+}