3 * Calculating cyclic redundancy values (non-cryptographic!)
5 * (c) 1998 Straylight/Edgeware
8 /*----- Licensing notice --------------------------------------------------*
10 * This file is part of the mLib utilities library.
12 * mLib is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU Library General Public License as
14 * published by the Free Software Foundation; either version 2 of the
15 * License, or (at your option) any later version.
17 * mLib is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU Library General Public License for more details.
22 * You should have received a copy of the GNU Library General Public
23 * License along with mLib; if not, write to the Free
24 * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
35 /*----- Header files ------------------------------------------------------*/
41 /*----- External values ---------------------------------------------------*/
43 extern const uint32 crc32_table
[256];
45 /*----- Macros ------------------------------------------------------------*/
49 * Arguments: @uint32 result@ = where to put the result
50 * @uint32 crc@ = carryover from previous call, or zero
51 * @void *buf@ = pointer to buffer to check
52 * @size_t sz@ = size of the buffer
54 * Use: A restartable CRC calculator wrapped up in a macro.
57 #define CRC32(result, crc, buf, sz) do { \
58 const octet *_p = (const octet *)(buf); \
59 const octet *_l = _p + (sz); \
60 uint32 _crc = U32(~(crc)); \
63 _crc = (_crc >> 8) ^ crc32_table[U8(*_p++ ^ _crc)]; \
64 (result) = U32(~_crc); \
67 /*----- Functions provided ------------------------------------------------*/
71 * Arguments: @uint32 crc@ = carryover from previous call, or zero
72 * @const void *buf@ = pointer to buffer to check
73 * @size_t sz@ = size of the buffer
75 * Returns: The CRC updated by the new buffer.
77 * Use: A restartable CRC calculator. This is just a function
78 * wrapper for the macro version.
81 extern uint32
crc32(uint32
/*crc*/, const void */
*buf*/
, size_t /*sz*/);
83 /*----- That's all, folks -------------------------------------------------*/