bitwise.c
上传用户:tuheem
上传日期:2007-05-01
资源大小:21889k
文件大小:19k
源码类别:

多媒体编程

开发平台:

Visual C++

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