aboutsummaryrefslogtreecommitdiff
path: root/src/bitwise.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/bitwise.c')
-rw-r--r--src/bitwise.c467
1 files changed, 366 insertions, 101 deletions
diff --git a/src/bitwise.c b/src/bitwise.c
index e800901..f5ef791 100644
--- a/src/bitwise.c
+++ b/src/bitwise.c
@@ -5,13 +5,12 @@
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
* *
- * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2010 *
+ * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2014 *
* by the Xiph.Org Foundation http://www.xiph.org/ *
* *
********************************************************************
function: packing variable sized words into an octet stream
- last mod: $Id: bitwise.c 16993 2010-03-21 23:15:46Z xiphmont $
********************************************************************/
@@ -20,6 +19,7 @@
#include <string.h>
#include <stdlib.h>
+#include <limits.h>
#include <ogg/ogg.h>
#define BUFFER_INCREMENT 256
@@ -80,24 +80,23 @@ void oggpackB_writetrunc(oggpack_buffer *b,long bits){
/* Takes only up to 32 bits. */
void oggpack_write(oggpack_buffer *b,unsigned long value,int bits){
- if(b->endbyte+4>=b->storage){
+ if(bits<0 || bits>32) goto err;
+ if(b->endbyte>=b->storage-4){
void *ret;
if(!b->ptr)return;
+ if(b->storage>LONG_MAX-BUFFER_INCREMENT) goto err;
ret=_ogg_realloc(b->buffer,b->storage+BUFFER_INCREMENT);
- if(!ret){
- oggpack_writeclear(b);
- return;
- }
+ if(!ret) goto err;
b->buffer=ret;
b->storage+=BUFFER_INCREMENT;
b->ptr=b->buffer+b->endbyte;
}
- value&=mask[bits];
+ value&=mask[bits];
bits+=b->endbit;
- b->ptr[0]|=value<<b->endbit;
-
+ b->ptr[0]|=value<<b->endbit;
+
if(bits>=8){
b->ptr[1]=(unsigned char)(value>>(8-b->endbit));
if(bits>=16){
@@ -117,28 +116,30 @@ void oggpack_write(oggpack_buffer *b,unsigned long value,int bits){
b->endbyte+=bits/8;
b->ptr+=bits/8;
b->endbit=bits&7;
+ return;
+ err:
+ oggpack_writeclear(b);
}
/* Takes only up to 32 bits. */
void oggpackB_write(oggpack_buffer *b,unsigned long value,int bits){
- if(b->endbyte+4>=b->storage){
+ if(bits<0 || bits>32) goto err;
+ if(b->endbyte>=b->storage-4){
void *ret;
if(!b->ptr)return;
+ if(b->storage>LONG_MAX-BUFFER_INCREMENT) goto err;
ret=_ogg_realloc(b->buffer,b->storage+BUFFER_INCREMENT);
- if(!ret){
- oggpack_writeclear(b);
- return;
- }
+ if(!ret) goto err;
b->buffer=ret;
b->storage+=BUFFER_INCREMENT;
b->ptr=b->buffer+b->endbyte;
}
- value=(value&mask[bits])<<(32-bits);
+ value=(value&mask[bits])<<(32-bits);
bits+=b->endbit;
- b->ptr[0]|=value>>(24+b->endbit);
-
+ b->ptr[0]|=value>>(24+b->endbit);
+
if(bits>=8){
b->ptr[1]=(unsigned char)(value>>(16+b->endbit));
if(bits>=16){
@@ -158,6 +159,9 @@ void oggpackB_write(oggpack_buffer *b,unsigned long value,int bits){
b->endbyte+=bits/8;
b->ptr+=bits/8;
b->endbit=bits&7;
+ return;
+ err:
+ oggpack_writeclear(b);
}
void oggpack_writealign(oggpack_buffer *b){
@@ -182,40 +186,45 @@ static void oggpack_writecopy_helper(oggpack_buffer *b,
unsigned char *ptr=(unsigned char *)source;
long bytes=bits/8;
+ long pbytes=(b->endbit+bits)/8;
bits-=bytes*8;
+ /* expand storage up-front */
+ if(b->endbyte+pbytes>=b->storage){
+ void *ret;
+ if(!b->ptr) goto err;
+ if(b->storage>b->endbyte+pbytes+BUFFER_INCREMENT) goto err;
+ b->storage=b->endbyte+pbytes+BUFFER_INCREMENT;
+ ret=_ogg_realloc(b->buffer,b->storage);
+ if(!ret) goto err;
+ b->buffer=ret;
+ b->ptr=b->buffer+b->endbyte;
+ }
+
+ /* copy whole octets */
if(b->endbit){
int i;
/* unaligned copy. Do it the hard way. */
for(i=0;i<bytes;i++)
- w(b,(unsigned long)(ptr[i]),8);
+ w(b,(unsigned long)(ptr[i]),8);
}else{
/* aligned block copy */
- if(b->endbyte+bytes+1>=b->storage){
- void *ret;
- if(!b->ptr)return;
- b->storage=b->endbyte+bytes+BUFFER_INCREMENT;
- ret=_ogg_realloc(b->buffer,b->storage);
- if(!ret){
- oggpack_writeclear(b);
- return;
- }
- b->buffer=ret;
- b->ptr=b->buffer+b->endbyte;
- }
-
memmove(b->ptr,source,bytes);
b->ptr+=bytes;
b->endbyte+=bytes;
*b->ptr=0;
-
}
+
+ /* copy trailing bits */
if(bits){
if(msb)
- w(b,(unsigned long)(ptr[bytes]>>(8-bits)),bits);
+ w(b,(unsigned long)(ptr[bytes]>>(8-bits)),bits);
else
- w(b,(unsigned long)(ptr[bytes]),bits);
+ w(b,(unsigned long)(ptr[bytes]),bits);
}
+ return;
+ err:
+ oggpack_writeclear(b);
}
void oggpack_writecopy(oggpack_buffer *b,void *source,long bits){
@@ -259,22 +268,27 @@ void oggpackB_readinit(oggpack_buffer *b,unsigned char *buf,int bytes){
/* Read in bits without advancing the bitptr; bits <= 32 */
long oggpack_look(oggpack_buffer *b,int bits){
unsigned long ret;
- unsigned long m=mask[bits];
+ unsigned long m;
+ if(bits<0 || bits>32) return -1;
+ m=mask[bits];
bits+=b->endbit;
- if(b->endbyte+4>=b->storage){
+ if(b->endbyte >= b->storage-4){
/* not the main path */
- if(b->endbyte*8+bits>b->storage*8)return(-1);
+ if(b->endbyte > b->storage-((bits+7)>>3)) return -1;
+ /* special case to avoid reading b->ptr[0], which might be past the end of
+ the buffer; also skips some useless accounting */
+ else if(!bits)return(0L);
}
-
+
ret=b->ptr[0]>>b->endbit;
if(bits>8){
- ret|=b->ptr[1]<<(8-b->endbit);
+ ret|=b->ptr[1]<<(8-b->endbit);
if(bits>16){
- ret|=b->ptr[2]<<(16-b->endbit);
+ ret|=b->ptr[2]<<(16-b->endbit);
if(bits>24){
- ret|=b->ptr[3]<<(24-b->endbit);
+ ret|=b->ptr[3]<<(24-b->endbit);
if(bits>32 && b->endbit)
ret|=b->ptr[4]<<(32-b->endbit);
}
@@ -288,20 +302,24 @@ long oggpackB_look(oggpack_buffer *b,int bits){
unsigned long ret;
int m=32-bits;
+ if(m<0 || m>32) return -1;
bits+=b->endbit;
- if(b->endbyte+4>=b->storage){
+ if(b->endbyte >= b->storage-4){
/* not the main path */
- if(b->endbyte*8+bits>b->storage*8)return(-1);
+ if(b->endbyte > b->storage-((bits+7)>>3)) return -1;
+ /* special case to avoid reading b->ptr[0], which might be past the end of
+ the buffer; also skips some useless accounting */
+ else if(!bits)return(0L);
}
-
+
ret=b->ptr[0]<<(24+b->endbit);
if(bits>8){
- ret|=b->ptr[1]<<(16+b->endbit);
+ ret|=b->ptr[1]<<(16+b->endbit);
if(bits>16){
- ret|=b->ptr[2]<<(8+b->endbit);
+ ret|=b->ptr[2]<<(8+b->endbit);
if(bits>24){
- ret|=b->ptr[3]<<(b->endbit);
+ ret|=b->ptr[3]<<(b->endbit);
if(bits>32 && b->endbit)
ret|=b->ptr[4]>>(8-b->endbit);
}
@@ -322,9 +340,18 @@ long oggpackB_look1(oggpack_buffer *b){
void oggpack_adv(oggpack_buffer *b,int bits){
bits+=b->endbit;
+
+ if(b->endbyte > b->storage-((bits+7)>>3)) goto overflow;
+
b->ptr+=bits/8;
b->endbyte+=bits/8;
b->endbit=bits&7;
+ return;
+
+ overflow:
+ b->ptr=NULL;
+ b->endbyte=b->storage;
+ b->endbit=1;
}
void oggpackB_adv(oggpack_buffer *b,int bits){
@@ -346,23 +373,27 @@ void oggpackB_adv1(oggpack_buffer *b){
/* bits <= 32 */
long oggpack_read(oggpack_buffer *b,int bits){
long ret;
- unsigned long m=mask[bits];
+ unsigned long m;
+ if(bits<0 || bits>32) goto err;
+ m=mask[bits];
bits+=b->endbit;
- if(b->endbyte+4>=b->storage){
+ if(b->endbyte >= b->storage-4){
/* not the main path */
- ret=-1L;
- if(b->endbyte*8+bits>b->storage*8)goto overflow;
+ if(b->endbyte > b->storage-((bits+7)>>3)) goto overflow;
+ /* special case to avoid reading b->ptr[0], which might be past the end of
+ the buffer; also skips some useless accounting */
+ else if(!bits)return(0L);
}
-
+
ret=b->ptr[0]>>b->endbit;
if(bits>8){
- ret|=b->ptr[1]<<(8-b->endbit);
+ ret|=b->ptr[1]<<(8-b->endbit);
if(bits>16){
- ret|=b->ptr[2]<<(16-b->endbit);
+ ret|=b->ptr[2]<<(16-b->endbit);
if(bits>24){
- ret|=b->ptr[3]<<(24-b->endbit);
+ ret|=b->ptr[3]<<(24-b->endbit);
if(bits>32 && b->endbit){
ret|=b->ptr[4]<<(32-b->endbit);
}
@@ -370,65 +401,67 @@ long oggpack_read(oggpack_buffer *b,int bits){
}
}
ret&=m;
-
- overflow:
-
b->ptr+=bits/8;
b->endbyte+=bits/8;
b->endbit=bits&7;
- return(ret);
+ return ret;
+
+ overflow:
+ err:
+ b->ptr=NULL;
+ b->endbyte=b->storage;
+ b->endbit=1;
+ return -1L;
}
/* bits <= 32 */
long oggpackB_read(oggpack_buffer *b,int bits){
long ret;
long m=32-bits;
-
+
+ if(m<0 || m>32) goto err;
bits+=b->endbit;
if(b->endbyte+4>=b->storage){
/* not the main path */
- ret=-1L;
- if(b->endbyte*8+bits>b->storage*8)goto overflow;
+ if(b->endbyte > b->storage-((bits+7)>>3)) goto overflow;
/* special case to avoid reading b->ptr[0], which might be past the end of
the buffer; also skips some useless accounting */
else if(!bits)return(0L);
}
-
+
ret=b->ptr[0]<<(24+b->endbit);
if(bits>8){
- ret|=b->ptr[1]<<(16+b->endbit);
+ ret|=b->ptr[1]<<(16+b->endbit);
if(bits>16){
- ret|=b->ptr[2]<<(8+b->endbit);
+ ret|=b->ptr[2]<<(8+b->endbit);
if(bits>24){
- ret|=b->ptr[3]<<(b->endbit);
+ ret|=b->ptr[3]<<(b->endbit);
if(bits>32 && b->endbit)
ret|=b->ptr[4]>>(8-b->endbit);
}
}
}
ret=((ret&0xffffffffUL)>>(m>>1))>>((m+1)>>1);
-
- overflow:
b->ptr+=bits/8;
b->endbyte+=bits/8;
b->endbit=bits&7;
- return(ret);
+ return ret;
+
+ overflow:
+ err:
+ b->ptr=NULL;
+ b->endbyte=b->storage;
+ b->endbit=1;
+ return -1L;
}
long oggpack_read1(oggpack_buffer *b){
long ret;
-
- if(b->endbyte>=b->storage){
- /* not the main path */
- ret=-1L;
- goto overflow;
- }
+ if(b->endbyte >= b->storage) goto overflow;
ret=(b->ptr[0]>>b->endbit)&1;
-
- overflow:
b->endbit++;
if(b->endbit>7){
@@ -436,21 +469,20 @@ long oggpack_read1(oggpack_buffer *b){
b->ptr++;
b->endbyte++;
}
- return(ret);
+ return ret;
+
+ overflow:
+ b->ptr=NULL;
+ b->endbyte=b->storage;
+ b->endbit=1;
+ return -1L;
}
long oggpackB_read1(oggpack_buffer *b){
long ret;
-
- if(b->endbyte>=b->storage){
- /* not the main path */
- ret=-1L;
- goto overflow;
- }
+ if(b->endbyte >= b->storage) goto overflow;
ret=(b->ptr[0]>>(7-b->endbit))&1;
-
- overflow:
b->endbit++;
if(b->endbit>7){
@@ -458,7 +490,13 @@ long oggpackB_read1(oggpack_buffer *b){
b->ptr++;
b->endbyte++;
}
- return(ret);
+ return ret;
+
+ overflow:
+ b->ptr=NULL;
+ b->endbyte=b->storage;
+ b->endbit=1;
+ return -1L;
}
long oggpack_bytes(oggpack_buffer *b){
@@ -476,7 +514,7 @@ long oggpackB_bytes(oggpack_buffer *b){
long oggpackB_bits(oggpack_buffer *b){
return oggpack_bits(b);
}
-
+
unsigned char *oggpack_get_buffer(oggpack_buffer *b){
return(b->buffer);
}
@@ -499,7 +537,7 @@ static int ilog(unsigned int v){
}
return(ret);
}
-
+
oggpack_buffer o;
oggpack_buffer r;
@@ -546,7 +584,7 @@ void cliptest(unsigned long *b,int vals,int bits,int *comp,int compsize){
void cliptestB(unsigned long *b,int vals,int bits,int *comp,int compsize){
long bytes,i;
unsigned char *buffer;
-
+
oggpackB_reset(&o);
for(i=0;i<vals;i++)
oggpackB_write(&o,b[i],bits?bits:ilog(b[i]));
@@ -578,9 +616,190 @@ void cliptestB(unsigned long *b,int vals,int bits,int *comp,int compsize){
if(oggpackB_bytes(&r)!=bytes)report("leftover bytes after read!\n");
}
+void copytest(int prefill, int copy){
+ oggpack_buffer source_write;
+ oggpack_buffer dest_write;
+ oggpack_buffer source_read;
+ oggpack_buffer dest_read;
+ unsigned char *source;
+ unsigned char *dest;
+ long source_bytes,dest_bytes;
+ int i;
+
+ oggpack_writeinit(&source_write);
+ oggpack_writeinit(&dest_write);
+
+ for(i=0;i<(prefill+copy+7)/8;i++)
+ oggpack_write(&source_write,(i^0x5a)&0xff,8);
+ source=oggpack_get_buffer(&source_write);
+ source_bytes=oggpack_bytes(&source_write);
+
+ /* prefill */
+ oggpack_writecopy(&dest_write,source,prefill);
+
+ /* check buffers; verify end byte masking */
+ dest=oggpack_get_buffer(&dest_write);
+ dest_bytes=oggpack_bytes(&dest_write);
+ if(dest_bytes!=(prefill+7)/8){
+ fprintf(stderr,"wrong number of bytes after prefill! %ld!=%d\n",dest_bytes,(prefill+7)/8);
+ exit(1);
+ }
+ oggpack_readinit(&source_read,source,source_bytes);
+ oggpack_readinit(&dest_read,dest,dest_bytes);
+
+ for(i=0;i<prefill;i+=8){
+ int s=oggpack_read(&source_read,prefill-i<8?prefill-i:8);
+ int d=oggpack_read(&dest_read,prefill-i<8?prefill-i:8);
+ if(s!=d){
+ fprintf(stderr,"prefill=%d mismatch! byte %d, %x!=%x\n",prefill,i/8,s,d);
+ exit(1);
+ }
+ }
+ if(prefill<dest_bytes){
+ if(oggpack_read(&dest_read,dest_bytes-prefill)!=0){
+ fprintf(stderr,"prefill=%d mismatch! trailing bits not zero\n",prefill);
+ exit(1);
+ }
+ }
+
+ /* second copy */
+ oggpack_writecopy(&dest_write,source,copy);
+
+ /* check buffers; verify end byte masking */
+ dest=oggpack_get_buffer(&dest_write);
+ dest_bytes=oggpack_bytes(&dest_write);
+ if(dest_bytes!=(copy+prefill+7)/8){
+ fprintf(stderr,"wrong number of bytes after prefill+copy! %ld!=%d\n",dest_bytes,(copy+prefill+7)/8);
+ exit(1);
+ }
+ oggpack_readinit(&source_read,source,source_bytes);
+ oggpack_readinit(&dest_read,dest,dest_bytes);
+
+ for(i=0;i<prefill;i+=8){
+ int s=oggpack_read(&source_read,prefill-i<8?prefill-i:8);
+ int d=oggpack_read(&dest_read,prefill-i<8?prefill-i:8);
+ if(s!=d){
+ fprintf(stderr,"prefill=%d mismatch! byte %d, %x!=%x\n",prefill,i/8,s,d);
+ exit(1);
+ }
+ }
+
+ oggpack_readinit(&source_read,source,source_bytes);
+ for(i=0;i<copy;i+=8){
+ int s=oggpack_read(&source_read,copy-i<8?copy-i:8);
+ int d=oggpack_read(&dest_read,copy-i<8?copy-i:8);
+ if(s!=d){
+ fprintf(stderr,"prefill=%d copy=%d mismatch! byte %d, %x!=%x\n",prefill,copy,i/8,s,d);
+ exit(1);
+ }
+ }
+
+ if(copy+prefill<dest_bytes){
+ if(oggpack_read(&dest_read,dest_bytes-copy-prefill)!=0){
+ fprintf(stderr,"prefill=%d copy=%d mismatch! trailing bits not zero\n",prefill,copy);
+ exit(1);
+ }
+ }
+
+ oggpack_writeclear(&source_write);
+ oggpack_writeclear(&dest_write);
+
+
+}
+
+void copytestB(int prefill, int copy){
+ oggpack_buffer source_write;
+ oggpack_buffer dest_write;
+ oggpack_buffer source_read;
+ oggpack_buffer dest_read;
+ unsigned char *source;
+ unsigned char *dest;
+ long source_bytes,dest_bytes;
+ int i;
+
+ oggpackB_writeinit(&source_write);
+ oggpackB_writeinit(&dest_write);
+
+ for(i=0;i<(prefill+copy+7)/8;i++)
+ oggpackB_write(&source_write,(i^0x5a)&0xff,8);
+ source=oggpackB_get_buffer(&source_write);
+ source_bytes=oggpackB_bytes(&source_write);
+
+ /* prefill */
+ oggpackB_writecopy(&dest_write,source,prefill);
+
+ /* check buffers; verify end byte masking */
+ dest=oggpackB_get_buffer(&dest_write);
+ dest_bytes=oggpackB_bytes(&dest_write);
+ if(dest_bytes!=(prefill+7)/8){
+ fprintf(stderr,"wrong number of bytes after prefill! %ld!=%d\n",dest_bytes,(prefill+7)/8);
+ exit(1);
+ }
+ oggpackB_readinit(&source_read,source,source_bytes);
+ oggpackB_readinit(&dest_read,dest,dest_bytes);
+
+ for(i=0;i<prefill;i+=8){
+ int s=oggpackB_read(&source_read,prefill-i<8?prefill-i:8);
+ int d=oggpackB_read(&dest_read,prefill-i<8?prefill-i:8);
+ if(s!=d){
+ fprintf(stderr,"prefill=%d mismatch! byte %d, %x!=%x\n",prefill,i/8,s,d);
+ exit(1);
+ }
+ }
+ if(prefill<dest_bytes){
+ if(oggpackB_read(&dest_read,dest_bytes-prefill)!=0){
+ fprintf(stderr,"prefill=%d mismatch! trailing bits not zero\n",prefill);
+ exit(1);
+ }
+ }
+
+ /* second copy */
+ oggpackB_writecopy(&dest_write,source,copy);
+
+ /* check buffers; verify end byte masking */
+ dest=oggpackB_get_buffer(&dest_write);
+ dest_bytes=oggpackB_bytes(&dest_write);
+ if(dest_bytes!=(copy+prefill+7)/8){
+ fprintf(stderr,"wrong number of bytes after prefill+copy! %ld!=%d\n",dest_bytes,(copy+prefill+7)/8);
+ exit(1);
+ }
+ oggpackB_readinit(&source_read,source,source_bytes);
+ oggpackB_readinit(&dest_read,dest,dest_bytes);
+
+ for(i=0;i<prefill;i+=8){
+ int s=oggpackB_read(&source_read,prefill-i<8?prefill-i:8);
+ int d=oggpackB_read(&dest_read,prefill-i<8?prefill-i:8);
+ if(s!=d){
+ fprintf(stderr,"prefill=%d mismatch! byte %d, %x!=%x\n",prefill,i/8,s,d);
+ exit(1);
+ }
+ }
+
+ oggpackB_readinit(&source_read,source,source_bytes);
+ for(i=0;i<copy;i+=8){
+ int s=oggpackB_read(&source_read,copy-i<8?copy-i:8);
+ int d=oggpackB_read(&dest_read,copy-i<8?copy-i:8);
+ if(s!=d){
+ fprintf(stderr,"prefill=%d copy=%d mismatch! byte %d, %x!=%x\n",prefill,copy,i/8,s,d);
+ exit(1);
+ }
+ }
+
+ if(copy+prefill<dest_bytes){
+ if(oggpackB_read(&dest_read,dest_bytes-copy-prefill)!=0){
+ fprintf(stderr,"prefill=%d copy=%d mismatch! trailing bits not zero\n",prefill,copy);
+ exit(1);
+ }
+ }
+
+ oggpackB_writeclear(&source_write);
+ oggpackB_writeclear(&dest_write);
+
+}
+
int main(void){
unsigned char *buffer;
- long bytes,i;
+ long bytes,i,j;
static unsigned long testbuffer1[]=
{18,12,103948,4325,543,76,432,52,3,65,4,56,32,42,34,21,1,23,32,546,456,7,
567,56,8,8,55,3,52,342,341,4,265,7,67,86,2199,21,7,1,5,1,4};
@@ -670,7 +889,7 @@ int main(void){
for(i=0;i<test2size;i++){
if(oggpack_look(&r,32)==-1)report("out of data. failed!");
if(oggpack_look(&r,32)!=large[i]){
- fprintf(stderr,"%ld != %ld (%lx!=%lx):",oggpack_look(&r,32),large[i],
+ fprintf(stderr,"%ld != %lu (%lx!=%lx):",oggpack_look(&r,32),large[i],
oggpack_look(&r,32),large[i]);
report("read incorrect value!\n");
}
@@ -692,7 +911,7 @@ int main(void){
fprintf(stderr,"ok.");
fprintf(stderr,"\nTesting read past end (LSb): ");
- oggpack_readinit(&r,"\0\0\0\0\0\0\0\0",8);
+ oggpack_readinit(&r,(unsigned char *)"\0\0\0\0\0\0\0\0",8);
for(i=0;i<64;i++){
if(oggpack_read(&r,1)!=0){
fprintf(stderr,"failed; got -1 prematurely.\n");
@@ -704,7 +923,7 @@ int main(void){
fprintf(stderr,"failed; read past end without -1.\n");
exit(1);
}
- oggpack_readinit(&r,"\0\0\0\0\0\0\0\0",8);
+ oggpack_readinit(&r,(unsigned char *)"\0\0\0\0\0\0\0\0",8);
if(oggpack_read(&r,30)!=0 || oggpack_read(&r,16)!=0){
fprintf(stderr,"failed 2; got -1 prematurely.\n");
exit(1);
@@ -726,7 +945,31 @@ int main(void){
exit(1);
}
oggpack_writeclear(&o);
- fprintf(stderr,"ok.\n");
+ fprintf(stderr,"ok.");
+
+ /* this is partly glassbox; we're mostly concerned about the allocation boundaries */
+
+ fprintf(stderr,"\nTesting aligned writecopies (LSb): ");
+ for(i=0;i<71;i++)
+ for(j=0;j<5;j++)
+ copytest(j*8,i);
+ for(i=BUFFER_INCREMENT*8-71;i<BUFFER_INCREMENT*8+71;i++)
+ for(j=0;j<5;j++)
+ copytest(j*8,i);
+ fprintf(stderr,"ok. ");
+
+ fprintf(stderr,"\nTesting unaligned writecopies (LSb): ");
+ for(i=0;i<71;i++)
+ for(j=1;j<40;j++)
+ if(j&0x7)
+ copytest(j,i);
+ for(i=BUFFER_INCREMENT*8-71;i<BUFFER_INCREMENT*8+71;i++)
+ for(j=1;j<40;j++)
+ if(j&0x7)
+ copytest(j,i);
+
+ fprintf(stderr,"ok. \n");
+
/********** lazy, cut-n-paste retest with MSb packing ***********/
@@ -756,7 +999,7 @@ int main(void){
for(i=0;i<test2size;i++){
if(oggpackB_look(&r,32)==-1)report("out of data. failed!");
if(oggpackB_look(&r,32)!=large[i]){
- fprintf(stderr,"%ld != %ld (%lx!=%lx):",oggpackB_look(&r,32),large[i],
+ fprintf(stderr,"%ld != %lu (%lx!=%lx):",oggpackB_look(&r,32),large[i],
oggpackB_look(&r,32),large[i]);
report("read incorrect value!\n");
}
@@ -778,7 +1021,7 @@ int main(void){
fprintf(stderr,"ok.");
fprintf(stderr,"\nTesting read past end (MSb): ");
- oggpackB_readinit(&r,"\0\0\0\0\0\0\0\0",8);
+ oggpackB_readinit(&r,(unsigned char *)"\0\0\0\0\0\0\0\0",8);
for(i=0;i<64;i++){
if(oggpackB_read(&r,1)!=0){
fprintf(stderr,"failed; got -1 prematurely.\n");
@@ -790,7 +1033,7 @@ int main(void){
fprintf(stderr,"failed; read past end without -1.\n");
exit(1);
}
- oggpackB_readinit(&r,"\0\0\0\0\0\0\0\0",8);
+ oggpackB_readinit(&r,(unsigned char *)"\0\0\0\0\0\0\0\0",8);
if(oggpackB_read(&r,30)!=0 || oggpackB_read(&r,16)!=0){
fprintf(stderr,"failed 2; got -1 prematurely.\n");
exit(1);
@@ -811,12 +1054,34 @@ int main(void){
fprintf(stderr,"failed; read past end without -1.\n");
exit(1);
}
+ fprintf(stderr,"ok.");
oggpackB_writeclear(&o);
- fprintf(stderr,"ok.\n\n");
+ /* this is partly glassbox; we're mostly concerned about the allocation boundaries */
+
+ fprintf(stderr,"\nTesting aligned writecopies (MSb): ");
+ for(i=0;i<71;i++)
+ for(j=0;j<5;j++)
+ copytestB(j*8,i);
+ for(i=BUFFER_INCREMENT*8-71;i<BUFFER_INCREMENT*8+71;i++)
+ for(j=0;j<5;j++)
+ copytestB(j*8,i);
+ fprintf(stderr,"ok. ");
+
+ fprintf(stderr,"\nTesting unaligned writecopies (MSb): ");
+ for(i=0;i<71;i++)
+ for(j=1;j<40;j++)
+ if(j&0x7)
+ copytestB(j,i);
+ for(i=BUFFER_INCREMENT*8-71;i<BUFFER_INCREMENT*8+71;i++)
+ for(j=1;j<40;j++)
+ if(j&0x7)
+ copytestB(j,i);
+
+ fprintf(stderr,"ok. \n\n");
return(0);
-}
+}
#endif /* _V_SELFTEST */
#undef BUFFER_INCREMENT