From 1b8abc8fa02acfa8f324a0dff963a52b671deea8 Mon Sep 17 00:00:00 2001 From: Jeremy Rand Date: Wed, 24 Jul 2013 18:01:04 -0500 Subject: [PATCH] Finish implementation on add --- Makefile | 5 ++--- abCalcMain.c | 8 +++++--- abCalcOp.c | 5 +++++ abCalcOp.h | 17 +++++++++++++++++ abCalcOpAdd.c | 42 +++++++++++++++++++++++++++++++++++++++++- abCalcStack.c | 11 ++++++++--- 6 files changed, 78 insertions(+), 10 deletions(-) diff --git a/Makefile b/Makefile index 4c2b83a..84025f9 100644 --- a/Makefile +++ b/Makefile @@ -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) diff --git a/abCalcMain.c b/abCalcMain.c index d6c1c49..489647f 100644 --- a/abCalcMain.c +++ b/abCalcMain.c @@ -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; } } diff --git a/abCalcOp.c b/abCalcOp.c index b5766af..ed06342 100644 --- a/abCalcOp.c +++ b/abCalcOp.c @@ -8,6 +8,9 @@ #include #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; } + + diff --git a/abCalcOp.h b/abCalcOp.h index 513812d..2f575ee 100644 --- a/abCalcOp.h +++ b/abCalcOp.h @@ -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); diff --git a/abCalcOpAdd.c b/abCalcOpAdd.c index 82d3907..9bb185b 100644 --- a/abCalcOpAdd.c +++ b/abCalcOpAdd.c @@ -7,7 +7,11 @@ #include #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); } diff --git a/abCalcStack.c b/abCalcStack.c index ad857de..5d7216d 100644 --- a/abCalcStack.c +++ b/abCalcStack.c @@ -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; }