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