diff --git a/Makefile b/Makefile index a4a10d0..0527b95 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,8 @@ OBJS=abCalc.o abCalcExpr.o abCalcExpReal.o abCalcExprInt.o abCalcStack.o \ abCalcOpSubtr.o abCalcOpMult.o abCalcOpDiv.o abCalcOpPower.o \ abCalcOpAnd.o abCalcOpOr.o abCalcOpXor.o abCalcOpNot.o \ abCalcOpBin.o abCalcOpOct.o abCalcOpDec.o abCalcOpHex.o abCalcOpStws.o \ - abCalcOpRcws.o + abCalcOpRcws.o abCalcOpSl.o abCalcOpRl.o abCalcOpSr.o abCalcOpRr.o \ + abCalcOpAsr.o NAME=abCalc @@ -21,22 +22,28 @@ abCalcMain.o: abCalc.h abCalcStack.h abCalcExpr.h abCalcOp.h abCalcError.h abCalcOp.o: abCalcOp.h abCalcError.h abCalcExpr.h abCalcStack.h abCalcOpAdd.h \ abCalcOpSubtr.h abCalcOpMult.h abCalcOpDiv.h abCalcOpPower.h \ abCalcOpAnd.h abCalcOpOr.h abCalcOpXor.h abCalcOpNot.h abCalcOpBin.h \ - abCalcOpOct.h abCalcOpDec.h abCalcOpHex.h abCalcOpStws.h abCalcOpRcws.h -abCalcOpAdd.o: abCalcOp.h abCalcError.h abCalcExpr.h abCalcStack.h abCalcOpAdd.h -abCalcOpSubtr.o: abCalcOp.h abCalcError.h abCalcExpr.h abCalcStack.h abCalcOpSubtr.h -abCalcOpMult.o: abCalcOp.h abCalcError.h abCalcExpr.h abCalcStack.h abCalcOpMult.h -abCalcOpDiv.o: abCalcOp.h abCalcError.h abCalcExpr.h abCalcStack.h abCalcOpDiv.h -abCalcOpPower.o: abCalcOp.h abCalcError.h abCalcExpr.h abCalcStack.h abCalcOpPower.h -abCalcOpAnd.o: abCalcOp.h abCalcError.h abCalcExpr.h abCalcStack.h abCalcOpAnd.h -abCalcOpOr.o: abCalcOp.h abCalcError.h abCalcExpr.h abCalcStack.h abCalcOpOr.h -abCalcOpXor.o: abCalcOp.h abCalcError.h abCalcExpr.h abCalcStack.h abCalcOpXor.h -abCalcOpNot.o: abCalcOp.h abCalcError.h abCalcExpr.h abCalcStack.h abCalcOpNot.h + abCalcOpOct.h abCalcOpDec.h abCalcOpHex.h abCalcOpStws.h abCalcOpRcws.h \ + abCalcOpSl.h abCalcOpRl.h abCalcOpSr.h abCalcOpRr.h abCalcOpAsr.h +abCalcOpAdd.o: abCalcOp.h abCalcError.h abCalcExpr.h abCalcExpReal.h abCalcExprInt.h abCalcStack.h abCalcOpAdd.h +abCalcOpSubtr.o: abCalcOp.h abCalcError.h abCalcExpr.h abCalcExpReal.h abCalcExprInt.h abCalcStack.h abCalcOpSubtr.h +abCalcOpMult.o: abCalcOp.h abCalcError.h abCalcExpr.h abCalcExpReal.h abCalcExprInt.h abCalcStack.h abCalcOpMult.h +abCalcOpDiv.o: abCalcOp.h abCalcError.h abCalcExpr.h abCalcExpReal.h abCalcExprInt.h abCalcStack.h abCalcOpDiv.h +abCalcOpPower.o: abCalcOp.h abCalcError.h abCalcExpr.h abCalcExpReal.h abCalcStack.h abCalcOpPower.h +abCalcOpAnd.o: abCalcOp.h abCalcError.h abCalcExpr.h abCalcExprInt.h abCalcStack.h abCalcOpAnd.h +abCalcOpOr.o: abCalcOp.h abCalcError.h abCalcExpr.h abCalcExprInt.h abCalcStack.h abCalcOpOr.h +abCalcOpXor.o: abCalcOp.h abCalcError.h abCalcExpr.h abCalcExprInt.h abCalcStack.h abCalcOpXor.h +abCalcOpNot.o: abCalcOp.h abCalcError.h abCalcExpr.h abCalcExprInt.h abCalcStack.h abCalcOpNot.h abCalcOpBin.o: abCalcOp.h abCalcMode.h abCalcOpBin.h abCalcOpOct.o: abCalcOp.h abCalcMode.h abCalcOpOct.h abCalcOpDec.o: abCalcOp.h abCalcMode.h abCalcOpDec.h abCalcOpHex.o: abCalcOp.h abCalcMode.h abCalcOpHex.h abCalcOpStws.o: abCalcOp.h abCalcMode.h abCalcStack.h abCalcExpr.h abCalcError.h abCalcOpStws.h -abCalcOpRcws.o: abCalcOp.h abCalcMode.h abCalcStack.h abCalcExpr.h abCalcOpRcws.h +abCalcOpRcws.o: abCalcOp.h abCalcMode.h abCalcStack.h abCalcExpr.h abCalcExpReal.h abCalcOpRcws.h +abCalcOpSl.o: abCalcOp.h abCalcError.h abCalcStack.h abCalcExpr.h abCalcExprInt.h abCalcOpSl.h +abCalcOpRl.o: abCalcOp.h abCalcMode.h abCalcError.h abCalcStack.h abCalcExpr.h abCalcExprInt.h abCalcOpRl.h +abCalcOpSr.o: abCalcOp.h abCalcError.h abCalcStack.h abCalcExpr.h abCalcExprInt.h abCalcOpSr.h +abCalcOpRr.o: abCalcOp.h abCalcMode.h abCalcError.h abCalcStack.h abCalcExpr.h abCalcExprInt.h abCalcOpRr.h +abCalcOpAsr.o: abCalcOp.h abCalcMode.h abCalcError.h abCalcStack.h abCalcExpr.h abCalcExprInt.h abCalcOpAsr.h $(NAME): $(OBJS) diff --git a/abCalcExpReal.c b/abCalcExpReal.c index b7a9053..405e162 100644 --- a/abCalcExpReal.c +++ b/abCalcExpReal.c @@ -205,3 +205,13 @@ char *abCalcExprRealFormat(abCalcExpr *expr, char *buffer) return buffer; } + + +void abCalcExprRealSet(abCalcExpr *expr, abCalcRealType value) +{ + if (expr == NULL) + return; + + expr->type = abCalcExprTypeReal; + expr->u.real = value; +} diff --git a/abCalcExpReal.h b/abCalcExpReal.h index 2188393..8fbd45c 100644 --- a/abCalcExpReal.h +++ b/abCalcExpReal.h @@ -8,7 +8,10 @@ #define ABCALCEXPREAL_H +struct abCalcExpr; + void abCalcExprRealInit(void); +void abCalcExprRealSet(struct abCalcExpr *expr, abCalcRealType value); #endif diff --git a/abCalcExprInt.c b/abCalcExprInt.c index b9cbd90..9a66cd8 100644 --- a/abCalcExprInt.c +++ b/abCalcExprInt.c @@ -245,3 +245,21 @@ char *abCalcExprIntFormat(abCalcExpr *expr, char *buffer) return buffer; } + + +void abCalcExprIntSet(abCalcExpr *expr, abCalcIntType value) +{ + int width; + + if (expr == NULL) + return; + + width = abCalcModeGetIntWidth(); + + expr->type = abCalcExprTypeInt; + expr->u.integer = value; + + if (width < AB_CALC_EXPR_MAX_INT_WIDTH) { + expr->u.integer &= ((1l << width) - 1); + } +} diff --git a/abCalcExprInt.h b/abCalcExprInt.h index 9fc7662..9c96816 100644 --- a/abCalcExprInt.h +++ b/abCalcExprInt.h @@ -8,7 +8,12 @@ #define ABCALCEXPRINT_H +struct abCalcExpr; + + void abCalcExprIntInit(void); +void abCalcExprIntSet(struct abCalcExpr *expr, abCalcIntType value); + #endif diff --git a/abCalcOp.c b/abCalcOp.c index 5b4b684..ab2a852 100644 --- a/abCalcOp.c +++ b/abCalcOp.c @@ -22,6 +22,11 @@ #include "abCalcOpOr.h" #include "abCalcOpXor.h" #include "abCalcOpNot.h" +#include "abCalcOpSl.h" +#include "abCalcOpRl.h" +#include "abCalcOpSr.h" +#include "abCalcOpRr.h" +#include "abCalcOpAsr.h" #include "abCalcOpBin.h" #include "abCalcOpOct.h" @@ -52,6 +57,11 @@ void abCalcOpInit(void) abCalcOpOrInit(); abCalcOpXorInit(); abCalcOpNotInit(); + abCalcOpSlInit(); + abCalcOpRlInit(); + abCalcOpSrInit(); + abCalcOpRrInit(); + abCalcOpAsrInit(); abCalcOpBinInit(); abCalcOpOctInit(); diff --git a/abCalcOpAdd.c b/abCalcOpAdd.c index 5b424ea..71f1a15 100644 --- a/abCalcOpAdd.c +++ b/abCalcOpAdd.c @@ -11,6 +11,8 @@ #include "abCalcOp.h" #include "abCalcError.h" #include "abCalcExpr.h" +#include "abCalcExpReal.h" +#include "abCalcExprInt.h" #include "abCalcStack.h" @@ -48,17 +50,14 @@ void addExecute(void) } if ((expr1Real) && (expr2Real)) { - result.type = abCalcExprTypeReal; - result.u.real = expr2->u.real + expr1->u.real; + abCalcExprRealSet(&result, expr2->u.real + expr1->u.real); } else { - result.type = abCalcExprTypeInt; - if (expr1Real) { - result.u.integer = expr2->u.integer + (abCalcIntType)expr1->u.real; + abCalcExprIntSet(&result, expr2->u.integer + (abCalcIntType)expr1->u.real); } else if (expr2Real) { - result.u.integer = (abCalcIntType)expr2->u.real + expr1->u.integer; + abCalcExprIntSet(&result, (abCalcIntType)expr2->u.real + expr1->u.integer); } else { - result.u.integer = expr2->u.integer + expr1->u.integer; + abCalcExprIntSet(&result, expr2->u.integer + expr1->u.integer); } } diff --git a/abCalcOpAnd.c b/abCalcOpAnd.c index 5874871..f546890 100644 --- a/abCalcOpAnd.c +++ b/abCalcOpAnd.c @@ -11,6 +11,7 @@ #include "abCalcOp.h" #include "abCalcError.h" #include "abCalcExpr.h" +#include "abCalcExprInt.h" #include "abCalcStack.h" @@ -41,8 +42,7 @@ void andExecute(void) return; } - result.type = abCalcExprTypeInt; - result.u.integer = expr2->u.integer & expr1->u.integer; + abCalcExprIntSet(&result, expr2->u.integer & expr1->u.integer); abCalcStackExprPop(NULL); abCalcStackExprPop(NULL); diff --git a/abCalcOpAsr.c b/abCalcOpAsr.c new file mode 100644 index 0000000..cf9f1fc --- /dev/null +++ b/abCalcOpAsr.c @@ -0,0 +1,50 @@ +/* + abCalcOpAsr.c + By: Jeremy Rand + */ + + +#include + +#include "abCalcOpAsr.h" + +#include "abCalcOp.h" +#include "abCalcError.h" +#include "abCalcExpr.h" +#include "abCalcExprInt.h" +#include "abCalcMode.h" +#include "abCalcStack.h" + + +#define OP_NAME "ASR" + + +static void asrExecute(void); + + +void abCalcOpAsrInit(void) +{ + abCalcOpRegister(OP_NAME, asrExecute); +} + + +void asrExecute(void) +{ + abCalcExpr result; + int width; + abCalcIntType upperBit; + AB_CALC_OP_ONE_ARG(OP_NAME); + + if (expr->type != abCalcExprTypeInt) { + abCalcRaiseError(abCalcBadArgTypeError, OP_NAME); + return; + } + + width = abCalcModeGetIntWidth(); + upperBit = (expr->u.integer & (1 << (width - 1))); + + abCalcExprIntSet(&result, ((expr->u.integer >> 1) | upperBit)); + + abCalcStackExprPop(NULL); + abCalcStackExprPush(&result); +} diff --git a/abCalcOpAsr.h b/abCalcOpAsr.h new file mode 100644 index 0000000..eec3a84 --- /dev/null +++ b/abCalcOpAsr.h @@ -0,0 +1,14 @@ +/* + abCalcOpAsr.h + By: Jeremy Rand + */ + + +#ifndef ABCALCOPASR_H +#define ABCALCOPASR_H + + +void abCalcOpAsrInit(void); + + +#endif diff --git a/abCalcOpDiv.c b/abCalcOpDiv.c index 1d8c8ac..06d1cd2 100644 --- a/abCalcOpDiv.c +++ b/abCalcOpDiv.c @@ -11,6 +11,8 @@ #include "abCalcOp.h" #include "abCalcError.h" #include "abCalcExpr.h" +#include "abCalcExpReal.h" +#include "abCalcExprInt.h" #include "abCalcStack.h" @@ -57,17 +59,14 @@ void divExecute(void) } if ((expr1Real) && (expr2Real)) { - result.type = abCalcExprTypeReal; - result.u.real = expr2->u.real / expr1->u.real; + abCalcExprRealSet(&result, expr2->u.real / expr1->u.real); } else { - result.type = abCalcExprTypeInt; - if (expr1Real) { - result.u.integer = expr2->u.integer / (abCalcIntType)expr1->u.real; + abCalcExprIntSet(&result, expr2->u.integer / (abCalcIntType)expr1->u.real); } else if (expr2Real) { - result.u.integer = (abCalcIntType)expr2->u.real / expr1->u.integer; + abCalcExprIntSet(&result, (abCalcIntType)expr2->u.real / expr1->u.integer); } else { - result.u.integer = expr2->u.integer / expr1->u.integer; + abCalcExprIntSet(&result, expr2->u.integer / expr1->u.integer); } } diff --git a/abCalcOpMult.c b/abCalcOpMult.c index 35cc6de..5848ee3 100644 --- a/abCalcOpMult.c +++ b/abCalcOpMult.c @@ -11,6 +11,8 @@ #include "abCalcOp.h" #include "abCalcError.h" #include "abCalcExpr.h" +#include "abCalcExpReal.h" +#include "abCalcExprInt.h" #include "abCalcStack.h" @@ -48,17 +50,14 @@ void multExecute(void) } if ((expr1Real) && (expr2Real)) { - result.type = abCalcExprTypeReal; - result.u.real = expr2->u.real * expr1->u.real; + abCalcExprRealSet(&result, expr2->u.real * expr1->u.real); } else { - result.type = abCalcExprTypeInt; - if (expr1Real) { - result.u.integer = expr2->u.integer * (abCalcIntType)expr1->u.real; + abCalcExprIntSet(&result, expr2->u.integer * (abCalcIntType)expr1->u.real); } else if (expr2Real) { - result.u.integer = (abCalcIntType)expr2->u.real * expr1->u.integer; + abCalcExprIntSet(&result, (abCalcIntType)expr2->u.real * expr1->u.integer); } else { - result.u.integer = expr2->u.integer * expr1->u.integer; + abCalcExprIntSet(&result, expr2->u.integer * expr1->u.integer); } } diff --git a/abCalcOpNot.c b/abCalcOpNot.c index 5bd896d..24c3292 100644 --- a/abCalcOpNot.c +++ b/abCalcOpNot.c @@ -11,6 +11,7 @@ #include "abCalcOp.h" #include "abCalcError.h" #include "abCalcExpr.h" +#include "abCalcExprInt.h" #include "abCalcStack.h" @@ -36,10 +37,8 @@ void notExecute(void) return; } - result.type = abCalcExprTypeInt; - result.u.integer = ~(expr->u.integer); + abCalcExprIntSet(&result, ~(expr->u.integer)); - abCalcStackExprPop(NULL); abCalcStackExprPop(NULL); abCalcStackExprPush(&result); } diff --git a/abCalcOpOr.c b/abCalcOpOr.c index a701d5d..3617b6a 100644 --- a/abCalcOpOr.c +++ b/abCalcOpOr.c @@ -11,6 +11,7 @@ #include "abCalcOp.h" #include "abCalcError.h" #include "abCalcExpr.h" +#include "abCalcExprInt.h" #include "abCalcStack.h" @@ -41,8 +42,7 @@ void orExecute(void) return; } - result.type = abCalcExprTypeInt; - result.u.integer = expr2->u.integer | expr1->u.integer; + abCalcExprIntSet(&result, expr2->u.integer | expr1->u.integer); abCalcStackExprPop(NULL); abCalcStackExprPop(NULL); diff --git a/abCalcOpPower.c b/abCalcOpPower.c index 08bf58a..6fb80b9 100644 --- a/abCalcOpPower.c +++ b/abCalcOpPower.c @@ -12,6 +12,7 @@ #include "abCalcOp.h" #include "abCalcError.h" #include "abCalcExpr.h" +#include "abCalcExpReal.h" #include "abCalcStack.h" @@ -43,17 +44,15 @@ void powerExecute(void) return; } - result.type = abCalcExprTypeReal; - if (expr2->u.real == 0.0) { if (expr1->u.real < 0.0) { abCalcRaiseError(abCalcInfiniteResultError, OP_NAME); return; } if (expr1->u.real == 0.0) { - result.u.real = 1.0; + abCalcExprRealSet(&result, 1.0); } else { - result.u.real = 0.0; + abCalcExprRealSet(&result, 0.0); } } else { if (expr2->u.real < 0.0) { @@ -63,7 +62,8 @@ void powerExecute(void) return; } } - result.u.real = pow(expr2->u.real, expr1->u.real); + + abCalcExprRealSet(&result, pow(expr2->u.real, expr1->u.real)); } abCalcStackExprPop(NULL); diff --git a/abCalcOpRcws.c b/abCalcOpRcws.c index 5404370..395146b 100644 --- a/abCalcOpRcws.c +++ b/abCalcOpRcws.c @@ -10,6 +10,7 @@ #include "abCalcOp.h" #include "abCalcExpr.h" +#include "abCalcExpReal.h" #include "abCalcStack.h" #include "abCalcMode.h" @@ -30,8 +31,7 @@ void rcwsExecute(void) { abCalcExpr result; - result.type = abCalcExprTypeReal; - result.u.real = abCalcModeGetIntWidth(); + abCalcExprRealSet(&result, (abCalcRealType)abCalcModeGetIntWidth()); abCalcStackExprPush(&result); } diff --git a/abCalcOpRl.c b/abCalcOpRl.c new file mode 100644 index 0000000..dae081e --- /dev/null +++ b/abCalcOpRl.c @@ -0,0 +1,50 @@ +/* + abCalcOpRl.c + By: Jeremy Rand + */ + + +#include + +#include "abCalcOpRl.h" + +#include "abCalcOp.h" +#include "abCalcError.h" +#include "abCalcExpr.h" +#include "abCalcExprInt.h" +#include "abCalcMode.h" +#include "abCalcStack.h" + + +#define OP_NAME "RL" + + +static void rlExecute(void); + + +void abCalcOpRlInit(void) +{ + abCalcOpRegister(OP_NAME, rlExecute); +} + + +void rlExecute(void) +{ + abCalcExpr result; + int width; + int topBit; + AB_CALC_OP_ONE_ARG(OP_NAME); + + if (expr->type != abCalcExprTypeInt) { + abCalcRaiseError(abCalcBadArgTypeError, OP_NAME); + return; + } + + width = abCalcModeGetIntWidth(); + topBit = ((expr->u.integer >> (width - 1)) & 1); + + abCalcExprIntSet(&result, ((expr->u.integer << 1) | topBit)); + + abCalcStackExprPop(NULL); + abCalcStackExprPush(&result); +} diff --git a/abCalcOpRl.h b/abCalcOpRl.h new file mode 100644 index 0000000..e8e1919 --- /dev/null +++ b/abCalcOpRl.h @@ -0,0 +1,14 @@ +/* + abCalcOpRl.h + By: Jeremy Rand + */ + + +#ifndef ABCALCOPRL_H +#define ABCALCOPRL_H + + +void abCalcOpRlInit(void); + + +#endif diff --git a/abCalcOpRr.c b/abCalcOpRr.c new file mode 100644 index 0000000..2ad3c7b --- /dev/null +++ b/abCalcOpRr.c @@ -0,0 +1,50 @@ +/* + abCalcOpRr.c + By: Jeremy Rand + */ + + +#include + +#include "abCalcOpRr.h" + +#include "abCalcOp.h" +#include "abCalcError.h" +#include "abCalcExpr.h" +#include "abCalcMode.h" +#include "abCalcStack.h" +#include "abCalcExprInt.h" + + +#define OP_NAME "RR" + + +static void rrExecute(void); + + +void abCalcOpRrInit(void) +{ + abCalcOpRegister(OP_NAME, rrExecute); +} + + +void rrExecute(void) +{ + abCalcExpr result; + int width; + abCalcIntType bottomBit; + AB_CALC_OP_ONE_ARG(OP_NAME); + + if (expr->type != abCalcExprTypeInt) { + abCalcRaiseError(abCalcBadArgTypeError, OP_NAME); + return; + } + + width = abCalcModeGetIntWidth(); + bottomBit = (expr->u.integer & 1); + + abCalcExprIntSet(&result, ((expr->u.integer >> 1) | (bottomBit << (width - 1)))); + + abCalcStackExprPop(NULL); + abCalcStackExprPush(&result); +} diff --git a/abCalcOpRr.h b/abCalcOpRr.h new file mode 100644 index 0000000..cc14457 --- /dev/null +++ b/abCalcOpRr.h @@ -0,0 +1,14 @@ +/* + abCalcOpRr.h + By: Jeremy Rand + */ + + +#ifndef ABCALCOPRR_H +#define ABCALCOPRR_H + + +void abCalcOpRrInit(void); + + +#endif diff --git a/abCalcOpSl.c b/abCalcOpSl.c new file mode 100644 index 0000000..1d7f27d --- /dev/null +++ b/abCalcOpSl.c @@ -0,0 +1,44 @@ +/* + abCalcOpSl.c + By: Jeremy Rand + */ + + +#include + +#include "abCalcOpSl.h" + +#include "abCalcOp.h" +#include "abCalcError.h" +#include "abCalcExpr.h" +#include "abCalcExprInt.h" +#include "abCalcStack.h" + + +#define OP_NAME "SL" + + +static void slExecute(void); + + +void abCalcOpSlInit(void) +{ + abCalcOpRegister(OP_NAME, slExecute); +} + + +void slExecute(void) +{ + abCalcExpr result; + AB_CALC_OP_ONE_ARG(OP_NAME); + + if (expr->type != abCalcExprTypeInt) { + abCalcRaiseError(abCalcBadArgTypeError, OP_NAME); + return; + } + + abCalcExprIntSet(&result, (expr->u.integer << 1)); + + abCalcStackExprPop(NULL); + abCalcStackExprPush(&result); +} diff --git a/abCalcOpSl.h b/abCalcOpSl.h new file mode 100644 index 0000000..7dd7884 --- /dev/null +++ b/abCalcOpSl.h @@ -0,0 +1,14 @@ +/* + abCalcOpSl.h + By: Jeremy Rand + */ + + +#ifndef ABCALCOPSL_H +#define ABCALCOPSL_H + + +void abCalcOpSlInit(void); + + +#endif diff --git a/abCalcOpSr.c b/abCalcOpSr.c new file mode 100644 index 0000000..ba70833 --- /dev/null +++ b/abCalcOpSr.c @@ -0,0 +1,44 @@ +/* + abCalcOpSr.c + By: Jeremy Rand + */ + + +#include + +#include "abCalcOpSr.h" + +#include "abCalcOp.h" +#include "abCalcError.h" +#include "abCalcExpr.h" +#include "abCalcExprInt.h" +#include "abCalcStack.h" + + +#define OP_NAME "SR" + + +static void srExecute(void); + + +void abCalcOpSrInit(void) +{ + abCalcOpRegister(OP_NAME, srExecute); +} + + +void srExecute(void) +{ + abCalcExpr result; + AB_CALC_OP_ONE_ARG(OP_NAME); + + if (expr->type != abCalcExprTypeInt) { + abCalcRaiseError(abCalcBadArgTypeError, OP_NAME); + return; + } + + abCalcExprIntSet(&result, (expr->u.integer >> 1)); + + abCalcStackExprPop(NULL); + abCalcStackExprPush(&result); +} diff --git a/abCalcOpSr.h b/abCalcOpSr.h new file mode 100644 index 0000000..16243b0 --- /dev/null +++ b/abCalcOpSr.h @@ -0,0 +1,14 @@ +/* + abCalcOpSr.h + By: Jeremy Rand + */ + + +#ifndef ABCALCOPSR_H +#define ABCALCOPSR_H + + +void abCalcOpSrInit(void); + + +#endif diff --git a/abCalcOpSubtr.c b/abCalcOpSubtr.c index f461242..32ec4e0 100644 --- a/abCalcOpSubtr.c +++ b/abCalcOpSubtr.c @@ -11,6 +11,8 @@ #include "abCalcOp.h" #include "abCalcError.h" #include "abCalcExpr.h" +#include "abCalcExpReal.h" +#include "abCalcExprInt.h" #include "abCalcStack.h" @@ -48,17 +50,14 @@ void subtrExecute(void) } if ((expr1Real) && (expr2Real)) { - result.type = abCalcExprTypeReal; - result.u.real = expr2->u.real - expr1->u.real; + abCalcExprRealSet(&result, expr2->u.real - expr1->u.real); } else { - result.type = abCalcExprTypeInt; - if (expr1Real) { - result.u.integer = expr2->u.integer - (abCalcIntType)expr1->u.real; + abCalcExprIntSet(&result, expr2->u.integer - (abCalcIntType)expr1->u.real); } else if (expr2Real) { - result.u.integer = (abCalcIntType)expr2->u.real - expr1->u.integer; + abCalcExprIntSet(&result, (abCalcIntType)expr2->u.real - expr1->u.integer); } else { - result.u.integer = expr2->u.integer - expr2->u.integer; + abCalcExprIntSet(&result, expr2->u.integer - expr2->u.integer); } } diff --git a/abCalcOpXor.c b/abCalcOpXor.c index 7cd9e0c..3399d4c 100644 --- a/abCalcOpXor.c +++ b/abCalcOpXor.c @@ -11,6 +11,7 @@ #include "abCalcOp.h" #include "abCalcError.h" #include "abCalcExpr.h" +#include "abCalcExprInt.h" #include "abCalcStack.h" @@ -41,8 +42,7 @@ void xorExecute(void) return; } - result.type = abCalcExprTypeInt; - result.u.integer = expr2->u.integer ^ expr1->u.integer; + abCalcExprIntSet(&result, expr2->u.integer ^ expr1->u.integer); abCalcStackExprPop(NULL); abCalcStackExprPop(NULL);