star-mesh

Define and load a binary data format for meshes
git clone git://git.meso-star.fr/star-mesh.git
Log | Files | Refs | README | LICENSE

commit 73db980f320f469e6c785d38a83777a2e92448ee
parent c04af09692f2647ea97f4b332b0fd9bab545ce86
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Wed,  7 Sep 2022 08:54:28 +0200

Add and test the smsh_desc_compute_hash function

Diffstat:
Msrc/smsh.c | 24++++++++++++++++++++++++
Msrc/smsh.h | 6++++++
Msrc/test_smsh_load.c | 12++++++++++++
3 files changed, 42 insertions(+), 0 deletions(-)

diff --git a/src/smsh.c b/src/smsh.c @@ -289,3 +289,27 @@ smsh_get_desc(const struct smsh* smsh, struct smsh_desc* desc) desc->dcell = smsh->dcell; return RES_OK; } + +res_T +smsh_desc_compute_hash(const struct smsh_desc* desc, hash256_T hash) +{ + struct sha256_ctx ctx; + + if(!desc || !hash) return RES_BAD_ARG; + + #define HASH(Var, Nb) \ + sha256_ctx_update(&ctx, (const char*)(Var), sizeof(*Var)*(Nb)); + + sha256_ctx_init(&ctx); + HASH(desc->nodes, desc->nnodes); + HASH(desc->cells, desc->ncells); + HASH(&desc->nnodes, 1); + HASH(&desc->ncells, 1); + HASH(&desc->dnode, 1); + HASH(&desc->dcell, 1); + sha256_ctx_finalize(&ctx, hash); + + #undef HASH + + return RES_OK; +} diff --git a/src/smsh.h b/src/smsh.h @@ -16,6 +16,7 @@ #ifndef SMSH_H #define SMSH_H +#include <rsys/hash.h> #include <rsys/rsys.h> /* Library symbol management */ @@ -97,6 +98,11 @@ smsh_get_desc (const struct smsh* smsh, struct smsh_desc* desc); +SMSH_API res_T +smsh_desc_compute_hash + (const struct smsh_desc* desc, + hash256_T hash); + static INLINE const double* smsh_desc_get_node (const struct smsh_desc* desc, diff --git a/src/test_smsh_load.c b/src/test_smsh_load.c @@ -67,6 +67,8 @@ check_smsh_desc static void test_load_mesh(struct smsh* smsh, const uint32_t dnode, const uint32_t dcell) { + hash256_T hash0; + hash256_T hash1; struct smsh_desc desc = SMSH_DESC_NULL; FILE* fp = NULL; const char* filename = "test_file.smsh"; @@ -122,10 +124,18 @@ test_load_mesh(struct smsh* smsh, const uint32_t dnode, const uint32_t dcell) CHK(smsh_get_desc(smsh, &desc) == RES_OK); check_smsh_desc(&desc, nnodes, ncells, dnode, dcell); + CHK(smsh_desc_compute_hash(NULL, hash0) == RES_BAD_ARG); + CHK(smsh_desc_compute_hash(&desc, NULL) == RES_BAD_ARG); + CHK(smsh_desc_compute_hash(&desc, hash0) == RES_OK); + rewind(fp); CHK(smsh_load_stream(smsh, fp, filename) == RES_OK); + CHK(smsh_get_desc(smsh, &desc) == RES_OK); check_smsh_desc(&desc, nnodes, ncells, dnode, dcell); + CHK(smsh_desc_compute_hash(&desc, hash1) == RES_OK); + CHK(hash256_eq(hash0, hash1)); + CHK(smsh_load(NULL, filename) == RES_BAD_ARG); CHK(smsh_load(smsh, NULL) == RES_BAD_ARG); CHK(smsh_load(smsh, "nop") == RES_IO_ERR); @@ -196,6 +206,7 @@ test_load_fail(struct smsh* smsh) static void test_load_files(struct smsh* smsh, int argc, char** argv) { + hash256_T hash; int i; CHK(smsh); FOR_EACH(i, 1, argc) { @@ -207,6 +218,7 @@ test_load_files(struct smsh* smsh, int argc, char** argv) printf("Load %s\n", argv[i]); CHK(smsh_load(smsh, argv[i]) == RES_OK); CHK(smsh_get_desc(smsh, &desc) == RES_OK); + CHK(smsh_desc_compute_hash(&desc, hash) == RES_OK); FOR_EACH(inode, 0, desc.nnodes) { const double* node = smsh_desc_get_node(&desc, inode);