Rework setting expressions and add shift operations
This commit is contained in:
parent
02092b15f3
commit
2aec9aecb6
31
Makefile
31
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)
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -8,7 +8,10 @@
|
|||
#define ABCALCEXPREAL_H
|
||||
|
||||
|
||||
struct abCalcExpr;
|
||||
|
||||
void abCalcExprRealInit(void);
|
||||
|
||||
void abCalcExprRealSet(struct abCalcExpr *expr, abCalcRealType value);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -8,7 +8,12 @@
|
|||
#define ABCALCEXPRINT_H
|
||||
|
||||
|
||||
struct abCalcExpr;
|
||||
|
||||
|
||||
void abCalcExprIntInit(void);
|
||||
|
||||
void abCalcExprIntSet(struct abCalcExpr *expr, abCalcIntType value);
|
||||
|
||||
|
||||
#endif
|
||||
|
|
10
abCalcOp.c
10
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();
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -0,0 +1,50 @@
|
|||
/*
|
||||
abCalcOpAsr.c
|
||||
By: Jeremy Rand
|
||||
*/
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#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);
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
/*
|
||||
abCalcOpAsr.h
|
||||
By: Jeremy Rand
|
||||
*/
|
||||
|
||||
|
||||
#ifndef ABCALCOPASR_H
|
||||
#define ABCALCOPASR_H
|
||||
|
||||
|
||||
void abCalcOpAsrInit(void);
|
||||
|
||||
|
||||
#endif
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -0,0 +1,50 @@
|
|||
/*
|
||||
abCalcOpRl.c
|
||||
By: Jeremy Rand
|
||||
*/
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#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);
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
/*
|
||||
abCalcOpRl.h
|
||||
By: Jeremy Rand
|
||||
*/
|
||||
|
||||
|
||||
#ifndef ABCALCOPRL_H
|
||||
#define ABCALCOPRL_H
|
||||
|
||||
|
||||
void abCalcOpRlInit(void);
|
||||
|
||||
|
||||
#endif
|
|
@ -0,0 +1,50 @@
|
|||
/*
|
||||
abCalcOpRr.c
|
||||
By: Jeremy Rand
|
||||
*/
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#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);
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
/*
|
||||
abCalcOpRr.h
|
||||
By: Jeremy Rand
|
||||
*/
|
||||
|
||||
|
||||
#ifndef ABCALCOPRR_H
|
||||
#define ABCALCOPRR_H
|
||||
|
||||
|
||||
void abCalcOpRrInit(void);
|
||||
|
||||
|
||||
#endif
|
|
@ -0,0 +1,44 @@
|
|||
/*
|
||||
abCalcOpSl.c
|
||||
By: Jeremy Rand
|
||||
*/
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#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);
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
/*
|
||||
abCalcOpSl.h
|
||||
By: Jeremy Rand
|
||||
*/
|
||||
|
||||
|
||||
#ifndef ABCALCOPSL_H
|
||||
#define ABCALCOPSL_H
|
||||
|
||||
|
||||
void abCalcOpSlInit(void);
|
||||
|
||||
|
||||
#endif
|
|
@ -0,0 +1,44 @@
|
|||
/*
|
||||
abCalcOpSr.c
|
||||
By: Jeremy Rand
|
||||
*/
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#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);
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
/*
|
||||
abCalcOpSr.h
|
||||
By: Jeremy Rand
|
||||
*/
|
||||
|
||||
|
||||
#ifndef ABCALCOPSR_H
|
||||
#define ABCALCOPSR_H
|
||||
|
||||
|
||||
void abCalcOpSrInit(void);
|
||||
|
||||
|
||||
#endif
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue