Subversion Repositories freemyipod

Rev

Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

/*
 * CRC32 functions
 * Based on public domain implementation by Finn Yannick Jacobs.
 */

/* Written and copyright 1999 by Finn Yannick Jacobs
 * No rights were reserved to this, so feel free to
 * manipulate or do with it, what you want or desire :)
 */

#include "crc32.h"

/* crc32table[] built by crc32_init() */
static unsigned long crc32table[256];

/* Calculate crc32. Little endian.
 * Standard seed is 0xffffffff or 0.
 * Some implementations xor result with 0xffffffff after calculation.
 */
uint32_t crc32(void *data, unsigned int len, uint32_t seed) {
        uint8_t *d = data;
        
        while (len--) {
                seed = ((seed >> 8) & 0x00FFFFFF) ^ crc32table [(seed ^ *d++) & 0xFF];
        }
        
        return seed;
}

/* Calculate crc32table */
void crc32_init() {
        uint32_t poly = 0xEDB88320L;
        uint32_t crc;
        int i, j;

        for (i = 0; i < 256; ++i) {
                crc = i;
                
                for (j = 8; j > 0; --j) {
                        crc = (crc >> 1) ^ ((crc & 1) ? poly : 0);
                }
                
                crc32table[i] = crc;
        }
}