xref: /aosp_15_r20/external/libogg/src/bitwise.c (revision 4d5d8b54cec1a9622d79143ad0e145ea73da2224)
1*4d5d8b54SAndroid Build Coastguard Worker /********************************************************************
2*4d5d8b54SAndroid Build Coastguard Worker  *                                                                  *
3*4d5d8b54SAndroid Build Coastguard Worker  * THIS FILE IS PART OF THE Ogg CONTAINER SOURCE CODE.              *
4*4d5d8b54SAndroid Build Coastguard Worker  * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS     *
5*4d5d8b54SAndroid Build Coastguard Worker  * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
6*4d5d8b54SAndroid Build Coastguard Worker  * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING.       *
7*4d5d8b54SAndroid Build Coastguard Worker  *                                                                  *
8*4d5d8b54SAndroid Build Coastguard Worker  * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2014             *
9*4d5d8b54SAndroid Build Coastguard Worker  * by the Xiph.Org Foundation http://www.xiph.org/                  *
10*4d5d8b54SAndroid Build Coastguard Worker  *                                                                  *
11*4d5d8b54SAndroid Build Coastguard Worker  ********************************************************************
12*4d5d8b54SAndroid Build Coastguard Worker 
13*4d5d8b54SAndroid Build Coastguard Worker   function: packing variable sized words into an octet stream
14*4d5d8b54SAndroid Build Coastguard Worker 
15*4d5d8b54SAndroid Build Coastguard Worker  ********************************************************************/
16*4d5d8b54SAndroid Build Coastguard Worker 
17*4d5d8b54SAndroid Build Coastguard Worker /* We're 'LSb' endian; if we write a word but read individual bits,
18*4d5d8b54SAndroid Build Coastguard Worker    then we'll read the lsb first */
19*4d5d8b54SAndroid Build Coastguard Worker 
20*4d5d8b54SAndroid Build Coastguard Worker #include <string.h>
21*4d5d8b54SAndroid Build Coastguard Worker #include <stdlib.h>
22*4d5d8b54SAndroid Build Coastguard Worker #include <limits.h>
23*4d5d8b54SAndroid Build Coastguard Worker #include <ogg/ogg.h>
24*4d5d8b54SAndroid Build Coastguard Worker 
25*4d5d8b54SAndroid Build Coastguard Worker #define BUFFER_INCREMENT 256
26*4d5d8b54SAndroid Build Coastguard Worker 
27*4d5d8b54SAndroid Build Coastguard Worker static const unsigned long mask[]=
28*4d5d8b54SAndroid Build Coastguard Worker {0x00000000,0x00000001,0x00000003,0x00000007,0x0000000f,
29*4d5d8b54SAndroid Build Coastguard Worker  0x0000001f,0x0000003f,0x0000007f,0x000000ff,0x000001ff,
30*4d5d8b54SAndroid Build Coastguard Worker  0x000003ff,0x000007ff,0x00000fff,0x00001fff,0x00003fff,
31*4d5d8b54SAndroid Build Coastguard Worker  0x00007fff,0x0000ffff,0x0001ffff,0x0003ffff,0x0007ffff,
32*4d5d8b54SAndroid Build Coastguard Worker  0x000fffff,0x001fffff,0x003fffff,0x007fffff,0x00ffffff,
33*4d5d8b54SAndroid Build Coastguard Worker  0x01ffffff,0x03ffffff,0x07ffffff,0x0fffffff,0x1fffffff,
34*4d5d8b54SAndroid Build Coastguard Worker  0x3fffffff,0x7fffffff,0xffffffff };
35*4d5d8b54SAndroid Build Coastguard Worker 
36*4d5d8b54SAndroid Build Coastguard Worker static const unsigned int mask8B[]=
37*4d5d8b54SAndroid Build Coastguard Worker {0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff};
38*4d5d8b54SAndroid Build Coastguard Worker 
oggpack_writeinit(oggpack_buffer * b)39*4d5d8b54SAndroid Build Coastguard Worker void oggpack_writeinit(oggpack_buffer *b){
40*4d5d8b54SAndroid Build Coastguard Worker   memset(b,0,sizeof(*b));
41*4d5d8b54SAndroid Build Coastguard Worker   b->ptr=b->buffer=_ogg_malloc(BUFFER_INCREMENT);
42*4d5d8b54SAndroid Build Coastguard Worker   b->buffer[0]='\0';
43*4d5d8b54SAndroid Build Coastguard Worker   b->storage=BUFFER_INCREMENT;
44*4d5d8b54SAndroid Build Coastguard Worker }
45*4d5d8b54SAndroid Build Coastguard Worker 
oggpackB_writeinit(oggpack_buffer * b)46*4d5d8b54SAndroid Build Coastguard Worker void oggpackB_writeinit(oggpack_buffer *b){
47*4d5d8b54SAndroid Build Coastguard Worker   oggpack_writeinit(b);
48*4d5d8b54SAndroid Build Coastguard Worker }
49*4d5d8b54SAndroid Build Coastguard Worker 
oggpack_writecheck(oggpack_buffer * b)50*4d5d8b54SAndroid Build Coastguard Worker int oggpack_writecheck(oggpack_buffer *b){
51*4d5d8b54SAndroid Build Coastguard Worker   if(!b->ptr || !b->storage)return -1;
52*4d5d8b54SAndroid Build Coastguard Worker   return 0;
53*4d5d8b54SAndroid Build Coastguard Worker }
54*4d5d8b54SAndroid Build Coastguard Worker 
oggpackB_writecheck(oggpack_buffer * b)55*4d5d8b54SAndroid Build Coastguard Worker int oggpackB_writecheck(oggpack_buffer *b){
56*4d5d8b54SAndroid Build Coastguard Worker   return oggpack_writecheck(b);
57*4d5d8b54SAndroid Build Coastguard Worker }
58*4d5d8b54SAndroid Build Coastguard Worker 
oggpack_writetrunc(oggpack_buffer * b,long bits)59*4d5d8b54SAndroid Build Coastguard Worker void oggpack_writetrunc(oggpack_buffer *b,long bits){
60*4d5d8b54SAndroid Build Coastguard Worker   long bytes=bits>>3;
61*4d5d8b54SAndroid Build Coastguard Worker   if(b->ptr){
62*4d5d8b54SAndroid Build Coastguard Worker     bits-=bytes*8;
63*4d5d8b54SAndroid Build Coastguard Worker     b->ptr=b->buffer+bytes;
64*4d5d8b54SAndroid Build Coastguard Worker     b->endbit=bits;
65*4d5d8b54SAndroid Build Coastguard Worker     b->endbyte=bytes;
66*4d5d8b54SAndroid Build Coastguard Worker     *b->ptr&=mask[bits];
67*4d5d8b54SAndroid Build Coastguard Worker   }
68*4d5d8b54SAndroid Build Coastguard Worker }
69*4d5d8b54SAndroid Build Coastguard Worker 
oggpackB_writetrunc(oggpack_buffer * b,long bits)70*4d5d8b54SAndroid Build Coastguard Worker void oggpackB_writetrunc(oggpack_buffer *b,long bits){
71*4d5d8b54SAndroid Build Coastguard Worker   long bytes=bits>>3;
72*4d5d8b54SAndroid Build Coastguard Worker   if(b->ptr){
73*4d5d8b54SAndroid Build Coastguard Worker     bits-=bytes*8;
74*4d5d8b54SAndroid Build Coastguard Worker     b->ptr=b->buffer+bytes;
75*4d5d8b54SAndroid Build Coastguard Worker     b->endbit=bits;
76*4d5d8b54SAndroid Build Coastguard Worker     b->endbyte=bytes;
77*4d5d8b54SAndroid Build Coastguard Worker     *b->ptr&=mask8B[bits];
78*4d5d8b54SAndroid Build Coastguard Worker   }
79*4d5d8b54SAndroid Build Coastguard Worker }
80*4d5d8b54SAndroid Build Coastguard Worker 
81*4d5d8b54SAndroid Build Coastguard Worker /* Takes only up to 32 bits. */
oggpack_write(oggpack_buffer * b,unsigned long value,int bits)82*4d5d8b54SAndroid Build Coastguard Worker void oggpack_write(oggpack_buffer *b,unsigned long value,int bits){
83*4d5d8b54SAndroid Build Coastguard Worker   if(bits<0 || bits>32) goto err;
84*4d5d8b54SAndroid Build Coastguard Worker   if(b->endbyte>=b->storage-4){
85*4d5d8b54SAndroid Build Coastguard Worker     void *ret;
86*4d5d8b54SAndroid Build Coastguard Worker     if(!b->ptr)return;
87*4d5d8b54SAndroid Build Coastguard Worker     if(b->storage>LONG_MAX-BUFFER_INCREMENT) goto err;
88*4d5d8b54SAndroid Build Coastguard Worker     ret=_ogg_realloc(b->buffer,b->storage+BUFFER_INCREMENT);
89*4d5d8b54SAndroid Build Coastguard Worker     if(!ret) goto err;
90*4d5d8b54SAndroid Build Coastguard Worker     b->buffer=ret;
91*4d5d8b54SAndroid Build Coastguard Worker     b->storage+=BUFFER_INCREMENT;
92*4d5d8b54SAndroid Build Coastguard Worker     b->ptr=b->buffer+b->endbyte;
93*4d5d8b54SAndroid Build Coastguard Worker   }
94*4d5d8b54SAndroid Build Coastguard Worker 
95*4d5d8b54SAndroid Build Coastguard Worker   value&=mask[bits];
96*4d5d8b54SAndroid Build Coastguard Worker   bits+=b->endbit;
97*4d5d8b54SAndroid Build Coastguard Worker 
98*4d5d8b54SAndroid Build Coastguard Worker   b->ptr[0]|=value<<b->endbit;
99*4d5d8b54SAndroid Build Coastguard Worker 
100*4d5d8b54SAndroid Build Coastguard Worker   if(bits>=8){
101*4d5d8b54SAndroid Build Coastguard Worker     b->ptr[1]=(unsigned char)(value>>(8-b->endbit));
102*4d5d8b54SAndroid Build Coastguard Worker     if(bits>=16){
103*4d5d8b54SAndroid Build Coastguard Worker       b->ptr[2]=(unsigned char)(value>>(16-b->endbit));
104*4d5d8b54SAndroid Build Coastguard Worker       if(bits>=24){
105*4d5d8b54SAndroid Build Coastguard Worker         b->ptr[3]=(unsigned char)(value>>(24-b->endbit));
106*4d5d8b54SAndroid Build Coastguard Worker         if(bits>=32){
107*4d5d8b54SAndroid Build Coastguard Worker           if(b->endbit)
108*4d5d8b54SAndroid Build Coastguard Worker             b->ptr[4]=(unsigned char)(value>>(32-b->endbit));
109*4d5d8b54SAndroid Build Coastguard Worker           else
110*4d5d8b54SAndroid Build Coastguard Worker             b->ptr[4]=0;
111*4d5d8b54SAndroid Build Coastguard Worker         }
112*4d5d8b54SAndroid Build Coastguard Worker       }
113*4d5d8b54SAndroid Build Coastguard Worker     }
114*4d5d8b54SAndroid Build Coastguard Worker   }
115*4d5d8b54SAndroid Build Coastguard Worker 
116*4d5d8b54SAndroid Build Coastguard Worker   b->endbyte+=bits/8;
117*4d5d8b54SAndroid Build Coastguard Worker   b->ptr+=bits/8;
118*4d5d8b54SAndroid Build Coastguard Worker   b->endbit=bits&7;
119*4d5d8b54SAndroid Build Coastguard Worker   return;
120*4d5d8b54SAndroid Build Coastguard Worker  err:
121*4d5d8b54SAndroid Build Coastguard Worker   oggpack_writeclear(b);
122*4d5d8b54SAndroid Build Coastguard Worker }
123*4d5d8b54SAndroid Build Coastguard Worker 
124*4d5d8b54SAndroid Build Coastguard Worker /* Takes only up to 32 bits. */
oggpackB_write(oggpack_buffer * b,unsigned long value,int bits)125*4d5d8b54SAndroid Build Coastguard Worker void oggpackB_write(oggpack_buffer *b,unsigned long value,int bits){
126*4d5d8b54SAndroid Build Coastguard Worker   if(bits<0 || bits>32) goto err;
127*4d5d8b54SAndroid Build Coastguard Worker   if(b->endbyte>=b->storage-4){
128*4d5d8b54SAndroid Build Coastguard Worker     void *ret;
129*4d5d8b54SAndroid Build Coastguard Worker     if(!b->ptr)return;
130*4d5d8b54SAndroid Build Coastguard Worker     if(b->storage>LONG_MAX-BUFFER_INCREMENT) goto err;
131*4d5d8b54SAndroid Build Coastguard Worker     ret=_ogg_realloc(b->buffer,b->storage+BUFFER_INCREMENT);
132*4d5d8b54SAndroid Build Coastguard Worker     if(!ret) goto err;
133*4d5d8b54SAndroid Build Coastguard Worker     b->buffer=ret;
134*4d5d8b54SAndroid Build Coastguard Worker     b->storage+=BUFFER_INCREMENT;
135*4d5d8b54SAndroid Build Coastguard Worker     b->ptr=b->buffer+b->endbyte;
136*4d5d8b54SAndroid Build Coastguard Worker   }
137*4d5d8b54SAndroid Build Coastguard Worker 
138*4d5d8b54SAndroid Build Coastguard Worker   value=(value&mask[bits])<<(32-bits);
139*4d5d8b54SAndroid Build Coastguard Worker   bits+=b->endbit;
140*4d5d8b54SAndroid Build Coastguard Worker 
141*4d5d8b54SAndroid Build Coastguard Worker   b->ptr[0]|=value>>(24+b->endbit);
142*4d5d8b54SAndroid Build Coastguard Worker 
143*4d5d8b54SAndroid Build Coastguard Worker   if(bits>=8){
144*4d5d8b54SAndroid Build Coastguard Worker     b->ptr[1]=(unsigned char)(value>>(16+b->endbit));
145*4d5d8b54SAndroid Build Coastguard Worker     if(bits>=16){
146*4d5d8b54SAndroid Build Coastguard Worker       b->ptr[2]=(unsigned char)(value>>(8+b->endbit));
147*4d5d8b54SAndroid Build Coastguard Worker       if(bits>=24){
148*4d5d8b54SAndroid Build Coastguard Worker         b->ptr[3]=(unsigned char)(value>>(b->endbit));
149*4d5d8b54SAndroid Build Coastguard Worker         if(bits>=32){
150*4d5d8b54SAndroid Build Coastguard Worker           if(b->endbit)
151*4d5d8b54SAndroid Build Coastguard Worker             b->ptr[4]=(unsigned char)(value<<(8-b->endbit));
152*4d5d8b54SAndroid Build Coastguard Worker           else
153*4d5d8b54SAndroid Build Coastguard Worker             b->ptr[4]=0;
154*4d5d8b54SAndroid Build Coastguard Worker         }
155*4d5d8b54SAndroid Build Coastguard Worker       }
156*4d5d8b54SAndroid Build Coastguard Worker     }
157*4d5d8b54SAndroid Build Coastguard Worker   }
158*4d5d8b54SAndroid Build Coastguard Worker 
159*4d5d8b54SAndroid Build Coastguard Worker   b->endbyte+=bits/8;
160*4d5d8b54SAndroid Build Coastguard Worker   b->ptr+=bits/8;
161*4d5d8b54SAndroid Build Coastguard Worker   b->endbit=bits&7;
162*4d5d8b54SAndroid Build Coastguard Worker   return;
163*4d5d8b54SAndroid Build Coastguard Worker  err:
164*4d5d8b54SAndroid Build Coastguard Worker   oggpack_writeclear(b);
165*4d5d8b54SAndroid Build Coastguard Worker }
166*4d5d8b54SAndroid Build Coastguard Worker 
oggpack_writealign(oggpack_buffer * b)167*4d5d8b54SAndroid Build Coastguard Worker void oggpack_writealign(oggpack_buffer *b){
168*4d5d8b54SAndroid Build Coastguard Worker   int bits=8-b->endbit;
169*4d5d8b54SAndroid Build Coastguard Worker   if(bits<8)
170*4d5d8b54SAndroid Build Coastguard Worker     oggpack_write(b,0,bits);
171*4d5d8b54SAndroid Build Coastguard Worker }
172*4d5d8b54SAndroid Build Coastguard Worker 
oggpackB_writealign(oggpack_buffer * b)173*4d5d8b54SAndroid Build Coastguard Worker void oggpackB_writealign(oggpack_buffer *b){
174*4d5d8b54SAndroid Build Coastguard Worker   int bits=8-b->endbit;
175*4d5d8b54SAndroid Build Coastguard Worker   if(bits<8)
176*4d5d8b54SAndroid Build Coastguard Worker     oggpackB_write(b,0,bits);
177*4d5d8b54SAndroid Build Coastguard Worker }
178*4d5d8b54SAndroid Build Coastguard Worker 
oggpack_writecopy_helper(oggpack_buffer * b,void * source,long bits,void (* w)(oggpack_buffer *,unsigned long,int),int msb)179*4d5d8b54SAndroid Build Coastguard Worker static void oggpack_writecopy_helper(oggpack_buffer *b,
180*4d5d8b54SAndroid Build Coastguard Worker                                      void *source,
181*4d5d8b54SAndroid Build Coastguard Worker                                      long bits,
182*4d5d8b54SAndroid Build Coastguard Worker                                      void (*w)(oggpack_buffer *,
183*4d5d8b54SAndroid Build Coastguard Worker                                                unsigned long,
184*4d5d8b54SAndroid Build Coastguard Worker                                                int),
185*4d5d8b54SAndroid Build Coastguard Worker                                      int msb){
186*4d5d8b54SAndroid Build Coastguard Worker   unsigned char *ptr=(unsigned char *)source;
187*4d5d8b54SAndroid Build Coastguard Worker 
188*4d5d8b54SAndroid Build Coastguard Worker   long bytes=bits/8;
189*4d5d8b54SAndroid Build Coastguard Worker   long pbytes=(b->endbit+bits)/8;
190*4d5d8b54SAndroid Build Coastguard Worker   bits-=bytes*8;
191*4d5d8b54SAndroid Build Coastguard Worker 
192*4d5d8b54SAndroid Build Coastguard Worker   /* expand storage up-front */
193*4d5d8b54SAndroid Build Coastguard Worker   if(b->endbyte+pbytes>=b->storage){
194*4d5d8b54SAndroid Build Coastguard Worker     void *ret;
195*4d5d8b54SAndroid Build Coastguard Worker     if(!b->ptr) goto err;
196*4d5d8b54SAndroid Build Coastguard Worker     if(b->storage>b->endbyte+pbytes+BUFFER_INCREMENT) goto err;
197*4d5d8b54SAndroid Build Coastguard Worker     b->storage=b->endbyte+pbytes+BUFFER_INCREMENT;
198*4d5d8b54SAndroid Build Coastguard Worker     ret=_ogg_realloc(b->buffer,b->storage);
199*4d5d8b54SAndroid Build Coastguard Worker     if(!ret) goto err;
200*4d5d8b54SAndroid Build Coastguard Worker     b->buffer=ret;
201*4d5d8b54SAndroid Build Coastguard Worker     b->ptr=b->buffer+b->endbyte;
202*4d5d8b54SAndroid Build Coastguard Worker   }
203*4d5d8b54SAndroid Build Coastguard Worker 
204*4d5d8b54SAndroid Build Coastguard Worker   /* copy whole octets */
205*4d5d8b54SAndroid Build Coastguard Worker   if(b->endbit){
206*4d5d8b54SAndroid Build Coastguard Worker     int i;
207*4d5d8b54SAndroid Build Coastguard Worker     /* unaligned copy.  Do it the hard way. */
208*4d5d8b54SAndroid Build Coastguard Worker     for(i=0;i<bytes;i++)
209*4d5d8b54SAndroid Build Coastguard Worker       w(b,(unsigned long)(ptr[i]),8);
210*4d5d8b54SAndroid Build Coastguard Worker   }else{
211*4d5d8b54SAndroid Build Coastguard Worker     /* aligned block copy */
212*4d5d8b54SAndroid Build Coastguard Worker     memmove(b->ptr,source,bytes);
213*4d5d8b54SAndroid Build Coastguard Worker     b->ptr+=bytes;
214*4d5d8b54SAndroid Build Coastguard Worker     b->endbyte+=bytes;
215*4d5d8b54SAndroid Build Coastguard Worker     *b->ptr=0;
216*4d5d8b54SAndroid Build Coastguard Worker   }
217*4d5d8b54SAndroid Build Coastguard Worker 
218*4d5d8b54SAndroid Build Coastguard Worker   /* copy trailing bits */
219*4d5d8b54SAndroid Build Coastguard Worker   if(bits){
220*4d5d8b54SAndroid Build Coastguard Worker     if(msb)
221*4d5d8b54SAndroid Build Coastguard Worker       w(b,(unsigned long)(ptr[bytes]>>(8-bits)),bits);
222*4d5d8b54SAndroid Build Coastguard Worker     else
223*4d5d8b54SAndroid Build Coastguard Worker       w(b,(unsigned long)(ptr[bytes]),bits);
224*4d5d8b54SAndroid Build Coastguard Worker   }
225*4d5d8b54SAndroid Build Coastguard Worker   return;
226*4d5d8b54SAndroid Build Coastguard Worker  err:
227*4d5d8b54SAndroid Build Coastguard Worker   oggpack_writeclear(b);
228*4d5d8b54SAndroid Build Coastguard Worker }
229*4d5d8b54SAndroid Build Coastguard Worker 
oggpack_writecopy(oggpack_buffer * b,void * source,long bits)230*4d5d8b54SAndroid Build Coastguard Worker void oggpack_writecopy(oggpack_buffer *b,void *source,long bits){
231*4d5d8b54SAndroid Build Coastguard Worker   oggpack_writecopy_helper(b,source,bits,oggpack_write,0);
232*4d5d8b54SAndroid Build Coastguard Worker }
233*4d5d8b54SAndroid Build Coastguard Worker 
oggpackB_writecopy(oggpack_buffer * b,void * source,long bits)234*4d5d8b54SAndroid Build Coastguard Worker void oggpackB_writecopy(oggpack_buffer *b,void *source,long bits){
235*4d5d8b54SAndroid Build Coastguard Worker   oggpack_writecopy_helper(b,source,bits,oggpackB_write,1);
236*4d5d8b54SAndroid Build Coastguard Worker }
237*4d5d8b54SAndroid Build Coastguard Worker 
oggpack_reset(oggpack_buffer * b)238*4d5d8b54SAndroid Build Coastguard Worker void oggpack_reset(oggpack_buffer *b){
239*4d5d8b54SAndroid Build Coastguard Worker   if(!b->ptr)return;
240*4d5d8b54SAndroid Build Coastguard Worker   b->ptr=b->buffer;
241*4d5d8b54SAndroid Build Coastguard Worker   b->buffer[0]=0;
242*4d5d8b54SAndroid Build Coastguard Worker   b->endbit=b->endbyte=0;
243*4d5d8b54SAndroid Build Coastguard Worker }
244*4d5d8b54SAndroid Build Coastguard Worker 
oggpackB_reset(oggpack_buffer * b)245*4d5d8b54SAndroid Build Coastguard Worker void oggpackB_reset(oggpack_buffer *b){
246*4d5d8b54SAndroid Build Coastguard Worker   oggpack_reset(b);
247*4d5d8b54SAndroid Build Coastguard Worker }
248*4d5d8b54SAndroid Build Coastguard Worker 
oggpack_writeclear(oggpack_buffer * b)249*4d5d8b54SAndroid Build Coastguard Worker void oggpack_writeclear(oggpack_buffer *b){
250*4d5d8b54SAndroid Build Coastguard Worker   if(b->buffer)_ogg_free(b->buffer);
251*4d5d8b54SAndroid Build Coastguard Worker   memset(b,0,sizeof(*b));
252*4d5d8b54SAndroid Build Coastguard Worker }
253*4d5d8b54SAndroid Build Coastguard Worker 
oggpackB_writeclear(oggpack_buffer * b)254*4d5d8b54SAndroid Build Coastguard Worker void oggpackB_writeclear(oggpack_buffer *b){
255*4d5d8b54SAndroid Build Coastguard Worker   oggpack_writeclear(b);
256*4d5d8b54SAndroid Build Coastguard Worker }
257*4d5d8b54SAndroid Build Coastguard Worker 
oggpack_readinit(oggpack_buffer * b,unsigned char * buf,int bytes)258*4d5d8b54SAndroid Build Coastguard Worker void oggpack_readinit(oggpack_buffer *b,unsigned char *buf,int bytes){
259*4d5d8b54SAndroid Build Coastguard Worker   memset(b,0,sizeof(*b));
260*4d5d8b54SAndroid Build Coastguard Worker   b->buffer=b->ptr=buf;
261*4d5d8b54SAndroid Build Coastguard Worker   b->storage=bytes;
262*4d5d8b54SAndroid Build Coastguard Worker }
263*4d5d8b54SAndroid Build Coastguard Worker 
oggpackB_readinit(oggpack_buffer * b,unsigned char * buf,int bytes)264*4d5d8b54SAndroid Build Coastguard Worker void oggpackB_readinit(oggpack_buffer *b,unsigned char *buf,int bytes){
265*4d5d8b54SAndroid Build Coastguard Worker   oggpack_readinit(b,buf,bytes);
266*4d5d8b54SAndroid Build Coastguard Worker }
267*4d5d8b54SAndroid Build Coastguard Worker 
268*4d5d8b54SAndroid Build Coastguard Worker /* Read in bits without advancing the bitptr; bits <= 32 */
oggpack_look(oggpack_buffer * b,int bits)269*4d5d8b54SAndroid Build Coastguard Worker long oggpack_look(oggpack_buffer *b,int bits){
270*4d5d8b54SAndroid Build Coastguard Worker   unsigned long ret;
271*4d5d8b54SAndroid Build Coastguard Worker   unsigned long m;
272*4d5d8b54SAndroid Build Coastguard Worker 
273*4d5d8b54SAndroid Build Coastguard Worker   if(bits<0 || bits>32) return -1;
274*4d5d8b54SAndroid Build Coastguard Worker   m=mask[bits];
275*4d5d8b54SAndroid Build Coastguard Worker   bits+=b->endbit;
276*4d5d8b54SAndroid Build Coastguard Worker 
277*4d5d8b54SAndroid Build Coastguard Worker   if(b->endbyte >= b->storage-4){
278*4d5d8b54SAndroid Build Coastguard Worker     /* not the main path */
279*4d5d8b54SAndroid Build Coastguard Worker     if(b->endbyte > b->storage-((bits+7)>>3)) return -1;
280*4d5d8b54SAndroid Build Coastguard Worker     /* special case to avoid reading b->ptr[0], which might be past the end of
281*4d5d8b54SAndroid Build Coastguard Worker         the buffer; also skips some useless accounting */
282*4d5d8b54SAndroid Build Coastguard Worker     else if(!bits)return(0L);
283*4d5d8b54SAndroid Build Coastguard Worker   }
284*4d5d8b54SAndroid Build Coastguard Worker 
285*4d5d8b54SAndroid Build Coastguard Worker   ret=b->ptr[0]>>b->endbit;
286*4d5d8b54SAndroid Build Coastguard Worker   if(bits>8){
287*4d5d8b54SAndroid Build Coastguard Worker     ret|=b->ptr[1]<<(8-b->endbit);
288*4d5d8b54SAndroid Build Coastguard Worker     if(bits>16){
289*4d5d8b54SAndroid Build Coastguard Worker       ret|=b->ptr[2]<<(16-b->endbit);
290*4d5d8b54SAndroid Build Coastguard Worker       if(bits>24){
291*4d5d8b54SAndroid Build Coastguard Worker         ret|=b->ptr[3]<<(24-b->endbit);
292*4d5d8b54SAndroid Build Coastguard Worker         if(bits>32 && b->endbit)
293*4d5d8b54SAndroid Build Coastguard Worker           ret|=b->ptr[4]<<(32-b->endbit);
294*4d5d8b54SAndroid Build Coastguard Worker       }
295*4d5d8b54SAndroid Build Coastguard Worker     }
296*4d5d8b54SAndroid Build Coastguard Worker   }
297*4d5d8b54SAndroid Build Coastguard Worker   return(m&ret);
298*4d5d8b54SAndroid Build Coastguard Worker }
299*4d5d8b54SAndroid Build Coastguard Worker 
300*4d5d8b54SAndroid Build Coastguard Worker /* Read in bits without advancing the bitptr; bits <= 32 */
oggpackB_look(oggpack_buffer * b,int bits)301*4d5d8b54SAndroid Build Coastguard Worker long oggpackB_look(oggpack_buffer *b,int bits){
302*4d5d8b54SAndroid Build Coastguard Worker   unsigned long ret;
303*4d5d8b54SAndroid Build Coastguard Worker   int m=32-bits;
304*4d5d8b54SAndroid Build Coastguard Worker 
305*4d5d8b54SAndroid Build Coastguard Worker   if(m<0 || m>32) return -1;
306*4d5d8b54SAndroid Build Coastguard Worker   bits+=b->endbit;
307*4d5d8b54SAndroid Build Coastguard Worker 
308*4d5d8b54SAndroid Build Coastguard Worker   if(b->endbyte >= b->storage-4){
309*4d5d8b54SAndroid Build Coastguard Worker     /* not the main path */
310*4d5d8b54SAndroid Build Coastguard Worker     if(b->endbyte > b->storage-((bits+7)>>3)) return -1;
311*4d5d8b54SAndroid Build Coastguard Worker     /* special case to avoid reading b->ptr[0], which might be past the end of
312*4d5d8b54SAndroid Build Coastguard Worker         the buffer; also skips some useless accounting */
313*4d5d8b54SAndroid Build Coastguard Worker     else if(!bits)return(0L);
314*4d5d8b54SAndroid Build Coastguard Worker   }
315*4d5d8b54SAndroid Build Coastguard Worker 
316*4d5d8b54SAndroid Build Coastguard Worker   ret=b->ptr[0]<<(24+b->endbit);
317*4d5d8b54SAndroid Build Coastguard Worker   if(bits>8){
318*4d5d8b54SAndroid Build Coastguard Worker     ret|=b->ptr[1]<<(16+b->endbit);
319*4d5d8b54SAndroid Build Coastguard Worker     if(bits>16){
320*4d5d8b54SAndroid Build Coastguard Worker       ret|=b->ptr[2]<<(8+b->endbit);
321*4d5d8b54SAndroid Build Coastguard Worker       if(bits>24){
322*4d5d8b54SAndroid Build Coastguard Worker         ret|=b->ptr[3]<<(b->endbit);
323*4d5d8b54SAndroid Build Coastguard Worker         if(bits>32 && b->endbit)
324*4d5d8b54SAndroid Build Coastguard Worker           ret|=b->ptr[4]>>(8-b->endbit);
325*4d5d8b54SAndroid Build Coastguard Worker       }
326*4d5d8b54SAndroid Build Coastguard Worker     }
327*4d5d8b54SAndroid Build Coastguard Worker   }
328*4d5d8b54SAndroid Build Coastguard Worker   return ((ret&0xffffffff)>>(m>>1))>>((m+1)>>1);
329*4d5d8b54SAndroid Build Coastguard Worker }
330*4d5d8b54SAndroid Build Coastguard Worker 
oggpack_look1(oggpack_buffer * b)331*4d5d8b54SAndroid Build Coastguard Worker long oggpack_look1(oggpack_buffer *b){
332*4d5d8b54SAndroid Build Coastguard Worker   if(b->endbyte>=b->storage)return(-1);
333*4d5d8b54SAndroid Build Coastguard Worker   return((b->ptr[0]>>b->endbit)&1);
334*4d5d8b54SAndroid Build Coastguard Worker }
335*4d5d8b54SAndroid Build Coastguard Worker 
oggpackB_look1(oggpack_buffer * b)336*4d5d8b54SAndroid Build Coastguard Worker long oggpackB_look1(oggpack_buffer *b){
337*4d5d8b54SAndroid Build Coastguard Worker   if(b->endbyte>=b->storage)return(-1);
338*4d5d8b54SAndroid Build Coastguard Worker   return((b->ptr[0]>>(7-b->endbit))&1);
339*4d5d8b54SAndroid Build Coastguard Worker }
340*4d5d8b54SAndroid Build Coastguard Worker 
oggpack_adv(oggpack_buffer * b,int bits)341*4d5d8b54SAndroid Build Coastguard Worker void oggpack_adv(oggpack_buffer *b,int bits){
342*4d5d8b54SAndroid Build Coastguard Worker   bits+=b->endbit;
343*4d5d8b54SAndroid Build Coastguard Worker 
344*4d5d8b54SAndroid Build Coastguard Worker   if(b->endbyte > b->storage-((bits+7)>>3)) goto overflow;
345*4d5d8b54SAndroid Build Coastguard Worker 
346*4d5d8b54SAndroid Build Coastguard Worker   b->ptr+=bits/8;
347*4d5d8b54SAndroid Build Coastguard Worker   b->endbyte+=bits/8;
348*4d5d8b54SAndroid Build Coastguard Worker   b->endbit=bits&7;
349*4d5d8b54SAndroid Build Coastguard Worker   return;
350*4d5d8b54SAndroid Build Coastguard Worker 
351*4d5d8b54SAndroid Build Coastguard Worker  overflow:
352*4d5d8b54SAndroid Build Coastguard Worker   b->ptr=NULL;
353*4d5d8b54SAndroid Build Coastguard Worker   b->endbyte=b->storage;
354*4d5d8b54SAndroid Build Coastguard Worker   b->endbit=1;
355*4d5d8b54SAndroid Build Coastguard Worker }
356*4d5d8b54SAndroid Build Coastguard Worker 
oggpackB_adv(oggpack_buffer * b,int bits)357*4d5d8b54SAndroid Build Coastguard Worker void oggpackB_adv(oggpack_buffer *b,int bits){
358*4d5d8b54SAndroid Build Coastguard Worker   oggpack_adv(b,bits);
359*4d5d8b54SAndroid Build Coastguard Worker }
360*4d5d8b54SAndroid Build Coastguard Worker 
oggpack_adv1(oggpack_buffer * b)361*4d5d8b54SAndroid Build Coastguard Worker void oggpack_adv1(oggpack_buffer *b){
362*4d5d8b54SAndroid Build Coastguard Worker   if(++(b->endbit)>7){
363*4d5d8b54SAndroid Build Coastguard Worker     b->endbit=0;
364*4d5d8b54SAndroid Build Coastguard Worker     b->ptr++;
365*4d5d8b54SAndroid Build Coastguard Worker     b->endbyte++;
366*4d5d8b54SAndroid Build Coastguard Worker   }
367*4d5d8b54SAndroid Build Coastguard Worker }
368*4d5d8b54SAndroid Build Coastguard Worker 
oggpackB_adv1(oggpack_buffer * b)369*4d5d8b54SAndroid Build Coastguard Worker void oggpackB_adv1(oggpack_buffer *b){
370*4d5d8b54SAndroid Build Coastguard Worker   oggpack_adv1(b);
371*4d5d8b54SAndroid Build Coastguard Worker }
372*4d5d8b54SAndroid Build Coastguard Worker 
373*4d5d8b54SAndroid Build Coastguard Worker /* bits <= 32 */
oggpack_read(oggpack_buffer * b,int bits)374*4d5d8b54SAndroid Build Coastguard Worker long oggpack_read(oggpack_buffer *b,int bits){
375*4d5d8b54SAndroid Build Coastguard Worker   long ret;
376*4d5d8b54SAndroid Build Coastguard Worker   unsigned long m;
377*4d5d8b54SAndroid Build Coastguard Worker 
378*4d5d8b54SAndroid Build Coastguard Worker   if(bits<0 || bits>32) goto err;
379*4d5d8b54SAndroid Build Coastguard Worker   m=mask[bits];
380*4d5d8b54SAndroid Build Coastguard Worker   bits+=b->endbit;
381*4d5d8b54SAndroid Build Coastguard Worker 
382*4d5d8b54SAndroid Build Coastguard Worker   if(b->endbyte >= b->storage-4){
383*4d5d8b54SAndroid Build Coastguard Worker     /* not the main path */
384*4d5d8b54SAndroid Build Coastguard Worker     if(b->endbyte > b->storage-((bits+7)>>3)) goto overflow;
385*4d5d8b54SAndroid Build Coastguard Worker     /* special case to avoid reading b->ptr[0], which might be past the end of
386*4d5d8b54SAndroid Build Coastguard Worker         the buffer; also skips some useless accounting */
387*4d5d8b54SAndroid Build Coastguard Worker     else if(!bits)return(0L);
388*4d5d8b54SAndroid Build Coastguard Worker   }
389*4d5d8b54SAndroid Build Coastguard Worker 
390*4d5d8b54SAndroid Build Coastguard Worker   ret=b->ptr[0]>>b->endbit;
391*4d5d8b54SAndroid Build Coastguard Worker   if(bits>8){
392*4d5d8b54SAndroid Build Coastguard Worker     ret|=b->ptr[1]<<(8-b->endbit);
393*4d5d8b54SAndroid Build Coastguard Worker     if(bits>16){
394*4d5d8b54SAndroid Build Coastguard Worker       ret|=b->ptr[2]<<(16-b->endbit);
395*4d5d8b54SAndroid Build Coastguard Worker       if(bits>24){
396*4d5d8b54SAndroid Build Coastguard Worker         ret|=b->ptr[3]<<(24-b->endbit);
397*4d5d8b54SAndroid Build Coastguard Worker         if(bits>32 && b->endbit){
398*4d5d8b54SAndroid Build Coastguard Worker           ret|=b->ptr[4]<<(32-b->endbit);
399*4d5d8b54SAndroid Build Coastguard Worker         }
400*4d5d8b54SAndroid Build Coastguard Worker       }
401*4d5d8b54SAndroid Build Coastguard Worker     }
402*4d5d8b54SAndroid Build Coastguard Worker   }
403*4d5d8b54SAndroid Build Coastguard Worker   ret&=m;
404*4d5d8b54SAndroid Build Coastguard Worker   b->ptr+=bits/8;
405*4d5d8b54SAndroid Build Coastguard Worker   b->endbyte+=bits/8;
406*4d5d8b54SAndroid Build Coastguard Worker   b->endbit=bits&7;
407*4d5d8b54SAndroid Build Coastguard Worker   return ret;
408*4d5d8b54SAndroid Build Coastguard Worker 
409*4d5d8b54SAndroid Build Coastguard Worker  overflow:
410*4d5d8b54SAndroid Build Coastguard Worker  err:
411*4d5d8b54SAndroid Build Coastguard Worker   b->ptr=NULL;
412*4d5d8b54SAndroid Build Coastguard Worker   b->endbyte=b->storage;
413*4d5d8b54SAndroid Build Coastguard Worker   b->endbit=1;
414*4d5d8b54SAndroid Build Coastguard Worker   return -1L;
415*4d5d8b54SAndroid Build Coastguard Worker }
416*4d5d8b54SAndroid Build Coastguard Worker 
417*4d5d8b54SAndroid Build Coastguard Worker /* bits <= 32 */
oggpackB_read(oggpack_buffer * b,int bits)418*4d5d8b54SAndroid Build Coastguard Worker long oggpackB_read(oggpack_buffer *b,int bits){
419*4d5d8b54SAndroid Build Coastguard Worker   long ret;
420*4d5d8b54SAndroid Build Coastguard Worker   long m=32-bits;
421*4d5d8b54SAndroid Build Coastguard Worker 
422*4d5d8b54SAndroid Build Coastguard Worker   if(m<0 || m>32) goto err;
423*4d5d8b54SAndroid Build Coastguard Worker   bits+=b->endbit;
424*4d5d8b54SAndroid Build Coastguard Worker 
425*4d5d8b54SAndroid Build Coastguard Worker   if(b->endbyte+4>=b->storage){
426*4d5d8b54SAndroid Build Coastguard Worker     /* not the main path */
427*4d5d8b54SAndroid Build Coastguard Worker     if(b->endbyte > b->storage-((bits+7)>>3)) goto overflow;
428*4d5d8b54SAndroid Build Coastguard Worker     /* special case to avoid reading b->ptr[0], which might be past the end of
429*4d5d8b54SAndroid Build Coastguard Worker         the buffer; also skips some useless accounting */
430*4d5d8b54SAndroid Build Coastguard Worker     else if(!bits)return(0L);
431*4d5d8b54SAndroid Build Coastguard Worker   }
432*4d5d8b54SAndroid Build Coastguard Worker 
433*4d5d8b54SAndroid Build Coastguard Worker   ret=b->ptr[0]<<(24+b->endbit);
434*4d5d8b54SAndroid Build Coastguard Worker   if(bits>8){
435*4d5d8b54SAndroid Build Coastguard Worker     ret|=b->ptr[1]<<(16+b->endbit);
436*4d5d8b54SAndroid Build Coastguard Worker     if(bits>16){
437*4d5d8b54SAndroid Build Coastguard Worker       ret|=b->ptr[2]<<(8+b->endbit);
438*4d5d8b54SAndroid Build Coastguard Worker       if(bits>24){
439*4d5d8b54SAndroid Build Coastguard Worker         ret|=b->ptr[3]<<(b->endbit);
440*4d5d8b54SAndroid Build Coastguard Worker         if(bits>32 && b->endbit)
441*4d5d8b54SAndroid Build Coastguard Worker           ret|=b->ptr[4]>>(8-b->endbit);
442*4d5d8b54SAndroid Build Coastguard Worker       }
443*4d5d8b54SAndroid Build Coastguard Worker     }
444*4d5d8b54SAndroid Build Coastguard Worker   }
445*4d5d8b54SAndroid Build Coastguard Worker   ret=((ret&0xffffffffUL)>>(m>>1))>>((m+1)>>1);
446*4d5d8b54SAndroid Build Coastguard Worker 
447*4d5d8b54SAndroid Build Coastguard Worker   b->ptr+=bits/8;
448*4d5d8b54SAndroid Build Coastguard Worker   b->endbyte+=bits/8;
449*4d5d8b54SAndroid Build Coastguard Worker   b->endbit=bits&7;
450*4d5d8b54SAndroid Build Coastguard Worker   return ret;
451*4d5d8b54SAndroid Build Coastguard Worker 
452*4d5d8b54SAndroid Build Coastguard Worker  overflow:
453*4d5d8b54SAndroid Build Coastguard Worker  err:
454*4d5d8b54SAndroid Build Coastguard Worker   b->ptr=NULL;
455*4d5d8b54SAndroid Build Coastguard Worker   b->endbyte=b->storage;
456*4d5d8b54SAndroid Build Coastguard Worker   b->endbit=1;
457*4d5d8b54SAndroid Build Coastguard Worker   return -1L;
458*4d5d8b54SAndroid Build Coastguard Worker }
459*4d5d8b54SAndroid Build Coastguard Worker 
oggpack_read1(oggpack_buffer * b)460*4d5d8b54SAndroid Build Coastguard Worker long oggpack_read1(oggpack_buffer *b){
461*4d5d8b54SAndroid Build Coastguard Worker   long ret;
462*4d5d8b54SAndroid Build Coastguard Worker 
463*4d5d8b54SAndroid Build Coastguard Worker   if(b->endbyte >= b->storage) goto overflow;
464*4d5d8b54SAndroid Build Coastguard Worker   ret=(b->ptr[0]>>b->endbit)&1;
465*4d5d8b54SAndroid Build Coastguard Worker 
466*4d5d8b54SAndroid Build Coastguard Worker   b->endbit++;
467*4d5d8b54SAndroid Build Coastguard Worker   if(b->endbit>7){
468*4d5d8b54SAndroid Build Coastguard Worker     b->endbit=0;
469*4d5d8b54SAndroid Build Coastguard Worker     b->ptr++;
470*4d5d8b54SAndroid Build Coastguard Worker     b->endbyte++;
471*4d5d8b54SAndroid Build Coastguard Worker   }
472*4d5d8b54SAndroid Build Coastguard Worker   return ret;
473*4d5d8b54SAndroid Build Coastguard Worker 
474*4d5d8b54SAndroid Build Coastguard Worker  overflow:
475*4d5d8b54SAndroid Build Coastguard Worker   b->ptr=NULL;
476*4d5d8b54SAndroid Build Coastguard Worker   b->endbyte=b->storage;
477*4d5d8b54SAndroid Build Coastguard Worker   b->endbit=1;
478*4d5d8b54SAndroid Build Coastguard Worker   return -1L;
479*4d5d8b54SAndroid Build Coastguard Worker }
480*4d5d8b54SAndroid Build Coastguard Worker 
oggpackB_read1(oggpack_buffer * b)481*4d5d8b54SAndroid Build Coastguard Worker long oggpackB_read1(oggpack_buffer *b){
482*4d5d8b54SAndroid Build Coastguard Worker   long ret;
483*4d5d8b54SAndroid Build Coastguard Worker 
484*4d5d8b54SAndroid Build Coastguard Worker   if(b->endbyte >= b->storage) goto overflow;
485*4d5d8b54SAndroid Build Coastguard Worker   ret=(b->ptr[0]>>(7-b->endbit))&1;
486*4d5d8b54SAndroid Build Coastguard Worker 
487*4d5d8b54SAndroid Build Coastguard Worker   b->endbit++;
488*4d5d8b54SAndroid Build Coastguard Worker   if(b->endbit>7){
489*4d5d8b54SAndroid Build Coastguard Worker     b->endbit=0;
490*4d5d8b54SAndroid Build Coastguard Worker     b->ptr++;
491*4d5d8b54SAndroid Build Coastguard Worker     b->endbyte++;
492*4d5d8b54SAndroid Build Coastguard Worker   }
493*4d5d8b54SAndroid Build Coastguard Worker   return ret;
494*4d5d8b54SAndroid Build Coastguard Worker 
495*4d5d8b54SAndroid Build Coastguard Worker  overflow:
496*4d5d8b54SAndroid Build Coastguard Worker   b->ptr=NULL;
497*4d5d8b54SAndroid Build Coastguard Worker   b->endbyte=b->storage;
498*4d5d8b54SAndroid Build Coastguard Worker   b->endbit=1;
499*4d5d8b54SAndroid Build Coastguard Worker   return -1L;
500*4d5d8b54SAndroid Build Coastguard Worker }
501*4d5d8b54SAndroid Build Coastguard Worker 
oggpack_bytes(oggpack_buffer * b)502*4d5d8b54SAndroid Build Coastguard Worker long oggpack_bytes(oggpack_buffer *b){
503*4d5d8b54SAndroid Build Coastguard Worker   return(b->endbyte+(b->endbit+7)/8);
504*4d5d8b54SAndroid Build Coastguard Worker }
505*4d5d8b54SAndroid Build Coastguard Worker 
oggpack_bits(oggpack_buffer * b)506*4d5d8b54SAndroid Build Coastguard Worker long oggpack_bits(oggpack_buffer *b){
507*4d5d8b54SAndroid Build Coastguard Worker   return(b->endbyte*8+b->endbit);
508*4d5d8b54SAndroid Build Coastguard Worker }
509*4d5d8b54SAndroid Build Coastguard Worker 
oggpackB_bytes(oggpack_buffer * b)510*4d5d8b54SAndroid Build Coastguard Worker long oggpackB_bytes(oggpack_buffer *b){
511*4d5d8b54SAndroid Build Coastguard Worker   return oggpack_bytes(b);
512*4d5d8b54SAndroid Build Coastguard Worker }
513*4d5d8b54SAndroid Build Coastguard Worker 
oggpackB_bits(oggpack_buffer * b)514*4d5d8b54SAndroid Build Coastguard Worker long oggpackB_bits(oggpack_buffer *b){
515*4d5d8b54SAndroid Build Coastguard Worker   return oggpack_bits(b);
516*4d5d8b54SAndroid Build Coastguard Worker }
517*4d5d8b54SAndroid Build Coastguard Worker 
oggpack_get_buffer(oggpack_buffer * b)518*4d5d8b54SAndroid Build Coastguard Worker unsigned char *oggpack_get_buffer(oggpack_buffer *b){
519*4d5d8b54SAndroid Build Coastguard Worker   return(b->buffer);
520*4d5d8b54SAndroid Build Coastguard Worker }
521*4d5d8b54SAndroid Build Coastguard Worker 
oggpackB_get_buffer(oggpack_buffer * b)522*4d5d8b54SAndroid Build Coastguard Worker unsigned char *oggpackB_get_buffer(oggpack_buffer *b){
523*4d5d8b54SAndroid Build Coastguard Worker   return oggpack_get_buffer(b);
524*4d5d8b54SAndroid Build Coastguard Worker }
525*4d5d8b54SAndroid Build Coastguard Worker 
526*4d5d8b54SAndroid Build Coastguard Worker /* Self test of the bitwise routines; everything else is based on
527*4d5d8b54SAndroid Build Coastguard Worker    them, so they damned well better be solid. */
528*4d5d8b54SAndroid Build Coastguard Worker 
529*4d5d8b54SAndroid Build Coastguard Worker #ifdef _V_SELFTEST
530*4d5d8b54SAndroid Build Coastguard Worker #include <stdio.h>
531*4d5d8b54SAndroid Build Coastguard Worker 
ilog(unsigned int v)532*4d5d8b54SAndroid Build Coastguard Worker static int ilog(unsigned int v){
533*4d5d8b54SAndroid Build Coastguard Worker   int ret=0;
534*4d5d8b54SAndroid Build Coastguard Worker   while(v){
535*4d5d8b54SAndroid Build Coastguard Worker     ret++;
536*4d5d8b54SAndroid Build Coastguard Worker     v>>=1;
537*4d5d8b54SAndroid Build Coastguard Worker   }
538*4d5d8b54SAndroid Build Coastguard Worker   return(ret);
539*4d5d8b54SAndroid Build Coastguard Worker }
540*4d5d8b54SAndroid Build Coastguard Worker 
541*4d5d8b54SAndroid Build Coastguard Worker oggpack_buffer o;
542*4d5d8b54SAndroid Build Coastguard Worker oggpack_buffer r;
543*4d5d8b54SAndroid Build Coastguard Worker 
report(char * in)544*4d5d8b54SAndroid Build Coastguard Worker void report(char *in){
545*4d5d8b54SAndroid Build Coastguard Worker   fprintf(stderr,"%s",in);
546*4d5d8b54SAndroid Build Coastguard Worker   exit(1);
547*4d5d8b54SAndroid Build Coastguard Worker }
548*4d5d8b54SAndroid Build Coastguard Worker 
cliptest(unsigned long * b,int vals,int bits,int * comp,int compsize)549*4d5d8b54SAndroid Build Coastguard Worker void cliptest(unsigned long *b,int vals,int bits,int *comp,int compsize){
550*4d5d8b54SAndroid Build Coastguard Worker   long bytes,i;
551*4d5d8b54SAndroid Build Coastguard Worker   unsigned char *buffer;
552*4d5d8b54SAndroid Build Coastguard Worker 
553*4d5d8b54SAndroid Build Coastguard Worker   oggpack_reset(&o);
554*4d5d8b54SAndroid Build Coastguard Worker   for(i=0;i<vals;i++)
555*4d5d8b54SAndroid Build Coastguard Worker     oggpack_write(&o,b[i],bits?bits:ilog(b[i]));
556*4d5d8b54SAndroid Build Coastguard Worker   buffer=oggpack_get_buffer(&o);
557*4d5d8b54SAndroid Build Coastguard Worker   bytes=oggpack_bytes(&o);
558*4d5d8b54SAndroid Build Coastguard Worker   if(bytes!=compsize)report("wrong number of bytes!\n");
559*4d5d8b54SAndroid Build Coastguard Worker   for(i=0;i<bytes;i++)if(buffer[i]!=comp[i]){
560*4d5d8b54SAndroid Build Coastguard Worker     for(i=0;i<bytes;i++)fprintf(stderr,"%x %x\n",(int)buffer[i],(int)comp[i]);
561*4d5d8b54SAndroid Build Coastguard Worker     report("wrote incorrect value!\n");
562*4d5d8b54SAndroid Build Coastguard Worker   }
563*4d5d8b54SAndroid Build Coastguard Worker   oggpack_readinit(&r,buffer,bytes);
564*4d5d8b54SAndroid Build Coastguard Worker   for(i=0;i<vals;i++){
565*4d5d8b54SAndroid Build Coastguard Worker     int tbit=bits?bits:ilog(b[i]);
566*4d5d8b54SAndroid Build Coastguard Worker     if(oggpack_look(&r,tbit)==-1)
567*4d5d8b54SAndroid Build Coastguard Worker       report("out of data!\n");
568*4d5d8b54SAndroid Build Coastguard Worker     if(oggpack_look(&r,tbit)!=(b[i]&mask[tbit]))
569*4d5d8b54SAndroid Build Coastguard Worker       report("looked at incorrect value!\n");
570*4d5d8b54SAndroid Build Coastguard Worker     if(tbit==1)
571*4d5d8b54SAndroid Build Coastguard Worker       if(oggpack_look1(&r)!=(b[i]&mask[tbit]))
572*4d5d8b54SAndroid Build Coastguard Worker         report("looked at single bit incorrect value!\n");
573*4d5d8b54SAndroid Build Coastguard Worker     if(tbit==1){
574*4d5d8b54SAndroid Build Coastguard Worker       if(oggpack_read1(&r)!=(b[i]&mask[tbit]))
575*4d5d8b54SAndroid Build Coastguard Worker         report("read incorrect single bit value!\n");
576*4d5d8b54SAndroid Build Coastguard Worker     }else{
577*4d5d8b54SAndroid Build Coastguard Worker     if(oggpack_read(&r,tbit)!=(b[i]&mask[tbit]))
578*4d5d8b54SAndroid Build Coastguard Worker       report("read incorrect value!\n");
579*4d5d8b54SAndroid Build Coastguard Worker     }
580*4d5d8b54SAndroid Build Coastguard Worker   }
581*4d5d8b54SAndroid Build Coastguard Worker   if(oggpack_bytes(&r)!=bytes)report("leftover bytes after read!\n");
582*4d5d8b54SAndroid Build Coastguard Worker }
583*4d5d8b54SAndroid Build Coastguard Worker 
cliptestB(unsigned long * b,int vals,int bits,int * comp,int compsize)584*4d5d8b54SAndroid Build Coastguard Worker void cliptestB(unsigned long *b,int vals,int bits,int *comp,int compsize){
585*4d5d8b54SAndroid Build Coastguard Worker   long bytes,i;
586*4d5d8b54SAndroid Build Coastguard Worker   unsigned char *buffer;
587*4d5d8b54SAndroid Build Coastguard Worker 
588*4d5d8b54SAndroid Build Coastguard Worker   oggpackB_reset(&o);
589*4d5d8b54SAndroid Build Coastguard Worker   for(i=0;i<vals;i++)
590*4d5d8b54SAndroid Build Coastguard Worker     oggpackB_write(&o,b[i],bits?bits:ilog(b[i]));
591*4d5d8b54SAndroid Build Coastguard Worker   buffer=oggpackB_get_buffer(&o);
592*4d5d8b54SAndroid Build Coastguard Worker   bytes=oggpackB_bytes(&o);
593*4d5d8b54SAndroid Build Coastguard Worker   if(bytes!=compsize)report("wrong number of bytes!\n");
594*4d5d8b54SAndroid Build Coastguard Worker   for(i=0;i<bytes;i++)if(buffer[i]!=comp[i]){
595*4d5d8b54SAndroid Build Coastguard Worker     for(i=0;i<bytes;i++)fprintf(stderr,"%x %x\n",(int)buffer[i],(int)comp[i]);
596*4d5d8b54SAndroid Build Coastguard Worker     report("wrote incorrect value!\n");
597*4d5d8b54SAndroid Build Coastguard Worker   }
598*4d5d8b54SAndroid Build Coastguard Worker   oggpackB_readinit(&r,buffer,bytes);
599*4d5d8b54SAndroid Build Coastguard Worker   for(i=0;i<vals;i++){
600*4d5d8b54SAndroid Build Coastguard Worker     int tbit=bits?bits:ilog(b[i]);
601*4d5d8b54SAndroid Build Coastguard Worker     if(oggpackB_look(&r,tbit)==-1)
602*4d5d8b54SAndroid Build Coastguard Worker       report("out of data!\n");
603*4d5d8b54SAndroid Build Coastguard Worker     if(oggpackB_look(&r,tbit)!=(b[i]&mask[tbit]))
604*4d5d8b54SAndroid Build Coastguard Worker       report("looked at incorrect value!\n");
605*4d5d8b54SAndroid Build Coastguard Worker     if(tbit==1)
606*4d5d8b54SAndroid Build Coastguard Worker       if(oggpackB_look1(&r)!=(b[i]&mask[tbit]))
607*4d5d8b54SAndroid Build Coastguard Worker         report("looked at single bit incorrect value!\n");
608*4d5d8b54SAndroid Build Coastguard Worker     if(tbit==1){
609*4d5d8b54SAndroid Build Coastguard Worker       if(oggpackB_read1(&r)!=(b[i]&mask[tbit]))
610*4d5d8b54SAndroid Build Coastguard Worker         report("read incorrect single bit value!\n");
611*4d5d8b54SAndroid Build Coastguard Worker     }else{
612*4d5d8b54SAndroid Build Coastguard Worker     if(oggpackB_read(&r,tbit)!=(b[i]&mask[tbit]))
613*4d5d8b54SAndroid Build Coastguard Worker       report("read incorrect value!\n");
614*4d5d8b54SAndroid Build Coastguard Worker     }
615*4d5d8b54SAndroid Build Coastguard Worker   }
616*4d5d8b54SAndroid Build Coastguard Worker   if(oggpackB_bytes(&r)!=bytes)report("leftover bytes after read!\n");
617*4d5d8b54SAndroid Build Coastguard Worker }
618*4d5d8b54SAndroid Build Coastguard Worker 
copytest(int prefill,int copy)619*4d5d8b54SAndroid Build Coastguard Worker void copytest(int prefill, int copy){
620*4d5d8b54SAndroid Build Coastguard Worker   oggpack_buffer source_write;
621*4d5d8b54SAndroid Build Coastguard Worker   oggpack_buffer dest_write;
622*4d5d8b54SAndroid Build Coastguard Worker   oggpack_buffer source_read;
623*4d5d8b54SAndroid Build Coastguard Worker   oggpack_buffer dest_read;
624*4d5d8b54SAndroid Build Coastguard Worker   unsigned char *source;
625*4d5d8b54SAndroid Build Coastguard Worker   unsigned char *dest;
626*4d5d8b54SAndroid Build Coastguard Worker   long source_bytes,dest_bytes;
627*4d5d8b54SAndroid Build Coastguard Worker   int i;
628*4d5d8b54SAndroid Build Coastguard Worker 
629*4d5d8b54SAndroid Build Coastguard Worker   oggpack_writeinit(&source_write);
630*4d5d8b54SAndroid Build Coastguard Worker   oggpack_writeinit(&dest_write);
631*4d5d8b54SAndroid Build Coastguard Worker 
632*4d5d8b54SAndroid Build Coastguard Worker   for(i=0;i<(prefill+copy+7)/8;i++)
633*4d5d8b54SAndroid Build Coastguard Worker     oggpack_write(&source_write,(i^0x5a)&0xff,8);
634*4d5d8b54SAndroid Build Coastguard Worker   source=oggpack_get_buffer(&source_write);
635*4d5d8b54SAndroid Build Coastguard Worker   source_bytes=oggpack_bytes(&source_write);
636*4d5d8b54SAndroid Build Coastguard Worker 
637*4d5d8b54SAndroid Build Coastguard Worker   /* prefill */
638*4d5d8b54SAndroid Build Coastguard Worker   oggpack_writecopy(&dest_write,source,prefill);
639*4d5d8b54SAndroid Build Coastguard Worker 
640*4d5d8b54SAndroid Build Coastguard Worker   /* check buffers; verify end byte masking */
641*4d5d8b54SAndroid Build Coastguard Worker   dest=oggpack_get_buffer(&dest_write);
642*4d5d8b54SAndroid Build Coastguard Worker   dest_bytes=oggpack_bytes(&dest_write);
643*4d5d8b54SAndroid Build Coastguard Worker   if(dest_bytes!=(prefill+7)/8){
644*4d5d8b54SAndroid Build Coastguard Worker     fprintf(stderr,"wrong number of bytes after prefill! %ld!=%d\n",dest_bytes,(prefill+7)/8);
645*4d5d8b54SAndroid Build Coastguard Worker     exit(1);
646*4d5d8b54SAndroid Build Coastguard Worker   }
647*4d5d8b54SAndroid Build Coastguard Worker   oggpack_readinit(&source_read,source,source_bytes);
648*4d5d8b54SAndroid Build Coastguard Worker   oggpack_readinit(&dest_read,dest,dest_bytes);
649*4d5d8b54SAndroid Build Coastguard Worker 
650*4d5d8b54SAndroid Build Coastguard Worker   for(i=0;i<prefill;i+=8){
651*4d5d8b54SAndroid Build Coastguard Worker     int s=oggpack_read(&source_read,prefill-i<8?prefill-i:8);
652*4d5d8b54SAndroid Build Coastguard Worker     int d=oggpack_read(&dest_read,prefill-i<8?prefill-i:8);
653*4d5d8b54SAndroid Build Coastguard Worker     if(s!=d){
654*4d5d8b54SAndroid Build Coastguard Worker       fprintf(stderr,"prefill=%d mismatch! byte %d, %x!=%x\n",prefill,i/8,s,d);
655*4d5d8b54SAndroid Build Coastguard Worker       exit(1);
656*4d5d8b54SAndroid Build Coastguard Worker     }
657*4d5d8b54SAndroid Build Coastguard Worker   }
658*4d5d8b54SAndroid Build Coastguard Worker   if(prefill<dest_bytes){
659*4d5d8b54SAndroid Build Coastguard Worker     if(oggpack_read(&dest_read,dest_bytes-prefill)!=0){
660*4d5d8b54SAndroid Build Coastguard Worker       fprintf(stderr,"prefill=%d mismatch! trailing bits not zero\n",prefill);
661*4d5d8b54SAndroid Build Coastguard Worker       exit(1);
662*4d5d8b54SAndroid Build Coastguard Worker     }
663*4d5d8b54SAndroid Build Coastguard Worker   }
664*4d5d8b54SAndroid Build Coastguard Worker 
665*4d5d8b54SAndroid Build Coastguard Worker   /* second copy */
666*4d5d8b54SAndroid Build Coastguard Worker   oggpack_writecopy(&dest_write,source,copy);
667*4d5d8b54SAndroid Build Coastguard Worker 
668*4d5d8b54SAndroid Build Coastguard Worker   /* check buffers; verify end byte masking */
669*4d5d8b54SAndroid Build Coastguard Worker   dest=oggpack_get_buffer(&dest_write);
670*4d5d8b54SAndroid Build Coastguard Worker   dest_bytes=oggpack_bytes(&dest_write);
671*4d5d8b54SAndroid Build Coastguard Worker   if(dest_bytes!=(copy+prefill+7)/8){
672*4d5d8b54SAndroid Build Coastguard Worker     fprintf(stderr,"wrong number of bytes after prefill+copy! %ld!=%d\n",dest_bytes,(copy+prefill+7)/8);
673*4d5d8b54SAndroid Build Coastguard Worker     exit(1);
674*4d5d8b54SAndroid Build Coastguard Worker   }
675*4d5d8b54SAndroid Build Coastguard Worker   oggpack_readinit(&source_read,source,source_bytes);
676*4d5d8b54SAndroid Build Coastguard Worker   oggpack_readinit(&dest_read,dest,dest_bytes);
677*4d5d8b54SAndroid Build Coastguard Worker 
678*4d5d8b54SAndroid Build Coastguard Worker   for(i=0;i<prefill;i+=8){
679*4d5d8b54SAndroid Build Coastguard Worker     int s=oggpack_read(&source_read,prefill-i<8?prefill-i:8);
680*4d5d8b54SAndroid Build Coastguard Worker     int d=oggpack_read(&dest_read,prefill-i<8?prefill-i:8);
681*4d5d8b54SAndroid Build Coastguard Worker     if(s!=d){
682*4d5d8b54SAndroid Build Coastguard Worker       fprintf(stderr,"prefill=%d mismatch! byte %d, %x!=%x\n",prefill,i/8,s,d);
683*4d5d8b54SAndroid Build Coastguard Worker       exit(1);
684*4d5d8b54SAndroid Build Coastguard Worker     }
685*4d5d8b54SAndroid Build Coastguard Worker   }
686*4d5d8b54SAndroid Build Coastguard Worker 
687*4d5d8b54SAndroid Build Coastguard Worker   oggpack_readinit(&source_read,source,source_bytes);
688*4d5d8b54SAndroid Build Coastguard Worker   for(i=0;i<copy;i+=8){
689*4d5d8b54SAndroid Build Coastguard Worker     int s=oggpack_read(&source_read,copy-i<8?copy-i:8);
690*4d5d8b54SAndroid Build Coastguard Worker     int d=oggpack_read(&dest_read,copy-i<8?copy-i:8);
691*4d5d8b54SAndroid Build Coastguard Worker     if(s!=d){
692*4d5d8b54SAndroid Build Coastguard Worker       fprintf(stderr,"prefill=%d copy=%d mismatch! byte %d, %x!=%x\n",prefill,copy,i/8,s,d);
693*4d5d8b54SAndroid Build Coastguard Worker       exit(1);
694*4d5d8b54SAndroid Build Coastguard Worker     }
695*4d5d8b54SAndroid Build Coastguard Worker   }
696*4d5d8b54SAndroid Build Coastguard Worker 
697*4d5d8b54SAndroid Build Coastguard Worker   if(copy+prefill<dest_bytes){
698*4d5d8b54SAndroid Build Coastguard Worker     if(oggpack_read(&dest_read,dest_bytes-copy-prefill)!=0){
699*4d5d8b54SAndroid Build Coastguard Worker       fprintf(stderr,"prefill=%d copy=%d mismatch! trailing bits not zero\n",prefill,copy);
700*4d5d8b54SAndroid Build Coastguard Worker       exit(1);
701*4d5d8b54SAndroid Build Coastguard Worker     }
702*4d5d8b54SAndroid Build Coastguard Worker   }
703*4d5d8b54SAndroid Build Coastguard Worker 
704*4d5d8b54SAndroid Build Coastguard Worker   oggpack_writeclear(&source_write);
705*4d5d8b54SAndroid Build Coastguard Worker   oggpack_writeclear(&dest_write);
706*4d5d8b54SAndroid Build Coastguard Worker 
707*4d5d8b54SAndroid Build Coastguard Worker 
708*4d5d8b54SAndroid Build Coastguard Worker }
709*4d5d8b54SAndroid Build Coastguard Worker 
copytestB(int prefill,int copy)710*4d5d8b54SAndroid Build Coastguard Worker void copytestB(int prefill, int copy){
711*4d5d8b54SAndroid Build Coastguard Worker   oggpack_buffer source_write;
712*4d5d8b54SAndroid Build Coastguard Worker   oggpack_buffer dest_write;
713*4d5d8b54SAndroid Build Coastguard Worker   oggpack_buffer source_read;
714*4d5d8b54SAndroid Build Coastguard Worker   oggpack_buffer dest_read;
715*4d5d8b54SAndroid Build Coastguard Worker   unsigned char *source;
716*4d5d8b54SAndroid Build Coastguard Worker   unsigned char *dest;
717*4d5d8b54SAndroid Build Coastguard Worker   long source_bytes,dest_bytes;
718*4d5d8b54SAndroid Build Coastguard Worker   int i;
719*4d5d8b54SAndroid Build Coastguard Worker 
720*4d5d8b54SAndroid Build Coastguard Worker   oggpackB_writeinit(&source_write);
721*4d5d8b54SAndroid Build Coastguard Worker   oggpackB_writeinit(&dest_write);
722*4d5d8b54SAndroid Build Coastguard Worker 
723*4d5d8b54SAndroid Build Coastguard Worker   for(i=0;i<(prefill+copy+7)/8;i++)
724*4d5d8b54SAndroid Build Coastguard Worker     oggpackB_write(&source_write,(i^0x5a)&0xff,8);
725*4d5d8b54SAndroid Build Coastguard Worker   source=oggpackB_get_buffer(&source_write);
726*4d5d8b54SAndroid Build Coastguard Worker   source_bytes=oggpackB_bytes(&source_write);
727*4d5d8b54SAndroid Build Coastguard Worker 
728*4d5d8b54SAndroid Build Coastguard Worker   /* prefill */
729*4d5d8b54SAndroid Build Coastguard Worker   oggpackB_writecopy(&dest_write,source,prefill);
730*4d5d8b54SAndroid Build Coastguard Worker 
731*4d5d8b54SAndroid Build Coastguard Worker   /* check buffers; verify end byte masking */
732*4d5d8b54SAndroid Build Coastguard Worker   dest=oggpackB_get_buffer(&dest_write);
733*4d5d8b54SAndroid Build Coastguard Worker   dest_bytes=oggpackB_bytes(&dest_write);
734*4d5d8b54SAndroid Build Coastguard Worker   if(dest_bytes!=(prefill+7)/8){
735*4d5d8b54SAndroid Build Coastguard Worker     fprintf(stderr,"wrong number of bytes after prefill! %ld!=%d\n",dest_bytes,(prefill+7)/8);
736*4d5d8b54SAndroid Build Coastguard Worker     exit(1);
737*4d5d8b54SAndroid Build Coastguard Worker   }
738*4d5d8b54SAndroid Build Coastguard Worker   oggpackB_readinit(&source_read,source,source_bytes);
739*4d5d8b54SAndroid Build Coastguard Worker   oggpackB_readinit(&dest_read,dest,dest_bytes);
740*4d5d8b54SAndroid Build Coastguard Worker 
741*4d5d8b54SAndroid Build Coastguard Worker   for(i=0;i<prefill;i+=8){
742*4d5d8b54SAndroid Build Coastguard Worker     int s=oggpackB_read(&source_read,prefill-i<8?prefill-i:8);
743*4d5d8b54SAndroid Build Coastguard Worker     int d=oggpackB_read(&dest_read,prefill-i<8?prefill-i:8);
744*4d5d8b54SAndroid Build Coastguard Worker     if(s!=d){
745*4d5d8b54SAndroid Build Coastguard Worker       fprintf(stderr,"prefill=%d mismatch! byte %d, %x!=%x\n",prefill,i/8,s,d);
746*4d5d8b54SAndroid Build Coastguard Worker       exit(1);
747*4d5d8b54SAndroid Build Coastguard Worker     }
748*4d5d8b54SAndroid Build Coastguard Worker   }
749*4d5d8b54SAndroid Build Coastguard Worker   if(prefill<dest_bytes){
750*4d5d8b54SAndroid Build Coastguard Worker     if(oggpackB_read(&dest_read,dest_bytes-prefill)!=0){
751*4d5d8b54SAndroid Build Coastguard Worker       fprintf(stderr,"prefill=%d mismatch! trailing bits not zero\n",prefill);
752*4d5d8b54SAndroid Build Coastguard Worker       exit(1);
753*4d5d8b54SAndroid Build Coastguard Worker     }
754*4d5d8b54SAndroid Build Coastguard Worker   }
755*4d5d8b54SAndroid Build Coastguard Worker 
756*4d5d8b54SAndroid Build Coastguard Worker   /* second copy */
757*4d5d8b54SAndroid Build Coastguard Worker   oggpackB_writecopy(&dest_write,source,copy);
758*4d5d8b54SAndroid Build Coastguard Worker 
759*4d5d8b54SAndroid Build Coastguard Worker   /* check buffers; verify end byte masking */
760*4d5d8b54SAndroid Build Coastguard Worker   dest=oggpackB_get_buffer(&dest_write);
761*4d5d8b54SAndroid Build Coastguard Worker   dest_bytes=oggpackB_bytes(&dest_write);
762*4d5d8b54SAndroid Build Coastguard Worker   if(dest_bytes!=(copy+prefill+7)/8){
763*4d5d8b54SAndroid Build Coastguard Worker     fprintf(stderr,"wrong number of bytes after prefill+copy! %ld!=%d\n",dest_bytes,(copy+prefill+7)/8);
764*4d5d8b54SAndroid Build Coastguard Worker     exit(1);
765*4d5d8b54SAndroid Build Coastguard Worker   }
766*4d5d8b54SAndroid Build Coastguard Worker   oggpackB_readinit(&source_read,source,source_bytes);
767*4d5d8b54SAndroid Build Coastguard Worker   oggpackB_readinit(&dest_read,dest,dest_bytes);
768*4d5d8b54SAndroid Build Coastguard Worker 
769*4d5d8b54SAndroid Build Coastguard Worker   for(i=0;i<prefill;i+=8){
770*4d5d8b54SAndroid Build Coastguard Worker     int s=oggpackB_read(&source_read,prefill-i<8?prefill-i:8);
771*4d5d8b54SAndroid Build Coastguard Worker     int d=oggpackB_read(&dest_read,prefill-i<8?prefill-i:8);
772*4d5d8b54SAndroid Build Coastguard Worker     if(s!=d){
773*4d5d8b54SAndroid Build Coastguard Worker       fprintf(stderr,"prefill=%d mismatch! byte %d, %x!=%x\n",prefill,i/8,s,d);
774*4d5d8b54SAndroid Build Coastguard Worker       exit(1);
775*4d5d8b54SAndroid Build Coastguard Worker     }
776*4d5d8b54SAndroid Build Coastguard Worker   }
777*4d5d8b54SAndroid Build Coastguard Worker 
778*4d5d8b54SAndroid Build Coastguard Worker   oggpackB_readinit(&source_read,source,source_bytes);
779*4d5d8b54SAndroid Build Coastguard Worker   for(i=0;i<copy;i+=8){
780*4d5d8b54SAndroid Build Coastguard Worker     int s=oggpackB_read(&source_read,copy-i<8?copy-i:8);
781*4d5d8b54SAndroid Build Coastguard Worker     int d=oggpackB_read(&dest_read,copy-i<8?copy-i:8);
782*4d5d8b54SAndroid Build Coastguard Worker     if(s!=d){
783*4d5d8b54SAndroid Build Coastguard Worker       fprintf(stderr,"prefill=%d copy=%d mismatch! byte %d, %x!=%x\n",prefill,copy,i/8,s,d);
784*4d5d8b54SAndroid Build Coastguard Worker       exit(1);
785*4d5d8b54SAndroid Build Coastguard Worker     }
786*4d5d8b54SAndroid Build Coastguard Worker   }
787*4d5d8b54SAndroid Build Coastguard Worker 
788*4d5d8b54SAndroid Build Coastguard Worker   if(copy+prefill<dest_bytes){
789*4d5d8b54SAndroid Build Coastguard Worker     if(oggpackB_read(&dest_read,dest_bytes-copy-prefill)!=0){
790*4d5d8b54SAndroid Build Coastguard Worker       fprintf(stderr,"prefill=%d copy=%d mismatch! trailing bits not zero\n",prefill,copy);
791*4d5d8b54SAndroid Build Coastguard Worker       exit(1);
792*4d5d8b54SAndroid Build Coastguard Worker     }
793*4d5d8b54SAndroid Build Coastguard Worker   }
794*4d5d8b54SAndroid Build Coastguard Worker 
795*4d5d8b54SAndroid Build Coastguard Worker   oggpackB_writeclear(&source_write);
796*4d5d8b54SAndroid Build Coastguard Worker   oggpackB_writeclear(&dest_write);
797*4d5d8b54SAndroid Build Coastguard Worker 
798*4d5d8b54SAndroid Build Coastguard Worker }
799*4d5d8b54SAndroid Build Coastguard Worker 
main(void)800*4d5d8b54SAndroid Build Coastguard Worker int main(void){
801*4d5d8b54SAndroid Build Coastguard Worker   unsigned char *buffer;
802*4d5d8b54SAndroid Build Coastguard Worker   long bytes,i,j;
803*4d5d8b54SAndroid Build Coastguard Worker   static unsigned long testbuffer1[]=
804*4d5d8b54SAndroid Build Coastguard Worker     {18,12,103948,4325,543,76,432,52,3,65,4,56,32,42,34,21,1,23,32,546,456,7,
805*4d5d8b54SAndroid Build Coastguard Worker        567,56,8,8,55,3,52,342,341,4,265,7,67,86,2199,21,7,1,5,1,4};
806*4d5d8b54SAndroid Build Coastguard Worker   int test1size=43;
807*4d5d8b54SAndroid Build Coastguard Worker 
808*4d5d8b54SAndroid Build Coastguard Worker   static unsigned long testbuffer2[]=
809*4d5d8b54SAndroid Build Coastguard Worker     {216531625L,1237861823,56732452,131,3212421,12325343,34547562,12313212,
810*4d5d8b54SAndroid Build Coastguard Worker        1233432,534,5,346435231,14436467,7869299,76326614,167548585,
811*4d5d8b54SAndroid Build Coastguard Worker        85525151,0,12321,1,349528352};
812*4d5d8b54SAndroid Build Coastguard Worker   int test2size=21;
813*4d5d8b54SAndroid Build Coastguard Worker 
814*4d5d8b54SAndroid Build Coastguard Worker   static unsigned long testbuffer3[]=
815*4d5d8b54SAndroid Build Coastguard Worker     {1,0,14,0,1,0,12,0,1,0,0,0,1,1,0,1,0,1,0,1,0,1,0,1,0,1,0,0,1,1,1,1,1,0,0,1,
816*4d5d8b54SAndroid Build Coastguard Worker        0,1,30,1,1,1,0,0,1,0,0,0,12,0,11,0,1,0,0,1};
817*4d5d8b54SAndroid Build Coastguard Worker   int test3size=56;
818*4d5d8b54SAndroid Build Coastguard Worker 
819*4d5d8b54SAndroid Build Coastguard Worker   static unsigned long large[]=
820*4d5d8b54SAndroid Build Coastguard Worker     {2136531625L,2137861823,56732452,131,3212421,12325343,34547562,12313212,
821*4d5d8b54SAndroid Build Coastguard Worker        1233432,534,5,2146435231,14436467,7869299,76326614,167548585,
822*4d5d8b54SAndroid Build Coastguard Worker        85525151,0,12321,1,2146528352};
823*4d5d8b54SAndroid Build Coastguard Worker 
824*4d5d8b54SAndroid Build Coastguard Worker   int onesize=33;
825*4d5d8b54SAndroid Build Coastguard Worker   static int one[33]={146,25,44,151,195,15,153,176,233,131,196,65,85,172,47,40,
826*4d5d8b54SAndroid Build Coastguard Worker                     34,242,223,136,35,222,211,86,171,50,225,135,214,75,172,
827*4d5d8b54SAndroid Build Coastguard Worker                     223,4};
828*4d5d8b54SAndroid Build Coastguard Worker   static int oneB[33]={150,101,131,33,203,15,204,216,105,193,156,65,84,85,222,
829*4d5d8b54SAndroid Build Coastguard Worker                        8,139,145,227,126,34,55,244,171,85,100,39,195,173,18,
830*4d5d8b54SAndroid Build Coastguard Worker                        245,251,128};
831*4d5d8b54SAndroid Build Coastguard Worker 
832*4d5d8b54SAndroid Build Coastguard Worker   int twosize=6;
833*4d5d8b54SAndroid Build Coastguard Worker   static int two[6]={61,255,255,251,231,29};
834*4d5d8b54SAndroid Build Coastguard Worker   static int twoB[6]={247,63,255,253,249,120};
835*4d5d8b54SAndroid Build Coastguard Worker 
836*4d5d8b54SAndroid Build Coastguard Worker   int threesize=54;
837*4d5d8b54SAndroid Build Coastguard Worker   static int three[54]={169,2,232,252,91,132,156,36,89,13,123,176,144,32,254,
838*4d5d8b54SAndroid Build Coastguard Worker                       142,224,85,59,121,144,79,124,23,67,90,90,216,79,23,83,
839*4d5d8b54SAndroid Build Coastguard Worker                       58,135,196,61,55,129,183,54,101,100,170,37,127,126,10,
840*4d5d8b54SAndroid Build Coastguard Worker                       100,52,4,14,18,86,77,1};
841*4d5d8b54SAndroid Build Coastguard Worker   static int threeB[54]={206,128,42,153,57,8,183,251,13,89,36,30,32,144,183,
842*4d5d8b54SAndroid Build Coastguard Worker                          130,59,240,121,59,85,223,19,228,180,134,33,107,74,98,
843*4d5d8b54SAndroid Build Coastguard Worker                          233,253,196,135,63,2,110,114,50,155,90,127,37,170,104,
844*4d5d8b54SAndroid Build Coastguard Worker                          200,20,254,4,58,106,176,144,0};
845*4d5d8b54SAndroid Build Coastguard Worker 
846*4d5d8b54SAndroid Build Coastguard Worker   int foursize=38;
847*4d5d8b54SAndroid Build Coastguard Worker   static int four[38]={18,6,163,252,97,194,104,131,32,1,7,82,137,42,129,11,72,
848*4d5d8b54SAndroid Build Coastguard Worker                      132,60,220,112,8,196,109,64,179,86,9,137,195,208,122,169,
849*4d5d8b54SAndroid Build Coastguard Worker                      28,2,133,0,1};
850*4d5d8b54SAndroid Build Coastguard Worker   static int fourB[38]={36,48,102,83,243,24,52,7,4,35,132,10,145,21,2,93,2,41,
851*4d5d8b54SAndroid Build Coastguard Worker                         1,219,184,16,33,184,54,149,170,132,18,30,29,98,229,67,
852*4d5d8b54SAndroid Build Coastguard Worker                         129,10,4,32};
853*4d5d8b54SAndroid Build Coastguard Worker 
854*4d5d8b54SAndroid Build Coastguard Worker   int fivesize=45;
855*4d5d8b54SAndroid Build Coastguard Worker   static int five[45]={169,2,126,139,144,172,30,4,80,72,240,59,130,218,73,62,
856*4d5d8b54SAndroid Build Coastguard Worker                      241,24,210,44,4,20,0,248,116,49,135,100,110,130,181,169,
857*4d5d8b54SAndroid Build Coastguard Worker                      84,75,159,2,1,0,132,192,8,0,0,18,22};
858*4d5d8b54SAndroid Build Coastguard Worker   static int fiveB[45]={1,84,145,111,245,100,128,8,56,36,40,71,126,78,213,226,
859*4d5d8b54SAndroid Build Coastguard Worker                         124,105,12,0,133,128,0,162,233,242,67,152,77,205,77,
860*4d5d8b54SAndroid Build Coastguard Worker                         172,150,169,129,79,128,0,6,4,32,0,27,9,0};
861*4d5d8b54SAndroid Build Coastguard Worker 
862*4d5d8b54SAndroid Build Coastguard Worker   int sixsize=7;
863*4d5d8b54SAndroid Build Coastguard Worker   static int six[7]={17,177,170,242,169,19,148};
864*4d5d8b54SAndroid Build Coastguard Worker   static int sixB[7]={136,141,85,79,149,200,41};
865*4d5d8b54SAndroid Build Coastguard Worker 
866*4d5d8b54SAndroid Build Coastguard Worker   /* Test read/write together */
867*4d5d8b54SAndroid Build Coastguard Worker   /* Later we test against pregenerated bitstreams */
868*4d5d8b54SAndroid Build Coastguard Worker   oggpack_writeinit(&o);
869*4d5d8b54SAndroid Build Coastguard Worker 
870*4d5d8b54SAndroid Build Coastguard Worker   fprintf(stderr,"\nSmall preclipped packing (LSb): ");
871*4d5d8b54SAndroid Build Coastguard Worker   cliptest(testbuffer1,test1size,0,one,onesize);
872*4d5d8b54SAndroid Build Coastguard Worker   fprintf(stderr,"ok.");
873*4d5d8b54SAndroid Build Coastguard Worker 
874*4d5d8b54SAndroid Build Coastguard Worker   fprintf(stderr,"\nNull bit call (LSb): ");
875*4d5d8b54SAndroid Build Coastguard Worker   cliptest(testbuffer3,test3size,0,two,twosize);
876*4d5d8b54SAndroid Build Coastguard Worker   fprintf(stderr,"ok.");
877*4d5d8b54SAndroid Build Coastguard Worker 
878*4d5d8b54SAndroid Build Coastguard Worker   fprintf(stderr,"\nLarge preclipped packing (LSb): ");
879*4d5d8b54SAndroid Build Coastguard Worker   cliptest(testbuffer2,test2size,0,three,threesize);
880*4d5d8b54SAndroid Build Coastguard Worker   fprintf(stderr,"ok.");
881*4d5d8b54SAndroid Build Coastguard Worker 
882*4d5d8b54SAndroid Build Coastguard Worker   fprintf(stderr,"\n32 bit preclipped packing (LSb): ");
883*4d5d8b54SAndroid Build Coastguard Worker   oggpack_reset(&o);
884*4d5d8b54SAndroid Build Coastguard Worker   for(i=0;i<test2size;i++)
885*4d5d8b54SAndroid Build Coastguard Worker     oggpack_write(&o,large[i],32);
886*4d5d8b54SAndroid Build Coastguard Worker   buffer=oggpack_get_buffer(&o);
887*4d5d8b54SAndroid Build Coastguard Worker   bytes=oggpack_bytes(&o);
888*4d5d8b54SAndroid Build Coastguard Worker   oggpack_readinit(&r,buffer,bytes);
889*4d5d8b54SAndroid Build Coastguard Worker   for(i=0;i<test2size;i++){
890*4d5d8b54SAndroid Build Coastguard Worker     if(oggpack_look(&r,32)==-1)report("out of data. failed!");
891*4d5d8b54SAndroid Build Coastguard Worker     if(oggpack_look(&r,32)!=large[i]){
892*4d5d8b54SAndroid Build Coastguard Worker       fprintf(stderr,"%ld != %lu (%lx!=%lx):",oggpack_look(&r,32),large[i],
893*4d5d8b54SAndroid Build Coastguard Worker               oggpack_look(&r,32),large[i]);
894*4d5d8b54SAndroid Build Coastguard Worker       report("read incorrect value!\n");
895*4d5d8b54SAndroid Build Coastguard Worker     }
896*4d5d8b54SAndroid Build Coastguard Worker     oggpack_adv(&r,32);
897*4d5d8b54SAndroid Build Coastguard Worker   }
898*4d5d8b54SAndroid Build Coastguard Worker   if(oggpack_bytes(&r)!=bytes)report("leftover bytes after read!\n");
899*4d5d8b54SAndroid Build Coastguard Worker   fprintf(stderr,"ok.");
900*4d5d8b54SAndroid Build Coastguard Worker 
901*4d5d8b54SAndroid Build Coastguard Worker   fprintf(stderr,"\nSmall unclipped packing (LSb): ");
902*4d5d8b54SAndroid Build Coastguard Worker   cliptest(testbuffer1,test1size,7,four,foursize);
903*4d5d8b54SAndroid Build Coastguard Worker   fprintf(stderr,"ok.");
904*4d5d8b54SAndroid Build Coastguard Worker 
905*4d5d8b54SAndroid Build Coastguard Worker   fprintf(stderr,"\nLarge unclipped packing (LSb): ");
906*4d5d8b54SAndroid Build Coastguard Worker   cliptest(testbuffer2,test2size,17,five,fivesize);
907*4d5d8b54SAndroid Build Coastguard Worker   fprintf(stderr,"ok.");
908*4d5d8b54SAndroid Build Coastguard Worker 
909*4d5d8b54SAndroid Build Coastguard Worker   fprintf(stderr,"\nSingle bit unclipped packing (LSb): ");
910*4d5d8b54SAndroid Build Coastguard Worker   cliptest(testbuffer3,test3size,1,six,sixsize);
911*4d5d8b54SAndroid Build Coastguard Worker   fprintf(stderr,"ok.");
912*4d5d8b54SAndroid Build Coastguard Worker 
913*4d5d8b54SAndroid Build Coastguard Worker   fprintf(stderr,"\nTesting read past end (LSb): ");
914*4d5d8b54SAndroid Build Coastguard Worker   oggpack_readinit(&r,(unsigned char *)"\0\0\0\0\0\0\0\0",8);
915*4d5d8b54SAndroid Build Coastguard Worker   for(i=0;i<64;i++){
916*4d5d8b54SAndroid Build Coastguard Worker     if(oggpack_read(&r,1)!=0){
917*4d5d8b54SAndroid Build Coastguard Worker       fprintf(stderr,"failed; got -1 prematurely.\n");
918*4d5d8b54SAndroid Build Coastguard Worker       exit(1);
919*4d5d8b54SAndroid Build Coastguard Worker     }
920*4d5d8b54SAndroid Build Coastguard Worker   }
921*4d5d8b54SAndroid Build Coastguard Worker   if(oggpack_look(&r,1)!=-1 ||
922*4d5d8b54SAndroid Build Coastguard Worker      oggpack_read(&r,1)!=-1){
923*4d5d8b54SAndroid Build Coastguard Worker       fprintf(stderr,"failed; read past end without -1.\n");
924*4d5d8b54SAndroid Build Coastguard Worker       exit(1);
925*4d5d8b54SAndroid Build Coastguard Worker   }
926*4d5d8b54SAndroid Build Coastguard Worker   oggpack_readinit(&r,(unsigned char *)"\0\0\0\0\0\0\0\0",8);
927*4d5d8b54SAndroid Build Coastguard Worker   if(oggpack_read(&r,30)!=0 || oggpack_read(&r,16)!=0){
928*4d5d8b54SAndroid Build Coastguard Worker       fprintf(stderr,"failed 2; got -1 prematurely.\n");
929*4d5d8b54SAndroid Build Coastguard Worker       exit(1);
930*4d5d8b54SAndroid Build Coastguard Worker   }
931*4d5d8b54SAndroid Build Coastguard Worker 
932*4d5d8b54SAndroid Build Coastguard Worker   if(oggpack_look(&r,18)!=0 ||
933*4d5d8b54SAndroid Build Coastguard Worker      oggpack_look(&r,18)!=0){
934*4d5d8b54SAndroid Build Coastguard Worker     fprintf(stderr,"failed 3; got -1 prematurely.\n");
935*4d5d8b54SAndroid Build Coastguard Worker       exit(1);
936*4d5d8b54SAndroid Build Coastguard Worker   }
937*4d5d8b54SAndroid Build Coastguard Worker   if(oggpack_look(&r,19)!=-1 ||
938*4d5d8b54SAndroid Build Coastguard Worker      oggpack_look(&r,19)!=-1){
939*4d5d8b54SAndroid Build Coastguard Worker     fprintf(stderr,"failed; read past end without -1.\n");
940*4d5d8b54SAndroid Build Coastguard Worker       exit(1);
941*4d5d8b54SAndroid Build Coastguard Worker   }
942*4d5d8b54SAndroid Build Coastguard Worker   if(oggpack_look(&r,32)!=-1 ||
943*4d5d8b54SAndroid Build Coastguard Worker      oggpack_look(&r,32)!=-1){
944*4d5d8b54SAndroid Build Coastguard Worker     fprintf(stderr,"failed; read past end without -1.\n");
945*4d5d8b54SAndroid Build Coastguard Worker       exit(1);
946*4d5d8b54SAndroid Build Coastguard Worker   }
947*4d5d8b54SAndroid Build Coastguard Worker   oggpack_writeclear(&o);
948*4d5d8b54SAndroid Build Coastguard Worker   fprintf(stderr,"ok.");
949*4d5d8b54SAndroid Build Coastguard Worker 
950*4d5d8b54SAndroid Build Coastguard Worker   /* this is partly glassbox; we're mostly concerned about the allocation boundaries */
951*4d5d8b54SAndroid Build Coastguard Worker 
952*4d5d8b54SAndroid Build Coastguard Worker   fprintf(stderr,"\nTesting aligned writecopies (LSb): ");
953*4d5d8b54SAndroid Build Coastguard Worker   for(i=0;i<71;i++)
954*4d5d8b54SAndroid Build Coastguard Worker     for(j=0;j<5;j++)
955*4d5d8b54SAndroid Build Coastguard Worker       copytest(j*8,i);
956*4d5d8b54SAndroid Build Coastguard Worker   for(i=BUFFER_INCREMENT*8-71;i<BUFFER_INCREMENT*8+71;i++)
957*4d5d8b54SAndroid Build Coastguard Worker     for(j=0;j<5;j++)
958*4d5d8b54SAndroid Build Coastguard Worker       copytest(j*8,i);
959*4d5d8b54SAndroid Build Coastguard Worker   fprintf(stderr,"ok.      ");
960*4d5d8b54SAndroid Build Coastguard Worker 
961*4d5d8b54SAndroid Build Coastguard Worker   fprintf(stderr,"\nTesting unaligned writecopies (LSb): ");
962*4d5d8b54SAndroid Build Coastguard Worker   for(i=0;i<71;i++)
963*4d5d8b54SAndroid Build Coastguard Worker     for(j=1;j<40;j++)
964*4d5d8b54SAndroid Build Coastguard Worker       if(j&0x7)
965*4d5d8b54SAndroid Build Coastguard Worker         copytest(j,i);
966*4d5d8b54SAndroid Build Coastguard Worker   for(i=BUFFER_INCREMENT*8-71;i<BUFFER_INCREMENT*8+71;i++)
967*4d5d8b54SAndroid Build Coastguard Worker     for(j=1;j<40;j++)
968*4d5d8b54SAndroid Build Coastguard Worker       if(j&0x7)
969*4d5d8b54SAndroid Build Coastguard Worker         copytest(j,i);
970*4d5d8b54SAndroid Build Coastguard Worker 
971*4d5d8b54SAndroid Build Coastguard Worker   fprintf(stderr,"ok.      \n");
972*4d5d8b54SAndroid Build Coastguard Worker 
973*4d5d8b54SAndroid Build Coastguard Worker 
974*4d5d8b54SAndroid Build Coastguard Worker   /********** lazy, cut-n-paste retest with MSb packing ***********/
975*4d5d8b54SAndroid Build Coastguard Worker 
976*4d5d8b54SAndroid Build Coastguard Worker   /* Test read/write together */
977*4d5d8b54SAndroid Build Coastguard Worker   /* Later we test against pregenerated bitstreams */
978*4d5d8b54SAndroid Build Coastguard Worker   oggpackB_writeinit(&o);
979*4d5d8b54SAndroid Build Coastguard Worker 
980*4d5d8b54SAndroid Build Coastguard Worker   fprintf(stderr,"\nSmall preclipped packing (MSb): ");
981*4d5d8b54SAndroid Build Coastguard Worker   cliptestB(testbuffer1,test1size,0,oneB,onesize);
982*4d5d8b54SAndroid Build Coastguard Worker   fprintf(stderr,"ok.");
983*4d5d8b54SAndroid Build Coastguard Worker 
984*4d5d8b54SAndroid Build Coastguard Worker   fprintf(stderr,"\nNull bit call (MSb): ");
985*4d5d8b54SAndroid Build Coastguard Worker   cliptestB(testbuffer3,test3size,0,twoB,twosize);
986*4d5d8b54SAndroid Build Coastguard Worker   fprintf(stderr,"ok.");
987*4d5d8b54SAndroid Build Coastguard Worker 
988*4d5d8b54SAndroid Build Coastguard Worker   fprintf(stderr,"\nLarge preclipped packing (MSb): ");
989*4d5d8b54SAndroid Build Coastguard Worker   cliptestB(testbuffer2,test2size,0,threeB,threesize);
990*4d5d8b54SAndroid Build Coastguard Worker   fprintf(stderr,"ok.");
991*4d5d8b54SAndroid Build Coastguard Worker 
992*4d5d8b54SAndroid Build Coastguard Worker   fprintf(stderr,"\n32 bit preclipped packing (MSb): ");
993*4d5d8b54SAndroid Build Coastguard Worker   oggpackB_reset(&o);
994*4d5d8b54SAndroid Build Coastguard Worker   for(i=0;i<test2size;i++)
995*4d5d8b54SAndroid Build Coastguard Worker     oggpackB_write(&o,large[i],32);
996*4d5d8b54SAndroid Build Coastguard Worker   buffer=oggpackB_get_buffer(&o);
997*4d5d8b54SAndroid Build Coastguard Worker   bytes=oggpackB_bytes(&o);
998*4d5d8b54SAndroid Build Coastguard Worker   oggpackB_readinit(&r,buffer,bytes);
999*4d5d8b54SAndroid Build Coastguard Worker   for(i=0;i<test2size;i++){
1000*4d5d8b54SAndroid Build Coastguard Worker     if(oggpackB_look(&r,32)==-1)report("out of data. failed!");
1001*4d5d8b54SAndroid Build Coastguard Worker     if(oggpackB_look(&r,32)!=large[i]){
1002*4d5d8b54SAndroid Build Coastguard Worker       fprintf(stderr,"%ld != %lu (%lx!=%lx):",oggpackB_look(&r,32),large[i],
1003*4d5d8b54SAndroid Build Coastguard Worker               oggpackB_look(&r,32),large[i]);
1004*4d5d8b54SAndroid Build Coastguard Worker       report("read incorrect value!\n");
1005*4d5d8b54SAndroid Build Coastguard Worker     }
1006*4d5d8b54SAndroid Build Coastguard Worker     oggpackB_adv(&r,32);
1007*4d5d8b54SAndroid Build Coastguard Worker   }
1008*4d5d8b54SAndroid Build Coastguard Worker   if(oggpackB_bytes(&r)!=bytes)report("leftover bytes after read!\n");
1009*4d5d8b54SAndroid Build Coastguard Worker   fprintf(stderr,"ok.");
1010*4d5d8b54SAndroid Build Coastguard Worker 
1011*4d5d8b54SAndroid Build Coastguard Worker   fprintf(stderr,"\nSmall unclipped packing (MSb): ");
1012*4d5d8b54SAndroid Build Coastguard Worker   cliptestB(testbuffer1,test1size,7,fourB,foursize);
1013*4d5d8b54SAndroid Build Coastguard Worker   fprintf(stderr,"ok.");
1014*4d5d8b54SAndroid Build Coastguard Worker 
1015*4d5d8b54SAndroid Build Coastguard Worker   fprintf(stderr,"\nLarge unclipped packing (MSb): ");
1016*4d5d8b54SAndroid Build Coastguard Worker   cliptestB(testbuffer2,test2size,17,fiveB,fivesize);
1017*4d5d8b54SAndroid Build Coastguard Worker   fprintf(stderr,"ok.");
1018*4d5d8b54SAndroid Build Coastguard Worker 
1019*4d5d8b54SAndroid Build Coastguard Worker   fprintf(stderr,"\nSingle bit unclipped packing (MSb): ");
1020*4d5d8b54SAndroid Build Coastguard Worker   cliptestB(testbuffer3,test3size,1,sixB,sixsize);
1021*4d5d8b54SAndroid Build Coastguard Worker   fprintf(stderr,"ok.");
1022*4d5d8b54SAndroid Build Coastguard Worker 
1023*4d5d8b54SAndroid Build Coastguard Worker   fprintf(stderr,"\nTesting read past end (MSb): ");
1024*4d5d8b54SAndroid Build Coastguard Worker   oggpackB_readinit(&r,(unsigned char *)"\0\0\0\0\0\0\0\0",8);
1025*4d5d8b54SAndroid Build Coastguard Worker   for(i=0;i<64;i++){
1026*4d5d8b54SAndroid Build Coastguard Worker     if(oggpackB_read(&r,1)!=0){
1027*4d5d8b54SAndroid Build Coastguard Worker       fprintf(stderr,"failed; got -1 prematurely.\n");
1028*4d5d8b54SAndroid Build Coastguard Worker       exit(1);
1029*4d5d8b54SAndroid Build Coastguard Worker     }
1030*4d5d8b54SAndroid Build Coastguard Worker   }
1031*4d5d8b54SAndroid Build Coastguard Worker   if(oggpackB_look(&r,1)!=-1 ||
1032*4d5d8b54SAndroid Build Coastguard Worker      oggpackB_read(&r,1)!=-1){
1033*4d5d8b54SAndroid Build Coastguard Worker       fprintf(stderr,"failed; read past end without -1.\n");
1034*4d5d8b54SAndroid Build Coastguard Worker       exit(1);
1035*4d5d8b54SAndroid Build Coastguard Worker   }
1036*4d5d8b54SAndroid Build Coastguard Worker   oggpackB_readinit(&r,(unsigned char *)"\0\0\0\0\0\0\0\0",8);
1037*4d5d8b54SAndroid Build Coastguard Worker   if(oggpackB_read(&r,30)!=0 || oggpackB_read(&r,16)!=0){
1038*4d5d8b54SAndroid Build Coastguard Worker       fprintf(stderr,"failed 2; got -1 prematurely.\n");
1039*4d5d8b54SAndroid Build Coastguard Worker       exit(1);
1040*4d5d8b54SAndroid Build Coastguard Worker   }
1041*4d5d8b54SAndroid Build Coastguard Worker 
1042*4d5d8b54SAndroid Build Coastguard Worker   if(oggpackB_look(&r,18)!=0 ||
1043*4d5d8b54SAndroid Build Coastguard Worker      oggpackB_look(&r,18)!=0){
1044*4d5d8b54SAndroid Build Coastguard Worker     fprintf(stderr,"failed 3; got -1 prematurely.\n");
1045*4d5d8b54SAndroid Build Coastguard Worker       exit(1);
1046*4d5d8b54SAndroid Build Coastguard Worker   }
1047*4d5d8b54SAndroid Build Coastguard Worker   if(oggpackB_look(&r,19)!=-1 ||
1048*4d5d8b54SAndroid Build Coastguard Worker      oggpackB_look(&r,19)!=-1){
1049*4d5d8b54SAndroid Build Coastguard Worker     fprintf(stderr,"failed; read past end without -1.\n");
1050*4d5d8b54SAndroid Build Coastguard Worker       exit(1);
1051*4d5d8b54SAndroid Build Coastguard Worker   }
1052*4d5d8b54SAndroid Build Coastguard Worker   if(oggpackB_look(&r,32)!=-1 ||
1053*4d5d8b54SAndroid Build Coastguard Worker      oggpackB_look(&r,32)!=-1){
1054*4d5d8b54SAndroid Build Coastguard Worker     fprintf(stderr,"failed; read past end without -1.\n");
1055*4d5d8b54SAndroid Build Coastguard Worker       exit(1);
1056*4d5d8b54SAndroid Build Coastguard Worker   }
1057*4d5d8b54SAndroid Build Coastguard Worker   fprintf(stderr,"ok.");
1058*4d5d8b54SAndroid Build Coastguard Worker   oggpackB_writeclear(&o);
1059*4d5d8b54SAndroid Build Coastguard Worker 
1060*4d5d8b54SAndroid Build Coastguard Worker   /* this is partly glassbox; we're mostly concerned about the allocation boundaries */
1061*4d5d8b54SAndroid Build Coastguard Worker 
1062*4d5d8b54SAndroid Build Coastguard Worker   fprintf(stderr,"\nTesting aligned writecopies (MSb): ");
1063*4d5d8b54SAndroid Build Coastguard Worker   for(i=0;i<71;i++)
1064*4d5d8b54SAndroid Build Coastguard Worker     for(j=0;j<5;j++)
1065*4d5d8b54SAndroid Build Coastguard Worker       copytestB(j*8,i);
1066*4d5d8b54SAndroid Build Coastguard Worker   for(i=BUFFER_INCREMENT*8-71;i<BUFFER_INCREMENT*8+71;i++)
1067*4d5d8b54SAndroid Build Coastguard Worker     for(j=0;j<5;j++)
1068*4d5d8b54SAndroid Build Coastguard Worker       copytestB(j*8,i);
1069*4d5d8b54SAndroid Build Coastguard Worker   fprintf(stderr,"ok.      ");
1070*4d5d8b54SAndroid Build Coastguard Worker 
1071*4d5d8b54SAndroid Build Coastguard Worker   fprintf(stderr,"\nTesting unaligned writecopies (MSb): ");
1072*4d5d8b54SAndroid Build Coastguard Worker   for(i=0;i<71;i++)
1073*4d5d8b54SAndroid Build Coastguard Worker     for(j=1;j<40;j++)
1074*4d5d8b54SAndroid Build Coastguard Worker       if(j&0x7)
1075*4d5d8b54SAndroid Build Coastguard Worker         copytestB(j,i);
1076*4d5d8b54SAndroid Build Coastguard Worker   for(i=BUFFER_INCREMENT*8-71;i<BUFFER_INCREMENT*8+71;i++)
1077*4d5d8b54SAndroid Build Coastguard Worker     for(j=1;j<40;j++)
1078*4d5d8b54SAndroid Build Coastguard Worker       if(j&0x7)
1079*4d5d8b54SAndroid Build Coastguard Worker         copytestB(j,i);
1080*4d5d8b54SAndroid Build Coastguard Worker 
1081*4d5d8b54SAndroid Build Coastguard Worker   fprintf(stderr,"ok.      \n\n");
1082*4d5d8b54SAndroid Build Coastguard Worker 
1083*4d5d8b54SAndroid Build Coastguard Worker   return(0);
1084*4d5d8b54SAndroid Build Coastguard Worker }
1085*4d5d8b54SAndroid Build Coastguard Worker #endif  /* _V_SELFTEST */
1086*4d5d8b54SAndroid Build Coastguard Worker 
1087*4d5d8b54SAndroid Build Coastguard Worker #undef BUFFER_INCREMENT
1088