X-Git-Url: https://git.distorted.org.uk/~mdw/catacomb/blobdiff_plain/4328f7469ba7f9539368a21107005009aa9d3a43..8f2287ef5c05d496fcb9b012629af007fe56f897:/symm/hash.h diff --git a/symm/hash.h b/symm/hash.h index dc0bbaa1..3d0c1179 100644 --- a/symm/hash.h +++ b/symm/hash.h @@ -38,6 +38,10 @@ #include +#ifndef CATACOMB_RSVR_H +# include "rsvr.h" +#endif + /*----- Macros ------------------------------------------------------------*/ /* --- @HASH_BUFFER@ --- * @@ -58,7 +62,10 @@ #define HASH_BUFFER(PRE, pre, ictx, ibuf, isz) do { \ pre##_ctx *_bctx = (ictx); \ size_t _bsz = (isz); \ - const octet *_bbuf = (octet *)(ibuf); \ + const octet *_bbuf = (octet *)(ibuf), *_p; \ + static const rsvr_policy _pol = { 0, PRE##_BUFSZ, PRE##_BUFSZ }; \ + uint32 _l, _h; \ + rsvr_state _st; \ \ /* --- Add on the size done so far --- * \ * \ @@ -66,44 +73,15 @@ * how many bits you've actually got. \ */ \ \ - { \ - uint32 _l = U32(_bsz); \ - uint32 _h = ((_bsz & ~MASK32) >> 16) >> 16; \ - _bctx->nh += _h; \ - _bctx->nl += _l; \ - if (_bctx->nl < _l || _bctx->nl & ~MASK32) \ - _bctx->nh++; \ - } \ - \ - /* --- Handle very small contributions --- */ \ + _l = U32(_bsz); _h = ((_bsz & ~(size_t)MASK32) >> 16) >> 16; \ + _bctx->nl += _l; if (_bctx->nl < _l || _bctx->nl & ~(uint32)MASK32) _h++; \ + _bctx->nh += _h; \ \ - if (_bctx->off + _bsz < PRE##_BUFSZ) { \ - memcpy(_bctx->buf + _bctx->off, _bbuf, _bsz); \ - _bctx->off += _bsz; \ - } else { \ - \ - /* --- Handle an initial partial buffer --- */ \ - \ - if (_bctx->off) { \ - size_t s = PRE##_BUFSZ - _bctx->off; \ - memcpy(_bctx->buf + _bctx->off, _bbuf, s); \ - pre##_compress(_bctx, _bctx->buf); \ - _bsz -= s; _bbuf += s; \ - } \ + /* --- Accumulate the input data --- */ \ \ - /* --- Do whole buffers while we can --- */ \ - \ - while (_bsz >= PRE##_BUFSZ) { \ - pre##_compress(_bctx, _bbuf); \ - _bsz -= PRE##_BUFSZ; _bbuf += PRE##_BUFSZ; \ - } \ - \ - /* --- And wrap up at the end --- */ \ - \ - if (_bsz) \ - memcpy(_bctx->buf, _bbuf, _bsz); \ - _bctx->off = _bsz; \ - } \ + rsvr_setup(&_st, &_pol, _bctx->buf, &_bctx->off, _bbuf, _bsz); \ + RSVR_DO(&_st) while ((_p = RSVR_NEXT(&_st, PRE##_BUFSZ)) != 0) \ + pre##_compress(_bctx, _p); \ } while (0) /* --- @HASH_PAD@ --- * @@ -169,7 +147,7 @@ #define HASH_VERIFYX(PRE, pre, name) \ \ -static int vrf_##pre(dstr *v) \ +static int vrf_##pre(dstr *v, const test_type *msgty) \ { \ pre##_ctx ctx; \ int ok = 1; \ @@ -201,8 +179,9 @@ static int vrf_##pre(dstr *v) \ } \ pre##_done(&ctx, d.buf); \ if (memcmp(d.buf, v[1].buf, PRE##_HASHSZ) != 0) { \ - printf("\nfail:\n\tstep = %i\n\tinput = `%s'\n\texpected = ", \ - *ip, v[0].buf); \ + printf("\nfail:\n\tstep = %i\n\tinput = ", *ip); \ + msgty->dump(&v[0], stdout); \ + printf("\n\texpected = "); \ type_hex.dump(&v[1], stdout); \ fputs("\n\tcomputed = ", stdout); \ type_hex.dump(&d, stdout); \ @@ -215,6 +194,11 @@ static int vrf_##pre(dstr *v) \ return (ok); \ } \ \ +static int vrf_##pre##_hex(dstr *v) \ + { return vrf_##pre(v, &type_hex); } \ +static int vrf_##pre##_lit(dstr *v) \ + { return vrf_##pre(v, &type_string); } \ + \ static int vrf_##pre##_rep(dstr *v) \ { \ pre##_ctx ctx; \ @@ -255,7 +239,8 @@ static int vrf_##pre##_rep(dstr *v) \ #define HASH_TESTDEFS(PRE, pre) HASH_TESTDEFSX(PRE, pre, #pre) #define HASH_TESTDEFSX(PRE, pre, name) \ - { name, vrf_##pre, { &type_string, &type_hex, 0 } }, \ + { name, vrf_##pre##_lit, { &type_string, &type_hex, 0 } }, \ + { name "-hex", vrf_##pre##_hex, { &type_hex, &type_hex, 0 } }, \ { name "-rep", vrf_##pre##_rep, \ { &type_string, &type_int, &type_hex, 0 } },