star-aerosol

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

commit e8ef6843fcc847a1baf80f3a2324b701e7dbf50a
parent 3da21deaf0f1cbda2f8e360e34a72d93c9b81239
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Wed, 31 Aug 2022 17:48:17 +0200

Add and test the sars_compute_hash function

Diffstat:
Msrc/sars.c | 42++++++++++++++++++++++++++++++++++++++++++
Msrc/sars.h | 6++++++
Msrc/test_sars_load.c | 21+++++++++++++++++++++
3 files changed, 69 insertions(+), 0 deletions(-)

diff --git a/src/sars.c b/src/sars.c @@ -22,6 +22,8 @@ #include "sars_log.h" #include <rsys/algorithm.h> +#include <rsys/dynamic_array_char.h> +#include <rsys/hash.h> #include <unistd.h> /* sysconf support */ @@ -434,6 +436,46 @@ error: goto exit; } +res_T +sars_compute_hash(const struct sars* sars, hash256_T hash) +{ + struct darray_char bytes; + size_t i; + res_T res = RES_OK; + + if(!sars || !hash) return RES_BAD_ARG; + + darray_char_init(sars->allocator, &bytes); + + /* Write data to hash */ + #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(&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)); + } + #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; +} + /******************************************************************************* * Local functions ******************************************************************************/ diff --git a/src/sars.h b/src/sars.h @@ -16,6 +16,7 @@ #ifndef SARS_H #define SARS_H +#include <rsys/hash.h> #include <rsys/rsys.h> /* Library symbol management */ @@ -112,6 +113,11 @@ sars_find_bands const double range[2], /* In nm. Limits are inclusive */ size_t ibands[2]); /* Range of overlaped bands. Limits are inclusive */ +SARS_API res_T +sars_compute_hash + (const struct sars* sars, + hash256_T hash); + static INLINE float sars_band_get_ka(const struct sars_band* band, const size_t inode) { diff --git a/src/test_sars_load.c b/src/test_sars_load.c @@ -16,6 +16,7 @@ #define _POSIX_C_SOURCE 200112L /* nextarfter */ #include "sars.h" +#include <rsys/hash.h> #include <rsys/mem_allocator.h> #include <math.h> @@ -109,6 +110,8 @@ write_sars static void test_load(struct sars* sars) { + hash256_T hash0; + hash256_T hash1; FILE* fp = NULL; const char* filename = "test_file.sars"; const uint64_t pagesize = 16384; @@ -127,12 +130,27 @@ test_load(struct sars* sars) rewind(fp); CHK(sars_load_stream(sars, fp, filename) == RES_OK); + CHK(sars_compute_hash(NULL, hash0) == RES_BAD_ARG); + CHK(sars_compute_hash(sars, NULL) == RES_BAD_ARG); + CHK(sars_compute_hash(sars, hash0) == RES_OK); + CHK(sars_load(NULL, filename) == RES_BAD_ARG); CHK(sars_load(sars, NULL) == RES_BAD_ARG); CHK(sars_load(sars, "nop") == RES_IO_ERR); CHK(sars_load(sars, filename) == RES_OK); check_sars_load(sars, nbands, nnodes); + CHK(sars_compute_hash(sars, hash1) == RES_OK); + CHK(hash256_eq(hash0, hash1)); + + rewind(fp); + write_sars(fp, pagesize, nbands+1, nnodes); + rewind(fp); + + CHK(sars_load_stream(sars, fp, filename) == RES_OK); + CHK(sars_compute_hash(sars, hash1) == RES_OK); + CHK(!hash256_eq(hash0, hash1)); + CHK(fclose(fp) == 0); } @@ -218,6 +236,7 @@ test_load_files(struct sars* sars, int argc, char** argv) int i; CHK(sars); FOR_EACH(i, 1, argc) { + hash256_T hash; size_t nnodes; size_t nbands; size_t iband; @@ -250,6 +269,8 @@ test_load_files(struct sars* sars, int argc, char** argv) CHK(ks == ks); /* !NaN */ } } + + CHK(sars_compute_hash(sars, hash) == RES_OK); } }