mirror of
https://github.com/jeremysrand/abCalc.git
synced 2024-11-23 08:35:43 +00:00
78 lines
1.6 KiB
C
78 lines
1.6 KiB
C
/*
|
|
abCMain.c
|
|
By: Jeremy Rand
|
|
*/
|
|
|
|
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
|
|
#include "abCalc.h"
|
|
#include "abCStack.h"
|
|
#include "abCError.h"
|
|
|
|
#include "expr/abCExpr.h"
|
|
|
|
#include "ops/abCOp.h"
|
|
|
|
|
|
char gBuffer[AB_CALC_EXPR_STRING_MAX];
|
|
abCalcExpr gExpr;
|
|
|
|
|
|
int main(void)
|
|
{
|
|
int timeToQuit = 0;
|
|
int depth;
|
|
int item;
|
|
int len;
|
|
abCalcOp *op;
|
|
char *errorString;
|
|
|
|
abCalcInit();
|
|
|
|
while (!timeToQuit) {
|
|
printf("\n---------------------------\nStack:\n");
|
|
depth = abCalcStackNumItems();
|
|
|
|
if (depth == 0) {
|
|
printf(" Empty!\n");
|
|
} else {
|
|
for(item = depth - 1; item >= 0; item--) {
|
|
abCalcFormatExpr(abCalcStackExprAt(item), gBuffer);
|
|
printf(" %3d: %s\n", item + 1, gBuffer);
|
|
}
|
|
}
|
|
|
|
errorString = abCalcGetError();
|
|
if (errorString != NULL) {
|
|
printf("\n === %s ===\n", errorString);
|
|
abCalcClearError();
|
|
}
|
|
|
|
printf("> ");
|
|
if (fgets(gBuffer, sizeof(gBuffer), stdin) != NULL) {
|
|
len = strlen(gBuffer);
|
|
if ((gBuffer[len - 1] == '\r') ||
|
|
(gBuffer[len - 1] == '\n')) {
|
|
gBuffer[len - 1] = '\0';
|
|
}
|
|
|
|
op = abCalcOpLookup(gBuffer);
|
|
|
|
if (op != NULL) {
|
|
op->execute();
|
|
} else if (abCalcParseExpr(&gExpr, gBuffer) != NULL) {
|
|
abCalcStackExprPush(&gExpr);
|
|
} else {
|
|
abCalcRaiseError(abCalcSyntaxError, NULL);
|
|
}
|
|
} else {
|
|
timeToQuit = 1;
|
|
}
|
|
}
|
|
|
|
exit(0);
|
|
}
|