diff options
author | Clyne Sullivan <tullivan99@gmail.com> | 2018-02-07 09:26:36 -0500 |
---|---|---|
committer | Clyne Sullivan <tullivan99@gmail.com> | 2018-02-07 09:26:36 -0500 |
commit | 2b8cf5e771cac4c2b087dc96a7ca05a459f630b5 (patch) | |
tree | d1e25ef8520e9df936c231af0d5b760177d6cbde /ops.c | |
parent | e3cbc8086c25d4fc1d9413815643b3ecaaee2062 (diff) |
conditionals, returns, cleaner code
Diffstat (limited to 'ops.c')
-rw-r--r-- | ops.c | 167 |
1 files changed, 167 insertions, 0 deletions
@@ -0,0 +1,167 @@ +#include "ops.h" + +void iop_add(variable *, variable *, variable *); +void iop_sub(variable *, variable *, variable *); +void iop_mult(variable *, variable *, variable *); +void iop_div(variable *, variable *, variable *); +void iop_and(variable *, variable *, variable *); +void iop_or(variable *, variable *, variable *); +void iop_xor(variable *, variable *, variable *); +void iop_shr(variable *, variable *, variable *); +void iop_shl(variable *, variable *, variable *); +void iop_eq(variable *, variable *, variable *); +void iop_lt(variable *, variable *, variable *); +void iop_gt(variable *, variable *, variable *); +void iop_lte(variable *, variable *, variable *); +void iop_gte(variable *, variable *, variable *); +void iop_ne(variable *, variable *, variable *); +void iop_mod(variable *, variable *, variable *); + +char *iops[IOPS_COUNT] = { + "+", "-", "*", "/", "&", "|", "^", ">>", "<<", + "==", "<", ">", "<=", ">=", "!=", "%" +}; + +operation_t iopfuncs[IOPS_COUNT] = { + iop_add, iop_sub, iop_mult, iop_div, iop_and, + iop_or, iop_xor, iop_shr, iop_shl, + iop_eq, iop_lt, iop_gt, iop_lte, iop_gte, iop_ne, + iop_mod +}; + + +void iop_add(variable *r, variable *a, variable *b) +{ + if (a->valtype == INTEGER && b->valtype == INTEGER) { + INT(r) = INT(a) + INT(b); + } else { + itofloat(a); + itofloat(b); + FLOAT(r) = FLOAT(a) + FLOAT(b); + } +} + +void iop_sub(variable *r, variable *a, variable *b) +{ + if (a->valtype == INTEGER && b->valtype == INTEGER) { + INT(r) = INT(a) - INT(b); + } else { + itofloat(a); + itofloat(b); + FLOAT(r) = FLOAT(a) - FLOAT(b); + } +} + +void iop_mult(variable *r, variable *a, variable *b) +{ + if (a->valtype == INTEGER && b->valtype == INTEGER) { + INT(r) = INT(a) * INT(b); + } else { + itofloat(a); + itofloat(b); + FLOAT(r) = FLOAT(a) * FLOAT(b); + } +} + +void iop_div(variable *r, variable *a, variable *b) +{ + if (a->valtype == INTEGER && b->valtype == INTEGER) { + INT(r) = INT(a) / INT(b); + } else { + itofloat(a); + itofloat(b); + FLOAT(r) = FLOAT(a) / FLOAT(b); + } +} + +void iop_and(variable *r, variable *a, variable *b) +{ + if (a->valtype == INTEGER && b->valtype == INTEGER) { + INT(r) = INT(a) & INT(b); + } +} + +void iop_or(variable *r, variable *a, variable *b) +{ + if (a->valtype == INTEGER && b->valtype == INTEGER) { + INT(r) = INT(a) | INT(b); + } +} + +void iop_xor(variable *r, variable *a, variable *b) +{ + if (a->valtype == INTEGER && b->valtype == INTEGER) { + INT(r) = INT(a) ^ INT(b); + } +} + +void iop_shr(variable *r, variable *a, variable *b) +{ + if (a->valtype == INTEGER && b->valtype == INTEGER) { + INT(r) = INT(a) >> INT(b); + } +} + +void iop_shl(variable *r, variable *a, variable *b) +{ + if (a->valtype == INTEGER && b->valtype == INTEGER) { + INT(r) = INT(a) << INT(b); + } +} + +void iop_eq(variable *r, variable *a, variable *b) +{ + if (a->valtype == INTEGER && b->valtype == INTEGER) + INT(r) = INT(a) == INT(b); + else + INT(r) = FLOAT(a) == FLOAT(b); +} + +void iop_lt(variable *r, variable *a, variable *b) +{ + if (a->valtype == INTEGER && b->valtype == INTEGER) + INT(r) = INT(a) < INT(b); + else + INT(r) = FLOAT(a) < FLOAT(b); +} + +void iop_gt(variable *r, variable *a, variable *b) +{ + if (a->valtype == INTEGER && b->valtype == INTEGER) + INT(r) = INT(a) > INT(b); + else + INT(r) = FLOAT(a) > FLOAT(b); +} + +void iop_lte(variable *r, variable *a, variable *b) +{ + if (a->valtype == INTEGER && b->valtype == INTEGER) + INT(r) = INT(a) <= INT(b); + else + INT(r) = FLOAT(a) <= FLOAT(b); +} + +void iop_gte(variable *r, variable *a, variable *b) +{ + if (a->valtype == INTEGER && b->valtype == INTEGER) + INT(r) = INT(a) >= INT(b); + else + INT(r) = FLOAT(a) >= FLOAT(b); +} + +void iop_ne(variable *r, variable *a, variable *b) +{ + if (a->valtype == INTEGER && b->valtype == INTEGER) + INT(r) = INT(a) != INT(b); + else + INT(r) = FLOAT(a) != FLOAT(b); +} + +void iop_mod(variable *r, variable *a, variable *b) +{ + if (a->valtype == INTEGER && b->valtype == INTEGER) + INT(r) = INT(a) % INT(b); + else + INT(r) = 0; +} + |