18462SApril.Chin@Sun.COM /*********************************************************************** 28462SApril.Chin@Sun.COM * * 38462SApril.Chin@Sun.COM * This software is part of the ast package * 4*12068SRoger.Faulkner@Oracle.COM * Copyright (c) 1996-2010 AT&T Intellectual Property * 58462SApril.Chin@Sun.COM * and is licensed under the * 68462SApril.Chin@Sun.COM * Common Public License, Version 1.0 * 78462SApril.Chin@Sun.COM * by AT&T Intellectual Property * 88462SApril.Chin@Sun.COM * * 98462SApril.Chin@Sun.COM * A copy of the License is available at * 108462SApril.Chin@Sun.COM * http://www.opensource.org/licenses/cpl1.0.txt * 118462SApril.Chin@Sun.COM * (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * 128462SApril.Chin@Sun.COM * * 138462SApril.Chin@Sun.COM * Information and Software Systems Research * 148462SApril.Chin@Sun.COM * AT&T Research * 158462SApril.Chin@Sun.COM * Florham Park NJ * 168462SApril.Chin@Sun.COM * * 178462SApril.Chin@Sun.COM * Glenn Fowler <gsf@research.att.com> * 188462SApril.Chin@Sun.COM * * 198462SApril.Chin@Sun.COM ***********************************************************************/ 208462SApril.Chin@Sun.COM #pragma prototyped 218462SApril.Chin@Sun.COM /* 228462SApril.Chin@Sun.COM * Glenn Fowler 238462SApril.Chin@Sun.COM * AT&T Research 248462SApril.Chin@Sun.COM * 258462SApril.Chin@Sun.COM * man this is sum library 268462SApril.Chin@Sun.COM */ 278462SApril.Chin@Sun.COM 2810898Sroland.mainz@nrubsig.org static const char id[] = "\n@(#)$Id: sumlib (AT&T Research) 2009-09-28 $\0\n"; 298462SApril.Chin@Sun.COM 308462SApril.Chin@Sun.COM #define _SUM_PRIVATE_ \ 318462SApril.Chin@Sun.COM struct Method_s* method; \ 328462SApril.Chin@Sun.COM uintmax_t total_count; \ 338462SApril.Chin@Sun.COM uintmax_t total_size; \ 348462SApril.Chin@Sun.COM uintmax_t size; 358462SApril.Chin@Sun.COM 368462SApril.Chin@Sun.COM #include <sum.h> 378462SApril.Chin@Sun.COM #include <ctype.h> 388462SApril.Chin@Sun.COM #include <swap.h> 398462SApril.Chin@Sun.COM #include <hashpart.h> 408462SApril.Chin@Sun.COM 418462SApril.Chin@Sun.COM #define SCALE(n,m) (((n)+(m)-1)/(m)) 428462SApril.Chin@Sun.COM 438462SApril.Chin@Sun.COM typedef struct Method_s 448462SApril.Chin@Sun.COM { 458462SApril.Chin@Sun.COM const char* match; 468462SApril.Chin@Sun.COM const char* description; 478462SApril.Chin@Sun.COM const char* options; 488462SApril.Chin@Sun.COM Sum_t* (*open)(const struct Method_s*, const char*); 498462SApril.Chin@Sun.COM int (*init)(Sum_t*); 508462SApril.Chin@Sun.COM int (*block)(Sum_t*, const void*, size_t); 518462SApril.Chin@Sun.COM int (*data)(Sum_t*, Sumdata_t*); 528462SApril.Chin@Sun.COM int (*print)(Sum_t*, Sfio_t*, int, size_t); 538462SApril.Chin@Sun.COM int (*done)(Sum_t*); 548462SApril.Chin@Sun.COM int scale; 558462SApril.Chin@Sun.COM } Method_t; 568462SApril.Chin@Sun.COM 578462SApril.Chin@Sun.COM typedef struct Map_s 588462SApril.Chin@Sun.COM { 598462SApril.Chin@Sun.COM const char* match; 608462SApril.Chin@Sun.COM const char* description; 618462SApril.Chin@Sun.COM const char* map; 628462SApril.Chin@Sun.COM } Map_t; 638462SApril.Chin@Sun.COM 648462SApril.Chin@Sun.COM /* 658462SApril.Chin@Sun.COM * 16 and 32 bit common code 668462SApril.Chin@Sun.COM */ 678462SApril.Chin@Sun.COM 688462SApril.Chin@Sun.COM #define _INTEGRAL_PRIVATE_ \ 698462SApril.Chin@Sun.COM uint32_t sum; \ 708462SApril.Chin@Sun.COM uint32_t total_sum; 718462SApril.Chin@Sun.COM 728462SApril.Chin@Sun.COM typedef struct Integral_s 738462SApril.Chin@Sun.COM { 748462SApril.Chin@Sun.COM _SUM_PUBLIC_ 758462SApril.Chin@Sun.COM _SUM_PRIVATE_ 768462SApril.Chin@Sun.COM _INTEGRAL_PRIVATE_ 778462SApril.Chin@Sun.COM } Integral_t; 788462SApril.Chin@Sun.COM 798462SApril.Chin@Sun.COM static Sum_t* 808462SApril.Chin@Sun.COM long_open(const Method_t* method, const char* name) 818462SApril.Chin@Sun.COM { 828462SApril.Chin@Sun.COM Integral_t* p; 838462SApril.Chin@Sun.COM 848462SApril.Chin@Sun.COM if (p = newof(0, Integral_t, 1, 0)) 858462SApril.Chin@Sun.COM { 868462SApril.Chin@Sun.COM p->method = (Method_t*)method; 878462SApril.Chin@Sun.COM p->name = name; 888462SApril.Chin@Sun.COM } 898462SApril.Chin@Sun.COM return (Sum_t*)p; 908462SApril.Chin@Sun.COM } 918462SApril.Chin@Sun.COM 928462SApril.Chin@Sun.COM static int 938462SApril.Chin@Sun.COM long_init(Sum_t* p) 948462SApril.Chin@Sun.COM { 958462SApril.Chin@Sun.COM ((Integral_t*)p)->sum = 0; 968462SApril.Chin@Sun.COM return 0; 978462SApril.Chin@Sun.COM } 988462SApril.Chin@Sun.COM 998462SApril.Chin@Sun.COM static int 1008462SApril.Chin@Sun.COM long_done(Sum_t* p) 1018462SApril.Chin@Sun.COM { 1028462SApril.Chin@Sun.COM register Integral_t* x = (Integral_t*)p; 1038462SApril.Chin@Sun.COM 1048462SApril.Chin@Sun.COM x->total_sum ^= (x->sum &= 0xffffffff); 1058462SApril.Chin@Sun.COM return 0; 1068462SApril.Chin@Sun.COM } 1078462SApril.Chin@Sun.COM 1088462SApril.Chin@Sun.COM static int 1098462SApril.Chin@Sun.COM short_done(Sum_t* p) 1108462SApril.Chin@Sun.COM { 1118462SApril.Chin@Sun.COM register Integral_t* x = (Integral_t*)p; 1128462SApril.Chin@Sun.COM 1138462SApril.Chin@Sun.COM x->total_sum ^= (x->sum &= 0xffff); 1148462SApril.Chin@Sun.COM return 0; 1158462SApril.Chin@Sun.COM } 1168462SApril.Chin@Sun.COM 1178462SApril.Chin@Sun.COM static int 1188462SApril.Chin@Sun.COM long_print(Sum_t* p, Sfio_t* sp, register int flags, size_t scale) 1198462SApril.Chin@Sun.COM { 1208462SApril.Chin@Sun.COM register Integral_t* x = (Integral_t*)p; 1218462SApril.Chin@Sun.COM register uint32_t c; 1228462SApril.Chin@Sun.COM register uintmax_t z; 1238462SApril.Chin@Sun.COM register size_t n; 1248462SApril.Chin@Sun.COM 1258462SApril.Chin@Sun.COM c = (flags & SUM_TOTAL) ? x->total_sum : x->sum; 1268462SApril.Chin@Sun.COM sfprintf(sp, "%.*I*u", (flags & SUM_LEGACY) ? 5 : 1, sizeof(c), c); 1278462SApril.Chin@Sun.COM if (flags & SUM_SIZE) 1288462SApril.Chin@Sun.COM { 1298462SApril.Chin@Sun.COM z = (flags & SUM_TOTAL) ? x->total_size : x->size; 1308462SApril.Chin@Sun.COM if ((flags & SUM_SCALE) && ((n = scale) || (n = x->method->scale))) 1318462SApril.Chin@Sun.COM z = SCALE(z, n); 1328462SApril.Chin@Sun.COM sfprintf(sp, " %*I*u", (flags & SUM_LEGACY) ? 6 : 0, sizeof(z), z); 1338462SApril.Chin@Sun.COM } 1348462SApril.Chin@Sun.COM if (flags & SUM_TOTAL) 1358462SApril.Chin@Sun.COM sfprintf(sp, " %*I*u", (flags & SUM_LEGACY) ? 6 : 0, sizeof(x->total_count), x->total_count); 1368462SApril.Chin@Sun.COM return 0; 1378462SApril.Chin@Sun.COM } 1388462SApril.Chin@Sun.COM 1398462SApril.Chin@Sun.COM static int 1408462SApril.Chin@Sun.COM long_data(Sum_t* p, Sumdata_t* data) 1418462SApril.Chin@Sun.COM { 1428462SApril.Chin@Sun.COM register Integral_t* x = (Integral_t*)p; 1438462SApril.Chin@Sun.COM 1448462SApril.Chin@Sun.COM data->size = sizeof(data->num); 1458462SApril.Chin@Sun.COM data->num = x->sum; 1468462SApril.Chin@Sun.COM data->buf = 0; 1478462SApril.Chin@Sun.COM return 0; 1488462SApril.Chin@Sun.COM } 1498462SApril.Chin@Sun.COM 1508462SApril.Chin@Sun.COM #include "FEATURE/sum" 1518462SApril.Chin@Sun.COM 1528462SApril.Chin@Sun.COM #include "sum-att.c" 1538462SApril.Chin@Sun.COM #include "sum-ast4.c" 1548462SApril.Chin@Sun.COM #include "sum-bsd.c" 1558462SApril.Chin@Sun.COM #include "sum-crc.c" 1568462SApril.Chin@Sun.COM #include "sum-prng.c" 1578462SApril.Chin@Sun.COM 1588462SApril.Chin@Sun.COM #if _LIB_md && _lib_MD5Init && _hdr_md5 && _lib_SHA2Init && _hdr_sha2 1598462SApril.Chin@Sun.COM 1608462SApril.Chin@Sun.COM #include "sum-lmd.c" 1618462SApril.Chin@Sun.COM 1628462SApril.Chin@Sun.COM #else 1638462SApril.Chin@Sun.COM 1648462SApril.Chin@Sun.COM #include "sum-md5.c" 1658462SApril.Chin@Sun.COM #include "sum-sha1.c" 1668462SApril.Chin@Sun.COM #include "sum-sha2.c" 1678462SApril.Chin@Sun.COM 1688462SApril.Chin@Sun.COM #endif 1698462SApril.Chin@Sun.COM 1708462SApril.Chin@Sun.COM /* 1718462SApril.Chin@Sun.COM * now the library interface 1728462SApril.Chin@Sun.COM */ 1738462SApril.Chin@Sun.COM 1748462SApril.Chin@Sun.COM #undef METHOD /* solaris <sys/localedef.h>! */ 1758462SApril.Chin@Sun.COM #define METHOD(x) x##_match,x##_description,x##_options,x##_open,x##_init,x##_block,x##_data,x##_print,x##_done,x##_scale 1768462SApril.Chin@Sun.COM 1778462SApril.Chin@Sun.COM static const Method_t methods[] = 1788462SApril.Chin@Sun.COM { 1798462SApril.Chin@Sun.COM METHOD(att), 1808462SApril.Chin@Sun.COM METHOD(ast4), 1818462SApril.Chin@Sun.COM METHOD(bsd), 1828462SApril.Chin@Sun.COM METHOD(crc), 1838462SApril.Chin@Sun.COM METHOD(prng), 1848462SApril.Chin@Sun.COM #ifdef md4_description 1858462SApril.Chin@Sun.COM METHOD(md4), 1868462SApril.Chin@Sun.COM #endif 1878462SApril.Chin@Sun.COM #ifdef md5_description 1888462SApril.Chin@Sun.COM METHOD(md5), 1898462SApril.Chin@Sun.COM #endif 1908462SApril.Chin@Sun.COM #ifdef sha1_description 1918462SApril.Chin@Sun.COM METHOD(sha1), 1928462SApril.Chin@Sun.COM #endif 1938462SApril.Chin@Sun.COM #ifdef sha256_description 1948462SApril.Chin@Sun.COM METHOD(sha256), 1958462SApril.Chin@Sun.COM #endif 1968462SApril.Chin@Sun.COM #ifdef sha384_description 1978462SApril.Chin@Sun.COM METHOD(sha384), 1988462SApril.Chin@Sun.COM #endif 1998462SApril.Chin@Sun.COM #ifdef sha512_description 2008462SApril.Chin@Sun.COM METHOD(sha512), 2018462SApril.Chin@Sun.COM #endif 2028462SApril.Chin@Sun.COM }; 2038462SApril.Chin@Sun.COM 2048462SApril.Chin@Sun.COM static const Map_t maps[] = 2058462SApril.Chin@Sun.COM { 2068462SApril.Chin@Sun.COM { 2078462SApril.Chin@Sun.COM "posix|cksum|std|standard", 2088462SApril.Chin@Sun.COM "The posix 1003.2-1992 32 bit crc checksum. This is the" 2098462SApril.Chin@Sun.COM " default \bcksum\b(1) method.", 2108462SApril.Chin@Sun.COM "crc-0x04c11db7-rotate-done-size" 2118462SApril.Chin@Sun.COM }, 2128462SApril.Chin@Sun.COM { 2138462SApril.Chin@Sun.COM "zip", 2148462SApril.Chin@Sun.COM "The \bzip\b(1) crc.", 2158462SApril.Chin@Sun.COM "crc-0xedb88320-init-done" 2168462SApril.Chin@Sun.COM }, 2178462SApril.Chin@Sun.COM { 2188462SApril.Chin@Sun.COM "fddi", 2198462SApril.Chin@Sun.COM "The FDDI crc.", 2208462SApril.Chin@Sun.COM "crc-0xedb88320-size=0xcc55cc55" 2218462SApril.Chin@Sun.COM }, 2228462SApril.Chin@Sun.COM { 2238462SApril.Chin@Sun.COM "fnv|fnv1", 2248462SApril.Chin@Sun.COM "The Fowler-Noll-Vo 32 bit PRNG hash with non-zero" 2258462SApril.Chin@Sun.COM " initializer (FNV-1).", 2268462SApril.Chin@Sun.COM "prng-0x01000193-init=0x811c9dc5" 2278462SApril.Chin@Sun.COM }, 2288462SApril.Chin@Sun.COM { 2298462SApril.Chin@Sun.COM "ast|strsum", 2308462SApril.Chin@Sun.COM "The \bast\b \bstrsum\b(3) PRNG hash.", 2318462SApril.Chin@Sun.COM "prng-0x63c63cd9-add=0x9c39c33d" 2328462SApril.Chin@Sun.COM }, 2338462SApril.Chin@Sun.COM }; 2348462SApril.Chin@Sun.COM 2358462SApril.Chin@Sun.COM /* 23610898Sroland.mainz@nrubsig.org * simple alternation prefix match 23710898Sroland.mainz@nrubsig.org */ 23810898Sroland.mainz@nrubsig.org 23910898Sroland.mainz@nrubsig.org static int 24010898Sroland.mainz@nrubsig.org match(register const char* s, register const char* p) 24110898Sroland.mainz@nrubsig.org { 24210898Sroland.mainz@nrubsig.org register const char* b = s; 24310898Sroland.mainz@nrubsig.org 24410898Sroland.mainz@nrubsig.org for (;;) 24510898Sroland.mainz@nrubsig.org { 24610898Sroland.mainz@nrubsig.org do 24710898Sroland.mainz@nrubsig.org { 24810898Sroland.mainz@nrubsig.org if (*p == '|' || *p == 0) 24910898Sroland.mainz@nrubsig.org return 1; 25010898Sroland.mainz@nrubsig.org } while (*s++ == *p++); 25110898Sroland.mainz@nrubsig.org for (;;) 25210898Sroland.mainz@nrubsig.org { 25310898Sroland.mainz@nrubsig.org switch (*p++) 25410898Sroland.mainz@nrubsig.org { 25510898Sroland.mainz@nrubsig.org case 0: 25610898Sroland.mainz@nrubsig.org return 0; 25710898Sroland.mainz@nrubsig.org case '|': 25810898Sroland.mainz@nrubsig.org break; 25910898Sroland.mainz@nrubsig.org default: 26010898Sroland.mainz@nrubsig.org continue; 26110898Sroland.mainz@nrubsig.org } 26210898Sroland.mainz@nrubsig.org break; 26310898Sroland.mainz@nrubsig.org } 26410898Sroland.mainz@nrubsig.org s = b; 26510898Sroland.mainz@nrubsig.org } 26610898Sroland.mainz@nrubsig.org return 0; 26710898Sroland.mainz@nrubsig.org } 26810898Sroland.mainz@nrubsig.org 26910898Sroland.mainz@nrubsig.org /* 2708462SApril.Chin@Sun.COM * open sum method name 2718462SApril.Chin@Sun.COM */ 2728462SApril.Chin@Sun.COM 2738462SApril.Chin@Sun.COM Sum_t* 2748462SApril.Chin@Sun.COM sumopen(register const char* name) 2758462SApril.Chin@Sun.COM { 2768462SApril.Chin@Sun.COM register int n; 2778462SApril.Chin@Sun.COM 2788462SApril.Chin@Sun.COM if (!name || !name[0] || name[0] == '-' && !name[1]) 2798462SApril.Chin@Sun.COM name = "default"; 2808462SApril.Chin@Sun.COM for (n = 0; n < elementsof(maps); n++) 28110898Sroland.mainz@nrubsig.org if (match(name, maps[n].match)) 2828462SApril.Chin@Sun.COM { 2838462SApril.Chin@Sun.COM name = maps[n].map; 2848462SApril.Chin@Sun.COM break; 2858462SApril.Chin@Sun.COM } 2868462SApril.Chin@Sun.COM for (n = 0; n < elementsof(methods); n++) 28710898Sroland.mainz@nrubsig.org if (match(name, methods[n].match)) 2888462SApril.Chin@Sun.COM return (*methods[n].open)(&methods[n], name); 2898462SApril.Chin@Sun.COM return 0; 2908462SApril.Chin@Sun.COM } 2918462SApril.Chin@Sun.COM 2928462SApril.Chin@Sun.COM /* 2938462SApril.Chin@Sun.COM * initialize for a new run of blocks 2948462SApril.Chin@Sun.COM */ 2958462SApril.Chin@Sun.COM 2968462SApril.Chin@Sun.COM int 2978462SApril.Chin@Sun.COM suminit(Sum_t* p) 2988462SApril.Chin@Sun.COM { 2998462SApril.Chin@Sun.COM p->size = 0; 3008462SApril.Chin@Sun.COM return (*p->method->init)(p); 3018462SApril.Chin@Sun.COM } 3028462SApril.Chin@Sun.COM 3038462SApril.Chin@Sun.COM /* 3048462SApril.Chin@Sun.COM * compute the running sum on buf 3058462SApril.Chin@Sun.COM */ 3068462SApril.Chin@Sun.COM 3078462SApril.Chin@Sun.COM int 3088462SApril.Chin@Sun.COM sumblock(Sum_t* p, const void* buf, size_t siz) 3098462SApril.Chin@Sun.COM { 3108462SApril.Chin@Sun.COM p->size += siz; 3118462SApril.Chin@Sun.COM return (*p->method->block)(p, buf, siz); 3128462SApril.Chin@Sun.COM } 3138462SApril.Chin@Sun.COM 3148462SApril.Chin@Sun.COM /* 3158462SApril.Chin@Sun.COM * done with this run of blocks 3168462SApril.Chin@Sun.COM */ 3178462SApril.Chin@Sun.COM 3188462SApril.Chin@Sun.COM int 3198462SApril.Chin@Sun.COM sumdone(Sum_t* p) 3208462SApril.Chin@Sun.COM { 3218462SApril.Chin@Sun.COM p->total_count++; 3228462SApril.Chin@Sun.COM p->total_size += p->size; 3238462SApril.Chin@Sun.COM return (*p->method->done)(p); 3248462SApril.Chin@Sun.COM } 3258462SApril.Chin@Sun.COM 3268462SApril.Chin@Sun.COM /* 3278462SApril.Chin@Sun.COM * print the sum [size] on sp 3288462SApril.Chin@Sun.COM */ 3298462SApril.Chin@Sun.COM 3308462SApril.Chin@Sun.COM int 3318462SApril.Chin@Sun.COM sumprint(Sum_t* p, Sfio_t* sp, int flags, size_t scale) 3328462SApril.Chin@Sun.COM { 3338462SApril.Chin@Sun.COM return (*p->method->print)(p, sp, flags, scale); 3348462SApril.Chin@Sun.COM } 3358462SApril.Chin@Sun.COM 3368462SApril.Chin@Sun.COM /* 3378462SApril.Chin@Sun.COM * return the current sum (internal) data 3388462SApril.Chin@Sun.COM */ 3398462SApril.Chin@Sun.COM 3408462SApril.Chin@Sun.COM int 3418462SApril.Chin@Sun.COM sumdata(Sum_t* p, Sumdata_t* d) 3428462SApril.Chin@Sun.COM { 3438462SApril.Chin@Sun.COM return (*p->method->data)(p, d); 3448462SApril.Chin@Sun.COM } 3458462SApril.Chin@Sun.COM 3468462SApril.Chin@Sun.COM /* 3478462SApril.Chin@Sun.COM * close an open sum handle 3488462SApril.Chin@Sun.COM */ 3498462SApril.Chin@Sun.COM 3508462SApril.Chin@Sun.COM int 3518462SApril.Chin@Sun.COM sumclose(Sum_t* p) 3528462SApril.Chin@Sun.COM { 3538462SApril.Chin@Sun.COM free(p); 3548462SApril.Chin@Sun.COM return 0; 3558462SApril.Chin@Sun.COM } 3568462SApril.Chin@Sun.COM 3578462SApril.Chin@Sun.COM /* 3588462SApril.Chin@Sun.COM * print the checksum method optget(3) usage on sp and return the length 3598462SApril.Chin@Sun.COM */ 3608462SApril.Chin@Sun.COM 3618462SApril.Chin@Sun.COM int 3628462SApril.Chin@Sun.COM sumusage(Sfio_t* sp) 3638462SApril.Chin@Sun.COM { 3648462SApril.Chin@Sun.COM register int i; 3658462SApril.Chin@Sun.COM register int n; 3668462SApril.Chin@Sun.COM 3678462SApril.Chin@Sun.COM for (i = n = 0; i < elementsof(methods); i++) 3688462SApril.Chin@Sun.COM { 3698462SApril.Chin@Sun.COM n += sfprintf(sp, "[+%s?%s]", methods[i].match, methods[i].description); 3708462SApril.Chin@Sun.COM if (methods[i].options) 3718462SApril.Chin@Sun.COM n += sfprintf(sp, "{\n%s\n}", methods[i].options); 3728462SApril.Chin@Sun.COM } 3738462SApril.Chin@Sun.COM for (i = 0; i < elementsof(maps); i++) 3748462SApril.Chin@Sun.COM n += sfprintf(sp, "[+%s?%s Shorthand for \b%s\b.]", maps[i].match, maps[i].description, maps[i].map); 3758462SApril.Chin@Sun.COM return n; 3768462SApril.Chin@Sun.COM } 377