Finish implementation on add

This commit is contained in:
Jeremy Rand 2013-07-24 18:01:04 -05:00
parent 822c7ab0ac
commit 1b8abc8fa0
6 changed files with 78 additions and 10 deletions

View File

@ -13,11 +13,10 @@ abCalcExprInt.o: abCalcExpr.h abCalcMode.h abCalcExprInt.h
abCalc.o: abCalc.h abCalcExpr.h abCalcMode.h abCalcExprReal.h abCalcExprInt.h \
abCalcStack.h abCalcOp.h abCalcError.h
abCalcMain.o: abCalc.h abCalcStack.h abCalcExpr.h abCalcOp.h abCalcError.h
abCalcOp.o: abCalcOp.h abCalcOpAdd.h
abCalcOpAdd.o: abCalcOp.h abCalcOpAdd.h
abCalcOp.o: abCalcOp.h abCalcError.h abCalcExpr.h abCalcStack.h abCalcOpAdd.h
abCalcOpAdd.o: abCalcOp.h abCalcError.h abCalcOpAdd.h
abCalcError.o: abCalcError.h
CFLAGS=-g
$(NAME): $(OBJS)
cc -o $(NAME) $(OBJS)

View File

@ -31,7 +31,7 @@ int main(void)
abCalcInit();
while (!timeToQuit) {
printf("Stack:\n");
printf("\n---------------------------\nStack:\n");
depth = abCalcStackNumItems();
if (depth == 0) {
@ -45,11 +45,11 @@ int main(void)
errorString = abCalcGetError();
if (errorString != NULL) {
printf("\n %s\n", errorString);
printf("\n === %s ===\n", errorString);
abCalcClearError();
}
timeToQuit = 1;
printf("> ");
if (fgets(gBuffer, sizeof(gBuffer), stdin) != NULL) {
len = strlen(gBuffer);
if ((gBuffer[len - 1] == '\r') ||
@ -66,6 +66,8 @@ int main(void)
} else {
abCalcRaiseError(abCalcSyntaxError, NULL);
}
} else {
timeToQuit = 1;
}
}

View File

@ -8,6 +8,9 @@
#include <string.h>
#include "abCalcOp.h"
#include "abCalcExpr.h"
#include "abCalcError.h"
#include "abCalcStack.h"
#include "abCalcOpAdd.h"
@ -52,3 +55,5 @@ abCalcOp *abCalcOpLookup(char *name)
return NULL;
}

View File

@ -8,6 +8,23 @@
#define ABCALCOP_H
#define AB_CALC_OP_ONE_ARG(opName) \
abCalcExpr *expr; \
if (abCalcStackNumItems() < 1) { \
abCalcRaiseError(abCalcTooFewArgsError, opName); \
return; \
} \
expr = abCalcStackExprAt(0);
#define AB_CALC_OP_TWO_ARGS(opName) \
abCalcExpr *expr1, *expr2; \
if (abCalcStackNumItems() < 2) { \
abCalcRaiseError(abCalcTooFewArgsError, opName); \
return; \
} \
expr1 = abCalcStackExprAt(0); \
expr2 = abCalcStackExprAt(1);
typedef struct abCalcOp {
char *name;
void (*execute)(void);

View File

@ -7,7 +7,11 @@
#include <stdio.h>
#include "abCalcOpAdd.h"
#include "abCalcOp.h"
#include "abCalcError.h"
#include "abCalcExpr.h"
#include "abCalcStack.h"
#define OP_NAME "+"
@ -24,5 +28,41 @@ void abCalcOpAddInit(void)
void addExecute(void)
{
printf("In add!\n");
abCalcExpr result;
char expr1Real = 0;
char expr2Real = 0;
AB_CALC_OP_TWO_ARGS(OP_NAME);
if (expr1->type == abCalcExprTypeReal) {
expr1Real = 1;
} else if (expr1->type != abCalcExprTypeInt) {
abCalcRaiseError(abCalcBadArgTypeError, OP_NAME);
return;
}
if (expr2->type == abCalcExprTypeReal) {
expr2Real = 1;
} else if (expr2->type != abCalcExprTypeInt) {
abCalcRaiseError(abCalcBadArgTypeError, OP_NAME);
return;
}
if ((expr1Real) && (expr2Real)) {
result.type = abCalcExprTypeReal;
result.u.real = expr1->u.real + expr2->u.real;
} else {
result.type = abCalcExprTypeInt;
if (expr1Real) {
result.u.integer = (abCalcIntType)expr1->u.real + expr2->u.integer;
} else if (expr2Real) {
result.u.integer = expr1->u.integer + (abCalcIntType)expr2->u.real;
} else {
result.u.integer = expr1->u.integer + expr2->u.integer;
}
}
abCalcStackExprPop(NULL);
abCalcStackExprPop(NULL);
abCalcStackExprPush(&result);
}

View File

@ -45,12 +45,17 @@ abCalcExpr *abCalcStackExprPush(abCalcExpr *expr)
abCalcExpr *abCalcStackExprPop(abCalcExpr *expr)
{
abCalcExpr *result = NULL;
if ((gStackNumItems > 0) &&
(expr != NULL)) {
gStackNumItems--;
if (gStackNumItems < 1)
return NULL;
gStackNumItems--;
if (expr != NULL) {
result = expr;
memcpy(expr, &(gStack[gStackNumItems]), sizeof(*expr));
}
return result;
}