Deploy the new <ctype.h> and `foocmp' macros from mLib.
[catacomb] / symm / hash.h
index dc9ad02..5b2e7fb 100644 (file)
 
 #include <mLib/bits.h>
 
+#ifndef CATACOMB_RSVR_H
+#  include "rsvr.h"
+#endif
+
 /*----- Macros ------------------------------------------------------------*/
 
 /* --- @HASH_BUFFER@ --- *
 #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 --- *                             \
    *                                                                   \
    * 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 --- */                                \
-                                                                       \
-  if (_bctx->off + _bsz < PRE##_BUFSZ) {                               \
-    memcpy(_bctx->buf + _bctx->off, _bbuf, _bsz);                      \
-    _bctx->off += _bsz;                                                        \
-  } else {                                                             \
-                                                                       \
-    /* --- Handle an initial partial buffer --- */                     \
+  _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) {                                                  \
-      size_t s = PRE##_BUFSZ - _bctx->off;                             \
-      memcpy(_bctx->buf + _bctx->off, _bbuf, s);                       \
-      pre##_compress(_bctx, _bctx->buf);                               \
-      _bsz -= s; _bbuf += s;                                           \
-    }                                                                  \
-                                                                       \
-    /* --- 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 --- */                               \
+  /* --- Accumulate the input data --- */                              \
                                                                        \
-    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@ --- *
 
 #ifdef TEST_RIG
 
+#include <mLib/macros.h>
 #include <mLib/quis.h>
 #include <mLib/testrig.h>
 
@@ -200,7 +179,7 @@ static int vrf_##pre(dstr *v, const test_type *msgty)                       \
       sz -= i;                                                         \
     }                                                                  \
     pre##_done(&ctx, d.buf);                                           \
-    if (memcmp(d.buf, v[1].buf, PRE##_HASHSZ) != 0) {                  \
+    if (MEMCMP(d.buf, !=, v[1].buf, PRE##_HASHSZ)) {                   \
       printf("\nfail:\n\tstep = %i\n\tinput = ", *ip);                 \
       msgty->dump(&v[0], stdout);                                      \
       printf("\n\texpected = ");                                       \
@@ -244,7 +223,7 @@ static int vrf_##pre##_rep(dstr *v)                                 \
   while (n--) pre##_hash(&ctx, p, len);                                        \
   pre##_done(&ctx, d.buf);                                             \
                                                                        \
-  if (memcmp(d.buf, v[2].buf, PRE##_HASHSZ) != 0) {                    \
+  if (MEMCMP(d.buf, !=, v[2].buf, PRE##_HASHSZ)) {                     \
     printf("\nfail:\n\tinput = `%s'\n\treps = `%i'\n\texpected = ",    \
             v[0].buf, *(int *)v[1].buf);                               \
     type_hex.dump(&v[2], stdout);                                      \