star-sp

Random number generators and distributions
git clone git://git.meso-star.fr/star-sp.git
Log | Files | Refs | README | LICENSE

commit d395b62cd28a9fc87b297bdb8ef321d971b43afc
parent bd6e91a68c82ee06d7f88d306c95db3ae3e5dfca
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Fri,  4 Dec 2020 11:17:30 +0100

Upd the read/write functions of the KISS rng

Data are now serialize/deserialize in binary rather than in ASCII.

Diffstat:
Msrc/ssp_rng.c | 53+++++++++++++++++++++++++++++++++++++----------------
1 file changed, 37 insertions(+), 16 deletions(-)

diff --git a/src/ssp_rng.c b/src/ssp_rng.c @@ -105,31 +105,49 @@ rng_kiss_get(void* data) static res_T rng_kiss_read(void* data, FILE* file) { + uint32_t val[4]; struct rng_kiss* rng = (struct rng_kiss*)data; - int n; + size_t n; ASSERT(data && file); - n = fscanf(file, "%u %u %u %u\n", &rng->x, &rng->y, &rng->z, &rng->c); - return (n == EOF || n < 4) ? RES_IO_ERR : RES_OK; + n = fread(val, sizeof(*val), sizeof(val)/sizeof(*val), file); + if(n != 4) return RES_IO_ERR; + rng->x = val[0]; + rng->y = val[1]; + rng->z = val[2]; + rng->c = val[3]; + return RES_OK; } static res_T rng_kiss_read_cstr(void* data, const char* cstr) { struct rng_kiss* rng = (struct rng_kiss*)data; - int n; + uint32_t val[4]; + size_t sz; ASSERT(data && cstr); - n = sscanf(cstr, "%u %u %u %u\n", &rng->x, &rng->y, &rng->z, &rng->c); - return (n == EOF || n < 4) ? RES_IO_ERR : RES_OK; + sz = strlen(cstr); + if(sz < sizeof(val)) return RES_IO_ERR; + memcpy(val, cstr, sizeof(val)); + rng->x = val[0]; + rng->y = val[1]; + rng->z = val[2]; + rng->c = val[3]; + return RES_OK; } static res_T rng_kiss_write(const void* data, FILE* file) { const struct rng_kiss* rng = (const struct rng_kiss*)data; - int res; + uint32_t val[4]; + size_t n; ASSERT(data && file); - res = fprintf(file, "%u %u %u %u\n", rng->x, rng->y, rng->z, rng->c); - return res < 0 ? RES_IO_ERR : RES_OK; + val[0] = rng->x; + val[1] = rng->y; + val[2] = rng->z; + val[3] = rng->c; + n = fwrite(val, sizeof(*val), sizeof(val)/sizeof(*val), file); + return (n != 4 ? RES_IO_ERR : RES_OK); } static res_T @@ -140,15 +158,18 @@ rng_kiss_write_cstr size_t* out_len) { const struct rng_kiss* rng = (const struct rng_kiss*)data; - int len = 0; + uint32_t val[4]; ASSERT(data); - len = snprintf(buf, bufsz, "%u %u %u %u\n", rng->x, rng->y, rng->z, rng->c); - CHK(len > 0); - if((size_t)len >= (bufsz - 1/*null char*/)) { - buf[bufsz-1] = '\0'; + val[0] = rng->x; + val[1] = rng->y; + val[2] = rng->z; + val[3] = rng->c; + if(bufsz >= sizeof(val) + 1/*null char*/) { + memcpy(buf, val, sizeof(val)); + buf[sizeof(val)] = '\0'; } - if(out_len) *out_len = (size_t)len; + if(out_len) *out_len = sizeof(val); return RES_OK; } @@ -742,7 +763,7 @@ ssp_rng_write(const struct ssp_rng* rng, FILE* stream) res_T ssp_rng_write_cstr (const struct ssp_rng* rng, - char* buf, + char* buf, const size_t bufsz, size_t* len) {