1N/A/***********************************************************************
1N/A* *
1N/A* This software is part of the ast package *
1N/A* Copyright (c) 1996-2011 AT&T Intellectual Property *
1N/A* and is licensed under the *
1N/A* Common Public License, Version 1.0 *
1N/A* by AT&T Intellectual Property *
1N/A* *
1N/A* A copy of the License is available at *
1N/A* http://www.opensource.org/licenses/cpl1.0.txt *
1N/A* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
1N/A* *
1N/A* Information and Software Systems Research *
1N/A* AT&T Research *
1N/A* Florham Park NJ *
1N/A* *
1N/A* Glenn Fowler <gsf@research.att.com> *
1N/A* *
1N/A***********************************************************************/
1N/A#pragma prototyped
1N/A/*
1N/A * Glenn Fowler
1N/A * AT&T Research
1N/A *
1N/A * man this is sum library
1N/A */
1N/A
1N/Astatic const char id[] = "\n@(#)$Id: sumlib (AT&T Research) 2009-09-28 $\0\n";
1N/A
1N/A#define _SUM_PRIVATE_ \
1N/A struct Method_s* method; \
1N/A uintmax_t total_count; \
1N/A uintmax_t total_size; \
1N/A uintmax_t size;
1N/A
1N/A#include <sum.h>
1N/A#include <ctype.h>
1N/A#include <swap.h>
1N/A#include <hashpart.h>
1N/A
1N/A#define SCALE(n,m) (((n)+(m)-1)/(m))
1N/A
1N/Atypedef struct Method_s
1N/A{
1N/A const char* match;
1N/A const char* description;
1N/A const char* options;
1N/A Sum_t* (*open)(const struct Method_s*, const char*);
1N/A int (*init)(Sum_t*);
1N/A int (*block)(Sum_t*, const void*, size_t);
1N/A int (*data)(Sum_t*, Sumdata_t*);
1N/A int (*print)(Sum_t*, Sfio_t*, int, size_t);
1N/A int (*done)(Sum_t*);
1N/A int scale;
1N/A} Method_t;
1N/A
1N/Atypedef struct Map_s
1N/A{
1N/A const char* match;
1N/A const char* description;
1N/A const char* map;
1N/A} Map_t;
1N/A
1N/A/*
1N/A * 16 and 32 bit common code
1N/A */
1N/A
1N/A#define _INTEGRAL_PRIVATE_ \
1N/A uint32_t sum; \
1N/A uint32_t total_sum;
1N/A
1N/Atypedef struct Integral_s
1N/A{
1N/A _SUM_PUBLIC_
1N/A _SUM_PRIVATE_
1N/A _INTEGRAL_PRIVATE_
1N/A} Integral_t;
1N/A
1N/Astatic Sum_t*
1N/Along_open(const Method_t* method, const char* name)
1N/A{
1N/A Integral_t* p;
1N/A
1N/A if (p = newof(0, Integral_t, 1, 0))
1N/A {
1N/A p->method = (Method_t*)method;
1N/A p->name = name;
1N/A }
1N/A return (Sum_t*)p;
1N/A}
1N/A
1N/Astatic int
1N/Along_init(Sum_t* p)
1N/A{
1N/A ((Integral_t*)p)->sum = 0;
1N/A return 0;
1N/A}
1N/A
1N/Astatic int
1N/Along_done(Sum_t* p)
1N/A{
1N/A register Integral_t* x = (Integral_t*)p;
1N/A
1N/A x->total_sum ^= (x->sum &= 0xffffffff);
1N/A return 0;
1N/A}
1N/A
1N/Astatic int
1N/Ashort_done(Sum_t* p)
1N/A{
1N/A register Integral_t* x = (Integral_t*)p;
1N/A
1N/A x->total_sum ^= (x->sum &= 0xffff);
1N/A return 0;
1N/A}
1N/A
1N/Astatic int
1N/Along_print(Sum_t* p, Sfio_t* sp, register int flags, size_t scale)
1N/A{
1N/A register Integral_t* x = (Integral_t*)p;
1N/A register uint32_t c;
1N/A register uintmax_t z;
1N/A register size_t n;
1N/A
1N/A c = (flags & SUM_TOTAL) ? x->total_sum : x->sum;
1N/A sfprintf(sp, "%.*I*u", (flags & SUM_LEGACY) ? 5 : 1, sizeof(c), c);
1N/A if (flags & SUM_SIZE)
1N/A {
1N/A z = (flags & SUM_TOTAL) ? x->total_size : x->size;
1N/A if ((flags & SUM_SCALE) && ((n = scale) || (n = x->method->scale)))
1N/A z = SCALE(z, n);
1N/A sfprintf(sp, " %*I*u", (flags & SUM_LEGACY) ? 6 : 0, sizeof(z), z);
1N/A }
1N/A if (flags & SUM_TOTAL)
1N/A sfprintf(sp, " %*I*u", (flags & SUM_LEGACY) ? 6 : 0, sizeof(x->total_count), x->total_count);
1N/A return 0;
1N/A}
1N/A
1N/Astatic int
1N/Along_data(Sum_t* p, Sumdata_t* data)
1N/A{
1N/A register Integral_t* x = (Integral_t*)p;
1N/A
1N/A data->size = sizeof(data->num);
1N/A data->num = x->sum;
1N/A data->buf = 0;
1N/A return 0;
1N/A}
1N/A
1N/A#include "FEATURE/sum"
1N/A
1N/A#include "sum-att.c"
1N/A#include "sum-ast4.c"
1N/A#include "sum-bsd.c"
1N/A#include "sum-crc.c"
1N/A#include "sum-prng.c"
1N/A
1N/A#if _LIB_md && _lib_MD5Init && _hdr_md5 && _lib_SHA2Init && _hdr_sha2
1N/A
1N/A#include "sum-lmd.c"
1N/A
1N/A#else
1N/A
1N/A#include "sum-md5.c"
1N/A#include "sum-sha1.c"
1N/A#include "sum-sha2.c"
1N/A
1N/A#endif
1N/A
1N/A/*
1N/A * now the library interface
1N/A */
1N/A
1N/A#undef METHOD /* solaris <sys/localedef.h>! */
1N/A#define METHOD(x) x##_match,x##_description,x##_options,x##_open,x##_init,x##_block,x##_data,x##_print,x##_done,x##_scale
1N/A
1N/Astatic const Method_t methods[] =
1N/A{
1N/A METHOD(att),
1N/A METHOD(ast4),
1N/A METHOD(bsd),
1N/A METHOD(crc),
1N/A METHOD(prng),
1N/A#ifdef md4_description
1N/A METHOD(md4),
1N/A#endif
1N/A#ifdef md5_description
1N/A METHOD(md5),
1N/A#endif
1N/A#ifdef sha1_description
1N/A METHOD(sha1),
1N/A#endif
1N/A#ifdef sha256_description
1N/A METHOD(sha256),
1N/A#endif
1N/A#ifdef sha384_description
1N/A METHOD(sha384),
1N/A#endif
1N/A#ifdef sha512_description
1N/A METHOD(sha512),
1N/A#endif
1N/A};
1N/A
1N/Astatic const Map_t maps[] =
1N/A{
1N/A {
1N/A "posix|cksum|std|standard",
1N/A "The posix 1003.2-1992 32 bit crc checksum. This is the"
1N/A " default \bcksum\b(1) method.",
1N/A "crc-0x04c11db7-rotate-done-size"
1N/A },
1N/A {
1N/A "zip",
1N/A "The \bzip\b(1) crc.",
1N/A "crc-0xedb88320-init-done"
1N/A },
1N/A {
1N/A "fddi",
1N/A "The FDDI crc.",
1N/A "crc-0xedb88320-size=0xcc55cc55"
1N/A },
1N/A {
1N/A "fnv|fnv1",
1N/A "The Fowler-Noll-Vo 32 bit PRNG hash with non-zero"
1N/A " initializer (FNV-1).",
1N/A "prng-0x01000193-init=0x811c9dc5"
1N/A },
1N/A {
1N/A "ast|strsum",
1N/A "The \bast\b \bstrsum\b(3) PRNG hash.",
1N/A "prng-0x63c63cd9-add=0x9c39c33d"
1N/A },
1N/A};
1N/A
1N/A/*
1N/A * simple alternation prefix match
1N/A */
1N/A
1N/Astatic int
1N/Amatch(register const char* s, register const char* p)
1N/A{
1N/A register const char* b = s;
1N/A
1N/A for (;;)
1N/A {
1N/A do
1N/A {
1N/A if (*p == '|' || *p == 0)
1N/A return 1;
1N/A } while (*s++ == *p++);
1N/A for (;;)
1N/A {
1N/A switch (*p++)
1N/A {
1N/A case 0:
1N/A return 0;
1N/A case '|':
1N/A break;
1N/A default:
1N/A continue;
1N/A }
1N/A break;
1N/A }
1N/A s = b;
1N/A }
1N/A return 0;
1N/A}
1N/A
1N/A/*
1N/A * open sum method name
1N/A */
1N/A
1N/ASum_t*
1N/Asumopen(register const char* name)
1N/A{
1N/A register int n;
1N/A
1N/A if (!name || !name[0] || name[0] == '-' && !name[1])
1N/A name = "default";
1N/A for (n = 0; n < elementsof(maps); n++)
1N/A if (match(name, maps[n].match))
1N/A {
1N/A name = maps[n].map;
1N/A break;
1N/A }
1N/A for (n = 0; n < elementsof(methods); n++)
1N/A if (match(name, methods[n].match))
1N/A return (*methods[n].open)(&methods[n], name);
1N/A return 0;
1N/A}
1N/A
1N/A/*
1N/A * initialize for a new run of blocks
1N/A */
1N/A
1N/Aint
1N/Asuminit(Sum_t* p)
1N/A{
1N/A p->size = 0;
1N/A return (*p->method->init)(p);
1N/A}
1N/A
1N/A/*
1N/A * compute the running sum on buf
1N/A */
1N/A
1N/Aint
1N/Asumblock(Sum_t* p, const void* buf, size_t siz)
1N/A{
1N/A p->size += siz;
1N/A return (*p->method->block)(p, buf, siz);
1N/A}
1N/A
1N/A/*
1N/A * done with this run of blocks
1N/A */
1N/A
1N/Aint
1N/Asumdone(Sum_t* p)
1N/A{
1N/A p->total_count++;
1N/A p->total_size += p->size;
1N/A return (*p->method->done)(p);
1N/A}
1N/A
1N/A/*
1N/A * print the sum [size] on sp
1N/A */
1N/A
1N/Aint
1N/Asumprint(Sum_t* p, Sfio_t* sp, int flags, size_t scale)
1N/A{
1N/A return (*p->method->print)(p, sp, flags, scale);
1N/A}
1N/A
1N/A/*
1N/A * return the current sum (internal) data
1N/A */
1N/A
1N/Aint
1N/Asumdata(Sum_t* p, Sumdata_t* d)
1N/A{
1N/A return (*p->method->data)(p, d);
1N/A}
1N/A
1N/A/*
1N/A * close an open sum handle
1N/A */
1N/A
1N/Aint
1N/Asumclose(Sum_t* p)
1N/A{
1N/A free(p);
1N/A return 0;
1N/A}
1N/A
1N/A/*
1N/A * print the checksum method optget(3) usage on sp and return the length
1N/A */
1N/A
1N/Aint
1N/Asumusage(Sfio_t* sp)
1N/A{
1N/A register int i;
1N/A register int n;
1N/A
1N/A for (i = n = 0; i < elementsof(methods); i++)
1N/A {
1N/A n += sfprintf(sp, "[+%s?%s]", methods[i].match, methods[i].description);
1N/A if (methods[i].options)
1N/A n += sfprintf(sp, "{\n%s\n}", methods[i].options);
1N/A }
1N/A for (i = 0; i < elementsof(maps); i++)
1N/A n += sfprintf(sp, "[+%s?%s Shorthand for \b%s\b.]", maps[i].match, maps[i].description, maps[i].map);
1N/A return n;
1N/A}