#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"
_(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) \
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;
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, \
#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 }
};
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;