Main Page | Class List | Directories | File List | Class Members | File Members

bitwise.c File Reference

#include <string.h>
#include <stdlib.h>
#include <ogg/ogg.h>

Go to the source code of this file.

Defines

#define BUFFER_INCREMENT   256

Functions

void oggpack_writeinit (oggpack_buffer *b)
void oggpackB_writeinit (oggpack_buffer *b)
void oggpack_writetrunc (oggpack_buffer *b, long bits)
void oggpackB_writetrunc (oggpack_buffer *b, long bits)
void oggpack_write (oggpack_buffer *b, unsigned long value, int bits)
void oggpackB_write (oggpack_buffer *b, unsigned long value, int bits)
void oggpack_writealign (oggpack_buffer *b)
void oggpackB_writealign (oggpack_buffer *b)
static void oggpack_writecopy_helper (oggpack_buffer *b, void *source, long bits, void(*w)(oggpack_buffer *, unsigned long, int), int msb)
void oggpack_writecopy (oggpack_buffer *b, void *source, long bits)
void oggpackB_writecopy (oggpack_buffer *b, void *source, long bits)
void oggpack_reset (oggpack_buffer *b)
void oggpackB_reset (oggpack_buffer *b)
void oggpack_writeclear (oggpack_buffer *b)
void oggpackB_writeclear (oggpack_buffer *b)
void oggpack_readinit (oggpack_buffer *b, unsigned char *buf, int bytes)
void oggpackB_readinit (oggpack_buffer *b, unsigned char *buf, int bytes)
long oggpack_look (oggpack_buffer *b, int bits)
long oggpackB_look (oggpack_buffer *b, int bits)
long oggpack_look1 (oggpack_buffer *b)
long oggpackB_look1 (oggpack_buffer *b)
void oggpack_adv (oggpack_buffer *b, int bits)
void oggpackB_adv (oggpack_buffer *b, int bits)
void oggpack_adv1 (oggpack_buffer *b)
void oggpackB_adv1 (oggpack_buffer *b)
long oggpack_read (oggpack_buffer *b, int bits)
long oggpackB_read (oggpack_buffer *b, int bits)
long oggpack_read1 (oggpack_buffer *b)
long oggpackB_read1 (oggpack_buffer *b)
long oggpack_bytes (oggpack_buffer *b)
long oggpack_bits (oggpack_buffer *b)
long oggpackB_bytes (oggpack_buffer *b)
long oggpackB_bits (oggpack_buffer *b)
unsigned char * oggpack_get_buffer (oggpack_buffer *b)
unsigned char * oggpackB_get_buffer (oggpack_buffer *b)

Variables

static const unsigned long mask []
static const unsigned int mask8B []


Define Documentation

#define BUFFER_INCREMENT   256
 

Definition at line 25 of file bitwise.c.

Referenced by oggpack_write(), oggpack_writecopy_helper(), oggpack_writeinit(), and oggpackB_write().


Function Documentation

void oggpack_adv oggpack_buffer b,
int  bits
 

Definition at line 288 of file bitwise.c.

References oggpack_buffer::endbit, oggpack_buffer::endbyte, and oggpack_buffer::ptr.

Referenced by oggpackB_adv().

00288                                             {
00289   bits+=b->endbit;
00290   b->ptr+=bits/8;
00291   b->endbyte+=bits/8;
00292   b->endbit=bits&7;
00293 }

void oggpack_adv1 oggpack_buffer b  ) 
 

Definition at line 299 of file bitwise.c.

References oggpack_buffer::endbit, oggpack_buffer::endbyte, and oggpack_buffer::ptr.

Referenced by oggpackB_adv1().

00299                                     {
00300   if(++(b->endbit)>7){
00301     b->endbit=0;
00302     b->ptr++;
00303     b->endbyte++;
00304   }
00305 }

long oggpack_bits oggpack_buffer b  ) 
 

Definition at line 430 of file bitwise.c.

References oggpack_buffer::endbit, and oggpack_buffer::endbyte.

Referenced by oggpackB_bits().

00430                                     {
00431   return(b->endbyte*8+b->endbit);
00432 }

long oggpack_bytes oggpack_buffer b  ) 
 

Definition at line 426 of file bitwise.c.

References oggpack_buffer::endbit, and oggpack_buffer::endbyte.

Referenced by oggpackB_bytes().

00426                                      {
00427   return(b->endbyte+(b->endbit+7)/8);
00428 }

unsigned char* oggpack_get_buffer oggpack_buffer b  ) 
 

Definition at line 442 of file bitwise.c.

References oggpack_buffer::buffer.

Referenced by oggpackB_get_buffer().

00442                                                     {
00443   return(b->buffer);
00444 }

long oggpack_look oggpack_buffer b,
int  bits
 

Definition at line 225 of file bitwise.c.

References oggpack_buffer::endbit, oggpack_buffer::endbyte, mask, oggpack_buffer::ptr, and oggpack_buffer::storage.

00225                                              {
00226   unsigned long ret;
00227   unsigned long m=mask[bits];
00228 
00229   bits+=b->endbit;
00230 
00231   if(b->endbyte+4>=b->storage){
00232     /* not the main path */
00233     if(b->endbyte*8+bits>b->storage*8)return(-1);
00234   }
00235   
00236   ret=b->ptr[0]>>b->endbit;
00237   if(bits>8){
00238     ret|=b->ptr[1]<<(8-b->endbit);  
00239     if(bits>16){
00240       ret|=b->ptr[2]<<(16-b->endbit);  
00241       if(bits>24){
00242         ret|=b->ptr[3]<<(24-b->endbit);  
00243         if(bits>32 && b->endbit)
00244           ret|=b->ptr[4]<<(32-b->endbit);
00245       }
00246     }
00247   }
00248   return(m&ret);
00249 }

long oggpack_look1 oggpack_buffer b  ) 
 

Definition at line 278 of file bitwise.c.

References oggpack_buffer::endbit, oggpack_buffer::endbyte, oggpack_buffer::ptr, and oggpack_buffer::storage.

00278                                      {
00279   if(b->endbyte>=b->storage)return(-1);
00280   return((b->ptr[0]>>b->endbit)&1);
00281 }

long oggpack_read oggpack_buffer b,
int  bits
 

Definition at line 312 of file bitwise.c.

References oggpack_buffer::endbit, oggpack_buffer::endbyte, mask, oggpack_buffer::ptr, and oggpack_buffer::storage.

00312                                              {
00313   long ret;
00314   unsigned long m=mask[bits];
00315 
00316   bits+=b->endbit;
00317 
00318   if(b->endbyte+4>=b->storage){
00319     /* not the main path */
00320     ret=-1L;
00321     if(b->endbyte*8+bits>b->storage*8)goto overflow;
00322   }
00323   
00324   ret=b->ptr[0]>>b->endbit;
00325   if(bits>8){
00326     ret|=b->ptr[1]<<(8-b->endbit);  
00327     if(bits>16){
00328       ret|=b->ptr[2]<<(16-b->endbit);  
00329       if(bits>24){
00330         ret|=b->ptr[3]<<(24-b->endbit);  
00331         if(bits>32 && b->endbit){
00332           ret|=b->ptr[4]<<(32-b->endbit);
00333         }
00334       }
00335     }
00336   }
00337   ret&=m;
00338   
00339  overflow:
00340 
00341   b->ptr+=bits/8;
00342   b->endbyte+=bits/8;
00343   b->endbit=bits&7;
00344   return(ret);
00345 }

long oggpack_read1 oggpack_buffer b  ) 
 

Definition at line 382 of file bitwise.c.

References oggpack_buffer::endbit, oggpack_buffer::endbyte, oggpack_buffer::ptr, and oggpack_buffer::storage.

00382                                      {
00383   long ret;
00384   
00385   if(b->endbyte>=b->storage){
00386     /* not the main path */
00387     ret=-1L;
00388     goto overflow;
00389   }
00390 
00391   ret=(b->ptr[0]>>b->endbit)&1;
00392   
00393  overflow:
00394 
00395   b->endbit++;
00396   if(b->endbit>7){
00397     b->endbit=0;
00398     b->ptr++;
00399     b->endbyte++;
00400   }
00401   return(ret);
00402 }

void oggpack_readinit oggpack_buffer b,
unsigned char *  buf,
int  bytes
 

Definition at line 214 of file bitwise.c.

Referenced by oggpackB_readinit().

00214                                                                      {
00215   memset(b,0,sizeof(*b));
00216   b->buffer=b->ptr=buf;
00217   b->storage=bytes;
00218 }

void oggpack_reset oggpack_buffer b  ) 
 

Definition at line 195 of file bitwise.c.

References oggpack_buffer::buffer, oggpack_buffer::endbit, oggpack_buffer::endbyte, and oggpack_buffer::ptr.

Referenced by oggpackB_reset().

00195                                      {
00196   b->ptr=b->buffer;
00197   b->buffer[0]=0;
00198   b->endbit=b->endbyte=0;
00199 }

void oggpack_write oggpack_buffer b,
unsigned long  value,
int  bits
 

Definition at line 69 of file bitwise.c.

References _ogg_realloc, oggpack_buffer::buffer, BUFFER_INCREMENT, oggpack_buffer::endbit, oggpack_buffer::endbyte, mask, oggpack_buffer::ptr, and oggpack_buffer::storage.

Referenced by oggpack_writealign(), and oggpack_writecopy().

00069                                                                   {
00070   if(b->endbyte+4>=b->storage){
00071     b->buffer=_ogg_realloc(b->buffer,b->storage+BUFFER_INCREMENT);
00072     b->storage+=BUFFER_INCREMENT;
00073     b->ptr=b->buffer+b->endbyte;
00074   }
00075 
00076   value&=mask[bits]; 
00077   bits+=b->endbit;
00078 
00079   b->ptr[0]|=value<<b->endbit;  
00080   
00081   if(bits>=8){
00082     b->ptr[1]=(unsigned char)(value>>(8-b->endbit));
00083     if(bits>=16){
00084       b->ptr[2]=(unsigned char)(value>>(16-b->endbit));
00085       if(bits>=24){
00086         b->ptr[3]=(unsigned char)(value>>(24-b->endbit));
00087         if(bits>=32){
00088           if(b->endbit)
00089             b->ptr[4]=(unsigned char)(value>>(32-b->endbit));
00090           else
00091             b->ptr[4]=0;
00092         }
00093       }
00094     }
00095   }
00096 
00097   b->endbyte+=bits/8;
00098   b->ptr+=bits/8;
00099   b->endbit=bits&7;
00100 }

void oggpack_writealign oggpack_buffer b  ) 
 

Definition at line 136 of file bitwise.c.

References oggpack_buffer::endbit, and oggpack_write().

00136                                           {
00137   int bits=8-b->endbit;
00138   if(bits<8)
00139     oggpack_write(b,0,bits);
00140 }

void oggpack_writeclear oggpack_buffer b  ) 
 

Definition at line 205 of file bitwise.c.

References _ogg_free, and oggpack_buffer::buffer.

Referenced by oggpackB_writeclear().

00205                                           {
00206   _ogg_free(b->buffer);
00207   memset(b,0,sizeof(*b));
00208 }

void oggpack_writecopy oggpack_buffer b,
void *  source,
long  bits
 

Definition at line 187 of file bitwise.c.

References oggpack_write(), and oggpack_writecopy_helper().

00187                                                                 {
00188   oggpack_writecopy_helper(b,source,bits,oggpack_write,0);
00189 }

static void oggpack_writecopy_helper oggpack_buffer b,
void *  source,
long  bits,
void(*)(oggpack_buffer *, unsigned long, int)  w,
int  msb
[static]
 

Definition at line 148 of file bitwise.c.

References _ogg_realloc, oggpack_buffer::buffer, BUFFER_INCREMENT, oggpack_buffer::endbit, oggpack_buffer::endbyte, oggpack_buffer::ptr, and oggpack_buffer::storage.

Referenced by oggpack_writecopy(), and oggpackB_writecopy().

00154                                              {
00155   unsigned char *ptr=(unsigned char *)source;
00156 
00157   long bytes=bits/8;
00158   bits-=bytes*8;
00159 
00160   if(b->endbit){
00161     int i;
00162     /* unaligned copy.  Do it the hard way. */
00163     for(i=0;i<bytes;i++)
00164       w(b,(unsigned long)(ptr[i]),8);    
00165   }else{
00166     /* aligned block copy */
00167     if(b->endbyte+bytes+1>=b->storage){
00168       b->storage=b->endbyte+bytes+BUFFER_INCREMENT;
00169       b->buffer=_ogg_realloc(b->buffer,b->storage);
00170       b->ptr=b->buffer+b->endbyte;
00171     }
00172 
00173     memmove(b->ptr,source,bytes);
00174     b->ptr+=bytes;
00175     b->endbyte+=bytes;
00176     *b->ptr=0;
00177 
00178   }
00179   if(bits){
00180     if(msb)
00181       w(b,(unsigned long)(ptr[bytes]>>(8-bits)),bits);    
00182     else
00183       w(b,(unsigned long)(ptr[bytes]),bits);    
00184   }
00185 }

void oggpack_writeinit oggpack_buffer b  ) 
 

Definition at line 39 of file bitwise.c.

References _ogg_malloc, and BUFFER_INCREMENT.

Referenced by oggpackB_writeinit().

00039                                          {
00040   memset(b,0,sizeof(*b));
00041   b->ptr=b->buffer=_ogg_malloc(BUFFER_INCREMENT);
00042   b->buffer[0]='\0';
00043   b->storage=BUFFER_INCREMENT;
00044 }

void oggpack_writetrunc oggpack_buffer b,
long  bits
 

Definition at line 50 of file bitwise.c.

References oggpack_buffer::buffer, oggpack_buffer::endbit, oggpack_buffer::endbyte, mask, and oggpack_buffer::ptr.

00050                                                     {
00051   long bytes=bits>>3;
00052   bits-=bytes*8;
00053   b->ptr=b->buffer+bytes;
00054   b->endbit=bits;
00055   b->endbyte=bytes;
00056   *b->ptr&=mask[bits];
00057 }

void oggpackB_adv oggpack_buffer b,
int  bits
 

Definition at line 295 of file bitwise.c.

References oggpack_adv().

00295                                              {
00296   oggpack_adv(b,bits);
00297 }

void oggpackB_adv1 oggpack_buffer b  ) 
 

Definition at line 307 of file bitwise.c.

References oggpack_adv1().

00307                                      {
00308   oggpack_adv1(b);
00309 }

long oggpackB_bits oggpack_buffer b  ) 
 

Definition at line 438 of file bitwise.c.

References oggpack_bits().

00438                                      {
00439   return oggpack_bits(b);
00440 }

long oggpackB_bytes oggpack_buffer b  ) 
 

Definition at line 434 of file bitwise.c.

References oggpack_bytes().

00434                                       {
00435   return oggpack_bytes(b);
00436 }

unsigned char* oggpackB_get_buffer oggpack_buffer b  ) 
 

Definition at line 446 of file bitwise.c.

References oggpack_get_buffer().

00446                                                      {
00447   return oggpack_get_buffer(b);
00448 }

long oggpackB_look oggpack_buffer b,
int  bits
 

Definition at line 252 of file bitwise.c.

References oggpack_buffer::endbit, oggpack_buffer::endbyte, oggpack_buffer::ptr, and oggpack_buffer::storage.

00252                                               {
00253   unsigned long ret;
00254   int m=32-bits;
00255 
00256   bits+=b->endbit;
00257 
00258   if(b->endbyte+4>=b->storage){
00259     /* not the main path */
00260     if(b->endbyte*8+bits>b->storage*8)return(-1);
00261   }
00262   
00263   ret=b->ptr[0]<<(24+b->endbit);
00264   if(bits>8){
00265     ret|=b->ptr[1]<<(16+b->endbit);  
00266     if(bits>16){
00267       ret|=b->ptr[2]<<(8+b->endbit);  
00268       if(bits>24){
00269         ret|=b->ptr[3]<<(b->endbit);  
00270         if(bits>32 && b->endbit)
00271           ret|=b->ptr[4]>>(8-b->endbit);
00272       }
00273     }
00274   }
00275   return ((ret&0xffffffff)>>(m>>1))>>((m+1)>>1);
00276 }

long oggpackB_look1 oggpack_buffer b  ) 
 

Definition at line 283 of file bitwise.c.

References oggpack_buffer::endbit, oggpack_buffer::endbyte, oggpack_buffer::ptr, and oggpack_buffer::storage.

00283                                       {
00284   if(b->endbyte>=b->storage)return(-1);
00285   return((b->ptr[0]>>(7-b->endbit))&1);
00286 }

long oggpackB_read oggpack_buffer b,
int  bits
 

Definition at line 348 of file bitwise.c.

References oggpack_buffer::endbit, oggpack_buffer::endbyte, oggpack_buffer::ptr, and oggpack_buffer::storage.

00348                                               {
00349   long ret;
00350   long m=32-bits;
00351   
00352   bits+=b->endbit;
00353 
00354   if(b->endbyte+4>=b->storage){
00355     /* not the main path */
00356     ret=-1L;
00357     if(b->endbyte*8+bits>b->storage*8)goto overflow;
00358   }
00359   
00360   ret=b->ptr[0]<<(24+b->endbit);
00361   if(bits>8){
00362     ret|=b->ptr[1]<<(16+b->endbit);  
00363     if(bits>16){
00364       ret|=b->ptr[2]<<(8+b->endbit);  
00365       if(bits>24){
00366         ret|=b->ptr[3]<<(b->endbit);  
00367         if(bits>32 && b->endbit)
00368           ret|=b->ptr[4]>>(8-b->endbit);
00369       }
00370     }
00371   }
00372   ret=((ret&0xffffffffUL)>>(m>>1))>>((m+1)>>1);
00373   
00374  overflow:
00375 
00376   b->ptr+=bits/8;
00377   b->endbyte+=bits/8;
00378   b->endbit=bits&7;
00379   return(ret);
00380 }

long oggpackB_read1 oggpack_buffer b  ) 
 

Definition at line 404 of file bitwise.c.

References oggpack_buffer::endbit, oggpack_buffer::endbyte, oggpack_buffer::ptr, and oggpack_buffer::storage.

00404                                       {
00405   long ret;
00406   
00407   if(b->endbyte>=b->storage){
00408     /* not the main path */
00409     ret=-1L;
00410     goto overflow;
00411   }
00412 
00413   ret=(b->ptr[0]>>(7-b->endbit))&1;
00414   
00415  overflow:
00416 
00417   b->endbit++;
00418   if(b->endbit>7){
00419     b->endbit=0;
00420     b->ptr++;
00421     b->endbyte++;
00422   }
00423   return(ret);
00424 }

void oggpackB_readinit oggpack_buffer b,
unsigned char *  buf,
int  bytes
 

Definition at line 220 of file bitwise.c.

References oggpack_readinit().

00220                                                                       {
00221   oggpack_readinit(b,buf,bytes);
00222 }

void oggpackB_reset oggpack_buffer b  ) 
 

Definition at line 201 of file bitwise.c.

References oggpack_reset().

00201                                       {
00202   oggpack_reset(b);
00203 }

void oggpackB_write oggpack_buffer b,
unsigned long  value,
int  bits
 

Definition at line 103 of file bitwise.c.

References _ogg_realloc, oggpack_buffer::buffer, BUFFER_INCREMENT, oggpack_buffer::endbit, oggpack_buffer::endbyte, mask, oggpack_buffer::ptr, and oggpack_buffer::storage.

Referenced by oggpackB_writealign(), and oggpackB_writecopy().

00103                                                                    {
00104   if(b->endbyte+4>=b->storage){
00105     b->buffer=_ogg_realloc(b->buffer,b->storage+BUFFER_INCREMENT);
00106     b->storage+=BUFFER_INCREMENT;
00107     b->ptr=b->buffer+b->endbyte;
00108   }
00109 
00110   value=(value&mask[bits])<<(32-bits); 
00111   bits+=b->endbit;
00112 
00113   b->ptr[0]|=value>>(24+b->endbit);  
00114   
00115   if(bits>=8){
00116     b->ptr[1]=(unsigned char)(value>>(16+b->endbit));
00117     if(bits>=16){
00118       b->ptr[2]=(unsigned char)(value>>(8+b->endbit));
00119       if(bits>=24){
00120         b->ptr[3]=(unsigned char)(value>>(b->endbit));
00121         if(bits>=32){
00122           if(b->endbit)
00123             b->ptr[4]=(unsigned char)(value<<(8-b->endbit));
00124           else
00125             b->ptr[4]=0;
00126         }
00127       }
00128     }
00129   }
00130 
00131   b->endbyte+=bits/8;
00132   b->ptr+=bits/8;
00133   b->endbit=bits&7;
00134 }

void oggpackB_writealign oggpack_buffer b  ) 
 

Definition at line 142 of file bitwise.c.

References oggpack_buffer::endbit, and oggpackB_write().

00142                                            {
00143   int bits=8-b->endbit;
00144   if(bits<8)
00145     oggpackB_write(b,0,bits);
00146 }

void oggpackB_writeclear oggpack_buffer b  ) 
 

Definition at line 210 of file bitwise.c.

References oggpack_writeclear().

00210                                            {
00211   oggpack_writeclear(b);
00212 }

void oggpackB_writecopy oggpack_buffer b,
void *  source,
long  bits
 

Definition at line 191 of file bitwise.c.

References oggpack_writecopy_helper(), and oggpackB_write().

00191                                                                  {
00192   oggpack_writecopy_helper(b,source,bits,oggpackB_write,1);
00193 }

void oggpackB_writeinit oggpack_buffer b  ) 
 

Definition at line 46 of file bitwise.c.

References oggpack_writeinit().

00046                                           {
00047   oggpack_writeinit(b);
00048 }

void oggpackB_writetrunc oggpack_buffer b,
long  bits
 

Definition at line 59 of file bitwise.c.

References oggpack_buffer::buffer, oggpack_buffer::endbit, oggpack_buffer::endbyte, mask8B, and oggpack_buffer::ptr.

00059                                                      {
00060   long bytes=bits>>3;
00061   bits-=bytes*8;
00062   b->ptr=b->buffer+bytes;
00063   b->endbit=bits;
00064   b->endbyte=bytes;
00065   *b->ptr&=mask8B[bits];
00066 }


Variable Documentation

const unsigned long mask[] [static]
 

Initial value:

{0x00000000,0x00000001,0x00000003,0x00000007,0x0000000f,
 0x0000001f,0x0000003f,0x0000007f,0x000000ff,0x000001ff,
 0x000003ff,0x000007ff,0x00000fff,0x00001fff,0x00003fff,
 0x00007fff,0x0000ffff,0x0001ffff,0x0003ffff,0x0007ffff,
 0x000fffff,0x001fffff,0x003fffff,0x007fffff,0x00ffffff,
 0x01ffffff,0x03ffffff,0x07ffffff,0x0fffffff,0x1fffffff,
 0x3fffffff,0x7fffffff,0xffffffff }

Definition at line 27 of file bitwise.c.

Referenced by oggpack_look(), oggpack_read(), oggpack_write(), oggpack_writetrunc(), and oggpackB_write().

const unsigned int mask8B[] [static]
 

Initial value:

{0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff}

Definition at line 36 of file bitwise.c.

Referenced by oggpackB_writetrunc().


© sourcejam.com 2005-2008