Changeset 4795:cf3e4ecde1f5 in roaraudio for libroar/crc.c


Ignore:
Timestamp:
03/14/11 15:47:34 (13 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

Added Adler32 support (Closes: #123) (pr1)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libroar/crc.c

    r4708 r4795  
    3939#define CRC24_INIT 0x00B704CEL 
    4040 
     41#define ADLER32_BASE 65521L 
     42#define ADLER32_INIT 1L 
     43 
    4144uint32_t roar_crc24_add(uint32_t state, const void * data, size_t len) { 
    4245 const unsigned char * p = data; 
     
    5760 return state & 0x00FFFFFFL; 
    5861} 
     62 
     63uint32_t roar_adler32_add(uint32_t state, const void * data, size_t len) { 
     64 const unsigned char * p = data; 
     65 uint32_t s1 =  state        & 0xFFFFL; 
     66 uint32_t s2 = (state >> 16) & 0xFFFFL; 
     67 size_t n; 
     68 
     69 if ( data == NULL ) 
     70  return ADLER32_INIT; 
     71 
     72 for (n = 0; n < len; n++) { 
     73  s1 = (s1 + p[n]) % ADLER32_BASE; 
     74  s2 = (s2 + s1  ) % ADLER32_BASE; 
     75 } 
     76 
     77 return (s2 << 16) + s1; 
     78} 
     79 
    5980 
    6081int roar_hash_crc24_init(void * state) { 
     
    93114} 
    94115 
     116 
     117int roar_hash_adler32_init(void * state) { 
     118 uint32_t * self = state; 
     119 
     120 *self = roar_adler32_init(); 
     121 
     122 return 0; 
     123} 
     124 
     125int roar_hash_adler32_digest(void * state, void * digest, size_t * len) { 
     126 uint32_t * self = state; 
     127 unsigned char * out  = digest; 
     128 register uint32_t crc; 
     129 
     130 if ( *len < 4 ) 
     131  return -1; 
     132 
     133 *len = 4; 
     134 
     135 crc = *self; 
     136 
     137 out[0] = ((crc & 0xFF000000) >> 24) & 0xFF; 
     138 out[1] = ((crc & 0x00FF0000) >> 16) & 0xFF; 
     139 out[2] = ((crc & 0x0000FF00) >>  8) & 0xFF; 
     140 out[3] = ((crc & 0x000000FF) >>  0) & 0xFF; 
     141 
     142 return 0; 
     143} 
     144 
     145int roar_hash_adler32_proc(void * state, const void * data, size_t len) { 
     146 uint32_t * self = state; 
     147 
     148 *self = roar_adler32_add(*self, data, len); 
     149 
     150 return 0; 
     151} 
     152 
    95153//ll 
Note: See TracChangeset for help on using the changeset viewer.