@@@ crypto-test strings
authorMark Wooding <mdw@distorted.org.uk>
Thu, 26 Sep 2019 03:45:38 +0000 (04:45 +0100)
committerMark Wooding <mdw@distorted.org.uk>
Thu, 26 Sep 2019 03:45:38 +0000 (04:45 +0100)
crypto-test.c
crypto-test.h

index 7c00f45..e25fd91 100644 (file)
@@ -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.
index 94bb009..807ae07 100644 (file)
@@ -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,