8836 libsum: 'id' defined but not used
[unleashed.git] / usr / src / lib / libsum / common / sumlib.c
blob7b87c939862642cc9abbbd46bb6168845df72e32
1 /***********************************************************************
2 * *
3 * This software is part of the ast package *
4 * Copyright (c) 1996-2010 AT&T Intellectual Property *
5 * and is licensed under the *
6 * Common Public License, Version 1.0 *
7 * by AT&T Intellectual Property *
8 * *
9 * A copy of the License is available at *
10 * http://www.opensource.org/licenses/cpl1.0.txt *
11 * (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
12 * *
13 * Information and Software Systems Research *
14 * AT&T Research *
15 * Florham Park NJ *
16 * *
17 * Glenn Fowler <gsf@research.att.com> *
18 * *
19 ***********************************************************************/
20 #pragma prototyped
22 * Glenn Fowler
23 * AT&T Research
25 * man this is sum library
28 #define _SUM_PRIVATE_ \
29 struct Method_s* method; \
30 uintmax_t total_count; \
31 uintmax_t total_size; \
32 uintmax_t size;
34 #include <sum.h>
35 #include <ctype.h>
36 #include <swap.h>
37 #include <hashpart.h>
39 #define SCALE(n,m) (((n)+(m)-1)/(m))
41 typedef struct Method_s
43 const char* match;
44 const char* description;
45 const char* options;
46 Sum_t* (*open)(const struct Method_s*, const char*);
47 int (*init)(Sum_t*);
48 int (*block)(Sum_t*, const void*, size_t);
49 int (*data)(Sum_t*, Sumdata_t*);
50 int (*print)(Sum_t*, Sfio_t*, int, size_t);
51 int (*done)(Sum_t*);
52 int scale;
53 } Method_t;
55 typedef struct Map_s
57 const char* match;
58 const char* description;
59 const char* map;
60 } Map_t;
63 * 16 and 32 bit common code
66 #define _INTEGRAL_PRIVATE_ \
67 uint32_t sum; \
68 uint32_t total_sum;
70 typedef struct Integral_s
72 _SUM_PUBLIC_
73 _SUM_PRIVATE_
74 _INTEGRAL_PRIVATE_
75 } Integral_t;
77 static Sum_t*
78 long_open(const Method_t* method, const char* name)
80 Integral_t* p;
82 if (p = newof(0, Integral_t, 1, 0))
84 p->method = (Method_t*)method;
85 p->name = name;
87 return (Sum_t*)p;
90 static int
91 long_init(Sum_t* p)
93 ((Integral_t*)p)->sum = 0;
94 return 0;
97 static int
98 long_done(Sum_t* p)
100 register Integral_t* x = (Integral_t*)p;
102 x->total_sum ^= (x->sum &= 0xffffffff);
103 return 0;
106 static int
107 short_done(Sum_t* p)
109 register Integral_t* x = (Integral_t*)p;
111 x->total_sum ^= (x->sum &= 0xffff);
112 return 0;
115 static int
116 long_print(Sum_t* p, Sfio_t* sp, register int flags, size_t scale)
118 register Integral_t* x = (Integral_t*)p;
119 register uint32_t c;
120 register uintmax_t z;
121 register size_t n;
123 c = (flags & SUM_TOTAL) ? x->total_sum : x->sum;
124 sfprintf(sp, "%.*I*u", (flags & SUM_LEGACY) ? 5 : 1, sizeof(c), c);
125 if (flags & SUM_SIZE)
127 z = (flags & SUM_TOTAL) ? x->total_size : x->size;
128 if ((flags & SUM_SCALE) && ((n = scale) || (n = x->method->scale)))
129 z = SCALE(z, n);
130 sfprintf(sp, " %*I*u", (flags & SUM_LEGACY) ? 6 : 0, sizeof(z), z);
132 if (flags & SUM_TOTAL)
133 sfprintf(sp, " %*I*u", (flags & SUM_LEGACY) ? 6 : 0, sizeof(x->total_count), x->total_count);
134 return 0;
137 static int
138 long_data(Sum_t* p, Sumdata_t* data)
140 register Integral_t* x = (Integral_t*)p;
142 data->size = sizeof(data->num);
143 data->num = x->sum;
144 data->buf = 0;
145 return 0;
148 #include "FEATURE/sum"
150 #include "sum-att.c"
151 #include "sum-ast4.c"
152 #include "sum-bsd.c"
153 #include "sum-crc.c"
154 #include "sum-prng.c"
156 #if _LIB_md && _lib_MD5Init && _hdr_md5 && _lib_SHA2Init && _hdr_sha2
158 #include "sum-lmd.c"
160 #else
162 #include "sum-md5.c"
163 #include "sum-sha1.c"
164 #include "sum-sha2.c"
166 #endif
169 * now the library interface
172 #undef METHOD /* solaris <sys/localedef.h>! */
173 #define METHOD(x) x##_match,x##_description,x##_options,x##_open,x##_init,x##_block,x##_data,x##_print,x##_done,x##_scale
175 static const Method_t methods[] =
177 METHOD(att),
178 METHOD(ast4),
179 METHOD(bsd),
180 METHOD(crc),
181 METHOD(prng),
182 #ifdef md4_description
183 METHOD(md4),
184 #endif
185 #ifdef md5_description
186 METHOD(md5),
187 #endif
188 #ifdef sha1_description
189 METHOD(sha1),
190 #endif
191 #ifdef sha256_description
192 METHOD(sha256),
193 #endif
194 #ifdef sha384_description
195 METHOD(sha384),
196 #endif
197 #ifdef sha512_description
198 METHOD(sha512),
199 #endif
202 static const Map_t maps[] =
205 "posix|cksum|std|standard",
206 "The posix 1003.2-1992 32 bit crc checksum. This is the"
207 " default \bcksum\b(1) method.",
208 "crc-0x04c11db7-rotate-done-size"
211 "zip",
212 "The \bzip\b(1) crc.",
213 "crc-0xedb88320-init-done"
216 "fddi",
217 "The FDDI crc.",
218 "crc-0xedb88320-size=0xcc55cc55"
221 "fnv|fnv1",
222 "The Fowler-Noll-Vo 32 bit PRNG hash with non-zero"
223 " initializer (FNV-1).",
224 "prng-0x01000193-init=0x811c9dc5"
227 "ast|strsum",
228 "The \bast\b \bstrsum\b(3) PRNG hash.",
229 "prng-0x63c63cd9-add=0x9c39c33d"
234 * simple alternation prefix match
237 static int
238 match(register const char* s, register const char* p)
240 register const char* b = s;
242 for (;;)
246 if (*p == '|' || *p == 0)
247 return 1;
248 } while (*s++ == *p++);
249 for (;;)
251 switch (*p++)
253 case 0:
254 return 0;
255 case '|':
256 break;
257 default:
258 continue;
260 break;
262 s = b;
264 return 0;
268 * open sum method name
271 Sum_t*
272 sumopen(register const char* name)
274 register int n;
276 if (!name || !name[0] || name[0] == '-' && !name[1])
277 name = "default";
278 for (n = 0; n < elementsof(maps); n++)
279 if (match(name, maps[n].match))
281 name = maps[n].map;
282 break;
284 for (n = 0; n < elementsof(methods); n++)
285 if (match(name, methods[n].match))
286 return (*methods[n].open)(&methods[n], name);
287 return 0;
291 * initialize for a new run of blocks
295 suminit(Sum_t* p)
297 p->size = 0;
298 return (*p->method->init)(p);
302 * compute the running sum on buf
306 sumblock(Sum_t* p, const void* buf, size_t siz)
308 p->size += siz;
309 return (*p->method->block)(p, buf, siz);
313 * done with this run of blocks
317 sumdone(Sum_t* p)
319 p->total_count++;
320 p->total_size += p->size;
321 return (*p->method->done)(p);
325 * print the sum [size] on sp
329 sumprint(Sum_t* p, Sfio_t* sp, int flags, size_t scale)
331 return (*p->method->print)(p, sp, flags, scale);
335 * return the current sum (internal) data
339 sumdata(Sum_t* p, Sumdata_t* d)
341 return (*p->method->data)(p, d);
345 * close an open sum handle
349 sumclose(Sum_t* p)
351 free(p);
352 return 0;
356 * print the checksum method optget(3) usage on sp and return the length
360 sumusage(Sfio_t* sp)
362 register int i;
363 register int n;
365 for (i = n = 0; i < elementsof(methods); i++)
367 n += sfprintf(sp, "[+%s?%s]", methods[i].match, methods[i].description);
368 if (methods[i].options)
369 n += sfprintf(sp, "{\n%s\n}", methods[i].options);
371 for (i = 0; i < elementsof(maps); i++)
372 n += sfprintf(sp, "[+%s?%s Shorthand for \b%s\b.]", maps[i].match, maps[i].description, maps[i].map);
373 return n;