static void bmw64_close(sph_bmw_big_context *sc, unsigned ub, unsigned n, void *dst, size_t out_size_w64) { unsigned char *buf, *out; size_t ptr, u, v; unsigned z; sph_u64 h1[16], h2[16], *h; buf = sc->buf; ptr = sc->ptr; z = 0x80 >> n; buf[ptr ++] = ((ub & -z) | z) & 0xFF; h = sc->H; if (ptr > (sizeof sc->buf) - 8) { memset(buf + ptr, 0, (sizeof sc->buf) - ptr); compress_big(buf, h, h1); ptr = 0; h = h1; } memset(buf + ptr, 0, (sizeof sc->buf) - 8 - ptr); sph_enc64le_aligned(buf + (sizeof sc->buf) - 8, SPH_T64(sc->bit_count + n)); compress_big(buf, h, h2); for (u = 0; u < 16; u ++) sph_enc64le_aligned(buf + 8 * u, h2[u]); compress_big(buf, final_b, h1); out = dst; for (u = 0, v = 16 - out_size_w64; u < out_size_w64; u ++, v ++) sph_enc64le(out + 8 * u, h1[v]); }
static void test_types64(void) { unsigned i; union { unsigned char bytes[64]; sph_u64 v64; } u; #if SPH_LITTLE_ENDIAN || SPH_BIG_ENDIAN ASSERT(sizeof(sph_u64) == 8); #else ASSERT(sizeof(sph_u64) >= 8); #endif for (i = 0; i < sizeof u.bytes; i ++) u.bytes[i] = i; for (i = 0; (i + 7) < sizeof u.bytes; i ++) { sph_u64 v, w; v = ((sph_u64)i << 56) | ((sph_u64)(i + 1) << 48) | ((sph_u64)(i + 2) << 40) | ((sph_u64)(i + 3) << 32) | ((sph_u64)(i + 4) << 24) | ((sph_u64)(i + 5) << 16) | ((sph_u64)(i + 6) << 8) | (sph_u64)(i + 7); w = ((sph_u64)(i + 7) << 56) | ((sph_u64)(i + 6) << 48) | ((sph_u64)(i + 5) << 40) | ((sph_u64)(i + 4) << 32) | ((sph_u64)(i + 3) << 24) | ((sph_u64)(i + 2) << 16) | ((sph_u64)(i + 1) << 8) | (sph_u64)i; ASSERT(sph_dec64be(u.bytes + i) == v); ASSERT(sph_dec64le(u.bytes + i) == w); if (i % 8 == 0) { ASSERT(sph_dec64be_aligned(u.bytes + i) == v); ASSERT(sph_dec64le_aligned(u.bytes + i) == w); } } memset(u.bytes, 0, sizeof u.bytes); for (i = 0; (i + 7) < sizeof u.bytes; i ++) { sph_u64 v, w; v = ((sph_u64)i << 56) | ((sph_u64)(i + 1) << 48) | ((sph_u64)(i + 2) << 40) | ((sph_u64)(i + 3) << 32) | ((sph_u64)(i + 4) << 24) | ((sph_u64)(i + 5) << 16) | ((sph_u64)(i + 6) << 8) | (sph_u64)(i + 7); w = ((sph_u64)(i + 7) << 56) | ((sph_u64)(i + 6) << 48) | ((sph_u64)(i + 5) << 40) | ((sph_u64)(i + 4) << 32) | ((sph_u64)(i + 3) << 24) | ((sph_u64)(i + 2) << 16) | ((sph_u64)(i + 1) << 8) | (sph_u64)i; if (i % 8 == 0) { sph_enc64be_aligned(u.bytes + i, v); } else { sph_enc64be(u.bytes + i, v); } ASSERT(u.bytes[i + 0] == i + 0); ASSERT(u.bytes[i + 1] == i + 1); ASSERT(u.bytes[i + 2] == i + 2); ASSERT(u.bytes[i + 3] == i + 3); ASSERT(u.bytes[i + 4] == i + 4); ASSERT(u.bytes[i + 5] == i + 5); ASSERT(u.bytes[i + 6] == i + 6); ASSERT(u.bytes[i + 7] == i + 7); memset(u.bytes, 0, sizeof u.bytes); if (i % 8 == 0) { sph_enc64le_aligned(u.bytes + i, w); } else { sph_enc64le(u.bytes + i, w); } ASSERT(u.bytes[i + 0] == i + 0); ASSERT(u.bytes[i + 1] == i + 1); ASSERT(u.bytes[i + 2] == i + 2); ASSERT(u.bytes[i + 3] == i + 3); ASSERT(u.bytes[i + 4] == i + 4); ASSERT(u.bytes[i + 5] == i + 5); ASSERT(u.bytes[i + 6] == i + 6); ASSERT(u.bytes[i + 7] == i + 7); } }