From b71dd676b5ebe3feec1eb2194e20453a3d01705d Mon Sep 17 00:00:00 2001 From: Sam Anthony Date: Sat, 1 Nov 2025 20:32:55 -0400 Subject: lookup output value in table --- fw/types.c | 108 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 fw/types.c (limited to 'fw/types.c') diff --git a/fw/types.c b/fw/types.c new file mode 100644 index 0000000..24a7c3a --- /dev/null +++ b/fw/types.c @@ -0,0 +1,108 @@ +#include + +#include "types.h" + +#define cmp(a, b) (((a) > (b)) ? 1 : (((a) < (b)) ? -1 : 0)) + +Status +u32ToNum(U32 x, NumType t, Number *n) { + n->type = t; + + switch (t) { + case NUM_U8: + n->u8 = x & 0xFF; + return OK; + case NUM_U16: + n->u16 = x & 0xFFFF; + return OK; + case NUM_U32: + n->u32 = x; + return OK; + case NUM_I8: + n->u8 = x & 0xFF; + n->i8 = *(I8 *)&n->u8; + return OK; + case NUM_I16: + n->u16 = x & 0xFFFF; + n->i16 = *(I16 *)&n->u16; + return OK; + case NUM_I32: + n->i32 = *(I32 *)&x; + return OK; + default: + return FAIL; + } +} + +static Status +cmpU32Num(U32 a, Number b, int *ord) { + switch (b.type) { + case NUM_U8: + *ord = cmp(a, b.u8); + return OK; + case NUM_U16: + *ord = cmp(a, b.u16); + return OK; + case NUM_U32: + *ord = cmp(a, b.u32); + return OK; + case NUM_I8: + *ord = cmp(a, b.i8); + return OK; + case NUM_I16: + *ord = cmp(a, b.i16); + return OK; + case NUM_I32: + *ord = cmp(a, b.i32); + return OK; + default: + return FAIL; + } +} + +Status +cmpNum(Number a, Number b, int *ord) { + switch (a.type) { + case NUM_U8: + a.i32 = a.u8; + break; + case NUM_U16: + a.i32 = a.u16; + break; + case NUM_U32: + return cmpU32Num(a.u32, b, ord); + case NUM_I8: + a.i32 = a.i8; + break; + case NUM_I16: + a.i32 = a.i16; + break; + case NUM_I32: + break; // do nothing + default: + return FAIL; + } + + switch (b.type) { + case NUM_U8: + *ord = cmp(a.i32, b.u8); + return OK; + case NUM_U16: + *ord = cmp(a.i32, b.u16); + return OK; + case NUM_U32: + *ord = cmp(a.i32, b.u32); + return OK; + case NUM_I8: + *ord = cmp(a.i32, b.i8); + return OK; + case NUM_I16: + *ord = cmp(a.i32, b.i16); + return OK; + case NUM_I32: + *ord = cmp(a.i32, b.i32); + return OK; + default: + return FAIL; + } +} -- cgit v1.2.3