From cca7b583eafe401069b3041c85cab4ed0a318db3 Mon Sep 17 00:00:00 2001 From: Jeremy Rand Date: Wed, 24 Jul 2013 09:30:44 -0500 Subject: [PATCH] Begin implementation of expressions and stack --- Makefile | 3 +++ abCalcExpr.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++ abCalcExpr.h | 17 ++++++++++--- abCalcStack.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++ abCalcStack.h | 15 ++++++++++++ 5 files changed, 158 insertions(+), 3 deletions(-) create mode 100644 abCalcStack.h diff --git a/Makefile b/Makefile index 93a3be8..66167a0 100644 --- a/Makefile +++ b/Makefile @@ -3,6 +3,9 @@ NAME=abCalc all: $(NAME) +abCalcExpr.o: abCalcExpr.h +abCalcStack.o: abCalcExpr.h abCalcStack.h + $(NAME): $(OBJS) cc -o $(NAME) $(OBJS) diff --git a/abCalcExpr.c b/abCalcExpr.c index b1c54cb..dd8ffb8 100644 --- a/abCalcExpr.c +++ b/abCalcExpr.c @@ -1 +1,61 @@ +/* + abCalcExpr.c + By: Jeremy Rand + */ + + +#include + #include "abCalcExpr.h" + + +static abCalcExprCallbacks *gCallbacks[abCalcExprTypeMax]; + + +#define AB_CALC_EXPR_TYPE_INVALID(type) (((type) < abCalcExprTypeMin) || ((type) >= abCalcExprTypeMax)) + +void abCalcExprInit(void) +{ + abCalcExprType type; + + for (type = abCalcExprTypeMin; type < abCalcExprTypeMax; type++) { + gCallbacks[type] = NULL; + } +} + + +void abCalcRegisterExprType(abCalcExprType type, abCalcExprCallbacks *callbacks) +{ + if (AB_CALC_EXPR_TYPE_INVALID(type)) + return; + + gCallbacks[type] = callbacks; +} + + +abCalcExpr *abCalcParseExpr(abCalcExpr *expr, char *buffer) +{ + abCalcExpr *result = NULL; + abCalcExprType type; + + for (type = abCalcExprTypeMin; type < abCalcExprTypeMax; type++) { + if (gCallbacks[type] != NULL) { + result = (gCallbacks[type]->parseExpr)(expr, buffer); + if (result != NULL) + return result; + } + } + return result; +} + + +char *abCalcFormatExpr(abCalcExpr *expr, char *buffer) +{ + if (AB_CALC_EXPR_TYPE_INVALID(expr->type)) + return NULL; + + if (gCallbacks[expr->type] == NULL) + return NULL; + + return (gCallbacks[expr->type]->formatExpr(expr, buffer)); +} diff --git a/abCalcExpr.h b/abCalcExpr.h index dc4640f..0f039ab 100644 --- a/abCalcExpr.h +++ b/abCalcExpr.h @@ -5,8 +5,11 @@ typedef enum abCalcExprType { - abCalcExprTypeReal, - abCalcExprTypeInt + abCalcExprTypeMin = 0, + abCalcExprTypeReal = 0, + abCalcExprTypeInt, + + abCalcExprTypeMax } abCalcExprType; @@ -24,5 +27,13 @@ typedef struct abCalcExpr { typedef struct abCalcExprCallbacks { - abCalcExpr * (*parseExpression)(abCalcExpr *expr, char *buffer); + abCalcExpr * (*parseExpr)(abCalcExpr *expr, char *buffer); + char * (*formatExpr)(abCalcExpr *expr, char *buffer); } abCalcExprCallbacks; + + +void abCalcExprInit(void); +void abCalcRegisterExprType(abCalcExprType type, abCalcExprCallbacks *callbacks); + +abCalcExpr *abCalcParseExpr(abCalcExpr *expr, char *buffer); +char *abCalcFormatExpr(abCalcExpr *expr, char *buffer); diff --git a/abCalcStack.c b/abCalcStack.c index e69de29..a10f576 100644 --- a/abCalcStack.c +++ b/abCalcStack.c @@ -0,0 +1,66 @@ +/* + abCalcStack.c + By: Jeremy Rand + */ + + +#include +#include + +#include "abCalcStack.h" + + +#define AB_CALC_STACK_DEPTH 128 + + +static abCalcExpr gStack[AB_CALC_STACK_DEPTH]; +static int gStackNumItems = 0; + + +void abCalcStackInit(void) +{ +} + + +abCalcExpr *abCalcStackExprPush(abCalcExpr *expr) +{ + abCalcExpr *result = NULL; + if ((gStackNumItems < AB_CALC_STACK_DEPTH) && + (expr != NULL)) { + result = &(gStack[gStackNumItems]); + memcpy(result, expr, sizeof(*expr)); + gStackNumItems++; + } + return result; +} + + +abCalcExpr *abCalcStackExprPop(abCalcExpr *expr) +{ + abCalcExpr *result = NULL; + if ((gStackNumItems > 0) && + (expr != NULL)) { + gStackNumItems--; + result = expr; + memcpy(expr, &(gStack[gStackNumItems]), sizeof(*expr)); + } + return result; +} + + +int abCalcStackNumItems(void) +{ + return gStackNumItems; +} + + +abCalcExpr *abCalcStackExprAt(abCalcExpr *expr, int depth) +{ + abCalcExpr *result = NULL; + if ((depth < gStackNumItems) && + (expr != NULL)) { + result = &(gStack[gStackNumItems - 1 - depth]); + } + + return result; +} diff --git a/abCalcStack.h b/abCalcStack.h new file mode 100644 index 0000000..7f32cc6 --- /dev/null +++ b/abCalcStack.h @@ -0,0 +1,15 @@ +/* + abCalcStack.h + By: Jeremy Rand + */ + + +#include "abCalcExpr.h" + +void abCalcStackInit(void); + +abCalcExpr *abCalcStackExprPush(abCalcExpr *expr); + +abCalcExpr *abCalcStackExprPop(abCalcExpr *expr); + +abCalcExpr *abCalcStackExprAt(abCalcExpr *expr, int depth);