star-ck

Describe the radiative properties of gas mixtures
git clone git://git.meso-star.fr/star-ck.git
Log | Files | Refs | README | LICENSE

commit 1ee180806a12e47560c8ca020ff5845248be6f73
parent 76f9d4e1a578d5723007891404cbe9ba09c68a62
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Tue,  6 Sep 2022 18:26:19 +0200

Update the hash computations

Rely on the sha256_ctx API

Diffstat:
Msrc/sck.c | 129++++++++++++++++++++++++++++++++++++++-----------------------------------------
1 file changed, 62 insertions(+), 67 deletions(-)

diff --git a/src/sck.c b/src/sck.c @@ -23,7 +23,6 @@ #include "sck_log.h" #include <rsys/algorithm.h> -#include <rsys/dynamic_array_char.h> #include <unistd.h> /* sysconf support */ @@ -325,6 +324,40 @@ error: goto exit; } +static INLINE void +hash_quad_pt + (struct sha256_ctx* ctx, + const struct sck_quad_pt* pt, + const size_t nnodes) +{ + ASSERT(ctx && pt); + #define HASH(Var, Nb) sha256_ctx_update(ctx, (const char*)(Var), sizeof(*Var)*(Nb)) + HASH(&pt->weight, 1); + HASH(&pt->id, 1); + HASH(pt->ka_list, nnodes); + #undef HASH +} + +static INLINE void +hash_band(struct sha256_ctx* ctx, const struct sck_band* band) +{ + size_t iquad_pt; + ASSERT(ctx && band); + + #define HASH(Var, Nb) sha256_ctx_update(ctx, (const char*)(Var), sizeof(*Var)*(Nb)) + HASH(&band->lower, 1); + HASH(&band->upper, 1); + HASH(&band->quad_pts_count, 1); + HASH(band->ks_list, band->sck__->nnodes); + #undef HASH + + FOR_EACH(iquad_pt, 0, band->quad_pts_count) { + struct sck_quad_pt quad_pt; + SCK(band_get_quad_pt(band, iquad_pt, &quad_pt)); + hash_quad_pt(ctx, &quad_pt, band->sck__->nnodes); + } +} + static void release_sck(ref_T* ref) { @@ -575,33 +608,23 @@ sck_quad_pt_compute_hash const size_t iquad_pt, hash256_T hash) { - struct darray_char bytes; + struct sha256_ctx ctx; struct sck_quad_pt quad_pt; res_T res = RES_OK; - if(!band || !hash) return RES_BAD_ARG; - - darray_char_init(band->sck__->allocator, &bytes); + if(!band || !hash) { + res = RES_BAD_ARG; + goto error; + } res = sck_band_get_quad_pt(band, iquad_pt, &quad_pt); if(res != RES_OK) goto error; - #define WRITE(Var, Nb) { \ - size_t ibyte; \ - FOR_EACH(ibyte, 0, sizeof(*Var)*(Nb)) { \ - res = darray_char_push_back(&bytes, ((const char*)Var)+ibyte); \ - if(res != RES_OK) goto error; \ - } \ - } (void)0 - WRITE(&quad_pt.weight, 1); - WRITE(&quad_pt.id, 1); - WRITE(quad_pt.ka_list, band->sck__->nnodes); - #undef WRITE - - hash_sha256(darray_char_cdata_get(&bytes), darray_char_size_get(&bytes), hash); + sha256_ctx_init(&ctx); + hash_quad_pt(&ctx, &quad_pt, band->sck__->nnodes); + sha256_ctx_finalize(&ctx, hash); exit: - darray_char_release(&bytes); return res; error: goto exit; @@ -613,42 +636,23 @@ sck_band_compute_hash const size_t iband, hash256_T hash) { - struct darray_char bytes; + struct sha256_ctx ctx; struct sck_band band; - size_t iquad_pt; res_T res = RES_OK; - if(!sck || !hash) return RES_BAD_ARG; - - darray_char_init(sck->allocator, &bytes); + if(!sck || !hash) { + res = RES_BAD_ARG; + goto error; + } res = sck_get_band(sck, iband, &band); if(res != RES_OK) goto error; - #define WRITE(Var, Nb) { \ - size_t ibyte; \ - FOR_EACH(ibyte, 0, sizeof(*Var)*(Nb)) { \ - res = darray_char_push_back(&bytes, ((const char*)Var)+ibyte); \ - if(res != RES_OK) goto error; \ - } \ - } (void)0 - WRITE(&band.lower, 1); - WRITE(&band.upper, 1); - WRITE(&band.quad_pts_count, 1); - WRITE(&band.id, 1); - WRITE(band.ks_list, sck->nnodes); - FOR_EACH(iquad_pt, 0, band.quad_pts_count) { - hash256_T quad_pt_hash; - res = sck_quad_pt_compute_hash(&band, iquad_pt, quad_pt_hash); - if(res != RES_OK) goto error; - WRITE(quad_pt_hash, sizeof(hash256_T)); - } - #undef WRITE - - hash_sha256(darray_char_cdata_get(&bytes), darray_char_size_get(&bytes), hash); + sha256_ctx_init(&ctx); + hash_band(&ctx, &band); + sha256_ctx_finalize(&ctx, hash); exit: - darray_char_release(&bytes); return res; error: goto exit; @@ -657,35 +661,26 @@ error: res_T sck_compute_hash(const struct sck* sck, hash256_T hash) { - struct darray_char bytes; + struct sha256_ctx ctx; size_t iband; res_T res = RES_OK; - if(!sck || !hash) return RES_BAD_ARG; - - darray_char_init(sck->allocator, &bytes); + if(!sck || !hash) { + res = RES_BAD_ARG; + goto error; + } - #define WRITE(Var, Nb) { \ - size_t ibyte; \ - FOR_EACH(ibyte, 0, sizeof(*Var)*(Nb)) { \ - res = darray_char_push_back(&bytes, ((const char*)Var)+ibyte); \ - if(res != RES_OK) goto error; \ - } \ - } (void)0 - WRITE(&sck->pagesize, 1); - WRITE(&sck->nnodes, 1); + sha256_ctx_init(&ctx); + sha256_ctx_update(&ctx, (const char*)&sck->pagesize, sizeof(sck->pagesize)); + sha256_ctx_update(&ctx, (const char*)&sck->nnodes, sizeof(sck->nnodes)); FOR_EACH(iband, 0, darray_band_size_get(&sck->bands)) { - hash256_T band_hash; - res = sck_band_compute_hash(sck, iband, band_hash); - if(res != RES_OK) goto error; - WRITE(band_hash, sizeof(hash256_T)); + struct sck_band band; + SCK(get_band(sck, iband, &band)); + hash_band(&ctx, &band); } - #undef WRITE - - hash_sha256(darray_char_cdata_get(&bytes), darray_char_size_get(&bytes), hash); + sha256_ctx_finalize(&ctx, hash); exit: - darray_char_release(&bytes); return res; error: goto exit;