chiark / gitweb /
Infrastructure: Split the files into subdirectories.
[mLib] / hash / crc32.h
CommitLineData
0875b58f 1/* -*-c-*-
0875b58f 2 *
3 * Calculating cyclic redundancy values (non-cryptographic!)
4 *
5 * (c) 1998 Straylight/Edgeware
6 */
7
d4efbcd9 8/*----- Licensing notice --------------------------------------------------*
0875b58f 9 *
10 * This file is part of the mLib utilities library.
11 *
12 * mLib is free software; you can redistribute it and/or modify
c846879c 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.
d4efbcd9 16 *
0875b58f 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
c846879c 20 * GNU Library General Public License for more details.
d4efbcd9 21 *
c846879c 22 * You should have received a copy of the GNU Library General Public
0bd98442 23 * License along with mLib; if not, write to the Free
24 * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
25 * MA 02111-1307, USA.
0875b58f 26 */
27
c6e0eaf0 28#ifndef MLIB_CRC32_H
573c5b46 29#define MLIB_CRC32_H
0875b58f 30
31#ifdef __cplusplus
32 extern "C" {
33#endif
34
7b4b46a7 35/*----- Header files ------------------------------------------------------*/
36
c6e0eaf0 37#ifndef MLIB_BITS_H
7b4b46a7 38# include "bits.h"
39#endif
40
0875b58f 41/*----- External values ---------------------------------------------------*/
42
7b4b46a7 43extern uint32 crc32_table[256];
0875b58f 44
45/*----- Macros ------------------------------------------------------------*/
46
47/* --- @CRC32@ --- *
48 *
7b4b46a7 49 * Arguments: @uint32 result@ = where to put the result
50 * @uint32 crc@ = carryover from previous call, or zero
0875b58f 51 * @void *buf@ = pointer to buffer to check
52 * @size_t sz@ = size of the buffer
53 *
54 * Use: A restartable CRC calculator wrapped up in a macro.
55 */
56
57#define CRC32(result, crc, buf, sz) do { \
7b4b46a7 58 const octet *_p = (const octet *)(buf); \
59 const octet *_l = _p + (sz); \
60 uint32 _crc = U32(~(crc)); \
0875b58f 61 \
62 while (_p < _l) \
7b4b46a7 63 _crc = (_crc >> 8) ^ crc32_table[U8(*_p++ ^ _crc)]; \
64 (result) = U32(~_crc); \
0875b58f 65} while (0)
66
67/*----- Functions provided ------------------------------------------------*/
68
69/* --- @crc32@ --- *
70 *
7b4b46a7 71 * Arguments: @uint32 crc@ = carryover from previous call, or zero
0875b58f 72 * @const void *buf@ = pointer to buffer to check
73 * @size_t sz@ = size of the buffer
74 *
75 * Returns: The CRC updated by the new buffer.
76 *
77 * Use: A restartable CRC calculator. This is just a function
78 * wrapper for the macro version.
79 */
80
7b4b46a7 81extern uint32 crc32(uint32 /*crc*/, const void */*buf*/, size_t /*sz*/);
0875b58f 82
83/*----- That's all, folks -------------------------------------------------*/
84
85#ifdef __cplusplus
86 }
87#endif
88
89#endif