#include <stdio.h> typedef unsigned int uint32_t; typedef int int32_t; const char *boolstring(int val) { return val ? "true" : "false"; } int i32_eq(int32_t a, int32_t b) { return (a == b); } int i32_neq(int32_t a, int32_t b) { return (a != b); } int32_t i32_eq_select(int32_t a, int32_t b, int32_t c, int32_t d) { return ((a == b) ? c : d); } int32_t i32_neq_select(int32_t a, int32_t b, int32_t c, int32_t d) { return ((a != b) ? c : d); } struct pred_s { const char *name; int (*predfunc)(int32_t, int32_t); int (*selfunc)(int32_t, int32_t, int32_t, int32_t); }; struct pred_s preds[] = { { "eq", i32_eq, i32_eq_select }, { "neq", i32_neq, i32_neq_select } }; int main(void) { int i; int32_t a = 1234567890; int32_t b = 345678901; int32_t c = 1234500000; int32_t d = 10001; int32_t e = 10000; printf("a = %12d (0x%08x)\n", a, a); printf("b = %12d (0x%08x)\n", b, b); printf("c = %12d (0x%08x)\n", c, c); printf("d = %12d (0x%08x)\n", d, d); printf("e = %12d (0x%08x)\n", e, e); printf("----------------------------------------\n"); for (i = 0; i < sizeof(preds)/sizeof(preds[0]); ++i) { printf("a %s a = %s\n", preds[i].name, boolstring((*preds[i].predfunc)(a, a))); printf("a %s a = %s\n", preds[i].name, boolstring((*preds[i].predfunc)(a, a))); printf("a %s b = %s\n", preds[i].name, boolstring((*preds[i].predfunc)(a, b))); printf("a %s c = %s\n", preds[i].name, boolstring((*preds[i].predfunc)(a, c))); printf("d %s e = %s\n", preds[i].name, boolstring((*preds[i].predfunc)(d, e))); printf("e %s e = %s\n", preds[i].name, boolstring((*preds[i].predfunc)(e, e))); printf("a %s a ? c : d = %d\n", preds[i].name, (*preds[i].selfunc)(a, a, c, d)); printf("a %s a ? c : d == c (%s)\n", preds[i].name, boolstring((*preds[i].selfunc)(a, a, c, d) == c)); printf("a %s b ? c : d = %d\n", preds[i].name, (*preds[i].selfunc)(a, b, c, d)); printf("a %s b ? c : d == d (%s)\n", preds[i].name, boolstring((*preds[i].selfunc)(a, b, c, d) == d)); printf("----------------------------------------\n"); } return 0; }