Branch data Line data Source code
1 : : /*
2 : : * Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved.
3 : : * Copyright (C) 2004-2006 Red Hat, Inc. All rights reserved.
4 : : *
5 : : * This file is part of LVM2.
6 : : *
7 : : * This copyrighted material is made available to anyone wishing to use,
8 : : * modify, copy, or redistribute it subject to the terms and conditions
9 : : * of the GNU Lesser General Public License v.2.1.
10 : : *
11 : : * You should have received a copy of the GNU Lesser General Public License
12 : : * along with this program; if not, write to the Free Software Foundation,
13 : : * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
14 : : */
15 : :
16 : : #include "lib.h"
17 : :
18 : : #include "crc.h"
19 : :
20 : : /* Calculate an endian-independent CRC of supplied buffer */
21 : 0 : uint32_t calc_crc(uint32_t initial, const void *buf, uint32_t size)
22 : : {
23 : : static const uint32_t crctab[] = {
24 : : 0x00000000, 0x1db71064, 0x3b6e20c8, 0x26d930ac,
25 : : 0x76dc4190, 0x6b6b51f4, 0x4db26158, 0x5005713c,
26 : : 0xedb88320, 0xf00f9344, 0xd6d6a3e8, 0xcb61b38c,
27 : : 0x9b64c2b0, 0x86d3d2d4, 0xa00ae278, 0xbdbdf21c
28 : : };
29 : 0 : uint32_t i, crc = initial;
30 : 0 : const uint8_t *data = (const uint8_t *) buf;
31 : :
32 [ # # ]: 0 : for (i = 0; i < size; i++) {
33 : 0 : crc ^= *data++;
34 : 0 : crc = (crc >> 4) ^ crctab[crc & 0xf];
35 : 0 : crc = (crc >> 4) ^ crctab[crc & 0xf];
36 : : }
37 : 0 : return crc;
38 : : }
|