From 3f8f973351d3273e6ef43e1029c0469508aa763c Mon Sep 17 00:00:00 2001 From: Mark Wooding Date: Thu, 26 Sep 2019 04:45:38 +0100 Subject: [PATCH] @@@ crypto-test strings --- crypto-test.c | 37 +++++++++++++++++++++++++++++++++++++ crypto-test.h | 7 +++++-- 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/crypto-test.c b/crypto-test.c index 7c00f45..e25fd91 100644 --- a/crypto-test.c +++ b/crypto-test.c @@ -254,6 +254,43 @@ const struct regty regty_bytes = { release_bytes }; +/* Text strings. Not really intended as an output type. */ + +void allocate_string(union regval *v, size_t sz) + { v->str.p = xmalloc(sz + 1); v->str.sz = sz; } + +static void init_string(union regval *v) { v->str.p = 0; v->str.sz = 0; } + +static void parse_string(union regval *v, char *p) +{ + size_t n = strlen(p); + + allocate_string(v, n); + memcpy(v->str.p, p, n + 1); +} + +static void dump_string(FILE *fp, const union regval *v) +{ + if (v->str.p) fprintf(fp, "`%s'\n", v->str.p); + else fputs("nil\n", fp); +} + +static int eq_string(const union regval *v0, const union regval *v1) +{ + size_t n0 = v0->str.sz, n1 = v1->str.sz, n = n0 < n1 ? n0 : n1; + return !strncmp(v0->str.p, v1->str.p, n); +} + +static void release_string(union regval *v) { free(v->str.p); } + +const struct regty regty_string = { + init_string, + parse_string, + dump_string, + eq_string, + release_string +}; + /*----- Core test machinery -----------------------------------------------*/ /* Say that a register is `reset' by releasing and then re-initializing it. diff --git a/crypto-test.h b/crypto-test.h index 94bb009..807ae07 100644 --- a/crypto-test.h +++ b/crypto-test.h @@ -66,7 +66,8 @@ union regval { long i; /* signed integer */ unsigned long u; /* unsigned integer */ - struct { void *p; size_t sz; } bytes; /* buffer of bytes */ + struct { unsigned char *p; size_t sz; } bytes; /* buffer of bytes */ + struct { char *p; size_t sz; } str; /* text string */ #ifdef REG_MEMBERS REG_MEMBERS /* your members here */ #endif @@ -120,12 +121,14 @@ extern void dump_hex(FILE *fp, const uint8_t *b, size_t sz); extern void trivial_regty_init(union regval *v); extern void trivial_regty_release(union regval *v); extern void allocate_bytes(union regval *v, size_t sz); +extern void allocate_string(union regval *v, size_t sz); /* Built-in register types. */ extern const struct regty regty_int, regty_uint, - regty_bytes; + regty_bytes, + regty_string; /* Running tests. */ extern void check_test_output(struct test_state *state, -- 2.11.0