Add a bunch more operation

This commit is contained in:
Jeremy Rand 2013-07-24 18:59:18 -05:00
parent 1b8abc8fa0
commit 062a5b6639
24 changed files with 642 additions and 18 deletions

View File

@ -1,21 +1,33 @@
OBJS=abCalc.o abCalcExpr.o abCalcExprReal.o abCalcExprInt.o abCalcStack.o \
abCalcMode.o abCalcMain.o abCalcOp.o abCalcOpAdd.o abCalcError.o
OBJS=abCalc.o abCalcExpr.o abCalcExpReal.o abCalcExprInt.o abCalcStack.o \
abCalcMode.o abCalcMain.o abCalcOp.o abCalcError.o abCalcOpAdd.o \
abCalcOpSubtr.o abCalcOpMult.o abCalcOpDiv.o abCalcOpPower.o \
abCalcOpAnd.o abCalcOpOr.o abCalcOpXor.o abCalcOpNot.o
NAME=abCalc
all: $(NAME)
abCalcExpr.o: abCalcExpr.h
abCalcExprReal.o: abCalcExpr.h abCalcExprReal.h
abCalcExpReal.o: abCalcExpr.h abCalcExpReal.h
abCalcExprInt.o: abCalcExpr.h abCalcMode.h abCalcExprInt.h
abCalcStack.o: abCalcExpr.h abCalcStack.h abCalcError.h
abCalcMode.o: abCalcMode.h abCalcExpr.h
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 abCalcError.h abCalcExpr.h abCalcStack.h abCalcOpAdd.h
abCalcOpAdd.o: abCalcOp.h abCalcError.h abCalcOpAdd.h
abCalcError.o: abCalcError.h
abCalc.o: abCalc.h abCalcExpr.h abCalcMode.h abCalcExpReal.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 abCalcError.h abCalcExpr.h abCalcStack.h abCalcOpAdd.h \
abCalcOpSubtr.h abCalcOpMult.h abCalcOpDiv.h abCalcOpPower.h \
abCalcOpAnd.h abCalcOpOr.h abCalcOpXor.h abCalcOpNot.h
abCalcOpAdd.o: abCalcOp.h abCalcError.h abCalcOpAdd.h
abCalcOpSubtr.o: abCalcOp.h abCalcError.h abCalcOpSubtr.h
abCalcOpMult.o: abCalcOp.h abCalcError.h abCalcOpMult.h
abCalcOpDiv.o: abCalcOp.h abCalcError.h abCalcOpDiv.h
abCalcOpPower.o: abCalcOp.h abCalcError.h abCalcOpPower.h
abCalcOpAnd.o: abCalcOp.h abCalcError.h abCalcOpAnd.h
abCalcOpOr.o: abCalcOp.h abCalcError.h abCalcOpOr.h
abCalcOpXor.o: abCalcOp.h abCalcError.h abCalcOpXor.h
abCalcOpNot.o: abCalcOp.h abCalcError.h abCalcOpNot.h
$(NAME): $(OBJS)

View File

@ -6,7 +6,7 @@
#include "abCalcExpr.h"
#include "abCalcExprInt.h"
#include "abCalcExprReal.h"
#include "abCalcExpReal.h"
#include "abCalcMode.h"
#include "abCalcStack.h"
#include "abCalcOp.h"

View File

@ -26,6 +26,8 @@ void abCalcErrorInit(void)
gErrorStrings[abCalcBadArgValueError] = "Bad Argument Value";
gErrorStrings[abCalcTooFewArgsError] = "Too Few Arguments";
gErrorStrings[abCalcStackFullError] = "Stack Full";
gErrorStrings[abCalcInfiniteResultError] = "Infinite Result";
gErrorStrings[abCalcComplexResultError] = "Complex Result";
}

View File

@ -16,6 +16,8 @@ typedef enum abCalcErrorType {
abCalcBadArgValueError,
abCalcTooFewArgsError,
abCalcStackFullError,
abCalcInfiniteResultError,
abCalcComplexResultError,
abCalcErrorTypeMax
} abCalcErrorType;

View File

@ -1,5 +1,5 @@
/*
abCalcExprReal.c
abCalcExpReal.c
By: Jeremy Rand
*/

View File

@ -1,11 +1,11 @@
/*
abCalcExprReal.h
abCalcExpReal.h
By: Jeremy Rand
*/
#ifndef ABCALCEXPRREAL_H
#define ABCALCEXPRREAL_H
#ifndef ABCALCEXPREAL_H
#define ABCALCEXPREAL_H
void abCalcExprRealInit(void);

View File

@ -13,6 +13,14 @@
#include "abCalcStack.h"
#include "abCalcOpAdd.h"
#include "abCalcOpSubtr.h"
#include "abCalcOpMult.h"
#include "abCalcOpDiv.h"
#include "abCalcOpPower.h"
#include "abCalcOpAnd.h"
#include "abCalcOpOr.h"
#include "abCalcOpXor.h"
#include "abCalcOpNot.h"
#define AB_CALC_MAX_OPS 128
@ -27,6 +35,14 @@ void abCalcOpInit(void)
memset(gOps, 0, sizeof(gOps));
abCalcOpAddInit();
abCalcOpSubtrInit();
abCalcOpMultInit();
abCalcOpDivInit();
abCalcOpPowerInit();
abCalcOpAndInit();
abCalcOpOrInit();
abCalcOpXorInit();
abCalcOpNotInit();
}

View File

@ -49,16 +49,16 @@ void addExecute(void)
if ((expr1Real) && (expr2Real)) {
result.type = abCalcExprTypeReal;
result.u.real = expr1->u.real + expr2->u.real;
result.u.real = expr2->u.real + expr1->u.real;
} else {
result.type = abCalcExprTypeInt;
if (expr1Real) {
result.u.integer = (abCalcIntType)expr1->u.real + expr2->u.integer;
result.u.integer = expr2->u.integer + (abCalcIntType)expr1->u.real;
} else if (expr2Real) {
result.u.integer = expr1->u.integer + (abCalcIntType)expr2->u.real;
result.u.integer = (abCalcIntType)expr2->u.real + expr1->u.integer;
} else {
result.u.integer = expr1->u.integer + expr2->u.integer;
result.u.integer = expr2->u.integer + expr1->u.integer;
}
}

50
abCalcOpAnd.c Normal file
View File

@ -0,0 +1,50 @@
/*
abCalcOpAnd.c
By: Jeremy Rand
*/
#include <stdio.h>
#include "abCalcOpAnd.h"
#include "abCalcOp.h"
#include "abCalcError.h"
#include "abCalcExpr.h"
#include "abCalcStack.h"
#define OP_NAME "AND"
static void andExecute(void);
void abCalcOpAndInit(void)
{
abCalcOpRegister(OP_NAME, andExecute);
}
void andExecute(void)
{
abCalcExpr result;
AB_CALC_OP_TWO_ARGS(OP_NAME);
if (expr1->type != abCalcExprTypeInt) {
abCalcRaiseError(abCalcBadArgTypeError, OP_NAME);
return;
}
if (expr2->type != abCalcExprTypeInt) {
abCalcRaiseError(abCalcBadArgTypeError, OP_NAME);
return;
}
result.type = abCalcExprTypeInt;
result.u.integer = expr2->u.integer & expr1->u.integer;
abCalcStackExprPop(NULL);
abCalcStackExprPop(NULL);
abCalcStackExprPush(&result);
}

14
abCalcOpAnd.h Normal file
View File

@ -0,0 +1,14 @@
/*
abCalcOpAnd.h
By: Jeremy Rand
*/
#ifndef ABCALCOPAND_H
#define ABCALCOPAND_H
void abCalcOpAndInit(void);
#endif

77
abCalcOpDiv.c Normal file
View File

@ -0,0 +1,77 @@
/*
abCalcOpDiv.c
By: Jeremy Rand
*/
#include <stdio.h>
#include "abCalcOpDiv.h"
#include "abCalcOp.h"
#include "abCalcError.h"
#include "abCalcExpr.h"
#include "abCalcStack.h"
#define OP_NAME "/"
static void divExecute(void);
void abCalcOpDivInit(void)
{
abCalcOpRegister(OP_NAME, divExecute);
}
void divExecute(void)
{
abCalcExpr result;
char expr1Real = 0;
char expr2Real = 0;
AB_CALC_OP_TWO_ARGS(OP_NAME);
if (expr1->type == abCalcExprTypeReal) {
expr1Real = 1;
if (expr1->u.real == 0.0) {
abCalcRaiseError(abCalcInfiniteResultError, OP_NAME);
return;
}
} else if (expr1->type == abCalcExprTypeInt) {
if (expr1->u.integer == 0l) {
abCalcRaiseError(abCalcInfiniteResultError, OP_NAME);
return;
}
} else {
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 = expr2->u.real / expr1->u.real;
} else {
result.type = abCalcExprTypeInt;
if (expr1Real) {
result.u.integer = expr2->u.integer / (abCalcIntType)expr1->u.real;
} else if (expr2Real) {
result.u.integer = (abCalcIntType)expr2->u.real / expr1->u.integer;
} else {
result.u.integer = expr2->u.integer / expr1->u.integer;
}
}
abCalcStackExprPop(NULL);
abCalcStackExprPop(NULL);
abCalcStackExprPush(&result);
}

14
abCalcOpDiv.h Normal file
View File

@ -0,0 +1,14 @@
/*
abCalcOpDiv.h
By: Jeremy Rand
*/
#ifndef ABCALCOPDIV_H
#define ABCALCOPDIV_H
void abCalcOpDivInit(void);
#endif

68
abCalcOpMult.c Normal file
View File

@ -0,0 +1,68 @@
/*
abCalcOpMult.c
By: Jeremy Rand
*/
#include <stdio.h>
#include "abCalcOpMult.h"
#include "abCalcOp.h"
#include "abCalcError.h"
#include "abCalcExpr.h"
#include "abCalcStack.h"
#define OP_NAME "*"
static void multExecute(void);
void abCalcOpMultInit(void)
{
abCalcOpRegister(OP_NAME, multExecute);
}
void multExecute(void)
{
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 = expr2->u.real * expr1->u.real;
} else {
result.type = abCalcExprTypeInt;
if (expr1Real) {
result.u.integer = expr2->u.integer * (abCalcIntType)expr1->u.real;
} else if (expr2Real) {
result.u.integer = (abCalcIntType)expr2->u.real * expr1->u.integer;
} else {
result.u.integer = expr2->u.integer * expr1->u.integer;
}
}
abCalcStackExprPop(NULL);
abCalcStackExprPop(NULL);
abCalcStackExprPush(&result);
}

14
abCalcOpMult.h Normal file
View File

@ -0,0 +1,14 @@
/*
abCalcOpMult.h
By: Jeremy Rand
*/
#ifndef ABCALCOPMULT_H
#define ABCALCOPMULT_H
void abCalcOpMultInit(void);
#endif

45
abCalcOpNot.c Normal file
View File

@ -0,0 +1,45 @@
/*
abCalcOpNot.c
By: Jeremy Rand
*/
#include <stdio.h>
#include "abCalcOpNot.h"
#include "abCalcOp.h"
#include "abCalcError.h"
#include "abCalcExpr.h"
#include "abCalcStack.h"
#define OP_NAME "NOT"
static void notExecute(void);
void abCalcOpNotInit(void)
{
abCalcOpRegister(OP_NAME, notExecute);
}
void notExecute(void)
{
abCalcExpr result;
AB_CALC_OP_ONE_ARG(OP_NAME);
if (expr->type != abCalcExprTypeInt) {
abCalcRaiseError(abCalcBadArgTypeError, OP_NAME);
return;
}
result.type = abCalcExprTypeInt;
result.u.integer = ~(expr->u.integer);
abCalcStackExprPop(NULL);
abCalcStackExprPop(NULL);
abCalcStackExprPush(&result);
}

14
abCalcOpNot.h Normal file
View File

@ -0,0 +1,14 @@
/*
abCalcOpNot.h
By: Jeremy Rand
*/
#ifndef ABCALCOPNOT_H
#define ABCALCOPNOT_H
void abCalcOpNotInit(void);
#endif

50
abCalcOpOr.c Normal file
View File

@ -0,0 +1,50 @@
/*
abCalcOpOr.c
By: Jeremy Rand
*/
#include <stdio.h>
#include "abCalcOpOr.h"
#include "abCalcOp.h"
#include "abCalcError.h"
#include "abCalcExpr.h"
#include "abCalcStack.h"
#define OP_NAME "OR"
static void orExecute(void);
void abCalcOpOrInit(void)
{
abCalcOpRegister(OP_NAME, orExecute);
}
void orExecute(void)
{
abCalcExpr result;
AB_CALC_OP_TWO_ARGS(OP_NAME);
if (expr1->type != abCalcExprTypeInt) {
abCalcRaiseError(abCalcBadArgTypeError, OP_NAME);
return;
}
if (expr2->type != abCalcExprTypeInt) {
abCalcRaiseError(abCalcBadArgTypeError, OP_NAME);
return;
}
result.type = abCalcExprTypeInt;
result.u.integer = expr2->u.integer | expr1->u.integer;
abCalcStackExprPop(NULL);
abCalcStackExprPop(NULL);
abCalcStackExprPush(&result);
}

14
abCalcOpOr.h Normal file
View File

@ -0,0 +1,14 @@
/*
abCalcOpOr.h
By: Jeremy Rand
*/
#ifndef ABCALCOPOR_H
#define ABCALCOPOR_H
void abCalcOpOrInit(void);
#endif

72
abCalcOpPower.c Normal file
View File

@ -0,0 +1,72 @@
/*
abCalcOpPower.c
By: Jeremy Rand
*/
#include <math.h>
#include <stdio.h>
#include "abCalcOpPower.h"
#include "abCalcOp.h"
#include "abCalcError.h"
#include "abCalcExpr.h"
#include "abCalcStack.h"
#define OP_NAME "^"
static void powerExecute(void);
void abCalcOpPowerInit(void)
{
abCalcOpRegister(OP_NAME, powerExecute);
}
void powerExecute(void)
{
abCalcExpr result;
double integral;
AB_CALC_OP_TWO_ARGS(OP_NAME);
if (expr1->type != abCalcExprTypeReal) {
abCalcRaiseError(abCalcBadArgTypeError, OP_NAME);
return;
}
if (expr2->type != abCalcExprTypeReal) {
abCalcRaiseError(abCalcBadArgTypeError, OP_NAME);
return;
}
result.type = abCalcExprTypeReal;
if (expr2->u.real == 0.0) {
if (expr1->u.real < 0.0) {
abCalcRaiseError(abCalcInfiniteResultError, OP_NAME);
return;
}
if (expr1->u.real == 0.0) {
result.u.real = 1.0;
} else {
result.u.real = 0.0;
}
} else {
if (expr2->u.real < 0.0) {
modf(expr1->u.real, &integral);
if (expr1->u.real != integral) {
abCalcRaiseError(abCalcComplexResultError, OP_NAME);
return;
}
}
result.u.real = pow(expr2->u.real, expr1->u.real);
}
abCalcStackExprPop(NULL);
abCalcStackExprPop(NULL);
abCalcStackExprPush(&result);
}

14
abCalcOpPower.h Normal file
View File

@ -0,0 +1,14 @@
/*
abCalcOpPower.h
By: Jeremy Rand
*/
#ifndef ABCALCOPPOWER_H
#define ABCALCOPPOWER_H
void abCalcOpPowerInit(void);
#endif

68
abCalcOpSubtr.c Normal file
View File

@ -0,0 +1,68 @@
/*
abCalcOpSubtr.c
By: Jeremy Rand
*/
#include <stdio.h>
#include "abCalcOpSubtr.h"
#include "abCalcOp.h"
#include "abCalcError.h"
#include "abCalcExpr.h"
#include "abCalcStack.h"
#define OP_NAME "-"
static void subtrExecute(void);
void abCalcOpSubtrInit(void)
{
abCalcOpRegister(OP_NAME, subtrExecute);
}
void subtrExecute(void)
{
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 = expr2->u.real - expr1->u.real;
} else {
result.type = abCalcExprTypeInt;
if (expr1Real) {
result.u.integer = expr2->u.integer - (abCalcIntType)expr1->u.real;
} else if (expr2Real) {
result.u.integer = (abCalcIntType)expr2->u.real - expr1->u.integer;
} else {
result.u.integer = expr2->u.integer - expr2->u.integer;
}
}
abCalcStackExprPop(NULL);
abCalcStackExprPop(NULL);
abCalcStackExprPush(&result);
}

14
abCalcOpSubtr.h Normal file
View File

@ -0,0 +1,14 @@
/*
abCalcOpSubtr.h
By: Jeremy Rand
*/
#ifndef ABCALCOPSUBTR_H
#define ABCALCOPSUBTR_H
void abCalcOpSubtrInit(void);
#endif

50
abCalcOpXor.c Normal file
View File

@ -0,0 +1,50 @@
/*
abCalcOpXor.c
By: Jeremy Rand
*/
#include <stdio.h>
#include "abCalcOpXor.h"
#include "abCalcOp.h"
#include "abCalcError.h"
#include "abCalcExpr.h"
#include "abCalcStack.h"
#define OP_NAME "XOR"
static void xorExecute(void);
void abCalcOpXorInit(void)
{
abCalcOpRegister(OP_NAME, xorExecute);
}
void xorExecute(void)
{
abCalcExpr result;
AB_CALC_OP_TWO_ARGS(OP_NAME);
if (expr1->type != abCalcExprTypeInt) {
abCalcRaiseError(abCalcBadArgTypeError, OP_NAME);
return;
}
if (expr2->type != abCalcExprTypeInt) {
abCalcRaiseError(abCalcBadArgTypeError, OP_NAME);
return;
}
result.type = abCalcExprTypeInt;
result.u.integer = expr2->u.integer ^ expr1->u.integer;
abCalcStackExprPop(NULL);
abCalcStackExprPop(NULL);
abCalcStackExprPush(&result);
}

14
abCalcOpXor.h Normal file
View File

@ -0,0 +1,14 @@
/*
abCalcOpXor.h
By: Jeremy Rand
*/
#ifndef ABCALCOPXOR_H
#define ABCALCOPXOR_H
void abCalcOpXorInit(void);
#endif