Rework setting expressions and add shift operations

This commit is contained in:
Jeremy Rand 2013-07-24 21:28:20 -05:00
parent 02092b15f3
commit 2aec9aecb6
26 changed files with 412 additions and 56 deletions

View File

@ -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)

View File

@ -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;
}

View File

@ -8,7 +8,10 @@
#define ABCALCEXPREAL_H
struct abCalcExpr;
void abCalcExprRealInit(void);
void abCalcExprRealSet(struct abCalcExpr *expr, abCalcRealType value);
#endif

View File

@ -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);
}
}

View File

@ -8,7 +8,12 @@
#define ABCALCEXPRINT_H
struct abCalcExpr;
void abCalcExprIntInit(void);
void abCalcExprIntSet(struct abCalcExpr *expr, abCalcIntType value);
#endif

View File

@ -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();

View File

@ -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);
}
}

View File

@ -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);

50
abCalcOpAsr.c Normal file
View File

@ -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);
}

14
abCalcOpAsr.h Normal file
View File

@ -0,0 +1,14 @@
/*
abCalcOpAsr.h
By: Jeremy Rand
*/
#ifndef ABCALCOPASR_H
#define ABCALCOPASR_H
void abCalcOpAsrInit(void);
#endif

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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);
}

View File

@ -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);

View File

@ -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);

View File

@ -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);
}

50
abCalcOpRl.c Normal file
View File

@ -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);
}

14
abCalcOpRl.h Normal file
View File

@ -0,0 +1,14 @@
/*
abCalcOpRl.h
By: Jeremy Rand
*/
#ifndef ABCALCOPRL_H
#define ABCALCOPRL_H
void abCalcOpRlInit(void);
#endif

50
abCalcOpRr.c Normal file
View File

@ -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);
}

14
abCalcOpRr.h Normal file
View File

@ -0,0 +1,14 @@
/*
abCalcOpRr.h
By: Jeremy Rand
*/
#ifndef ABCALCOPRR_H
#define ABCALCOPRR_H
void abCalcOpRrInit(void);
#endif

44
abCalcOpSl.c Normal file
View File

@ -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);
}

14
abCalcOpSl.h Normal file
View File

@ -0,0 +1,14 @@
/*
abCalcOpSl.h
By: Jeremy Rand
*/
#ifndef ABCALCOPSL_H
#define ABCALCOPSL_H
void abCalcOpSlInit(void);
#endif

44
abCalcOpSr.c Normal file
View File

@ -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);
}

14
abCalcOpSr.h Normal file
View File

@ -0,0 +1,14 @@
/*
abCalcOpSr.h
By: Jeremy Rand
*/
#ifndef ABCALCOPSR_H
#define ABCALCOPSR_H
void abCalcOpSrInit(void);
#endif

View File

@ -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);
}
}

View File

@ -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);