X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/mLib/blobdiff_plain/c5e0e40378b7e209521d2e9a52f055575a948313..3efcfd2df21aa11bd9d1ba5ea2f5f490fd4d5b84:/test/t/tvec-test.c diff --git a/test/t/tvec-test.c b/test/t/tvec-test.c index b4ef9a4..78f730f 100644 --- a/test/t/tvec-test.c +++ b/test/t/tvec-test.c @@ -70,7 +70,7 @@ static const struct tvec_floatinfo fenum_fltinfo = #define DEFENUM(tag, ty, slot) \ static const struct tvec_##slot##enuminfo slot##enum_info = \ - { { slot##enum_NAME, TVMISC_##tag }, slot##enum_assocs slot##enum_ARGS }; + { slot##enum_NAME, slot##enum_assocs slot##enum_ARGS }; #define ienum_NAME "order" #define ienum_ARGS , &tvrange_i16 #define uenum_NAME "fruit" @@ -122,10 +122,10 @@ static const struct tvec_urange range_32 = { 0, 31 }; _(float, RFP, float, p, 0) \ _(fltish, RFISH, float, p, &fltish_info) \ _(char, RCH, char, p, 0) \ - _(ienum, RIE, enum, p, &ienum_info) \ - _(uenum, RUE, enum, p, &uenum_info) \ - _(fenum, RFE, enum, p, &fenum_info) \ - _(penum, RPE, enum, p, &penum_info) \ + _(ienum, RIE, ienum, p, &ienum_info) \ + _(uenum, RUE, uenum, p, &uenum_info) \ + _(fenum, RFE, fenum, p, &fenum_info) \ + _(penum, RPE, penum, p, &penum_info) \ _(flags, RF, flags, p, &attr_info) \ _(string, RSTR, string, p, &range_32) \ _(bytes, RBY, bytes, p, &tvrange_byte) \ @@ -199,30 +199,25 @@ static void test_serialization if (BLEFT(&b._b)) { out[RRC].v.i = -3; goto end; } - if (in[RSAB].f&TVRF_LIVE) { - for (rd = tv->test->regs; rd->name; rd++) - if (STRCMP(in[RSAB].v.str.p, ==, rd->name)) { - rv = &out[rd->i].v; - if (rd->ty == &tvty_int || - (rd->ty == &tvty_enum && - ((const struct tvec_enuminfo *)rd->arg.p)->mv == TVMISC_INT)) - rv->i ^= 1; - else if (rd->ty == &tvty_uint || rd->ty == &tvty_flags || - (rd->ty == &tvty_enum && - ((const struct tvec_enuminfo *)rd->arg.p)->mv == - TVMISC_INT)) - rv->u ^= 1; - else if (rd->ty == &tvty_enum && - ((const struct tvec_enuminfo *)rd->arg.p)->mv == TVMISC_PTR) - rv->p = rv->p - ? 0 - : (/*unconst*/ void *) - ((const struct tvec_penuminfo *)rd->arg.p)->av[0].p; - else if (rd->ty == &tvty_string) - { if (rv->str.sz) rv->str.p[0] ^= 1; } - else if (rd->ty == &tvty_bytes) - { if (rv->bytes.sz) rv->bytes.p[0] ^= 1; } - } + if ((in[RSAB].f&TVRF_LIVE) && in[RSAB].v.i >= 0) { + rd = &tv->test->regs[in[RSAB].v.i]; rv = &out[in[RSAB].v.i].v; + if (rd->ty == &tvty_int || rd->ty == &tvty_ienum) + rv->i ^= 1; + else if (rd->ty == &tvty_uint || + rd->ty == &tvty_flags || rd->ty == &tvty_uenum) + rv->u ^= 1; + else if (rd->ty == &tvty_float || rd->ty == &tvty_fenum) { + if (rv->f == rv->f) rv->f = -rv->f; + else rv->f = 1.0; + } else if (rd->ty == &tvty_penum) + rv->p = rv->p + ? 0 + : (/*unconst*/ void *) + ((const struct tvec_penuminfo *)rd->arg.p)->av[0].p; + else if (rd->ty == &tvty_string) + { if (rv->str.sz) rv->str.p[0] ^= 1; } + else if (rd->ty == &tvty_bytes) + { if (rv->bytes.sz) rv->bytes.p[0] ^= 1; } } out[RRC].v.i = 0; @@ -230,6 +225,15 @@ end: dbuf_destroy(&b); } +static const struct tvec_iassoc type_assocs[] = { + { "none", -1 }, +#define DEFASSOC(name, i, ty, argslot, argval) { #name, i }, + TYPEREGS(DEFASSOC) +#undef DEFASSOC + { 0, 0 } +}; +static const struct tvec_ienuminfo type_enum = { "regty", type_assocs, 0 }; + static DSGINIT(const) struct tvec_regdef test_regs[] = { #define DEFREG(name, i, ty, argslot, argval) \ { #name, i, &tvty_##ty, TVRF_OPT, \ @@ -238,7 +242,7 @@ static DSGINIT(const) struct tvec_regdef test_regs[] = { #undef DEFREG { "rc", RRC, &tvty_int, TVRF_OPT, { &tvrange_int } }, { "serialized", RSER, &tvty_bytes, TVRF_OPT }, - { "sabotage", RSAB, &tvty_string, TVRF_OPT, { &tvrange_byte } }, + { "sabotage", RSAB, &tvty_ienum, TVRF_OPT, { &type_enum } }, { 0 } }; @@ -298,10 +302,10 @@ static int single_set(struct tvec_state *tv, const char *name, struct singlectx *s = ctx; union tvec_regval rv; static const struct tvec_regdef rd = - { "@show", -1, &tvty_enum, 0, { &tvenum_bool } }; + { "@show", -1, &tvty_ienum, 0, { &tvenum_bool } }; if (STRCMP(name, ==, "@show")) { - if (tvty_enum.parse(&rv, &rd, tv)) return (-1); + if (tvty_ienum.parse(&rv, &rd, tv)) return (-1); if (s) { if (rv.i) s->f |= SF_SHOW; else s->f &= ~SF_SHOW;