mirror of
https://github.com/jeremysrand/abCalc.git
synced 2025-02-06 10:30:11 +00:00
Finish implementation on add
This commit is contained in:
parent
822c7ab0ac
commit
1b8abc8fa0
5
Makefile
5
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)
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
17
abCalcOp.h
17
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);
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user