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:
| M | src/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)
{