chiark / gitweb /
Ooops, how did that slip by? Fix return type of @ghcopy@.
[catacomb] / crc32.c
1 /* -*-c-*-
2  *
3  * $Id: crc32.c,v 1.2 2004/03/21 23:52:58 mdw Exp $
4  *
5  * Generic hash wrapper for CRC32
6  *
7  * (c) 2001 Straylight/Edgeware
8  */
9
10 /*----- Licensing notice --------------------------------------------------* 
11  *
12  * This file is part of Catacomb.
13  *
14  * Catacomb is free software; you can redistribute it and/or modify
15  * it under the terms of the GNU Library General Public License as
16  * published by the Free Software Foundation; either version 2 of the
17  * License, or (at your option) any later version.
18  * 
19  * Catacomb is distributed in the hope that it will be useful,
20  * but WITHOUT ANY WARRANTY; without even the implied warranty of
21  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22  * GNU Library General Public License for more details.
23  * 
24  * You should have received a copy of the GNU Library General Public
25  * License along with Catacomb; if not, write to the Free
26  * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
27  * MA 02111-1307, USA.
28  */
29
30 /*----- Revision history --------------------------------------------------* 
31  *
32  * $Log: crc32.c,v $
33  * Revision 1.2  2004/03/21 23:52:58  mdw
34  * Ooops, how did that slip by?  Fix return type of @ghcopy@.
35  *
36  * Revision 1.1  2001/04/19 18:26:32  mdw
37  * Add CRC as another hash function.
38  *
39  */
40
41 /*----- Header files ------------------------------------------------------*/
42
43 #include <mLib/crc32.h>
44 #include <mLib/sub.h>
45
46 #include "arena.h"
47 #include "crc32.h"
48 #include "ghash.h"
49 #include "paranoia.h"
50
51 /*----- Main code ---------------------------------------------------------*/
52
53 typedef struct gctx {
54   ghash h;
55   uint32 c;
56   octet buf[4];
57 } gctx;
58
59 static const ghash_ops gops;
60
61 static ghash *ghinit(void)
62 {
63   gctx *g = S_CREATE(gctx);
64   g->h.ops = &gops;
65   g->c = 0;
66   return (&g->h);
67 }
68
69 static void ghhash(ghash *h, const void *p, size_t sz)
70 {
71   gctx *g = (gctx *)h;
72   CRC32(g->c, g->c, p, sz);
73 }
74
75 static octet *ghdone(ghash *h, void *buf)
76 {
77   gctx *g = (gctx *)h;
78   if (!buf)
79     buf = g->buf;
80   STORE32(buf, g->c);
81   return (buf);
82 }
83
84 static void ghdestroy(ghash *h)
85 {
86   gctx *g = (gctx *)h;
87   BURN(*g);
88   S_DESTROY(g);
89 }
90
91 static ghash *ghcopy(ghash *h)
92 {
93   gctx *g = (gctx *)h;
94   gctx *gg = S_CREATE(gctx);
95   memcpy(gg, g, sizeof(gctx));
96   return (&gg->h);
97 }
98
99 static const ghash_ops gops = { &gcrc32, ghhash, ghdone, ghdestroy, ghcopy };
100 const gchash gcrc32 = { "crc32", 4, ghinit };
101
102 /*----- That's all, folks -------------------------------------------------*/