chiark / gitweb /
Infrastructure: Split the files into subdirectories.
[mLib] / hash / crc32.h
... / ...
CommitLineData
1/* -*-c-*-
2 *
3 * Calculating cyclic redundancy values (non-cryptographic!)
4 *
5 * (c) 1998 Straylight/Edgeware
6 */
7
8/*----- Licensing notice --------------------------------------------------*
9 *
10 * This file is part of the mLib utilities library.
11 *
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.
16 *
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.
21 *
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,
25 * MA 02111-1307, USA.
26 */
27
28#ifndef MLIB_CRC32_H
29#define MLIB_CRC32_H
30
31#ifdef __cplusplus
32 extern "C" {
33#endif
34
35/*----- Header files ------------------------------------------------------*/
36
37#ifndef MLIB_BITS_H
38# include "bits.h"
39#endif
40
41/*----- External values ---------------------------------------------------*/
42
43extern uint32 crc32_table[256];
44
45/*----- Macros ------------------------------------------------------------*/
46
47/* --- @CRC32@ --- *
48 *
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
53 *
54 * Use: A restartable CRC calculator wrapped up in a macro.
55 */
56
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)); \
61 \
62 while (_p < _l) \
63 _crc = (_crc >> 8) ^ crc32_table[U8(*_p++ ^ _crc)]; \
64 (result) = U32(~_crc); \
65} while (0)
66
67/*----- Functions provided ------------------------------------------------*/
68
69/* --- @crc32@ --- *
70 *
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
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
81extern uint32 crc32(uint32 /*crc*/, const void */*buf*/, size_t /*sz*/);
82
83/*----- That's all, folks -------------------------------------------------*/
84
85#ifdef __cplusplus
86 }
87#endif
88
89#endif