bitwise.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783
  1. /********************************************************************
  2. * *
  3. * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
  4. * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
  5. * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
  6. * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
  7. * *
  8. * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2002 *
  9. * by the Xiph.Org Foundation http://www.xiph.org/ *
  10. * *
  11. ********************************************************************
  12. function: packing variable sized words into an octet stream
  13. last mod: $Id: bitwise.c,v 1.17 2003/11/10 13:06:08 xiphmont Exp $
  14. ********************************************************************/
  15. /* We're 'LSb' endian; if we write a word but read individual bits,
  16. then we'll read the lsb first */
  17. #include <string.h>
  18. #include <stdlib.h>
  19. #include "../ogg/ogg.h"
  20. #define BUFFER_INCREMENT 256
  21. static unsigned long mask[]=
  22. {0x00000000,0x00000001,0x00000003,0x00000007,0x0000000f,
  23. 0x0000001f,0x0000003f,0x0000007f,0x000000ff,0x000001ff,
  24. 0x000003ff,0x000007ff,0x00000fff,0x00001fff,0x00003fff,
  25. 0x00007fff,0x0000ffff,0x0001ffff,0x0003ffff,0x0007ffff,
  26. 0x000fffff,0x001fffff,0x003fffff,0x007fffff,0x00ffffff,
  27. 0x01ffffff,0x03ffffff,0x07ffffff,0x0fffffff,0x1fffffff,
  28. 0x3fffffff,0x7fffffff,0xffffffff };
  29. static unsigned int mask8B[]=
  30. {0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff};
  31. void oggpack_writeinit(oggpack_buffer *b){
  32. memset(b,0,sizeof(*b));
  33. b->ptr=b->buffer=_ogg_malloc(BUFFER_INCREMENT);
  34. b->buffer[0]='\0';
  35. b->storage=BUFFER_INCREMENT;
  36. }
  37. void oggpackB_writeinit(oggpack_buffer *b){
  38. oggpack_writeinit(b);
  39. }
  40. void oggpack_writetrunc(oggpack_buffer *b,long bits){
  41. long bytes=bits>>3;
  42. bits-=bytes*8;
  43. b->ptr=b->buffer+bytes;
  44. b->endbit=bits;
  45. b->endbyte=bytes;
  46. *b->ptr&=mask[bits];
  47. }
  48. void oggpackB_writetrunc(oggpack_buffer *b,long bits){
  49. long bytes=bits>>3;
  50. bits-=bytes*8;
  51. b->ptr=b->buffer+bytes;
  52. b->endbit=bits;
  53. b->endbyte=bytes;
  54. *b->ptr&=mask8B[bits];
  55. }
  56. /* Takes only up to 32 bits. */
  57. void oggpack_write(oggpack_buffer *b,unsigned long value,int bits){
  58. if(b->endbyte+4>=b->storage){
  59. b->buffer=_ogg_realloc(b->buffer,b->storage+BUFFER_INCREMENT);
  60. b->storage+=BUFFER_INCREMENT;
  61. b->ptr=b->buffer+b->endbyte;
  62. }
  63. value&=mask[bits];
  64. bits+=b->endbit;
  65. b->ptr[0]|=value<<b->endbit;
  66. if(bits>=8){
  67. b->ptr[1]=value>>(8-b->endbit);
  68. if(bits>=16){
  69. b->ptr[2]=value>>(16-b->endbit);
  70. if(bits>=24){
  71. b->ptr[3]=value>>(24-b->endbit);
  72. if(bits>=32){
  73. if(b->endbit)
  74. b->ptr[4]=value>>(32-b->endbit);
  75. else
  76. b->ptr[4]=0;
  77. }
  78. }
  79. }
  80. }
  81. b->endbyte+=bits/8;
  82. b->ptr+=bits/8;
  83. b->endbit=bits&7;
  84. }
  85. /* Takes only up to 32 bits. */
  86. void oggpackB_write(oggpack_buffer *b,unsigned long value,int bits){
  87. if(b->endbyte+4>=b->storage){
  88. b->buffer=_ogg_realloc(b->buffer,b->storage+BUFFER_INCREMENT);
  89. b->storage+=BUFFER_INCREMENT;
  90. b->ptr=b->buffer+b->endbyte;
  91. }
  92. value=(value&mask[bits])<<(32-bits);
  93. bits+=b->endbit;
  94. b->ptr[0]|=value>>(24+b->endbit);
  95. if(bits>=8){
  96. b->ptr[1]=value>>(16+b->endbit);
  97. if(bits>=16){
  98. b->ptr[2]=value>>(8+b->endbit);
  99. if(bits>=24){
  100. b->ptr[3]=value>>(b->endbit);
  101. if(bits>=32){
  102. if(b->endbit)
  103. b->ptr[4]=value<<(8-b->endbit);
  104. else
  105. b->ptr[4]=0;
  106. }
  107. }
  108. }
  109. }
  110. b->endbyte+=bits/8;
  111. b->ptr+=bits/8;
  112. b->endbit=bits&7;
  113. }
  114. void oggpack_writealign(oggpack_buffer *b){
  115. int bits=8-b->endbit;
  116. if(bits<8)
  117. oggpack_write(b,0,bits);
  118. }
  119. void oggpackB_writealign(oggpack_buffer *b){
  120. int bits=8-b->endbit;
  121. if(bits<8)
  122. oggpackB_write(b,0,bits);
  123. }
  124. static void oggpack_writecopy_helper(oggpack_buffer *b,
  125. void *source,
  126. long bits,
  127. void (*w)(oggpack_buffer *,
  128. unsigned long,
  129. int),
  130. int msb){
  131. unsigned char *ptr=(unsigned char *)source;
  132. long bytes=bits/8;
  133. bits-=bytes*8;
  134. if(b->endbit){
  135. int i;
  136. /* unaligned copy. Do it the hard way. */
  137. for(i=0;i<bytes;i++)
  138. w(b,(unsigned long)(ptr[i]),8);
  139. }else{
  140. /* aligned block copy */
  141. if(b->endbyte+bytes+1>=b->storage){
  142. b->storage=b->endbyte+bytes+BUFFER_INCREMENT;
  143. b->buffer=_ogg_realloc(b->buffer,b->storage);
  144. b->ptr=b->buffer+b->endbyte;
  145. }
  146. memmove(b->ptr,source,bytes);
  147. b->ptr+=bytes;
  148. b->buffer+=bytes;
  149. *b->ptr=0;
  150. }
  151. if(bits){
  152. if(msb)
  153. w(b,(unsigned long)(ptr[bytes]>>(8-bits)),bits);
  154. else
  155. w(b,(unsigned long)(ptr[bytes]),bits);
  156. }
  157. }
  158. void oggpack_writecopy(oggpack_buffer *b,void *source,long bits){
  159. oggpack_writecopy_helper(b,source,bits,oggpack_write,0);
  160. }
  161. void oggpackB_writecopy(oggpack_buffer *b,void *source,long bits){
  162. oggpack_writecopy_helper(b,source,bits,oggpackB_write,1);
  163. }
  164. void oggpack_reset(oggpack_buffer *b){
  165. b->ptr=b->buffer;
  166. b->buffer[0]=0;
  167. b->endbit=b->endbyte=0;
  168. }
  169. void oggpackB_reset(oggpack_buffer *b){
  170. oggpack_reset(b);
  171. }
  172. void oggpack_writeclear(oggpack_buffer *b){
  173. _ogg_free(b->buffer);
  174. memset(b,0,sizeof(*b));
  175. }
  176. void oggpackB_writeclear(oggpack_buffer *b){
  177. oggpack_writeclear(b);
  178. }
  179. void oggpack_readinit(oggpack_buffer *b,unsigned char *buf,int bytes){
  180. memset(b,0,sizeof(*b));
  181. b->buffer=b->ptr=buf;
  182. b->storage=bytes;
  183. }
  184. void oggpackB_readinit(oggpack_buffer *b,unsigned char *buf,int bytes){
  185. oggpack_readinit(b,buf,bytes);
  186. }
  187. /* Read in bits without advancing the bitptr; bits <= 32 */
  188. long oggpack_look(oggpack_buffer *b,int bits){
  189. unsigned long ret;
  190. unsigned long m=mask[bits];
  191. bits+=b->endbit;
  192. if(b->endbyte+4>=b->storage){
  193. /* not the main path */
  194. if(b->endbyte*8+bits>b->storage*8)return(-1);
  195. }
  196. ret=b->ptr[0]>>b->endbit;
  197. if(bits>8){
  198. ret|=b->ptr[1]<<(8-b->endbit);
  199. if(bits>16){
  200. ret|=b->ptr[2]<<(16-b->endbit);
  201. if(bits>24){
  202. ret|=b->ptr[3]<<(24-b->endbit);
  203. if(bits>32 && b->endbit)
  204. ret|=b->ptr[4]<<(32-b->endbit);
  205. }
  206. }
  207. }
  208. return(m&ret);
  209. }
  210. /* Read in bits without advancing the bitptr; bits <= 32 */
  211. long oggpackB_look(oggpack_buffer *b,int bits){
  212. unsigned long ret;
  213. int m=32-bits;
  214. bits+=b->endbit;
  215. if(b->endbyte+4>=b->storage){
  216. /* not the main path */
  217. if(b->endbyte*8+bits>b->storage*8)return(-1);
  218. }
  219. ret=b->ptr[0]<<(24+b->endbit);
  220. if(bits>8){
  221. ret|=b->ptr[1]<<(16+b->endbit);
  222. if(bits>16){
  223. ret|=b->ptr[2]<<(8+b->endbit);
  224. if(bits>24){
  225. ret|=b->ptr[3]<<(b->endbit);
  226. if(bits>32 && b->endbit)
  227. ret|=b->ptr[4]>>(8-b->endbit);
  228. }
  229. }
  230. }
  231. return (ret>>(m>>1))>>((m+1)>>1);
  232. }
  233. long oggpack_look1(oggpack_buffer *b){
  234. if(b->endbyte>=b->storage)return(-1);
  235. return((b->ptr[0]>>b->endbit)&1);
  236. }
  237. long oggpackB_look1(oggpack_buffer *b){
  238. if(b->endbyte>=b->storage)return(-1);
  239. return((b->ptr[0]>>(7-b->endbit))&1);
  240. }
  241. void oggpack_adv(oggpack_buffer *b,int bits){
  242. bits+=b->endbit;
  243. b->ptr+=bits/8;
  244. b->endbyte+=bits/8;
  245. b->endbit=bits&7;
  246. }
  247. void oggpackB_adv(oggpack_buffer *b,int bits){
  248. oggpack_adv(b,bits);
  249. }
  250. void oggpack_adv1(oggpack_buffer *b){
  251. if(++(b->endbit)>7){
  252. b->endbit=0;
  253. b->ptr++;
  254. b->endbyte++;
  255. }
  256. }
  257. void oggpackB_adv1(oggpack_buffer *b){
  258. oggpack_adv1(b);
  259. }
  260. /* bits <= 32 */
  261. long oggpack_read(oggpack_buffer *b,int bits){
  262. unsigned long ret;
  263. unsigned long m=mask[bits];
  264. bits+=b->endbit;
  265. if(b->endbyte+4>=b->storage){
  266. /* not the main path */
  267. ret=-1UL;
  268. if(b->endbyte*8+bits>b->storage*8)goto overflow;
  269. }
  270. ret=b->ptr[0]>>b->endbit;
  271. if(bits>8){
  272. ret|=b->ptr[1]<<(8-b->endbit);
  273. if(bits>16){
  274. ret|=b->ptr[2]<<(16-b->endbit);
  275. if(bits>24){
  276. ret|=b->ptr[3]<<(24-b->endbit);
  277. if(bits>32 && b->endbit){
  278. ret|=b->ptr[4]<<(32-b->endbit);
  279. }
  280. }
  281. }
  282. }
  283. ret&=m;
  284. overflow:
  285. b->ptr+=bits/8;
  286. b->endbyte+=bits/8;
  287. b->endbit=bits&7;
  288. return(ret);
  289. }
  290. /* bits <= 32 */
  291. long oggpackB_read(oggpack_buffer *b,int bits){
  292. unsigned long ret;
  293. long m=32-bits;
  294. bits+=b->endbit;
  295. if(b->endbyte+4>=b->storage){
  296. /* not the main path */
  297. ret=-1UL;
  298. if(b->endbyte*8+bits>b->storage*8)goto overflow;
  299. }
  300. ret=b->ptr[0]<<(24+b->endbit);
  301. if(bits>8){
  302. ret|=b->ptr[1]<<(16+b->endbit);
  303. if(bits>16){
  304. ret|=b->ptr[2]<<(8+b->endbit);
  305. if(bits>24){
  306. ret|=b->ptr[3]<<(b->endbit);
  307. if(bits>32 && b->endbit)
  308. ret|=b->ptr[4]>>(8-b->endbit);
  309. }
  310. }
  311. }
  312. ret=(ret>>(m>>1))>>((m+1)>>1);
  313. overflow:
  314. b->ptr+=bits/8;
  315. b->endbyte+=bits/8;
  316. b->endbit=bits&7;
  317. return(ret);
  318. }
  319. long oggpack_read1(oggpack_buffer *b){
  320. unsigned long ret;
  321. if(b->endbyte>=b->storage){
  322. /* not the main path */
  323. ret=-1UL;
  324. goto overflow;
  325. }
  326. ret=(b->ptr[0]>>b->endbit)&1;
  327. overflow:
  328. b->endbit++;
  329. if(b->endbit>7){
  330. b->endbit=0;
  331. b->ptr++;
  332. b->endbyte++;
  333. }
  334. return(ret);
  335. }
  336. long oggpackB_read1(oggpack_buffer *b){
  337. unsigned long ret;
  338. if(b->endbyte>=b->storage){
  339. /* not the main path */
  340. ret=-1UL;
  341. goto overflow;
  342. }
  343. ret=(b->ptr[0]>>(7-b->endbit))&1;
  344. overflow:
  345. b->endbit++;
  346. if(b->endbit>7){
  347. b->endbit=0;
  348. b->ptr++;
  349. b->endbyte++;
  350. }
  351. return(ret);
  352. }
  353. long oggpack_bytes(oggpack_buffer *b){
  354. return(b->endbyte+(b->endbit+7)/8);
  355. }
  356. long oggpack_bits(oggpack_buffer *b){
  357. return(b->endbyte*8+b->endbit);
  358. }
  359. long oggpackB_bytes(oggpack_buffer *b){
  360. return oggpack_bytes(b);
  361. }
  362. long oggpackB_bits(oggpack_buffer *b){
  363. return oggpack_bits(b);
  364. }
  365. unsigned char *oggpack_get_buffer(oggpack_buffer *b){
  366. return(b->buffer);
  367. }
  368. unsigned char *oggpackB_get_buffer(oggpack_buffer *b){
  369. return oggpack_get_buffer(b);
  370. }
  371. /* Self test of the bitwise routines; everything else is based on
  372. them, so they damned well better be solid. */
  373. #ifdef _V_SELFTEST
  374. #include <stdio.h>
  375. static int ilog(unsigned int v){
  376. int ret=0;
  377. while(v){
  378. ret++;
  379. v>>=1;
  380. }
  381. return(ret);
  382. }
  383. oggpack_buffer o;
  384. oggpack_buffer r;
  385. void report(char *in){
  386. fprintf(stderr,"%s",in);
  387. exit(1);
  388. }
  389. void cliptest(unsigned long *b,int vals,int bits,int *comp,int compsize){
  390. long bytes,i;
  391. unsigned char *buffer;
  392. oggpack_reset(&o);
  393. for(i=0;i<vals;i++)
  394. oggpack_write(&o,b[i],bits?bits:ilog(b[i]));
  395. buffer=oggpack_get_buffer(&o);
  396. bytes=oggpack_bytes(&o);
  397. if(bytes!=compsize)report("wrong number of bytes!\n");
  398. for(i=0;i<bytes;i++)if(buffer[i]!=comp[i]){
  399. for(i=0;i<bytes;i++)fprintf(stderr,"%x %x\n",(int)buffer[i],(int)comp[i]);
  400. report("wrote incorrect value!\n");
  401. }
  402. oggpack_readinit(&r,buffer,bytes);
  403. for(i=0;i<vals;i++){
  404. int tbit=bits?bits:ilog(b[i]);
  405. if(oggpack_look(&r,tbit)==-1)
  406. report("out of data!\n");
  407. if(oggpack_look(&r,tbit)!=(b[i]&mask[tbit]))
  408. report("looked at incorrect value!\n");
  409. if(tbit==1)
  410. if(oggpack_look1(&r)!=(b[i]&mask[tbit]))
  411. report("looked at single bit incorrect value!\n");
  412. if(tbit==1){
  413. if(oggpack_read1(&r)!=(b[i]&mask[tbit]))
  414. report("read incorrect single bit value!\n");
  415. }else{
  416. if(oggpack_read(&r,tbit)!=(b[i]&mask[tbit]))
  417. report("read incorrect value!\n");
  418. }
  419. }
  420. if(oggpack_bytes(&r)!=bytes)report("leftover bytes after read!\n");
  421. }
  422. void cliptestB(unsigned long *b,int vals,int bits,int *comp,int compsize){
  423. long bytes,i;
  424. unsigned char *buffer;
  425. oggpackB_reset(&o);
  426. for(i=0;i<vals;i++)
  427. oggpackB_write(&o,b[i],bits?bits:ilog(b[i]));
  428. buffer=oggpackB_get_buffer(&o);
  429. bytes=oggpackB_bytes(&o);
  430. if(bytes!=compsize)report("wrong number of bytes!\n");
  431. for(i=0;i<bytes;i++)if(buffer[i]!=comp[i]){
  432. for(i=0;i<bytes;i++)fprintf(stderr,"%x %x\n",(int)buffer[i],(int)comp[i]);
  433. report("wrote incorrect value!\n");
  434. }
  435. oggpackB_readinit(&r,buffer,bytes);
  436. for(i=0;i<vals;i++){
  437. int tbit=bits?bits:ilog(b[i]);
  438. if(oggpackB_look(&r,tbit)==-1)
  439. report("out of data!\n");
  440. if(oggpackB_look(&r,tbit)!=(b[i]&mask[tbit]))
  441. report("looked at incorrect value!\n");
  442. if(tbit==1)
  443. if(oggpackB_look1(&r)!=(b[i]&mask[tbit]))
  444. report("looked at single bit incorrect value!\n");
  445. if(tbit==1){
  446. if(oggpackB_read1(&r)!=(b[i]&mask[tbit]))
  447. report("read incorrect single bit value!\n");
  448. }else{
  449. if(oggpackB_read(&r,tbit)!=(b[i]&mask[tbit]))
  450. report("read incorrect value!\n");
  451. }
  452. }
  453. if(oggpackB_bytes(&r)!=bytes)report("leftover bytes after read!\n");
  454. }
  455. int main(void){
  456. unsigned char *buffer;
  457. long bytes,i;
  458. static unsigned long testbuffer1[]=
  459. {18,12,103948,4325,543,76,432,52,3,65,4,56,32,42,34,21,1,23,32,546,456,7,
  460. 567,56,8,8,55,3,52,342,341,4,265,7,67,86,2199,21,7,1,5,1,4};
  461. int test1size=43;
  462. static unsigned long testbuffer2[]=
  463. {216531625L,1237861823,56732452,131,3212421,12325343,34547562,12313212,
  464. 1233432,534,5,346435231,14436467,7869299,76326614,167548585,
  465. 85525151,0,12321,1,349528352};
  466. int test2size=21;
  467. static unsigned long testbuffer3[]=
  468. {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,
  469. 0,1,30,1,1,1,0,0,1,0,0,0,12,0,11,0,1,0,0,1};
  470. int test3size=56;
  471. static unsigned long large[]=
  472. {2136531625L,2137861823,56732452,131,3212421,12325343,34547562,12313212,
  473. 1233432,534,5,2146435231,14436467,7869299,76326614,167548585,
  474. 85525151,0,12321,1,2146528352};
  475. int onesize=33;
  476. static int one[33]={146,25,44,151,195,15,153,176,233,131,196,65,85,172,47,40,
  477. 34,242,223,136,35,222,211,86,171,50,225,135,214,75,172,
  478. 223,4};
  479. static int oneB[33]={150,101,131,33,203,15,204,216,105,193,156,65,84,85,222,
  480. 8,139,145,227,126,34,55,244,171,85,100,39,195,173,18,
  481. 245,251,128};
  482. int twosize=6;
  483. static int two[6]={61,255,255,251,231,29};
  484. static int twoB[6]={247,63,255,253,249,120};
  485. int threesize=54;
  486. static int three[54]={169,2,232,252,91,132,156,36,89,13,123,176,144,32,254,
  487. 142,224,85,59,121,144,79,124,23,67,90,90,216,79,23,83,
  488. 58,135,196,61,55,129,183,54,101,100,170,37,127,126,10,
  489. 100,52,4,14,18,86,77,1};
  490. static int threeB[54]={206,128,42,153,57,8,183,251,13,89,36,30,32,144,183,
  491. 130,59,240,121,59,85,223,19,228,180,134,33,107,74,98,
  492. 233,253,196,135,63,2,110,114,50,155,90,127,37,170,104,
  493. 200,20,254,4,58,106,176,144,0};
  494. int foursize=38;
  495. static int four[38]={18,6,163,252,97,194,104,131,32,1,7,82,137,42,129,11,72,
  496. 132,60,220,112,8,196,109,64,179,86,9,137,195,208,122,169,
  497. 28,2,133,0,1};
  498. static int fourB[38]={36,48,102,83,243,24,52,7,4,35,132,10,145,21,2,93,2,41,
  499. 1,219,184,16,33,184,54,149,170,132,18,30,29,98,229,67,
  500. 129,10,4,32};
  501. int fivesize=45;
  502. static int five[45]={169,2,126,139,144,172,30,4,80,72,240,59,130,218,73,62,
  503. 241,24,210,44,4,20,0,248,116,49,135,100,110,130,181,169,
  504. 84,75,159,2,1,0,132,192,8,0,0,18,22};
  505. static int fiveB[45]={1,84,145,111,245,100,128,8,56,36,40,71,126,78,213,226,
  506. 124,105,12,0,133,128,0,162,233,242,67,152,77,205,77,
  507. 172,150,169,129,79,128,0,6,4,32,0,27,9,0};
  508. int sixsize=7;
  509. static int six[7]={17,177,170,242,169,19,148};
  510. static int sixB[7]={136,141,85,79,149,200,41};
  511. /* Test read/write together */
  512. /* Later we test against pregenerated bitstreams */
  513. oggpack_writeinit(&o);
  514. fprintf(stderr,"\nSmall preclipped packing (LSb): ");
  515. cliptest(testbuffer1,test1size,0,one,onesize);
  516. fprintf(stderr,"ok.");
  517. fprintf(stderr,"\nNull bit call (LSb): ");
  518. cliptest(testbuffer3,test3size,0,two,twosize);
  519. fprintf(stderr,"ok.");
  520. fprintf(stderr,"\nLarge preclipped packing (LSb): ");
  521. cliptest(testbuffer2,test2size,0,three,threesize);
  522. fprintf(stderr,"ok.");
  523. fprintf(stderr,"\n32 bit preclipped packing (LSb): ");
  524. oggpack_reset(&o);
  525. for(i=0;i<test2size;i++)
  526. oggpack_write(&o,large[i],32);
  527. buffer=oggpack_get_buffer(&o);
  528. bytes=oggpack_bytes(&o);
  529. oggpack_readinit(&r,buffer,bytes);
  530. for(i=0;i<test2size;i++){
  531. if(oggpack_look(&r,32)==-1)report("out of data. failed!");
  532. if(oggpack_look(&r,32)!=large[i]){
  533. fprintf(stderr,"%ld != %ld (%lx!=%lx):",oggpack_look(&r,32),large[i],
  534. oggpack_look(&r,32),large[i]);
  535. report("read incorrect value!\n");
  536. }
  537. oggpack_adv(&r,32);
  538. }
  539. if(oggpack_bytes(&r)!=bytes)report("leftover bytes after read!\n");
  540. fprintf(stderr,"ok.");
  541. fprintf(stderr,"\nSmall unclipped packing (LSb): ");
  542. cliptest(testbuffer1,test1size,7,four,foursize);
  543. fprintf(stderr,"ok.");
  544. fprintf(stderr,"\nLarge unclipped packing (LSb): ");
  545. cliptest(testbuffer2,test2size,17,five,fivesize);
  546. fprintf(stderr,"ok.");
  547. fprintf(stderr,"\nSingle bit unclipped packing (LSb): ");
  548. cliptest(testbuffer3,test3size,1,six,sixsize);
  549. fprintf(stderr,"ok.");
  550. fprintf(stderr,"\nTesting read past end (LSb): ");
  551. oggpack_readinit(&r,"\0\0\0\0\0\0\0\0",8);
  552. for(i=0;i<64;i++){
  553. if(oggpack_read(&r,1)!=0){
  554. fprintf(stderr,"failed; got -1 prematurely.\n");
  555. exit(1);
  556. }
  557. }
  558. if(oggpack_look(&r,1)!=-1 ||
  559. oggpack_read(&r,1)!=-1){
  560. fprintf(stderr,"failed; read past end without -1.\n");
  561. exit(1);
  562. }
  563. oggpack_readinit(&r,"\0\0\0\0\0\0\0\0",8);
  564. if(oggpack_read(&r,30)!=0 || oggpack_read(&r,16)!=0){
  565. fprintf(stderr,"failed 2; got -1 prematurely.\n");
  566. exit(1);
  567. }
  568. if(oggpack_look(&r,18)!=0 ||
  569. oggpack_look(&r,18)!=0){
  570. fprintf(stderr,"failed 3; got -1 prematurely.\n");
  571. exit(1);
  572. }
  573. if(oggpack_look(&r,19)!=-1 ||
  574. oggpack_look(&r,19)!=-1){
  575. fprintf(stderr,"failed; read past end without -1.\n");
  576. exit(1);
  577. }
  578. if(oggpack_look(&r,32)!=-1 ||
  579. oggpack_look(&r,32)!=-1){
  580. fprintf(stderr,"failed; read past end without -1.\n");
  581. exit(1);
  582. }
  583. fprintf(stderr,"ok.\n");
  584. /********** lazy, cut-n-paste retest with MSb packing ***********/
  585. /* Test read/write together */
  586. /* Later we test against pregenerated bitstreams */
  587. oggpackB_writeinit(&o);
  588. fprintf(stderr,"\nSmall preclipped packing (MSb): ");
  589. cliptestB(testbuffer1,test1size,0,oneB,onesize);
  590. fprintf(stderr,"ok.");
  591. fprintf(stderr,"\nNull bit call (MSb): ");
  592. cliptestB(testbuffer3,test3size,0,twoB,twosize);
  593. fprintf(stderr,"ok.");
  594. fprintf(stderr,"\nLarge preclipped packing (MSb): ");
  595. cliptestB(testbuffer2,test2size,0,threeB,threesize);
  596. fprintf(stderr,"ok.");
  597. fprintf(stderr,"\n32 bit preclipped packing (MSb): ");
  598. oggpackB_reset(&o);
  599. for(i=0;i<test2size;i++)
  600. oggpackB_write(&o,large[i],32);
  601. buffer=oggpackB_get_buffer(&o);
  602. bytes=oggpackB_bytes(&o);
  603. oggpackB_readinit(&r,buffer,bytes);
  604. for(i=0;i<test2size;i++){
  605. if(oggpackB_look(&r,32)==-1)report("out of data. failed!");
  606. if(oggpackB_look(&r,32)!=large[i]){
  607. fprintf(stderr,"%ld != %ld (%lx!=%lx):",oggpackB_look(&r,32),large[i],
  608. oggpackB_look(&r,32),large[i]);
  609. report("read incorrect value!\n");
  610. }
  611. oggpackB_adv(&r,32);
  612. }
  613. if(oggpackB_bytes(&r)!=bytes)report("leftover bytes after read!\n");
  614. fprintf(stderr,"ok.");
  615. fprintf(stderr,"\nSmall unclipped packing (MSb): ");
  616. cliptestB(testbuffer1,test1size,7,fourB,foursize);
  617. fprintf(stderr,"ok.");
  618. fprintf(stderr,"\nLarge unclipped packing (MSb): ");
  619. cliptestB(testbuffer2,test2size,17,fiveB,fivesize);
  620. fprintf(stderr,"ok.");
  621. fprintf(stderr,"\nSingle bit unclipped packing (MSb): ");
  622. cliptestB(testbuffer3,test3size,1,sixB,sixsize);
  623. fprintf(stderr,"ok.");
  624. fprintf(stderr,"\nTesting read past end (MSb): ");
  625. oggpackB_readinit(&r,"\0\0\0\0\0\0\0\0",8);
  626. for(i=0;i<64;i++){
  627. if(oggpackB_read(&r,1)!=0){
  628. fprintf(stderr,"failed; got -1 prematurely.\n");
  629. exit(1);
  630. }
  631. }
  632. if(oggpackB_look(&r,1)!=-1 ||
  633. oggpackB_read(&r,1)!=-1){
  634. fprintf(stderr,"failed; read past end without -1.\n");
  635. exit(1);
  636. }
  637. oggpackB_readinit(&r,"\0\0\0\0\0\0\0\0",8);
  638. if(oggpackB_read(&r,30)!=0 || oggpackB_read(&r,16)!=0){
  639. fprintf(stderr,"failed 2; got -1 prematurely.\n");
  640. exit(1);
  641. }
  642. if(oggpackB_look(&r,18)!=0 ||
  643. oggpackB_look(&r,18)!=0){
  644. fprintf(stderr,"failed 3; got -1 prematurely.\n");
  645. exit(1);
  646. }
  647. if(oggpackB_look(&r,19)!=-1 ||
  648. oggpackB_look(&r,19)!=-1){
  649. fprintf(stderr,"failed; read past end without -1.\n");
  650. exit(1);
  651. }
  652. if(oggpackB_look(&r,32)!=-1 ||
  653. oggpackB_look(&r,32)!=-1){
  654. fprintf(stderr,"failed; read past end without -1.\n");
  655. exit(1);
  656. }
  657. fprintf(stderr,"ok.\n\n");
  658. return(0);
  659. }
  660. #endif /* _V_SELFTEST */
  661. #undef BUFFER_INCREMENT