star-aerosol

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

commit 9ecc827d12d0f917ffbc603b82ca9ac77b29c2a8
parent e8ef6843fcc847a1baf80f3a2324b701e7dbf50a
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Mon,  5 Sep 2022 14:30:15 +0200

Add and test the sars_band_compute_hash function

Diffstat:
Msrc/sars.c | 48+++++++++++++++++++++++++++++++++++++++++++-----
Msrc/sars.h | 6++++++
Msrc/test_sars_load.c | 14++++++++++++++
3 files changed, 63 insertions(+), 5 deletions(-)

diff --git a/src/sars.c b/src/sars.c @@ -437,6 +437,45 @@ error: } res_T +sars_band_compute_hash + (const struct sars* sars, + const size_t iband, + hash256_T hash) +{ + struct darray_char bytes; + struct sars_band band; + res_T res = RES_OK; + + if(!sars || !hash) return RES_BAD_ARG; + + darray_char_init(sars->allocator, &bytes); + + res = sars_get_band(sars, 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.id, 1); + WRITE(band.k_list, sars->nnodes); + #undef WRITE + + hash_sha256(darray_char_cdata_get(&bytes), darray_char_size_get(&bytes), hash); + +exit: + darray_char_release(&bytes); + return res; +error: + goto exit; +} + +res_T sars_compute_hash(const struct sars* sars, hash256_T hash) { struct darray_char bytes; @@ -459,11 +498,10 @@ sars_compute_hash(const struct sars* sars, hash256_T hash) WRITE(&sars->pagesize, 1); WRITE(&sars->nnodes, 1); FOR_EACH(i, 0, darray_band_size_get(&sars->bands)) { - const struct band* band = darray_band_cdata_get(&sars->bands) + i; - hash_sha256(band->k_list, sars->nnodes*sizeof(float), hash); - WRITE(&band->low, 1); - WRITE(&band->upp, 1); - WRITE(hash, sizeof(hash256_T)); + hash256_T hash_band; + res = sars_band_compute_hash(sars, i, hash_band); + if(res != RES_OK) goto error; + WRITE(hash_band, sizeof(hash256_T)); } #undef WRITE diff --git a/src/sars.h b/src/sars.h @@ -114,6 +114,12 @@ sars_find_bands size_t ibands[2]); /* Range of overlaped bands. Limits are inclusive */ SARS_API res_T +sars_band_compute_hash + (const struct sars* sars, + const size_t iband, + hash256_T hash); + +SARS_API res_T sars_compute_hash (const struct sars* sars, hash256_T hash); diff --git a/src/test_sars_load.c b/src/test_sars_load.c @@ -112,6 +112,8 @@ test_load(struct sars* sars) { hash256_T hash0; hash256_T hash1; + hash256_T band_hash0; + hash256_T band_hash1; FILE* fp = NULL; const char* filename = "test_file.sars"; const uint64_t pagesize = 16384; @@ -134,6 +136,15 @@ test_load(struct sars* sars) CHK(sars_compute_hash(sars, NULL) == RES_BAD_ARG); CHK(sars_compute_hash(sars, hash0) == RES_OK); + CHK(sars_band_compute_hash(NULL, 0, band_hash0) == RES_BAD_ARG); + CHK(sars_band_compute_hash(sars, nbands, band_hash0) == RES_BAD_ARG); + CHK(sars_band_compute_hash(sars, 0, NULL) == RES_BAD_ARG); + CHK(sars_band_compute_hash(sars, 0, band_hash0) == RES_OK); + CHK(!hash256_eq(hash0, band_hash0)); + + CHK(sars_band_compute_hash(sars, 0, band_hash1) == RES_OK); + CHK(hash256_eq(band_hash0, band_hash1)); + CHK(sars_load(NULL, filename) == RES_BAD_ARG); CHK(sars_load(sars, NULL) == RES_BAD_ARG); CHK(sars_load(sars, "nop") == RES_IO_ERR); @@ -151,6 +162,9 @@ test_load(struct sars* sars) CHK(sars_compute_hash(sars, hash1) == RES_OK); CHK(!hash256_eq(hash0, hash1)); + CHK(sars_band_compute_hash(sars, 0, band_hash1) == RES_OK); + CHK(hash256_eq(band_hash0, band_hash1)); + CHK(fclose(fp) == 0); }