From be0d47681c9e55a2e8278df3c553d1f1733bf27b Mon Sep 17 00:00:00 2001 From: Jeremy Rand Date: Mon, 11 Sep 2017 23:05:43 -0400 Subject: [PATCH] Move to the new build environment --- .DS_Store | Bin 6148 -> 6148 bytes Make.engine | 94 --- Make.mac | 18 - Makefile | 51 -- README.md | 41 - abCError.c | 75 -- abCError.h | 35 - abCMain.c | 77 -- abCMode.c | 47 -- abCMode.h | 37 - abCStack.c | 103 --- abCStack.h | 32 - abCalc.c | 32 - abCalc.h | 14 - abCalc.xcodeproj/project.pbxproj | 671 +++++++++++++++ .../contents.xcworkspacedata | 7 + .../UserInterfaceState.xcuserstate | Bin 0 -> 19549 bytes .../xcshareddata/xcschemes/abCalc.xcscheme | 98 +++ .../xcschemes/doNotBuild.xcscheme | 91 +++ .../xcschemes/xcschememanagement.plist | 32 + abCalcHelp | 1 - abCalcNDA.c | 764 ------------------ abCalcNDA.defs | 115 --- abCalcNDA.rez | 462 ----------- expr/abCExpReal.c | 217 ----- expr/abCExpReal.h | 17 - expr/abCExpr.c | 61 -- expr/abCExpr.h | 51 -- expr/abCExprInt.c | 272 ------- expr/abCExprInt.h | 19 - ops/abCOp.c | 177 ---- ops/abCOp.h | 44 - ops/abCOpAcos.c | 52 -- ops/abCOpAcos.h | 14 - ops/abCOpAdd.c | 69 -- ops/abCOpAdd.h | 14 - ops/abCOpAlog.c | 46 -- ops/abCOpAlog.h | 14 - ops/abCOpAnd.c | 51 -- ops/abCOpAnd.h | 14 - ops/abCOpAsin.c | 52 -- ops/abCOpAsin.h | 14 - ops/abCOpAsr.c | 51 -- ops/abCOpAsr.h | 14 - ops/abCOpAtan.c | 46 -- ops/abCOpAtan.h | 14 - ops/abCOpB2R.c | 48 -- ops/abCOpB2R.h | 14 - ops/abCOpBin.c | 30 - ops/abCOpBin.h | 14 - ops/abCOpChs.c | 46 -- ops/abCOpChs.h | 14 - ops/abCOpClear.c | 31 - ops/abCOpClear.h | 14 - ops/abCOpCos.c | 46 -- ops/abCOpCos.h | 14 - ops/abCOpCosh.c | 46 -- ops/abCOpCosh.h | 14 - ops/abCOpDec.c | 30 - ops/abCOpDec.h | 14 - ops/abCOpDiv.c | 77 -- ops/abCOpDiv.h | 14 - ops/abCOpDrop.c | 36 - ops/abCOpDrop.h | 14 - ops/abCOpExp.c | 46 -- ops/abCOpExp.h | 14 - ops/abCOpHex.c | 30 - ops/abCOpHex.h | 14 - ops/abCOpInv.c | 51 -- ops/abCOpInv.h | 14 - ops/abCOpLn.c | 55 -- ops/abCOpLn.h | 14 - ops/abCOpLog.c | 55 -- ops/abCOpLog.h | 14 - ops/abCOpMult.c | 68 -- ops/abCOpMult.h | 14 - ops/abCOpNot.c | 45 -- ops/abCOpNot.h | 14 - ops/abCOpOct.c | 30 - ops/abCOpOct.h | 14 - ops/abCOpOr.c | 51 -- ops/abCOpOr.h | 14 - ops/abCOpPi.c | 42 - ops/abCOpPi.h | 14 - ops/abCOpPower.c | 73 -- ops/abCOpPower.h | 14 - ops/abCOpR2B.c | 48 -- ops/abCOpR2B.h | 14 - ops/abCOpRcws.c | 38 - ops/abCOpRcws.h | 14 - ops/abCOpRl.c | 51 -- ops/abCOpRl.h | 14 - ops/abCOpRr.c | 51 -- ops/abCOpRr.h | 14 - ops/abCOpSin.c | 46 -- ops/abCOpSin.h | 14 - ops/abCOpSinh.c | 46 -- ops/abCOpSinh.h | 14 - ops/abCOpSl.c | 45 -- ops/abCOpSl.h | 14 - ops/abCOpSq.c | 46 -- ops/abCOpSq.h | 14 - ops/abCOpSqrt.c | 51 -- ops/abCOpSqrt.h | 14 - ops/abCOpSr.c | 45 -- ops/abCOpSr.h | 14 - ops/abCOpStws.c | 50 -- ops/abCOpStws.h | 14 - ops/abCOpSubtr.c | 68 -- ops/abCOpSubtr.h | 14 - ops/abCOpSwap.c | 45 -- ops/abCOpSwap.h | 14 - ops/abCOpTan.c | 46 -- ops/abCOpTan.h | 14 - ops/abCOpTanh.c | 46 -- ops/abCOpTanh.h | 14 - ops/abCOpXor.c | 51 -- ops/abCOpXor.h | 14 - screenshots/abCalc.png | Bin 61995 -> 0 bytes screenshots/abCalcNDA.png | Bin 138532 -> 0 bytes 120 files changed, 899 insertions(+), 5534 deletions(-) delete mode 100644 Make.engine delete mode 100644 Make.mac delete mode 100644 Makefile delete mode 100644 README.md delete mode 100644 abCError.c delete mode 100644 abCError.h delete mode 100644 abCMain.c delete mode 100644 abCMode.c delete mode 100644 abCMode.h delete mode 100644 abCStack.c delete mode 100644 abCStack.h delete mode 100644 abCalc.c delete mode 100644 abCalc.h create mode 100644 abCalc.xcodeproj/project.pbxproj create mode 100644 abCalc.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 abCalc.xcodeproj/project.xcworkspace/xcuserdata/jrand.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 abCalc.xcodeproj/xcshareddata/xcschemes/abCalc.xcscheme create mode 100644 abCalc.xcodeproj/xcuserdata/jrand.xcuserdatad/xcschemes/doNotBuild.xcscheme create mode 100644 abCalc.xcodeproj/xcuserdata/jrand.xcuserdatad/xcschemes/xcschememanagement.plist delete mode 100644 abCalcHelp delete mode 100644 abCalcNDA.c delete mode 100644 abCalcNDA.defs delete mode 100644 abCalcNDA.rez delete mode 100644 expr/abCExpReal.c delete mode 100644 expr/abCExpReal.h delete mode 100644 expr/abCExpr.c delete mode 100644 expr/abCExpr.h delete mode 100644 expr/abCExprInt.c delete mode 100644 expr/abCExprInt.h delete mode 100644 ops/abCOp.c delete mode 100644 ops/abCOp.h delete mode 100644 ops/abCOpAcos.c delete mode 100644 ops/abCOpAcos.h delete mode 100644 ops/abCOpAdd.c delete mode 100644 ops/abCOpAdd.h delete mode 100644 ops/abCOpAlog.c delete mode 100644 ops/abCOpAlog.h delete mode 100644 ops/abCOpAnd.c delete mode 100644 ops/abCOpAnd.h delete mode 100644 ops/abCOpAsin.c delete mode 100644 ops/abCOpAsin.h delete mode 100644 ops/abCOpAsr.c delete mode 100644 ops/abCOpAsr.h delete mode 100644 ops/abCOpAtan.c delete mode 100644 ops/abCOpAtan.h delete mode 100644 ops/abCOpB2R.c delete mode 100644 ops/abCOpB2R.h delete mode 100644 ops/abCOpBin.c delete mode 100644 ops/abCOpBin.h delete mode 100644 ops/abCOpChs.c delete mode 100644 ops/abCOpChs.h delete mode 100644 ops/abCOpClear.c delete mode 100644 ops/abCOpClear.h delete mode 100644 ops/abCOpCos.c delete mode 100644 ops/abCOpCos.h delete mode 100644 ops/abCOpCosh.c delete mode 100644 ops/abCOpCosh.h delete mode 100644 ops/abCOpDec.c delete mode 100644 ops/abCOpDec.h delete mode 100644 ops/abCOpDiv.c delete mode 100644 ops/abCOpDiv.h delete mode 100644 ops/abCOpDrop.c delete mode 100644 ops/abCOpDrop.h delete mode 100644 ops/abCOpExp.c delete mode 100644 ops/abCOpExp.h delete mode 100644 ops/abCOpHex.c delete mode 100644 ops/abCOpHex.h delete mode 100644 ops/abCOpInv.c delete mode 100644 ops/abCOpInv.h delete mode 100644 ops/abCOpLn.c delete mode 100644 ops/abCOpLn.h delete mode 100644 ops/abCOpLog.c delete mode 100644 ops/abCOpLog.h delete mode 100644 ops/abCOpMult.c delete mode 100644 ops/abCOpMult.h delete mode 100644 ops/abCOpNot.c delete mode 100644 ops/abCOpNot.h delete mode 100644 ops/abCOpOct.c delete mode 100644 ops/abCOpOct.h delete mode 100644 ops/abCOpOr.c delete mode 100644 ops/abCOpOr.h delete mode 100644 ops/abCOpPi.c delete mode 100644 ops/abCOpPi.h delete mode 100644 ops/abCOpPower.c delete mode 100644 ops/abCOpPower.h delete mode 100644 ops/abCOpR2B.c delete mode 100644 ops/abCOpR2B.h delete mode 100644 ops/abCOpRcws.c delete mode 100644 ops/abCOpRcws.h delete mode 100644 ops/abCOpRl.c delete mode 100644 ops/abCOpRl.h delete mode 100644 ops/abCOpRr.c delete mode 100644 ops/abCOpRr.h delete mode 100644 ops/abCOpSin.c delete mode 100644 ops/abCOpSin.h delete mode 100644 ops/abCOpSinh.c delete mode 100644 ops/abCOpSinh.h delete mode 100644 ops/abCOpSl.c delete mode 100644 ops/abCOpSl.h delete mode 100644 ops/abCOpSq.c delete mode 100644 ops/abCOpSq.h delete mode 100644 ops/abCOpSqrt.c delete mode 100644 ops/abCOpSqrt.h delete mode 100644 ops/abCOpSr.c delete mode 100644 ops/abCOpSr.h delete mode 100644 ops/abCOpStws.c delete mode 100644 ops/abCOpStws.h delete mode 100644 ops/abCOpSubtr.c delete mode 100644 ops/abCOpSubtr.h delete mode 100644 ops/abCOpSwap.c delete mode 100644 ops/abCOpSwap.h delete mode 100644 ops/abCOpTan.c delete mode 100644 ops/abCOpTan.h delete mode 100644 ops/abCOpTanh.c delete mode 100644 ops/abCOpTanh.h delete mode 100644 ops/abCOpXor.c delete mode 100644 ops/abCOpXor.h delete mode 100644 screenshots/abCalc.png delete mode 100644 screenshots/abCalcNDA.png diff --git a/.DS_Store b/.DS_Store index cd1041af326deb08af7c298ec982119818e6af80..24aa3a7773743c5e1bb2cd924d94e8da48b9e84e 100644 GIT binary patch delta 374 zcmZoMXfc=|#>B)qF;Q%yo+2a5!~pA!7aACWj2`WJZiZrpWQHP!R3OX)vNIU+8A=$6 zlgf(=l5+Bs7#JAtBo*Xj7MBCJzF;Q%yo+2aD!~pBb1|lqz`I$5}r!p^M*<8T9j%hPH2R{c;(dI $(NDA_NAME).map - chtyp -t nda $(NDA_NAME) - -abCMain.o: abCMain.c - occ $(CFLAGS) -c -o $@ $< - -$(NDA_NAME).o: $(NDA_NAME).c - occ $(CFLAGS) -c -o $@ $< - -clean: - cp -p rm -f $(SHELL_NAME) $(SHELL_OBJS) $(SHELL_NAME).root - cp -p rm -f $(NDA_NAME) $(NDA_OBJS) $(NDA_NAME).r $(NDA_NAME).root - cp -p rm -f *.root - cp -p rm -f *.map - cp -p rm -f expr/*.root - cp -p rm -f ops/*.root - -fixfiles: - tr '\\012' '\\015' < abCalcNDA.defs > /tmp/blah - cp -f /tmp/blah abCalcNDA.defs - tr '\\012' '\\015' < abCalcNDA.rez > /tmp/blah - cp -f /tmp/blah abCalcNDA.rez - chtyp -l CC *.c *.h *.defs - chtyp -l REZ *.rez - chtyp -l CC expr/*.c expr/*.h - chtyp -l CC ops/*.c ops/*.h - -%.o: %.c - occ $(CFLAGS) -r -c -o $@ $< - -%.r: %.rez - occ -o $@ $< diff --git a/README.md b/README.md deleted file mode 100644 index e9063fe..0000000 --- a/README.md +++ /dev/null @@ -1,41 +0,0 @@ -abCalc -====== - -The "Ass-Backward Calculator" for the Apple //GS - an RPN calculator NDA - -The source can be built both from Mac OSX, resulting in a commandline binary which you can run on a Mac and from a //GS. -To build and execute on a Mac: - -1. Make sure you have Xcode installed. If not, grab it from the Mac App store. -2. Execute "make -f Make.mac" -3. Run "./abCalc" - -In theory, it should work on any POSIX platform like Linux, Solaris, etc but I have not tested it on any other platforms. - -To build this on a //GS, you need a number of prerequisites: - -1. Orca/C v2.0.1 -2. GNO/ME v2.x -3. occ - the Orca/C wrapper -4. dmake - -To build this on a //GS, the steps are: - -1. Somehow copy the files to your //GS. Depending on whether you are using a real machine or an emulator, your -approach here may be different. -2. Find this line in your ORCACDefs/scrap.h file: - extern pascal void PutScrap(unsigned Longint, Word, Pointer) inline(0x0C16,dispatcher); -and change it to - extern pascal void PutScrap(LongWord, Word, Pointer) inline(0x0C16,dispatcher); -This is a bug in the headers which causes ORCA/C to generate the wrong output. -3. Once you have the files, you should first execute "dmake fixfiles". This makes sure all files have the right -file types. -4. Execute "dmake" - -When done, you will have two binaries. The abCalc binary is a shell command you can use from GNO/ME: - -![abCalc Shell Screenshot](/screenshots/abCalc.png "abCalc Shell Screenshot") - -And abCalcNDA is a new desk accessory which you can use from within GS/OS applications: - -![abCalc NDA Screenshot](/screenshots/abCalcNDA.png "abCalc NDA Screenshot") diff --git a/abCError.c b/abCError.c deleted file mode 100644 index 35b5f21..0000000 --- a/abCError.c +++ /dev/null @@ -1,75 +0,0 @@ -/* - abCError.c - By: Jeremy Rand - */ - - -#include -#include - -#include "abCError.h" - - -static char *gErrorStrings[abCalcErrorTypeMax]; - -static abCalcErrorType gCurrErrorType = abCalcNoError; -static char *gCurrErrorOpName = NULL; - -char gErrorBuffer[128]; - - -void abCalcErrorInit(void) -{ - gErrorStrings[abCalcNoError] = NULL; - gErrorStrings[abCalcSyntaxError] = "Syntax Error"; - gErrorStrings[abCalcBadArgTypeError] = "Bad Argument Type"; - gErrorStrings[abCalcBadArgValueError] = "Bad Argument Value"; - gErrorStrings[abCalcTooFewArgsError] = "Too Few Arguments"; - gErrorStrings[abCalcStackFullError] = "Stack Full"; - gErrorStrings[abCalcInfiniteResultError] = "Infinite Result"; - gErrorStrings[abCalcComplexResultError] = "Complex Result"; -} - - -void abCalcRaiseError(abCalcErrorType type, char *opName) -{ - if ((type < abCalcErrorTypeMin) || - (type >= abCalcErrorTypeMax)) - return; - - if (gCurrErrorType == abCalcNoError) { - gCurrErrorType = type; - gCurrErrorOpName = opName; - } -} - - -char *abCalcGetError(void) -{ - char *errorString; - - if ((gCurrErrorType < abCalcErrorTypeMin) || - (gCurrErrorType >= abCalcErrorTypeMax)) - return NULL; - - errorString = gErrorStrings[gCurrErrorType]; - - if (errorString == NULL) - return NULL; - - if (gCurrErrorOpName != NULL) { - sprintf(gErrorBuffer, "%s Error: %s", gCurrErrorOpName, gErrorStrings[gCurrErrorType]); - } else { - sprintf(gErrorBuffer, "Error: %s", gErrorStrings[gCurrErrorType]); - } - - return gErrorBuffer; -} - - -void abCalcClearError(void) -{ - gCurrErrorType = abCalcNoError; - gCurrErrorOpName = NULL; -} - diff --git a/abCError.h b/abCError.h deleted file mode 100644 index bf6fad0..0000000 --- a/abCError.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - abCError.h - By: Jeremy Rand - */ - - -#ifndef ABCERROR_H -#define ABCERROR_H - - -typedef enum abCalcErrorType { - abCalcErrorTypeMin = 0, - abCalcNoError, - abCalcSyntaxError, - abCalcBadArgTypeError, - abCalcBadArgValueError, - abCalcTooFewArgsError, - abCalcStackFullError, - abCalcInfiniteResultError, - abCalcComplexResultError, - - abCalcErrorTypeMax -} abCalcErrorType; - - -void abCalcErrorInit(void); - -void abCalcRaiseError(abCalcErrorType type, char *opName); - -char *abCalcGetError(void); - -void abCalcClearError(void); - - -#endif diff --git a/abCMain.c b/abCMain.c deleted file mode 100644 index 6d74347..0000000 --- a/abCMain.c +++ /dev/null @@ -1,77 +0,0 @@ -/* - abCMain.c - By: Jeremy Rand - */ - - -#include -#include -#include - -#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); -} diff --git a/abCMode.c b/abCMode.c deleted file mode 100644 index 987875d..0000000 --- a/abCMode.c +++ /dev/null @@ -1,47 +0,0 @@ -/* - abCMode.c - By: Jeremy Rand - */ - - -#include "abCMode.h" - - - -static abCalcModeIntBase gBase = abCalcModeDecBase; -static int gIntWidth = AB_CALC_EXPR_MAX_INT_WIDTH; - - -void abCalcModeInit(void) -{ -} - - -abCalcModeIntBase abCalcModeGetBase(void) -{ - return gBase; -} - - -void abCalcModeSetBase(abCalcModeIntBase base) -{ - if ((base >= abCalcModeIntBaseMin) && - (base < abCalcModeIntBaseMax)) { - gBase = base; - } -} - - -int abCalcModeGetIntWidth(void) -{ - return gIntWidth; -} - - -void abCalcModeSetIntWidth(int width) -{ - if ((width > 0) && - (width <= AB_CALC_EXPR_MAX_INT_WIDTH)) { - gIntWidth = width; - } -} diff --git a/abCMode.h b/abCMode.h deleted file mode 100644 index 31aa46e..0000000 --- a/abCMode.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - abCMode.h - By: Jeremy Rand - */ - - -#ifndef ABCMODE_H -#define ABCMODE_H - - -#include "expr/abCExpr.h" - - -typedef enum abCalcModeIntBase -{ - abCalcModeIntBaseMin = 0, - abCalcModeBinBase = 0, - abCalcModeOctBase, - abCalcModeDecBase, - abCalcModeHexBase, - - abCalcModeIntBaseMax -} abCalcModeIntBase; - - -void abCalcModeInit(void); - -abCalcModeIntBase abCalcModeGetBase(void); - -void abCalcModeSetBase(abCalcModeIntBase base); - -int abCalcModeGetIntWidth(void); - -void abCalcModeSetIntWidth(int width); - - -#endif diff --git a/abCStack.c b/abCStack.c deleted file mode 100644 index dc806b7..0000000 --- a/abCStack.c +++ /dev/null @@ -1,103 +0,0 @@ -/* - abCStack.c - By: Jeremy Rand - */ - - -#include -#include -#include - -#include "abCStack.h" -#include "abCError.h" - - -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) { - abCalcRaiseError(abCalcStackFullError, NULL); - return 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 < 1) - return NULL; - - gStackNumItems--; - - if (expr != NULL) { - result = expr; - memcpy(expr, &(gStack[gStackNumItems]), sizeof(*expr)); - } - - return result; -} - - -int abCalcStackNumItems(void) -{ - return gStackNumItems; -} - - -abCalcExpr *abCalcStackExprAt(int depth) -{ - abCalcExpr *result = NULL; - if (depth < gStackNumItems) { - result = &(gStack[gStackNumItems - 1 - depth]); - } - - return result; -} - - -char *abCalcStackExprStringAt(int depth, char *buffer, int addPrefix) -{ - static char tmpBuffer[AB_CALC_EXPR_STRING_MAX]; - - if (buffer == NULL) - return NULL; - - if (addPrefix) { - sprintf(buffer, "%3d: ", depth + 1); - } else { - buffer[0] = '\0'; - } - if (depth < gStackNumItems) { - if (abCalcFormatExpr(&(gStack[gStackNumItems - 1 - depth]), tmpBuffer) != NULL) { - strcat(buffer, tmpBuffer); - } - } - - return buffer; -} - - -void abCalcStackClear(void) -{ - gStackNumItems = 0; -} diff --git a/abCStack.h b/abCStack.h deleted file mode 100644 index c62bc2c..0000000 --- a/abCStack.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - abCStack.h - By: Jeremy Rand - */ - - -#ifndef ABCSTACK_H -#define ABCSTACK_H - - -#include "expr/abCExpr.h" - - -#define AB_CALC_STACK_DEPTH 128 - - -void abCalcStackInit(void); - -abCalcExpr *abCalcStackExprPush(abCalcExpr *expr); - -abCalcExpr *abCalcStackExprPop(abCalcExpr *expr); - -abCalcExpr *abCalcStackExprAt(int depth); - -char *abCalcStackExprStringAt(int depth, char *buffer, int addPrefix); - -int abCalcStackNumItems(void); - -void abCalcStackClear(void); - - -#endif diff --git a/abCalc.c b/abCalc.c deleted file mode 100644 index 6083b42..0000000 --- a/abCalc.c +++ /dev/null @@ -1,32 +0,0 @@ -/* - abCalc.c - By: Jeremy Rand - */ - - -#include "abCMode.h" -#include "abCStack.h" -#include "abCError.h" - -#include "expr/abCExpr.h" -#include "expr/abCExprInt.h" -#include "expr/abCExpReal.h" - -#include "ops/abCOp.h" - - -void abCalcInit(void) -{ - abCalcExprInit(); - abCalcExprRealInit(); - abCalcExprIntInit(); - - abCalcModeInit(); - abCalcStackInit(); - - abCalcOpInit(); - - abCalcErrorInit(); -} - - diff --git a/abCalc.h b/abCalc.h deleted file mode 100644 index 11f7f3c..0000000 --- a/abCalc.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - abCalc.h - By: Jeremy Rand - */ - - -#ifndef ABCALC_H -#define ABCALC_H - - -void abCalcInit(void); - - -#endif diff --git a/abCalc.xcodeproj/project.pbxproj b/abCalc.xcodeproj/project.pbxproj new file mode 100644 index 0000000..8046c37 --- /dev/null +++ b/abCalc.xcodeproj/project.pbxproj @@ -0,0 +1,671 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 9D1B83E51F677D78006AA28A /* nda.mk in Sources */ = {isa = PBXBuildFile; fileRef = 9D1B83E41F677D78006AA28A /* nda.mk */; }; + 9D1B83E81F677D78006AA28A /* config.txt in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9D1B83E71F677D78006AA28A /* config.txt */; }; + 9D1B83EA1F677D78006AA28A /* createDiskImage in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9D1B83E91F677D78006AA28A /* createDiskImage */; }; + 9D1B83EC1F677D78006AA28A /* head.mk in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9D1B83EB1F677D78006AA28A /* head.mk */; }; + 9D1B83EE1F677D78006AA28A /* launchEmulator in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9D1B83ED1F677D78006AA28A /* launchEmulator */; }; + 9D1B83F01F677D78006AA28A /* orca-asm in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9D1B83EF1F677D78006AA28A /* orca-asm */; }; + 9D1B83F21F677D78006AA28A /* orca-cc in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9D1B83F11F677D78006AA28A /* orca-cc */; }; + 9D1B83F41F677D78006AA28A /* orca-macgen in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9D1B83F31F677D78006AA28A /* orca-macgen */; }; + 9D1B83F61F677D78006AA28A /* orca-rez in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9D1B83F51F677D78006AA28A /* orca-rez */; }; + 9D1B83F81F677D78006AA28A /* system601.2mg in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9D1B83F71F677D78006AA28A /* system601.2mg */; }; + 9D1B83FA1F677D78006AA28A /* tail.mk in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9D1B83F91F677D78006AA28A /* tail.mk */; }; + 9D1B83FD1F677D78006AA28A /* abCalc.xcscheme in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9D1B83FC1F677D78006AA28A /* abCalc.xcscheme */; }; + 9D1B84131F677D9A006AA28A /* abCalc.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D1B84061F677D9A006AA28A /* abCalc.c */; }; + 9D1B84161F677D9A006AA28A /* abCError.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D1B840C1F677D9A006AA28A /* abCError.c */; }; + 9D1B84181F677D9A006AA28A /* abCMode.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D1B840F1F677D9A006AA28A /* abCMode.c */; }; + 9D1B84191F677D9A006AA28A /* abCStack.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D1B84111F677D9A006AA28A /* abCStack.c */; }; + 9D1B841B1F677DAB006AA28A /* README.md in Sources */ = {isa = PBXBuildFile; fileRef = 9D1B841A1F677DAB006AA28A /* README.md */; }; + 9D1B84851F677E91006AA28A /* abCalcNDA.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D1B84821F677E91006AA28A /* abCalcNDA.c */; }; + 9D1B84861F677E91006AA28A /* abCalcNDA.h in Sources */ = {isa = PBXBuildFile; fileRef = 9D1B84831F677E91006AA28A /* abCalcNDA.h */; }; + 9D1B84881F677EA1006AA28A /* abCMain.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D1B84871F677EA1006AA28A /* abCMain.c */; }; + 9D1B848D1F67810E006AA28A /* Makefile in Sources */ = {isa = PBXBuildFile; fileRef = 9D1B848C1F67810E006AA28A /* Makefile */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 9D1B83DA1F677D78006AA28A /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + 9D1B83F41F677D78006AA28A /* orca-macgen in CopyFiles */, + 9D1B83F61F677D78006AA28A /* orca-rez in CopyFiles */, + 9D1B83EE1F677D78006AA28A /* launchEmulator in CopyFiles */, + 9D1B83FD1F677D78006AA28A /* abCalc.xcscheme in CopyFiles */, + 9D1B83F21F677D78006AA28A /* orca-cc in CopyFiles */, + 9D1B83FA1F677D78006AA28A /* tail.mk in CopyFiles */, + 9D1B83EA1F677D78006AA28A /* createDiskImage in CopyFiles */, + 9D1B83E81F677D78006AA28A /* config.txt in CopyFiles */, + 9D1B83F01F677D78006AA28A /* orca-asm in CopyFiles */, + 9D1B83EC1F677D78006AA28A /* head.mk in CopyFiles */, + 9D1B83F81F677D78006AA28A /* system601.2mg in CopyFiles */, + ); + runOnlyForDeploymentPostprocessing = 1; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 9D1B83DC1F677D78006AA28A /* doNotBuild */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = doNotBuild; sourceTree = BUILT_PRODUCTS_DIR; }; + 9D1B83E41F677D78006AA28A /* nda.mk */ = {isa = PBXFileReference; lastKnownFileType = text; path = nda.mk; sourceTree = ""; }; + 9D1B83E71F677D78006AA28A /* config.txt */ = {isa = PBXFileReference; lastKnownFileType = text; name = config.txt; path = make/config.txt; sourceTree = ""; }; + 9D1B83E91F677D78006AA28A /* createDiskImage */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; name = createDiskImage; path = make/createDiskImage; sourceTree = ""; }; + 9D1B83EB1F677D78006AA28A /* head.mk */ = {isa = PBXFileReference; lastKnownFileType = text; name = head.mk; path = make/head.mk; sourceTree = ""; }; + 9D1B83ED1F677D78006AA28A /* launchEmulator */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; name = launchEmulator; path = make/launchEmulator; sourceTree = ""; }; + 9D1B83EF1F677D78006AA28A /* orca-asm */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; name = "orca-asm"; path = "make/orca-asm"; sourceTree = ""; }; + 9D1B83F11F677D78006AA28A /* orca-cc */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; name = "orca-cc"; path = "make/orca-cc"; sourceTree = ""; }; + 9D1B83F31F677D78006AA28A /* orca-macgen */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; name = "orca-macgen"; path = "make/orca-macgen"; sourceTree = ""; }; + 9D1B83F51F677D78006AA28A /* orca-rez */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; name = "orca-rez"; path = "make/orca-rez"; sourceTree = ""; }; + 9D1B83F71F677D78006AA28A /* system601.2mg */ = {isa = PBXFileReference; lastKnownFileType = file; name = system601.2mg; path = make/system601.2mg; sourceTree = ""; }; + 9D1B83F91F677D78006AA28A /* tail.mk */ = {isa = PBXFileReference; lastKnownFileType = text; name = tail.mk; path = make/tail.mk; sourceTree = ""; }; + 9D1B83FC1F677D78006AA28A /* abCalc.xcscheme */ = {isa = PBXFileReference; lastKnownFileType = text.xml; name = abCalc.xcscheme; path = abCalc.xcodeproj/xcshareddata/xcschemes/abCalc.xcscheme; sourceTree = SOURCE_ROOT; }; + 9D1B84061F677D9A006AA28A /* abCalc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = abCalc.c; sourceTree = ""; }; + 9D1B84071F677D9A006AA28A /* abCalc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = abCalc.h; sourceTree = ""; }; + 9D1B840C1F677D9A006AA28A /* abCError.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = abCError.c; sourceTree = ""; }; + 9D1B840D1F677D9A006AA28A /* abCError.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = abCError.h; sourceTree = ""; }; + 9D1B840F1F677D9A006AA28A /* abCMode.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = abCMode.c; sourceTree = ""; }; + 9D1B84101F677D9A006AA28A /* abCMode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = abCMode.h; sourceTree = ""; }; + 9D1B84111F677D9A006AA28A /* abCStack.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = abCStack.c; sourceTree = ""; }; + 9D1B84121F677D9A006AA28A /* abCStack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = abCStack.h; sourceTree = ""; }; + 9D1B841A1F677DAB006AA28A /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; + 9D1B841D1F677DC6006AA28A /* abCExpr.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = abCExpr.c; sourceTree = ""; }; + 9D1B841E1F677DC6006AA28A /* abCExpr.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = abCExpr.h; sourceTree = ""; }; + 9D1B841F1F677DC6006AA28A /* abCExpReal.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = abCExpReal.c; sourceTree = ""; }; + 9D1B84201F677DC6006AA28A /* abCExpReal.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = abCExpReal.h; sourceTree = ""; }; + 9D1B84211F677DC6006AA28A /* abCExprInt.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = abCExprInt.c; sourceTree = ""; }; + 9D1B84221F677DC6006AA28A /* abCExprInt.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = abCExprInt.h; sourceTree = ""; }; + 9D1B84241F677DC6006AA28A /* abCOp.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = abCOp.c; sourceTree = ""; }; + 9D1B84251F677DC6006AA28A /* abCOp.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = abCOp.h; sourceTree = ""; }; + 9D1B84261F677DC6006AA28A /* abCOpAcos.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = abCOpAcos.c; sourceTree = ""; }; + 9D1B84271F677DC6006AA28A /* abCOpAcos.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = abCOpAcos.h; sourceTree = ""; }; + 9D1B84281F677DC6006AA28A /* abCOpAdd.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = abCOpAdd.c; sourceTree = ""; }; + 9D1B84291F677DC6006AA28A /* abCOpAdd.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = abCOpAdd.h; sourceTree = ""; }; + 9D1B842A1F677DC6006AA28A /* abCOpAlog.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = abCOpAlog.c; sourceTree = ""; }; + 9D1B842B1F677DC6006AA28A /* abCOpAlog.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = abCOpAlog.h; sourceTree = ""; }; + 9D1B842C1F677DC6006AA28A /* abCOpAnd.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = abCOpAnd.c; sourceTree = ""; }; + 9D1B842D1F677DC6006AA28A /* abCOpAnd.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = abCOpAnd.h; sourceTree = ""; }; + 9D1B842E1F677DC6006AA28A /* abCOpAsin.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = abCOpAsin.c; sourceTree = ""; }; + 9D1B842F1F677DC6006AA28A /* abCOpAsin.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = abCOpAsin.h; sourceTree = ""; }; + 9D1B84301F677DC6006AA28A /* abCOpAsr.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = abCOpAsr.c; sourceTree = ""; }; + 9D1B84311F677DC6006AA28A /* abCOpAsr.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = abCOpAsr.h; sourceTree = ""; }; + 9D1B84321F677DC6006AA28A /* abCOpAtan.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = abCOpAtan.c; sourceTree = ""; }; + 9D1B84331F677DC6006AA28A /* abCOpAtan.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = abCOpAtan.h; sourceTree = ""; }; + 9D1B84341F677DC6006AA28A /* abCOpB2R.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = abCOpB2R.c; sourceTree = ""; }; + 9D1B84351F677DC6006AA28A /* abCOpB2R.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = abCOpB2R.h; sourceTree = ""; }; + 9D1B84361F677DC6006AA28A /* abCOpBin.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = abCOpBin.c; sourceTree = ""; }; + 9D1B84371F677DC6006AA28A /* abCOpBin.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = abCOpBin.h; sourceTree = ""; }; + 9D1B84381F677DC6006AA28A /* abCOpChs.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = abCOpChs.c; sourceTree = ""; }; + 9D1B84391F677DC6006AA28A /* abCOpChs.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = abCOpChs.h; sourceTree = ""; }; + 9D1B843A1F677DC6006AA28A /* abCOpClear.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = abCOpClear.c; sourceTree = ""; }; + 9D1B843B1F677DC6006AA28A /* abCOpClear.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = abCOpClear.h; sourceTree = ""; }; + 9D1B843C1F677DC6006AA28A /* abCOpCos.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = abCOpCos.c; sourceTree = ""; }; + 9D1B843D1F677DC6006AA28A /* abCOpCos.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = abCOpCos.h; sourceTree = ""; }; + 9D1B843E1F677DC6006AA28A /* abCOpCosh.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = abCOpCosh.c; sourceTree = ""; }; + 9D1B843F1F677DC6006AA28A /* abCOpCosh.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = abCOpCosh.h; sourceTree = ""; }; + 9D1B84401F677DC6006AA28A /* abCOpDec.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = abCOpDec.c; sourceTree = ""; }; + 9D1B84411F677DC6006AA28A /* abCOpDec.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = abCOpDec.h; sourceTree = ""; }; + 9D1B84421F677DC6006AA28A /* abCOpDiv.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = abCOpDiv.c; sourceTree = ""; }; + 9D1B84431F677DC6006AA28A /* abCOpDiv.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = abCOpDiv.h; sourceTree = ""; }; + 9D1B84441F677DC6006AA28A /* abCOpDrop.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = abCOpDrop.c; sourceTree = ""; }; + 9D1B84451F677DC6006AA28A /* abCOpDrop.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = abCOpDrop.h; sourceTree = ""; }; + 9D1B84461F677DC6006AA28A /* abCOpExp.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = abCOpExp.c; sourceTree = ""; }; + 9D1B84471F677DC6006AA28A /* abCOpExp.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = abCOpExp.h; sourceTree = ""; }; + 9D1B84481F677DC6006AA28A /* abCOpHex.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = abCOpHex.c; sourceTree = ""; }; + 9D1B84491F677DC6006AA28A /* abCOpHex.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = abCOpHex.h; sourceTree = ""; }; + 9D1B844A1F677DC6006AA28A /* abCOpInv.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = abCOpInv.c; sourceTree = ""; }; + 9D1B844B1F677DC6006AA28A /* abCOpInv.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = abCOpInv.h; sourceTree = ""; }; + 9D1B844C1F677DC6006AA28A /* abCOpLn.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = abCOpLn.c; sourceTree = ""; }; + 9D1B844D1F677DC6006AA28A /* abCOpLn.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = abCOpLn.h; sourceTree = ""; }; + 9D1B844E1F677DC6006AA28A /* abCOpLog.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = abCOpLog.c; sourceTree = ""; }; + 9D1B844F1F677DC6006AA28A /* abCOpLog.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = abCOpLog.h; sourceTree = ""; }; + 9D1B84501F677DC6006AA28A /* abCOpMult.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = abCOpMult.c; sourceTree = ""; }; + 9D1B84511F677DC6006AA28A /* abCOpMult.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = abCOpMult.h; sourceTree = ""; }; + 9D1B84521F677DC6006AA28A /* abCOpNot.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = abCOpNot.c; sourceTree = ""; }; + 9D1B84531F677DC6006AA28A /* abCOpNot.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = abCOpNot.h; sourceTree = ""; }; + 9D1B84541F677DC6006AA28A /* abCOpOct.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = abCOpOct.c; sourceTree = ""; }; + 9D1B84551F677DC6006AA28A /* abCOpOct.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = abCOpOct.h; sourceTree = ""; }; + 9D1B84561F677DC6006AA28A /* abCOpOr.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = abCOpOr.c; sourceTree = ""; }; + 9D1B84571F677DC6006AA28A /* abCOpOr.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = abCOpOr.h; sourceTree = ""; }; + 9D1B84581F677DC6006AA28A /* abCOpPi.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = abCOpPi.c; sourceTree = ""; }; + 9D1B84591F677DC6006AA28A /* abCOpPi.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = abCOpPi.h; sourceTree = ""; }; + 9D1B845A1F677DC6006AA28A /* abCOpPower.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = abCOpPower.c; sourceTree = ""; }; + 9D1B845B1F677DC6006AA28A /* abCOpPower.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = abCOpPower.h; sourceTree = ""; }; + 9D1B845C1F677DC6006AA28A /* abCOpR2B.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = abCOpR2B.c; sourceTree = ""; }; + 9D1B845D1F677DC6006AA28A /* abCOpR2B.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = abCOpR2B.h; sourceTree = ""; }; + 9D1B845E1F677DC6006AA28A /* abCOpRcws.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = abCOpRcws.c; sourceTree = ""; }; + 9D1B845F1F677DC6006AA28A /* abCOpRcws.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = abCOpRcws.h; sourceTree = ""; }; + 9D1B84601F677DC6006AA28A /* abCOpRl.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = abCOpRl.c; sourceTree = ""; }; + 9D1B84611F677DC6006AA28A /* abCOpRl.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = abCOpRl.h; sourceTree = ""; }; + 9D1B84621F677DC6006AA28A /* abCOpRr.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = abCOpRr.c; sourceTree = ""; }; + 9D1B84631F677DC6006AA28A /* abCOpRr.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = abCOpRr.h; sourceTree = ""; }; + 9D1B84641F677DC6006AA28A /* abCOpSin.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = abCOpSin.c; sourceTree = ""; }; + 9D1B84651F677DC6006AA28A /* abCOpSin.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = abCOpSin.h; sourceTree = ""; }; + 9D1B84661F677DC6006AA28A /* abCOpSinh.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = abCOpSinh.c; sourceTree = ""; }; + 9D1B84671F677DC6006AA28A /* abCOpSinh.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = abCOpSinh.h; sourceTree = ""; }; + 9D1B84681F677DC6006AA28A /* abCOpSl.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = abCOpSl.c; sourceTree = ""; }; + 9D1B84691F677DC6006AA28A /* abCOpSl.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = abCOpSl.h; sourceTree = ""; }; + 9D1B846A1F677DC6006AA28A /* abCOpSq.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = abCOpSq.c; sourceTree = ""; }; + 9D1B846B1F677DC6006AA28A /* abCOpSq.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = abCOpSq.h; sourceTree = ""; }; + 9D1B846C1F677DC6006AA28A /* abCOpSqrt.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = abCOpSqrt.c; sourceTree = ""; }; + 9D1B846D1F677DC6006AA28A /* abCOpSqrt.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = abCOpSqrt.h; sourceTree = ""; }; + 9D1B846E1F677DC6006AA28A /* abCOpSr.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = abCOpSr.c; sourceTree = ""; }; + 9D1B846F1F677DC6006AA28A /* abCOpSr.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = abCOpSr.h; sourceTree = ""; }; + 9D1B84701F677DC6006AA28A /* abCOpStws.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = abCOpStws.c; sourceTree = ""; }; + 9D1B84711F677DC6006AA28A /* abCOpStws.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = abCOpStws.h; sourceTree = ""; }; + 9D1B84721F677DC6006AA28A /* abCOpSubtr.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = abCOpSubtr.c; sourceTree = ""; }; + 9D1B84731F677DC6006AA28A /* abCOpSubtr.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = abCOpSubtr.h; sourceTree = ""; }; + 9D1B84741F677DC6006AA28A /* abCOpSwap.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = abCOpSwap.c; sourceTree = ""; }; + 9D1B84751F677DC6006AA28A /* abCOpSwap.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = abCOpSwap.h; sourceTree = ""; }; + 9D1B84761F677DC6006AA28A /* abCOpTan.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = abCOpTan.c; sourceTree = ""; }; + 9D1B84771F677DC6006AA28A /* abCOpTan.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = abCOpTan.h; sourceTree = ""; }; + 9D1B84781F677DC6006AA28A /* abCOpTanh.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = abCOpTanh.c; sourceTree = ""; }; + 9D1B84791F677DC6006AA28A /* abCOpTanh.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = abCOpTanh.h; sourceTree = ""; }; + 9D1B847A1F677DC6006AA28A /* abCOpXor.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = abCOpXor.c; sourceTree = ""; }; + 9D1B847B1F677DC6006AA28A /* abCOpXor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = abCOpXor.h; sourceTree = ""; }; + 9D1B847D1F677DC6006AA28A /* abCalc.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = abCalc.png; sourceTree = ""; }; + 9D1B847E1F677DC6006AA28A /* abCalcNDA.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = abCalcNDA.png; sourceTree = ""; }; + 9D1B84821F677E91006AA28A /* abCalcNDA.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = abCalcNDA.c; path = NDA/abCalcNDA.c; sourceTree = ""; }; + 9D1B84831F677E91006AA28A /* abCalcNDA.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = abCalcNDA.h; path = NDA/abCalcNDA.h; sourceTree = ""; }; + 9D1B84841F677E91006AA28A /* abCalcNDA.rez */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.rez; name = abCalcNDA.rez; path = NDA/abCalcNDA.rez; sourceTree = ""; }; + 9D1B84871F677EA1006AA28A /* abCMain.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = abCMain.c; path = Shell/abCMain.c; sourceTree = ""; }; + 9D1B848A1F677FB0006AA28A /* abCalcHelp */ = {isa = PBXFileReference; lastKnownFileType = text; name = abCalcHelp; path = copydir/abCalcHelp; sourceTree = ""; }; + 9D1B848B1F67808A006AA28A /* shell.mk */ = {isa = PBXFileReference; lastKnownFileType = text; path = shell.mk; sourceTree = ""; }; + 9D1B848C1F67810E006AA28A /* Makefile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.make; path = Makefile; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 9D1B83D91F677D78006AA28A /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 9D1B83D21F677D78006AA28A = { + isa = PBXGroup; + children = ( + 9D1B83DE1F677D78006AA28A /* abCalc */, + 9D1B83DD1F677D78006AA28A /* Products */, + ); + sourceTree = ""; + }; + 9D1B83DD1F677D78006AA28A /* Products */ = { + isa = PBXGroup; + children = ( + 9D1B83DC1F677D78006AA28A /* doNotBuild */, + ); + name = Products; + sourceTree = ""; + }; + 9D1B83DE1F677D78006AA28A /* abCalc */ = { + isa = PBXGroup; + children = ( + 9D1B84061F677D9A006AA28A /* abCalc.c */, + 9D1B84071F677D9A006AA28A /* abCalc.h */, + 9D1B840C1F677D9A006AA28A /* abCError.c */, + 9D1B840D1F677D9A006AA28A /* abCError.h */, + 9D1B840F1F677D9A006AA28A /* abCMode.c */, + 9D1B84101F677D9A006AA28A /* abCMode.h */, + 9D1B84111F677D9A006AA28A /* abCStack.c */, + 9D1B84121F677D9A006AA28A /* abCStack.h */, + 9D1B848C1F67810E006AA28A /* Makefile */, + 9D1B83E41F677D78006AA28A /* nda.mk */, + 9D1B848B1F67808A006AA28A /* shell.mk */, + 9D1B841A1F677DAB006AA28A /* README.md */, + 9D1B84811F677E27006AA28A /* shell */, + 9D1B847F1F677E14006AA28A /* nda */, + 9D1B841C1F677DC6006AA28A /* expr */, + 9D1B84231F677DC6006AA28A /* ops */, + 9D1B847C1F677DC6006AA28A /* screenshots */, + 9D1B84891F677F9F006AA28A /* copydir */, + 9D1B83E61F677D78006AA28A /* make */, + 9D1B83FB1F677D78006AA28A /* Supporting Files */, + ); + path = abCalc; + sourceTree = ""; + }; + 9D1B83E61F677D78006AA28A /* make */ = { + isa = PBXGroup; + children = ( + 9D1B83E71F677D78006AA28A /* config.txt */, + 9D1B83E91F677D78006AA28A /* createDiskImage */, + 9D1B83EB1F677D78006AA28A /* head.mk */, + 9D1B83ED1F677D78006AA28A /* launchEmulator */, + 9D1B83EF1F677D78006AA28A /* orca-asm */, + 9D1B83F11F677D78006AA28A /* orca-cc */, + 9D1B83F31F677D78006AA28A /* orca-macgen */, + 9D1B83F51F677D78006AA28A /* orca-rez */, + 9D1B83F71F677D78006AA28A /* system601.2mg */, + 9D1B83F91F677D78006AA28A /* tail.mk */, + ); + name = make; + sourceTree = ""; + }; + 9D1B83FB1F677D78006AA28A /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 9D1B83FC1F677D78006AA28A /* abCalc.xcscheme */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 9D1B841C1F677DC6006AA28A /* expr */ = { + isa = PBXGroup; + children = ( + 9D1B841D1F677DC6006AA28A /* abCExpr.c */, + 9D1B841E1F677DC6006AA28A /* abCExpr.h */, + 9D1B841F1F677DC6006AA28A /* abCExpReal.c */, + 9D1B84201F677DC6006AA28A /* abCExpReal.h */, + 9D1B84211F677DC6006AA28A /* abCExprInt.c */, + 9D1B84221F677DC6006AA28A /* abCExprInt.h */, + ); + path = expr; + sourceTree = ""; + }; + 9D1B84231F677DC6006AA28A /* ops */ = { + isa = PBXGroup; + children = ( + 9D1B84241F677DC6006AA28A /* abCOp.c */, + 9D1B84251F677DC6006AA28A /* abCOp.h */, + 9D1B84261F677DC6006AA28A /* abCOpAcos.c */, + 9D1B84271F677DC6006AA28A /* abCOpAcos.h */, + 9D1B84281F677DC6006AA28A /* abCOpAdd.c */, + 9D1B84291F677DC6006AA28A /* abCOpAdd.h */, + 9D1B842A1F677DC6006AA28A /* abCOpAlog.c */, + 9D1B842B1F677DC6006AA28A /* abCOpAlog.h */, + 9D1B842C1F677DC6006AA28A /* abCOpAnd.c */, + 9D1B842D1F677DC6006AA28A /* abCOpAnd.h */, + 9D1B842E1F677DC6006AA28A /* abCOpAsin.c */, + 9D1B842F1F677DC6006AA28A /* abCOpAsin.h */, + 9D1B84301F677DC6006AA28A /* abCOpAsr.c */, + 9D1B84311F677DC6006AA28A /* abCOpAsr.h */, + 9D1B84321F677DC6006AA28A /* abCOpAtan.c */, + 9D1B84331F677DC6006AA28A /* abCOpAtan.h */, + 9D1B84341F677DC6006AA28A /* abCOpB2R.c */, + 9D1B84351F677DC6006AA28A /* abCOpB2R.h */, + 9D1B84361F677DC6006AA28A /* abCOpBin.c */, + 9D1B84371F677DC6006AA28A /* abCOpBin.h */, + 9D1B84381F677DC6006AA28A /* abCOpChs.c */, + 9D1B84391F677DC6006AA28A /* abCOpChs.h */, + 9D1B843A1F677DC6006AA28A /* abCOpClear.c */, + 9D1B843B1F677DC6006AA28A /* abCOpClear.h */, + 9D1B843C1F677DC6006AA28A /* abCOpCos.c */, + 9D1B843D1F677DC6006AA28A /* abCOpCos.h */, + 9D1B843E1F677DC6006AA28A /* abCOpCosh.c */, + 9D1B843F1F677DC6006AA28A /* abCOpCosh.h */, + 9D1B84401F677DC6006AA28A /* abCOpDec.c */, + 9D1B84411F677DC6006AA28A /* abCOpDec.h */, + 9D1B84421F677DC6006AA28A /* abCOpDiv.c */, + 9D1B84431F677DC6006AA28A /* abCOpDiv.h */, + 9D1B84441F677DC6006AA28A /* abCOpDrop.c */, + 9D1B84451F677DC6006AA28A /* abCOpDrop.h */, + 9D1B84461F677DC6006AA28A /* abCOpExp.c */, + 9D1B84471F677DC6006AA28A /* abCOpExp.h */, + 9D1B84481F677DC6006AA28A /* abCOpHex.c */, + 9D1B84491F677DC6006AA28A /* abCOpHex.h */, + 9D1B844A1F677DC6006AA28A /* abCOpInv.c */, + 9D1B844B1F677DC6006AA28A /* abCOpInv.h */, + 9D1B844C1F677DC6006AA28A /* abCOpLn.c */, + 9D1B844D1F677DC6006AA28A /* abCOpLn.h */, + 9D1B844E1F677DC6006AA28A /* abCOpLog.c */, + 9D1B844F1F677DC6006AA28A /* abCOpLog.h */, + 9D1B84501F677DC6006AA28A /* abCOpMult.c */, + 9D1B84511F677DC6006AA28A /* abCOpMult.h */, + 9D1B84521F677DC6006AA28A /* abCOpNot.c */, + 9D1B84531F677DC6006AA28A /* abCOpNot.h */, + 9D1B84541F677DC6006AA28A /* abCOpOct.c */, + 9D1B84551F677DC6006AA28A /* abCOpOct.h */, + 9D1B84561F677DC6006AA28A /* abCOpOr.c */, + 9D1B84571F677DC6006AA28A /* abCOpOr.h */, + 9D1B84581F677DC6006AA28A /* abCOpPi.c */, + 9D1B84591F677DC6006AA28A /* abCOpPi.h */, + 9D1B845A1F677DC6006AA28A /* abCOpPower.c */, + 9D1B845B1F677DC6006AA28A /* abCOpPower.h */, + 9D1B845C1F677DC6006AA28A /* abCOpR2B.c */, + 9D1B845D1F677DC6006AA28A /* abCOpR2B.h */, + 9D1B845E1F677DC6006AA28A /* abCOpRcws.c */, + 9D1B845F1F677DC6006AA28A /* abCOpRcws.h */, + 9D1B84601F677DC6006AA28A /* abCOpRl.c */, + 9D1B84611F677DC6006AA28A /* abCOpRl.h */, + 9D1B84621F677DC6006AA28A /* abCOpRr.c */, + 9D1B84631F677DC6006AA28A /* abCOpRr.h */, + 9D1B84641F677DC6006AA28A /* abCOpSin.c */, + 9D1B84651F677DC6006AA28A /* abCOpSin.h */, + 9D1B84661F677DC6006AA28A /* abCOpSinh.c */, + 9D1B84671F677DC6006AA28A /* abCOpSinh.h */, + 9D1B84681F677DC6006AA28A /* abCOpSl.c */, + 9D1B84691F677DC6006AA28A /* abCOpSl.h */, + 9D1B846A1F677DC6006AA28A /* abCOpSq.c */, + 9D1B846B1F677DC6006AA28A /* abCOpSq.h */, + 9D1B846C1F677DC6006AA28A /* abCOpSqrt.c */, + 9D1B846D1F677DC6006AA28A /* abCOpSqrt.h */, + 9D1B846E1F677DC6006AA28A /* abCOpSr.c */, + 9D1B846F1F677DC6006AA28A /* abCOpSr.h */, + 9D1B84701F677DC6006AA28A /* abCOpStws.c */, + 9D1B84711F677DC6006AA28A /* abCOpStws.h */, + 9D1B84721F677DC6006AA28A /* abCOpSubtr.c */, + 9D1B84731F677DC6006AA28A /* abCOpSubtr.h */, + 9D1B84741F677DC6006AA28A /* abCOpSwap.c */, + 9D1B84751F677DC6006AA28A /* abCOpSwap.h */, + 9D1B84761F677DC6006AA28A /* abCOpTan.c */, + 9D1B84771F677DC6006AA28A /* abCOpTan.h */, + 9D1B84781F677DC6006AA28A /* abCOpTanh.c */, + 9D1B84791F677DC6006AA28A /* abCOpTanh.h */, + 9D1B847A1F677DC6006AA28A /* abCOpXor.c */, + 9D1B847B1F677DC6006AA28A /* abCOpXor.h */, + ); + path = ops; + sourceTree = ""; + }; + 9D1B847C1F677DC6006AA28A /* screenshots */ = { + isa = PBXGroup; + children = ( + 9D1B847D1F677DC6006AA28A /* abCalc.png */, + 9D1B847E1F677DC6006AA28A /* abCalcNDA.png */, + ); + path = screenshots; + sourceTree = ""; + }; + 9D1B847F1F677E14006AA28A /* nda */ = { + isa = PBXGroup; + children = ( + 9D1B84821F677E91006AA28A /* abCalcNDA.c */, + 9D1B84831F677E91006AA28A /* abCalcNDA.h */, + 9D1B84841F677E91006AA28A /* abCalcNDA.rez */, + ); + name = nda; + sourceTree = ""; + }; + 9D1B84811F677E27006AA28A /* shell */ = { + isa = PBXGroup; + children = ( + 9D1B84871F677EA1006AA28A /* abCMain.c */, + ); + name = shell; + sourceTree = ""; + }; + 9D1B84891F677F9F006AA28A /* copydir */ = { + isa = PBXGroup; + children = ( + 9D1B848A1F677FB0006AA28A /* abCalcHelp */, + ); + name = copydir; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXLegacyTarget section */ + 9D1B83D71F677D78006AA28A /* abCalc */ = { + isa = PBXLegacyTarget; + buildArgumentsString = "-C abCalc $(ACTION)"; + buildConfigurationList = 9D1B84001F677D78006AA28A /* Build configuration list for PBXLegacyTarget "abCalc" */; + buildPhases = ( + ); + buildToolPath = /usr/bin/make; + dependencies = ( + ); + name = abCalc; + passBuildSettingsInEnvironment = 1; + productName = abCalc; + }; +/* End PBXLegacyTarget section */ + +/* Begin PBXNativeTarget section */ + 9D1B83DB1F677D78006AA28A /* doNotBuild */ = { + isa = PBXNativeTarget; + buildConfigurationList = 9D1B84031F677D78006AA28A /* Build configuration list for PBXNativeTarget "doNotBuild" */; + buildPhases = ( + 9D1B83D81F677D78006AA28A /* Sources */, + 9D1B83D91F677D78006AA28A /* Frameworks */, + 9D1B83DA1F677D78006AA28A /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = doNotBuild; + productName = doNotBuild; + productReference = 9D1B83DC1F677D78006AA28A /* doNotBuild */; + productType = "com.apple.product-type.tool"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 9D1B83D31F677D78006AA28A /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0830; + ORGANIZATIONNAME = "Jeremy Rand"; + TargetAttributes = { + 9D1B83D71F677D78006AA28A = { + CreatedOnToolsVersion = 8.3.3; + ProvisioningStyle = Automatic; + }; + 9D1B83DB1F677D78006AA28A = { + CreatedOnToolsVersion = 8.3.3; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = 9D1B83D61F677D78006AA28A /* Build configuration list for PBXProject "abCalc" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = 9D1B83D21F677D78006AA28A; + productRefGroup = 9D1B83DD1F677D78006AA28A /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 9D1B83D71F677D78006AA28A /* abCalc */, + 9D1B83DB1F677D78006AA28A /* doNotBuild */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + 9D1B83D81F677D78006AA28A /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 9D1B84191F677D9A006AA28A /* abCStack.c in Sources */, + 9D1B83E51F677D78006AA28A /* nda.mk in Sources */, + 9D1B841B1F677DAB006AA28A /* README.md in Sources */, + 9D1B848D1F67810E006AA28A /* Makefile in Sources */, + 9D1B84161F677D9A006AA28A /* abCError.c in Sources */, + 9D1B84851F677E91006AA28A /* abCalcNDA.c in Sources */, + 9D1B84181F677D9A006AA28A /* abCMode.c in Sources */, + 9D1B84861F677E91006AA28A /* abCalcNDA.h in Sources */, + 9D1B84131F677D9A006AA28A /* abCalc.c in Sources */, + 9D1B84881F677EA1006AA28A /* abCMain.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 9D1B83FE1F677D78006AA28A /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + }; + name = Debug; + }; + 9D1B83FF1F677D78006AA28A /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MTL_ENABLE_DEBUG_INFO = NO; + }; + name = Release; + }; + 9D1B84011F677D78006AA28A /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + DEBUGGING_SYMBOLS = YES; + DEBUG_INFORMATION_FORMAT = dwarf; + GCC_GENERATE_DEBUGGING_SYMBOLS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + OTHER_CFLAGS = ""; + OTHER_LDFLAGS = ""; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 9D1B84021F677D78006AA28A /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + OTHER_CFLAGS = ""; + OTHER_LDFLAGS = ""; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 9D1B84041F677D78006AA28A /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_PREPROCESSOR_DEFINITIONS = ( + "inline(X,Y)=\"\"\n", + "pascal=\"\"", + ); + HEADER_SEARCH_PATHS = ( + "$GOLDEN_GATE/Libraries/ORCACDefs\n", + "~/Library/GoldenGate/Libraries/ORCACDefs\n", + "/Library/GoldenGate/Libraries/ORCACDefs\n", + "~/GoldenGate/Libraries/ORCACDefs", + ); + PRODUCT_NAME = doNotBuild; + }; + name = Debug; + }; + 9D1B84051F677D78006AA28A /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_PREPROCESSOR_DEFINITIONS = ( + "inline(X,Y)=\"\"\n", + "pascal=\"\"", + ); + HEADER_SEARCH_PATHS = ( + "$GOLDEN_GATE/Libraries/ORCACDefs\n", + "~/Library/GoldenGate/Libraries/ORCACDefs\n", + "/Library/GoldenGate/Libraries/ORCACDefs\n", + "~/GoldenGate/Libraries/ORCACDefs", + ); + PRODUCT_NAME = doNotBuild; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 9D1B83D61F677D78006AA28A /* Build configuration list for PBXProject "abCalc" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 9D1B83FE1F677D78006AA28A /* Debug */, + 9D1B83FF1F677D78006AA28A /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 9D1B84001F677D78006AA28A /* Build configuration list for PBXLegacyTarget "abCalc" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 9D1B84011F677D78006AA28A /* Debug */, + 9D1B84021F677D78006AA28A /* Release */, + ); + defaultConfigurationIsVisible = 0; + }; + 9D1B84031F677D78006AA28A /* Build configuration list for PBXNativeTarget "doNotBuild" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 9D1B84041F677D78006AA28A /* Debug */, + 9D1B84051F677D78006AA28A /* Release */, + ); + defaultConfigurationIsVisible = 0; + }; +/* End XCConfigurationList section */ + }; + rootObject = 9D1B83D31F677D78006AA28A /* Project object */; +} diff --git a/abCalc.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/abCalc.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..d343921 --- /dev/null +++ b/abCalc.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/abCalc.xcodeproj/project.xcworkspace/xcuserdata/jrand.xcuserdatad/UserInterfaceState.xcuserstate b/abCalc.xcodeproj/project.xcworkspace/xcuserdata/jrand.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..434fe9bfb6ada2220b1077ad2243ee3a33c0ad74 GIT binary patch literal 19549 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/abCalc.xcodeproj/xcuserdata/jrand.xcuserdatad/xcschemes/doNotBuild.xcscheme b/abCalc.xcodeproj/xcuserdata/jrand.xcuserdatad/xcschemes/doNotBuild.xcscheme new file mode 100644 index 0000000..6ef63bd --- /dev/null +++ b/abCalc.xcodeproj/xcuserdata/jrand.xcuserdatad/xcschemes/doNotBuild.xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/abCalc.xcodeproj/xcuserdata/jrand.xcuserdatad/xcschemes/xcschememanagement.plist b/abCalc.xcodeproj/xcuserdata/jrand.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..bb3a56c --- /dev/null +++ b/abCalc.xcodeproj/xcuserdata/jrand.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,32 @@ + + + + + SchemeUserState + + abCalc.xcscheme_^#shared#^_ + + orderHint + 0 + + doNotBuild.xcscheme + + orderHint + 1 + + + SuppressBuildableAutocreation + + 9D1B83D71F677D78006AA28A + + primary + + + 9D1B83DB1F677D78006AA28A + + primary + + + + + diff --git a/abCalcHelp b/abCalcHelp deleted file mode 100644 index 1b9a5cb..0000000 --- a/abCalcHelp +++ /dev/null @@ -1 +0,0 @@ -Ass-Backwards Calculator Help: This document is split into the following sections: 1. Installation 2. UI Overview 3. Shell UI 4. A Bit About RPN 5. Number Formats 6. Operations 1. Installation: To install abCalc, drag the file abCalcNDA to the Desk.Accs folder in your System folder on your boot drive. After rebooting, you should find "abCalc" in the Apple menu in any GUI application on your Apple //GS. Alternatively, if you have the IR Finder extra installed, you can just double click abCalcNDA from the Finder whenever you want to launch it. If you reboot, you will have to double click it again to add it because it won't be loaded automatically on boot up. 2. UI Overview: The abCalc UI is split into the following major components: 1. The list at the top is the "stack" where the numbers you are working with will be displayed. The stack always displays at least four items, even if there are not four things on the stack. Each item on the stack is prefixed with a number which is its depth on the stack where "1:" is the label for the item at the top of the stack and "2:" is the number just below the top of the stack, etc. The number at the top of the stack is displayed at the bottom of the list (did I mention that the NDA is called the "Ass-Backwards Calculator"). Any non-empty row on the stack can be selected and you can do a copy operation on the row. The number on that row will be copied to the clipboard. 2. On the left side, directly below the stack is the entry box. This is where you can type in new numbers which go on the stack. You can actually do everything with abCalc with the keyboard. You can type in numbers or operations which manipulate the numbers on your stack. If you are typing in operations, you can type them in upper-case, lower-case or any mixture. abCalc does a case insensitive match for the operation. You can select text in the entry box and do the usual cut, copy and paste operations your selection. 3. On the right side, directly below the stack is a long list of the operations available in abCalc. The operations are sorted into an order which groups them into the following types: arithmetic, stack, trigonomety, exponentials and logical. You can scroll through the operations but be careful. Just clicking on an operation in the list will result in that operation being executed. So, items in the list operate both as a cheat sheet of the operations available and as a way to execute those operations. 4. Below the entry box is a series of buttons which make abCalc look just a bit like a classic calculator. You can use these buttons by clicking on them using your mouse or you can just type into the entry box directly. Whichever way you want to work. Note that the "+", "-", "x", "/" and "^" buttons do the same thing as their counterparts listed in the operation list. So you can add numbers in three ways: you can click the "+" button, you can click the "+" item in the operation list or you can type + followed by enter on your keyboard. The numbers 1 to 9 and letters A to F are there to allow you to enter numbers in both decimal and hexidecimal (hex numbers consist of numbers 1-9 and letters A-F). When you click them, the number or letter is inserted into the entry box. Similarly the period and # buttons insert those characters into the entry box. See number formats for the meaning the the # character. 3. Shell UI: Included with abCalcNDA is a shell EXE called abCalc which you can use from GNO/ME if you have that installed on your Apple //GS. It has all the functionality of the NDA. When you launch the command from the shell, you will see the stack printed and a prompt where you can enter your numbers and operations. You enter numbers the same way you would using the NDA. All of the operations are supported from the shell version as are supported from the NDA. So, to calculate "4 x 2", you would type 4 2 * . When you are done and want to leave abCalc, just type Ctrl-D. 4. A Bit About RPN: Let's talk about some more backward-ness. RPN stands for "Reverse Polish Notation" and it is a different way to write arithmetic expressions. People are used to things like "1 + 2" but in RPN, that would be "1 2 +". The way to think about this is "Put the number 1 on the stack, then put the number 2 on the stack, then execute the + operation which takes the last two numbers from the stack, adds them and puts the result back on the stack". So, if you wanted to calculate "1+2" on abCalc, you would type or click the following: "1 2 +". NOTE, you can actually avoid pressing the second if you click the + button or the + operation from the operation list. When you click a button which executes an operation or select an operation from the operation list, anything in the entry box is first pushed onto the stack. Then, it executes the operation you selected. This is just a small shortcut you can use. In my examples in this section, I will always include the unnecessary . You can do more complex calculations by combining operations together. Imagine you wanted to calculate "(1+2)*3". In abCalc, you would type or click the following: "1 2 + 3 *". But, what if you wanted "1+(2*3)". That is easy also: "1 2 3 * +". In general, abCalc has two fundamental types of operations: unary operations and binary operations. Addition and multiplication is a binary operation because it takes two items from the stack (two - thus binary) and pushes a single result back onto the stack. A unary operation takes a single number from the stack and pushes a single result back onto the stack. An example of a unary operation is SIN which calculates the sine of a number in radians. So, to calculate "sine(4)", you would type or click the follwing: "4 ". To calcuate "3*(sin(4-2))", you would type or click the following: "3 4 2 <-> <*>". Remember, you can click SIN from the operation list or you can type "sin" into the entry box to execute the sine operation. Operations use case insensitive matching so you can enter "Sin", "sin", "SIN" or even "SiN". Whatever you like. There are operations which are neither unary nor binary (like DROP, CLEAR and RCWS) and those are documented later. RPN may seem unnatural and "ass-backwards" but with practice, it can start to become second nature to the point where you may dread using a standard calculator. 5. Number Formats: abCalc operates on two types of numbers: real numbers and integer numbers. Real numbers are standard decimal numbers which may or may not have a fractional part. They may be expressed as an exponential number, like 6.283E15 which means "6.283 times 10 to the power of 15". The exponential can be negative for a very small number, like 4.712E-13 which means "4.712 times 10 to the power of minus 13". abCalc will automatically display very large or very small real numbers in exponential format. Entering negative real numbers and negative exponentials causes a minor problem in the calculator. The "-" character normally executes the subtract operation. There are some exceptions though. If the entry box is empty, pressing the "-" character will insert a minus character into the entry box. The calculator is assuming you want to enter a negative number. If you actually wanted the subtract operation, just press "" and the calculator will perform a subtract. If you have a positive or negative real number in the entry box followed by "E" or "e", then the calculator assumes you are entering an exponential number. If you then type "-" or hit the "-" button, it will insert a minus character after the "E". This allows you to enter negative exponents. If you have a number on the stack which you want to make negative, you probably want the CHS (change sign) operation. Integer numbers start with a "#" character. But before entering an integer, you need to know what base you are in and the bit width. By default, the calculator is in decimal mode and expects base 10 numbers. You can switch between bases by using the BIN (binary), OCT (octal), DEC (decimal) and HEX (hexadecimal) operations. The integer number you enter is interpreted using that base so if you are not sure, you may want to execute the specific base you intend to use. After the "#" character comes a series of 0's and 1's when entering a binary number. Or numbers from 0 to 7 for an octal number. In decimal mode, you would enter digits from 0 to 9. And in hexadecimal, the digits are the numbers from 0 to 9 and letters A through F. The letters can be entered in lower or uppercase when entering a hexadecimal number. An integer on the stack has the "#" prefix but also has a suffix to tell you the current base. The suffix is "b" for binary, "o" for octal, "d" for decimal and "h" for hexadecimal. This entry and display format is often used in HP RPN calculators which abCalc somewhat mimics. Other than the base, the other thing to be aware of with integer numbers is the current word size. By default, the calculator manipulates 32 bit integers. That means you can enter an integer from #00000000h to $FFFFFFFFh. But you can use the STWS operation to specify a different word size for your integers. If you want to work with 16 bit integers, push the real number "16" onto the stack and execute STWS. You can set the word size to any value from 1 to 32. All operations which manipulate integers respect that word size. So, if you rotate the bits in your integer to the left, then the high bit according to the current word size is rotated into the low bit. This way, if you want to do 8 bit math, 16 bit math or even 5 bit math, it is just a matter of setting your word size. There are two shortcuts when entering integers. Regardless of the current base, you can always enter a hex number by prefixing it with a "$" character. So, you can enter the hex number 42 by entering "$42" even if you happen to be in decimal mode. Also, you can use C like syntax and enter the hex number as "0x42". Note that C syntax for octal numbers does not work. The octal number 42 in C would be represented as "042" but that cannot be distinguished from the real number 42 with a leading zero. So, these shortcuts only work for hex numbers. Note that you can use the R2B and B2R operations to convert real numbers to integers and integer numbers to real numbers respectively. 6. Operations: All of these operations can be entered directly into the entry box or selected from the operation list on the right side of the UI. The descriptions below are grouped into a series of related operations. Arithmetic Operations: +: The add operation takes two numbers from the stack and pushes the sum of those two numbers. The operation works with two real numbers and pushes a real number result. It also works with two integer numbers and pushes ain integer result. And you can add a real number and an integer number. When you add a real and integer number, the real number is converted to an integer in the current word size and then those two numbers are added. The result is an integer number. -: The subtract operation takes two numbers from the stack and pushes the difference of those two numbers. To calculate "4 - 2", you would push 4, then 2 and then do the subtract. The operation works with two real numbers and pushes a real number result. It also works with two integer numbers and pushes an integer result. And you can subtract a real number and an integer number. When you subtract a real and integer number, the real number is converted to an integer in the current word size and then those two numbers are subtracted. The result is an integer number. *: The multiply operation takes two numbers from the stack and pushes the product of those two numbers. To calculate "4 x 2", you would push 4, then 2 and then do the multiply. The operation works with two real numbers and pushes a real number result. It also works with two integer numbers and pushes an integer result. And you can multiple a real number and an integer number. When you multiply a real and integer number, the real number is converted to an integer in the current word size and then those two numbers are multiplied. The result is an integer number. /: The divide operation takes two numbers from the stack and pushes the ratio of those two numbers. To calculate "4 / 2", you would push 4, then 2 and then do the divide. The operation works with two real numbers and pushes a real number result. It also works with two integer numbers and pushes an integer result. And you can divide a real number and an integer number. When you divide a real and integer number, the real number is converted to an integer in the current word size and then those two numbers are divided. The result is an integer number. CHS: The CHS operation stands for "CHange Sign". It takes a single real number from the stack and returns a real number with the opposite sign. Effectively it multiplies its argument by minus one. This operation does not work with integer numbers. INV: The INV operation is short for "INVerse". It takes a single real number from the stack and returns a real number which is the reciprocal of that number. Effectively it calculates "1 / x" where "x" is the number it pulls from the stack. This operation does not work with integer numbers. SQ: The SQ operation is short for "SQuare". It takes a single real number from the stack and returns a real number which is the square of that number. Effectively, it calculates "x * x" where "x" is the number it pulls from the stack. This operation does not work with integer numbers. SQRT: The SQRT operation is short for "SQuare RooT". It takes a single real number from the stack and returns a real number which is the square root of that number. Effectively, it calculates "x ^ 0.5" where "x" is the number it pulls from the stack. This operation does not work with integer numbers. ^: The power operation takes two numbers from the stack and pushes the result. To calculate "4 ^ 2", you would push 4, then 2 and then do the power operation. The operation works with two real numbers and pushes a real number result. This operation does not work with integer numbers. Stack Operations: DROP: This operation just pops the item off the top of the stack. It does not matter if the value is a real number or integer number. SWAP: This operation pops the two items off the tops of the stack and pushes them back onto the stack in reverse order. CLEAR: This operation removes all items from the stack. Trigonometry Operations: PI: This operation pushes the value of pi onto the stack as a real number. SIN: This operation takes a real number from the top of the stack and calculates the sine of that number as an angle in radians and pushes the result back onto the stack as a real number. This operation does not work with integer numbers. COS: This operation takes a real number from the top of the stack and calculates the cosine of that number as an angle in radians and pushes the result back onto the stack as a real number. This operation does not work with integer numbers. TAN: This operation takes a real number from the top of the stack and calculates the tangent of that number as an angle in radians and pushes the result back onto the stack as a real number. This operation does not work with integer numbers. ASIN: This operation takes a real number from the top of the stack and calculates the inverse sine of that number and pushes the result back onto the stack as an angle in radians. This operation does not work with integer numbers. ACOS: This operation takes a real number from the top of the stack and calculates the inverse cosine of that number and pushes the result back onto the stack as an angle in radians. This operation does not work with integer numbers. ATAN: This operation takes a real number from the top of the stack and calculates the inverse tangent of that number and pushes the result back onto the stack as an angle in radians. This operation does not work with integer numbers. Exponential Operations: LOG: This operation takes a real number from the top of the stack and calculates the base ten logarithm of that number and pushes the result back onto the stack. This operation does not work with integer numbers. ALOG: This operation takes a real number from the top of the stack and calculates ten to the power of that number and pushes the result back onto the stack. This operation is the inverse of the LOG operation. This operation does not work with integer numbers. LN: This operation takes a real number from the top of the stack and calculates the base e logarithm of that number and pushes that result back onto the stack. This operation does not work with integer numbers. EXP: This operation takes a real number from the top of the stack and calculates e to the power of that number and pushes that result back onto the stack. This operation is the inverse of the LN operation. This operation does not work with integer numbers. SINH: This operation takes a real number from the top of the stack and calculates the hyperbolic sine of that number and pushes that result back onto the stack. This operation does not work with integer numbers. COSH: This operation takes a real number from the top of the stack and calculates the hyperbolic cosine of that number and pushes that result back onto the stack. This operation does not work with integer numbers. TANH: This operation takes a real number from the top of the stack and calculates the hyperbolic tangent of that number and pushes that result back onto the stack. This operation does not work with integer numbers. Logical Operations: R2B: This operation takes a real number from the stack and converts it to an integer given the current word size. The converted number is pushed onto the stack. B2R: This operation takes a integer number from the stack and converts it to a real number. The converted number is pushed onto the stack. AND: This operation takes two integer numbers from the top of the stack and pushes the logical and of those two numbers back onto the stack as an integer number. This operation does not work with real numbers. OR: This operation takes two integer numbers from the top of the stack and pushes the logical or of those two numbers back onto the stack as an integer number. This operation does not work with real numbers. XOR: This operation takes two integer numbers from the top of the stack and pushes the logical exclusive or of those two numbers back onto the stack as an integer number. This operation does not work with real numbers. NOT: This operation takes a single integer number from the top of the stack and pushes an integer result with each bit inverted (0 to 1, 1 to 0). This operation does not work with real numbers. SL: This operation takes a single integer number from the top of the stack and shifts each bit one position to the left, inserting a 0 bit at the low bit position. The high bit (as determined by the word size) is lost. This operation is basically like multiplying by two. This operation does not work with real numbers. RL: This operation takes a single integer number from the top of the stack and rotates each bit one position to the left and pushes the result back onto the stack. The high bit (as determined by the word size) becomes the bit at the low bit position. This operation does not work with real numbers. SR: This operation takes a single integer number from the top of the stack and shifts each bit one position to the right, inserting a 0 bit at the high bit position (as determined by the word size). The bit at the low bit position is lost. This operation is basically like dividing by two. This operation does not work with real numbers. RR: This operation takes a single integer number from the top of the stack and rotates each bit one position to the right and pushes the result back onto the stack. This low bit becomes the bit at the high bit position (as determined by the word size). This operation does not work with real numbers. ASR: This operation takes a single integer number from the top of the stack and shifts each bit one position to the right. However, the high bit (as determined by the word size) is preserved so if it was a 1, it remains a 1. This operation is basically like dividing by two where the high bit represents a sign bit. This operation does not work with real numbers. BIN: This operation takes no values from the stack and pushes nothing onto the stack. It sets the default integer base size to binary. Any integers on the stack will be displayed in binary format after executing this operation. When entering an integer, the calculator will expect a binary number. OCT: This operation takes no values from the stack and pushes nothing onto the stack. It sets the default integer base size to octal. Any integers on the stack will be displayed in octal format after executing this operation. When entering an integer, the calculator will expect an octal number. DEC: This operation takes no values from the stack and pushes nothing onto the stack. It sets the default integer base size to decimal. Any integers on the stack will be displayed in decimal format after executing this operation. When entering an integer, the calculator will expect a decimal number. HEX: This operation takes no values from the stack and pushes nothing onto the stack. It sets the default integer base size to hexadecimal. Any integers on the stack will be displayed in hexadecimal format after executing this operation. When entering an integer, the calculator will expect a hexadecimal number. STWS: This operation takes a single real number from the stack and pushes nothing onto the stack. The real number should be between 1 and 32 and have no fractional part. The value becomes the new word size used for integers. So, if you want to do 16 bit integer math, you would push 16 onto the stack and then execute the STWS operation. RCWS: This operation takes no values from the stack and pushes a single real number onto the stack. The real number is between 1 and 32 and is the current word size used for integers. Use the STWS operation to change the word size. \ No newline at end of file diff --git a/abCalcNDA.c b/abCalcNDA.c deleted file mode 100644 index a226ddd..0000000 --- a/abCalcNDA.c +++ /dev/null @@ -1,764 +0,0 @@ -/* - abCalcNDA.c - By: Jeremy Rand - */ - - -#pragma nda NDAOpen NDAClose NDAAction NDAInit -1 0xFFFF " abCalc\\H**" - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include "abCalcNDA.defs" -#include "abCalc.h" -#include "abCStack.h" -#include "abCError.h" - -#include "expr/abCExpr.h" - -#include "ops/abCOp.h" - - -#define MIN_STACK_ITEMS 4 - -void UpdateStack(void); - - -typedef struct listElement { - char *memPtr; - Byte memFlag; -} listElement; - - -static BOOLEAN gListStarted = FALSE; -static Handle gSANEDirectPage = NULL; - -static BOOLEAN gCalcActive = FALSE; -static GrafPortPtr gCalcWinPtr = NULL; -static unsigned int gUserId; -static unsigned int gResourceId; -listElement *gOpList = NULL; -listElement gStackList[AB_CALC_STACK_DEPTH]; -abCalcExpr gNDAExpr; - -static Str255 gStrBuf; -static int gSelectedStackItem = -1; - -char *gBuffer = NULL; - - -void NDAClose(void) -{ - int i; - - if (gCalcActive) { - CloseWindow(gCalcWinPtr); - gCalcWinPtr = NULL; - gCalcActive = FALSE; - } - - if (gBuffer != NULL) { - free(gBuffer); - gBuffer = NULL; - } - - if (gOpList != NULL) { - free(gOpList); - gOpList = NULL; - } - - for (i = 0; i < AB_CALC_STACK_DEPTH; i++) { - if (gStackList[i].memPtr != NULL) { - free(gStackList[i].memPtr); - gStackList[i].memPtr = NULL; - } - } - - CloseResourceFile(gResourceId); - ResourceShutDown(); -} - - -void NDAInit(int code) -{ - int i; - - if (code) { - gCalcActive = FALSE; - gUserId = MMStartUp(); - - if (!ListStatus()) { - LoadOneTool(0x1c, 0); - ListStartUp(); - gListStarted = TRUE; - } - - if (!SANEStatus()) { - LoadOneTool(0x0a, 0); - gSANEDirectPage = NewHandle(256, gUserId, - attrBank | attrFixed | attrLocked | attrPage, NULL); - SANEStartUp((Word) *gSANEDirectPage); - } - - abCalcInit(); - - for (i = 0; i < AB_CALC_STACK_DEPTH; i++) { - gStackList[i].memPtr = NULL; - } - } else { - if (gSANEDirectPage) { - SANEShutDown(); - DisposeHandle(gSANEDirectPage); - UnloadOneTool(0x0a); - gSANEDirectPage = NULL; - } - - if (gListStarted) { - ListShutDown(); - UnloadOneTool(0x1c); - gListStarted = FALSE; - } - } -} - - -#pragma databank 1 -void DrawContents(void) -{ - PenNormal(); - DrawControls(GetPort()); -} -#pragma databank 0 - - -GrafPortPtr NDAOpen(void) -{ - Pointer pathToSelf; - unsigned int oldResourceApp; - LevelRecGS levelDCB; - unsigned int oldLevel; - SysPrefsRecGS prefsDCB; - unsigned int oldPrefs; - int numOps; - int i; - Handle opListCtl; - - if (gCalcActive) - return NULL; - - oldResourceApp = GetCurResourceApp(); - ResourceStartUp(gUserId); - pathToSelf = LGetPathname2(gUserId, 1); - - levelDCB.pCount = 2; - GetLevelGS(&levelDCB); - oldLevel = levelDCB.level; - levelDCB.level = 0; - SetLevelGS(&levelDCB); - - prefsDCB.pCount = 1; - GetSysPrefsGS(&prefsDCB); - oldPrefs = prefsDCB.preferences; - prefsDCB.preferences = (prefsDCB.preferences & 0x1fff) | 0x8000; - SetSysPrefsGS(&prefsDCB); - - gResourceId = OpenResourceFile(readEnable, NULL, pathToSelf); - - gCalcWinPtr = NewWindow2("\p abCalc ", 0, DrawContents, NULL, refIsResource, - abCalcWinNum, rWindParam1); - - SetSysWindow(gCalcWinPtr); - ShowWindow(gCalcWinPtr); - SelectWindow(gCalcWinPtr); - SetPort(gCalcWinPtr); - - if (gOpList == NULL) { - numOps = abCalcOpNumOps(); - gOpList = malloc(sizeof(*gOpList) * numOps); - for (i = 0; i < numOps; i++) { - gOpList[i].memPtr = abCalcOpNth(i)->name; - gOpList[i].memFlag = 0; - } - } - - opListCtl = (Handle)GetCtlHandleFromID(gCalcWinPtr, abCalcOpList); - NewList2(NULL, 1, (Ref)gOpList, 0, numOps, opListCtl); - - UpdateStack(); - - gCalcActive = TRUE; - - prefsDCB.preferences = oldPrefs; - SetSysPrefsGS(&prefsDCB); - - levelDCB.level = oldLevel; - SetLevelGS(&levelDCB); - - SetCurResourceApp(oldResourceApp); - - return gCalcWinPtr; -} - - -void UpdateStack(void) -{ - Handle stackListCtl; - int i; - int numToDisplay = abCalcStackNumItems(); - - if (numToDisplay < MIN_STACK_ITEMS) { - numToDisplay = MIN_STACK_ITEMS; - } - - stackListCtl = (Handle)GetCtlHandleFromID(gCalcWinPtr, abCalcStackList); - - for (i = numToDisplay - 1; i >= 0; i--) { - if (gStackList[i].memPtr == NULL) { - gStackList[i].memPtr = malloc(AB_CALC_EXPR_STRING_MAX + 8); - } - abCalcStackExprStringAt(numToDisplay - i - 1, gStackList[i].memPtr, - TRUE); - gStackList[i].memFlag = 0; - } - - NewList2(NULL, numToDisplay - 3, (Ref)gStackList, 0, numToDisplay, stackListCtl); - gSelectedStackItem = -1; -} - - -BOOLEAN ErrorRaised(void) -{ - char *errorString = abCalcGetError(); - if (errorString == NULL) { - return FALSE; - } - - AlertWindow(awCString+awResource, (Pointer)&errorString, abCalcErrorAlert); - - abCalcClearError(); - return TRUE; -} - - -void PushCalcEntry(CtlRecHndl entryBox) -{ - abCalcOp *op; - - GetLETextByID(gCalcWinPtr, abCalcEntryBox, &gStrBuf); - - if (gStrBuf.textLength > 0) { - gStrBuf.text[gStrBuf.textLength] = '\0'; - - op = abCalcOpLookup(gStrBuf.text); - - if (op != NULL) { - op->execute(); - } else if (abCalcParseExpr(&gNDAExpr, gStrBuf.text) != NULL) { - abCalcStackExprPush(&gNDAExpr); - } else { - LERecHndl leHandle; - - HLock((Handle)entryBox); - leHandle = (LERecHndl)(*entryBox)->ctlData; - HUnlock((Handle)entryBox); - - LESetSelect(0, gStrBuf.textLength, leHandle); - abCalcRaiseError(abCalcSyntaxError, NULL); - return; - } - - gStrBuf.textLength = 0; - SetLETextByID(gCalcWinPtr, abCalcEntryBox, &gStrBuf); - } -} - - -void ExecCalcCmd(char *cmd) -{ - abCalcOp *op = abCalcOpLookup(cmd); - CtlRecHndl entryBox = GetCtlHandleFromID(gCalcWinPtr, abCalcEntryBox); - - PushCalcEntry(entryBox); - - if ((!ErrorRaised()) && - (op != NULL)) { - op->execute(); - } - - ErrorRaised(); - - UpdateStack(); -} - - -void InsertChar(CtlRecHndl entryBox, char ch) -{ - LERecHndl leHandle; - - HLock((Handle)entryBox); - leHandle = (LERecHndl)(*entryBox)->ctlData; - HUnlock((Handle)entryBox); - - LEDelete(leHandle); - LEInsert(&ch, 1, leHandle); -} - - -void ExecMinusButton(void) -{ - int i; - char aChar; - BOOLEAN doCmd = FALSE; - BOOLEAN dotSeen = FALSE; - - CtlRecHndl entryBox = GetCtlHandleFromID(gCalcWinPtr, abCalcEntryBox); - GetLETextByID(gCalcWinPtr, abCalcEntryBox, &gStrBuf); - - if (gStrBuf.textLength > 0) { - doCmd = TRUE; - - gStrBuf.text[gStrBuf.textLength] = '\0'; - - aChar = gStrBuf.text[gStrBuf.textLength - 1]; - if (((aChar == 'e') || - (aChar == 'E')) && - (gStrBuf.textLength > 1)) { - doCmd = FALSE; - for (i = 0; i < gStrBuf.textLength - 1; i++) { - switch (gStrBuf.text[i]) { - case '-': - if (i != 0) { - doCmd = TRUE; - } - break; - - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - break; - - case '.': - if (dotSeen) { - doCmd = TRUE; - } else { - dotSeen = TRUE; - } - break; - - default: - doCmd = TRUE; - break; - } - if (doCmd) - break; - } - } - } - - if (doCmd) { - ExecCalcCmd("-"); - } else { - InsertChar(entryBox, '-'); - } - - return; -} - - -void HandleEntryBox(void) -{ - Handle stackListCtl = (Handle)GetCtlHandleFromID(gCalcWinPtr, abCalcStackList); - if (gSelectedStackItem != -1) { - ResetMember2(stackListCtl); - DrawMember2(gSelectedStackItem, stackListCtl); - gSelectedStackItem = -1; - } -} - - -void HandleStackClick(void) -{ - Handle stackListCtl = (Handle)GetCtlHandleFromID(gCalcWinPtr, abCalcStackList); - int nthOp; - int numStackItems = abCalcStackNumItems(); - int numDisplayed = numStackItems; - int selectedStackItem = -1; - - nthOp = NextMember2(0, stackListCtl); - if (nthOp == gSelectedStackItem) { - ResetMember2(stackListCtl); - DrawMember2(gSelectedStackItem, stackListCtl); - gSelectedStackItem = -1; - nthOp = NextMember2(0, stackListCtl); - } - if (nthOp == 0) - return; - - if (numDisplayed < MIN_STACK_ITEMS) - numDisplayed = MIN_STACK_ITEMS; - - selectedStackItem = numDisplayed + 1 - nthOp; - - if (selectedStackItem > numStackItems) { - ResetMember2(stackListCtl); - DrawMember2(nthOp, stackListCtl); - gSelectedStackItem = -1; - } else { - gSelectedStackItem = nthOp; - } -} - - -void HandleOpClick(void) -{ - Handle opListCtl = (Handle)GetCtlHandleFromID(gCalcWinPtr, abCalcOpList); - int nthOp = ResetMember2(opListCtl); - abCalcOp *op; - - if (nthOp > 0) { - nthOp--; - - op = abCalcOpNth(nthOp); - if (op != NULL) { - CtlRecHndl entryBox = GetCtlHandleFromID(gCalcWinPtr, abCalcEntryBox); - PushCalcEntry(entryBox); - - if (!ErrorRaised()) { - op->execute(); - } - - ErrorRaised(); - - UpdateStack(); - } - - DrawMember2(nthOp + 1, opListCtl); - } -} - - -void HandleControl(EventRecord *event) -{ - CtlRecHndl entryBox = GetCtlHandleFromID(gCalcWinPtr, abCalcEntryBox); - SetPort(gCalcWinPtr); - - switch (event->wmTaskData4) { - case abCalcBtn0: - InsertChar(entryBox, '0'); - break; - - case abCalcBtn1: - InsertChar(entryBox, '1'); - break; - - case abCalcBtn2: - InsertChar(entryBox, '2'); - break; - - case abCalcBtn3: - InsertChar(entryBox, '3'); - break; - - case abCalcBtn4: - InsertChar(entryBox, '4'); - break; - - case abCalcBtn5: - InsertChar(entryBox, '5'); - break; - - case abCalcBtn6: - InsertChar(entryBox, '6'); - break; - - case abCalcBtn7: - InsertChar(entryBox, '7'); - break; - - case abCalcBtn8: - InsertChar(entryBox, '8'); - break; - - case abCalcBtn9: - InsertChar(entryBox, '9'); - break; - - case abCalcBtnEnter: - PushCalcEntry(entryBox); - ErrorRaised(); - UpdateStack(); - break; - - case abCalcBtnDot: - InsertChar(entryBox, '.'); - break; - - case abCalcBtnNum: - InsertChar(entryBox, '#'); - break; - - case abCalcBtnAdd: - ExecCalcCmd("+"); - break; - - case abCalcBtnSub: - ExecMinusButton(); - break; - - case abCalcBtnMult: - ExecCalcCmd("*"); - break; - - case abCalcBtnDiv: - ExecCalcCmd("/"); - break; - - case abCalcBtnPow: - ExecCalcCmd("^"); - break; - - case abCalcBtnA: - InsertChar(entryBox, 'A'); - break; - - case abCalcBtnB: - InsertChar(entryBox, 'B'); - break; - - case abCalcBtnC: - InsertChar(entryBox, 'C'); - break; - - case abCalcBtnD: - InsertChar(entryBox, 'D'); - break; - - case abCalcBtnE: - InsertChar(entryBox, 'E'); - break; - - case abCalcBtnF: - InsertChar(entryBox, 'F'); - break; - - case abCalcEntryBox: - HandleEntryBox(); - break; - - case abCalcStackList: - HandleStackClick(); - break; - - case abCalcOpList: - HandleOpClick(); - break; - } -} - - -void DoCut(void) -{ - LERecHndl leHandle; - CtlRecHndl entryBox = GetCtlHandleFromID(gCalcWinPtr, abCalcEntryBox); - - HLock((Handle)entryBox); - leHandle = (LERecHndl)(*entryBox)->ctlData; - HUnlock((Handle)entryBox); - - LECut(leHandle); - LEToScrap(); -} - - -void DoCopy(void) -{ - Handle stackListCtl = (Handle)GetCtlHandleFromID(gCalcWinPtr, abCalcStackList); - LERecHndl leHandle; - CtlRecHndl entryBox = GetCtlHandleFromID(gCalcWinPtr, abCalcEntryBox); - - int numStackItems = abCalcStackNumItems(); - int numDisplayed = numStackItems; - int selectedStackItem; - - if (gSelectedStackItem == -1) { - HLock((Handle)entryBox); - leHandle = (LERecHndl)(*entryBox)->ctlData; - HUnlock((Handle)entryBox); - - LECopy(leHandle); - LEToScrap(); - return; - } - - if (numDisplayed < MIN_STACK_ITEMS) - numDisplayed = MIN_STACK_ITEMS; - - selectedStackItem = numDisplayed - gSelectedStackItem; - - if (gBuffer == NULL) { - gBuffer = malloc(AB_CALC_EXPR_STRING_MAX); - } - - if ((selectedStackItem >= 0) && - (selectedStackItem < numStackItems) && - (abCalcStackExprStringAt(selectedStackItem, gBuffer, FALSE) != NULL)) { - ZeroScrap(); - PutScrap(strlen(gBuffer), textScrap, gBuffer); - } - - SetPort(gCalcWinPtr); - ResetMember2(stackListCtl); - DrawMember2(gSelectedStackItem, stackListCtl); - gSelectedStackItem = -1; -} - - -void DoPaste(void) -{ - LERecHndl leHandle; - CtlRecHndl entryBox = GetCtlHandleFromID(gCalcWinPtr, abCalcEntryBox); - - HLock((Handle)entryBox); - leHandle = (LERecHndl)(*entryBox)->ctlData; - HUnlock((Handle)entryBox); - - LEFromScrap(); - LEPaste(leHandle); -} - - -void DoClear(void) -{ - LERecHndl leHandle; - CtlRecHndl entryBox = GetCtlHandleFromID(gCalcWinPtr, abCalcEntryBox); - - HLock((Handle)entryBox); - leHandle = (LERecHndl)(*entryBox)->ctlData; - HUnlock((Handle)entryBox); - - LEDelete(leHandle); -} - - -void HandleMenu(int menuItem) -{ - SetPort(gCalcWinPtr); - - switch (menuItem) { - case cutAction: - DoCut(); - break; - - case copyAction: - DoCopy(); - break; - - case pasteAction: - DoPaste(); - break; - - case clearAction: - DoClear(); - break; - - default: - break; - } -} - - -void HandleKey(EventRecord *event) -{ - BOOLEAN appleKeyPressed = ((event->modifiers & appleKey) != 0); - char key = (event->message & 0xff); - - if (!appleKeyPressed) - return; - - switch (key) { - case 'C': - case 'c': - DoCopy(); - break; - - case 'X': - case 'x': - DoCut(); - break; - - case 'V': - case 'v': - DoPaste(); - break; - } -} - - -BOOLEAN NDAAction(EventRecord *sysEvent, int code) -{ - int event; - static EventRecord localEvent; - unsigned int eventCode; - BOOLEAN result = FALSE; - - switch (code) { - case runAction: - return result; - - case eventAction: - BlockMove((Pointer)sysEvent, (Pointer)&localEvent, 16); - localEvent.wmTaskMask = 0x001FFFFF; - eventCode = TaskMasterDA(0, &localEvent); - switch(eventCode) { - case updateEvt: - BeginUpdate(gCalcWinPtr); - DrawContents(); - EndUpdate(gCalcWinPtr); - break; - - case wInControl: - HandleControl(&localEvent); - break; - - case keyDownEvt: - case autoKeyEvt: - HandleKey(&localEvent); - break; - } - break; - - case cutAction: - case copyAction: - case pasteAction: - case clearAction: - result = TRUE; - HandleMenu(code); - break; - } - - return result; -} diff --git a/abCalcNDA.defs b/abCalcNDA.defs deleted file mode 100644 index b383cc6..0000000 --- a/abCalcNDA.defs +++ /dev/null @@ -1,115 +0,0 @@ -/* */ -/* abCalcNDA.defs */ -/* By: Jeremy Rand */ -/* */ - -#define abCalcWinNum 1001 -#define abCalcLinedColors 1002 - -#define abCalcControlList 1003 - - -#define abCalcBtn0 2001 -#define abCalcBtn0Str 2002 - -#define abCalcBtn1 2003 -#define abCalcBtn1Str 2004 - -#define abCalcBtn2 2005 -#define abCalcBtn2Str 2006 - -#define abCalcBtn3 2007 -#define abCalcBtn3Str 2008 - -#define abCalcBtn4 2009 -#define abCalcBtn4Str 2010 - -#define abCalcBtn5 2011 -#define abCalcBtn5Str 2012 - -#define abCalcBtn6 2013 -#define abCalcBtn6Str 2014 - -#define abCalcBtn7 2015 -#define abCalcBtn7Str 2016 - -#define abCalcBtn8 2017 -#define abCalcBtn8Str 2018 - -#define abCalcBtn9 2019 -#define abCalcBtn9Str 2020 - -#define abCalcBtnEnter 2021 -#define abCalcBtnEnterStr 2022 - -#define abCalcBtnDot 2023 -#define abCalcBtnDotStr 2024 - -#define abCalcBtnNum 2025 -#define abCalcBtnNumStr 2026 - -#define abCalcBtnAdd 2027 -#define abCalcBtnAddStr 2028 - -#define abCalcBtnSub 2029 -#define abCalcBtnSubStr 2030 - -#define abCalcBtnMult 2031 -#define abCalcBtnMultStr 2032 - -#define abCalcBtnDiv 2033 -#define abCalcBtnDivStr 2034 - -#define abCalcBtnA 2035 -#define abCalcBtnAStr 2036 - -#define abCalcBtnB 2037 -#define abCalcBtnBStr 2038 - -#define abCalcBtnC 2039 -#define abCalcBtnCStr 2040 - -#define abCalcBtnD 2041 -#define abCalcBtnDStr 2042 - -#define abCalcBtnE 2043 -#define abCalcBtnEStr 2044 - -#define abCalcBtnF 2045 -#define abCalcBtnFStr 2046 - -#define abCalcBtnPow 2047 -#define abCalcBtnPowStr 2048 - -#define abCalcEntryBox 3001 -#define abCalcStackList 3002 -#define abCalcOpList 3003 - -#define abCalcErrorAlert 4001 - - -#define abCalcWinX 10 -#define abCalcWinY 25 -#define abCalcWinWidth 300 -#define abCalcWinHeight 170 - -#define abCalcBtnSpaceX 5 -#define abCalcBtnSpaceY 2 -#define abCalcBtnWidth 39 -#define abCalcBtnHeight 14 - -#define abCalcBtnRow0 abCalcWinHeight-abCalcBtnSpaceY-abCalcBtnHeight -#define abCalcBtnRow1 abCalcBtnRow0-abCalcBtnSpaceY-abCalcBtnHeight -#define abCalcBtnRow2 abCalcBtnRow1-abCalcBtnSpaceY-abCalcBtnHeight -#define abCalcBtnRow3 abCalcBtnRow2-abCalcBtnSpaceY-abCalcBtnHeight -#define abCalcBtnRow4 abCalcBtnRow3-abCalcBtnSpaceY-abCalcBtnHeight -#define abCalcBtnRow5 abCalcBtnRow4-abCalcBtnSpaceY-abCalcBtnHeight -#define abCalcBtnRow6 abCalcBtnRow5-abCalcBtnSpaceY-abCalcBtnHeight -#define abCalcBtnRow7 abCalcBtnRow6-abCalcBtnSpaceY-abCalcBtnHeight - -#define abCalcBtnCol0 abCalcBtnSpaceX -#define abCalcBtnCol1 abCalcBtnCol0+abCalcBtnSpaceX+abCalcBtnWidth -#define abCalcBtnCol2 abCalcBtnCol1+abCalcBtnSpaceX+abCalcBtnWidth -#define abCalcBtnCol3 abCalcBtnCol2+abCalcBtnSpaceX+abCalcBtnWidth - -#define abCalcOpCol abCalcBtnCol3+abCalcBtnSpaceX+abCalcBtnWidth diff --git a/abCalcNDA.rez b/abCalcNDA.rez deleted file mode 100644 index 7c7baa1..0000000 --- a/abCalcNDA.rez +++ /dev/null @@ -1,462 +0,0 @@ -/* */ -/* abCalcNDA.h */ -/* By: Jeremy Rand */ -/* */ - - -#include "types.rez" -#include "abCalcNda.defs" - - -resource rWindParam1 (abCalcWinNum) { - $C0A5, /* wFrameBits */ - nil, /* wTitle */ - 0, /* wRefCon */ - {0,0,0,0}, /* ZoomRect */ - abCalcLinedColors, /* wColor ID */ - {0,0}, /* Origin */ - {0,0}, /* data size */ - {0,0}, /* max height-width */ - {0,0}, /* scroll ver hors */ - {0,0}, /* page ver horiz */ - 0, /* winfoRefcon */ - 0, /* wInfoHeight */ - {abCalcWinY,abCalcWinX,abCalcWinY+abCalcWinHeight,abCalcWinX+abCalcWinWidth}, /* wposition */ - infront, /* wPlane */ - abCalcControlList, /* wStorage */ - $0809 /* wInVerb */ -}; - - -resource rWindColor (abCalcLinedColors) { - 0x0000, /* frameColor */ - 0x0F00, /* titleColor */ - 0x020F, /* tbarColor */ - 0xF0F0, /* growColor */ - 0x00F0, /* infoColor */ -}; - - -resource rControlList (abCalcControlList) { - { - abCalcBtn0, - abCalcBtn1, - abCalcBtn2, - abCalcBtn3, - abCalcBtn4, - abCalcBtn5, - abCalcBtn6, - abCalcBtn7, - abCalcBtn8, - abCalcBtn9, - abCalcBtnEnter, - abCalcBtnDot, - abCalcBtnNum, - abCalcBtnAdd, - abCalcBtnSub, - abCalcBtnMult, - abCalcBtnDiv, - abCalcBtnPow, - abCalcBtnA, - abCalcBtnB, - abCalcBtnC, - abCalcBtnD, - abCalcBtnE, - abCalcBtnF, - abCalcEntryBox, - abCalcStackList, - abCalcOpList - } -}; - - -resource rControlTemplate (abCalcBtn0) { - abCalcBtn0, - {abCalcBtnRow0, abCalcBtnCol0, 0, 0}, - SimpleButtonControl {{ - $0002, - $3002, - 0, - abCalcBtn0Str, - 0, - {"0","",0,0} - }}; -}; -resource rPString (abCalcBtn0Str, noCrossBank) { "0" }; - -resource rControlTemplate (abCalcBtnDot) { - abCalcBtnDot, - {abCalcBtnRow0, abCalcBtnCol1, abCalcBtnRow0+abCalcBtnHeight, abCalcBtnCol1+abCalcBtnWidth}, - SimpleButtonControl {{ - $0002, - $3002, - 0, - abCalcBtnDotStr, - 0, - {".","",0,0} - }}; -}; -resource rPString (abCalcBtnDotStr, noCrossBank) { "." }; - -resource rControlTemplate (abCalcBtnNum) { - abCalcBtnNum, - {abCalcBtnRow0, abCalcBtnCol2, 0, 0}, - SimpleButtonControl {{ - $0002, - $3002, - 0, - abCalcBtnNumStr, - 0, - {"#","",0,0} - }}; -}; -resource rPString (abCalcBtnNumStr, noCrossBank) { "#" }; - -resource rControlTemplate (abCalcBtn1) { - abCalcBtn1, - {abCalcBtnRow1, abCalcBtnCol0, 0, 0}, - SimpleButtonControl {{ - $0002, - $3002, - 0, - abCalcBtn1Str, - 0, - {"1","",0,0} - }}; -}; -resource rPString (abCalcBtn1Str, noCrossBank) { "1" }; - -resource rControlTemplate (abCalcBtn2) { - abCalcBtn2, - {abCalcBtnRow1, abCalcBtnCol1, 0, 0}, - SimpleButtonControl {{ - $0002, - $3002, - 0, - abCalcBtn2Str, - 0, - {"2","",0,0} - }}; -}; -resource rPString (abCalcBtn2Str, noCrossBank) { "2" }; - -resource rControlTemplate (abCalcBtn3) { - abCalcBtn3, - {abCalcBtnRow1, abCalcBtnCol2, 0, 0}, - SimpleButtonControl {{ - $0002, - $3002, - 0, - abCalcBtn3Str, - 0, - {"3","",0,0} - }}; -}; -resource rPString (abCalcBtn3Str, noCrossBank) { "3" }; - -resource rControlTemplate (abCalcBtn4) { - abCalcBtn4, - {abCalcBtnRow2, abCalcBtnCol0, 0, 0}, - SimpleButtonControl {{ - $0002, - $3002, - 0, - abCalcBtn4Str, - 0, - {"4","",0,0} - }}; -}; -resource rPString (abCalcBtn4Str, noCrossBank) { "4" }; - -resource rControlTemplate (abCalcBtn5) { - abCalcBtn5, - {abCalcBtnRow2, abCalcBtnCol1, 0, 0}, - SimpleButtonControl {{ - $0002, - $3002, - 0, - abCalcBtn5Str, - 0, - {"5","",0,0} - }}; -}; -resource rPString (abCalcBtn5Str, noCrossBank) { "5" }; - -resource rControlTemplate (abCalcBtn6) { - abCalcBtn6, - {abCalcBtnRow2, abCalcBtnCol2, 0, 0}, - SimpleButtonControl {{ - $0002, - $3002, - 0, - abCalcBtn6Str, - 0, - {"6","",0,0} - }}; -}; -resource rPString (abCalcBtn6Str, noCrossBank) { "6" }; - -resource rControlTemplate (abCalcBtn7) { - abCalcBtn7, - {abCalcBtnRow3, abCalcBtnCol0, 0, 0}, - SimpleButtonControl {{ - $0002, - $3002, - 0, - abCalcBtn7Str, - 0, - {"7","",0,0} - }}; -}; -resource rPString (abCalcBtn7Str, noCrossBank) { "7" }; - -resource rControlTemplate (abCalcBtn8) { - abCalcBtn8, - {abCalcBtnRow3, abCalcBtnCol1, 0, 0}, - SimpleButtonControl {{ - $0002, - $3002, - 0, - abCalcBtn8Str, - 0, - {"8","",0,0} - }}; -}; -resource rPString (abCalcBtn8Str, noCrossBank) { "8" }; - -resource rControlTemplate (abCalcBtn9) { - abCalcBtn9, - {abCalcBtnRow3, abCalcBtnCol2, 0, 0}, - SimpleButtonControl {{ - $0002, - $3002, - 0, - abCalcBtn9Str, - 0, - {"9","",0,0} - }}; -}; -resource rPString (abCalcBtn9Str, noCrossBank) { "9" }; - -resource rControlTemplate (abCalcBtnEnter) { - abCalcBtnEnter, - {abCalcBtnRow4, abCalcBtnCol0, abCalcBtnRow4+abCalcBtnHeight, abCalcBtnCol2+abCalcBtnWidth}, - SimpleButtonControl {{ - $0003, - $3002, - 0, - abCalcBtnEnterStr, - 0, - {"\n","",0,0} - }}; -}; -resource rPString (abCalcBtnEnterStr, noCrossBank) { "Enter" }; - -resource rControlTemplate (abCalcBtnPow) { - abCalcBtnPow, - {abCalcBtnRow4, abCalcBtnCol3, 0, 0}, - SimpleButtonControl {{ - $0002, - $3002, - 0, - abCalcBtnPowStr, - 0, - {"^","",0,0} - }}; -}; -resource rPString (abCalcBtnPowStr, noCrossBank) { "^" }; - -resource rControlTemplate (abCalcBtnAdd) { - abCalcBtnAdd, - {abCalcBtnRow0, abCalcBtnCol3, 0, 0}, - SimpleButtonControl {{ - $0002, - $3002, - 0, - abCalcBtnAddStr, - 0, - {"+","",0,0} - }}; -}; -resource rPString (abCalcBtnAddStr, noCrossBank) { "+" }; - -resource rControlTemplate (abCalcBtnSub) { - abCalcBtnSub, - {abCalcBtnRow1, abCalcBtnCol3, 0, 0}, - SimpleButtonControl {{ - $0002, - $3002, - 0, - abCalcBtnSubStr, - 0, - {"-","",0,0} - }}; -}; -resource rPString (abCalcBtnSubStr, noCrossBank) { "-" }; - -resource rControlTemplate (abCalcBtnMult) { - abCalcBtnMult, - {abCalcBtnRow2, abCalcBtnCol3, 0, 0}, - SimpleButtonControl {{ - $0002, - $3002, - 0, - abCalcBtnMultStr, - 0, - {"*","",0,0} - }}; -}; -resource rPString (abCalcBtnMultStr, noCrossBank) { "x" }; - -resource rControlTemplate (abCalcBtnDiv) { - abCalcBtnDiv, - {abCalcBtnRow3, abCalcBtnCol3, 0, 0}, - SimpleButtonControl {{ - $0002, - $3002, - 0, - abCalcBtnDivStr, - 0, - {"/","",0,0} - }}; -}; -resource rPString (abCalcBtnDivStr, noCrossBank) { "/" }; - -resource rControlTemplate (abCalcBtnA) { - abCalcBtnA, - {abCalcBtnRow5, abCalcBtnCol0, 0, 0}, - SimpleButtonControl {{ - $0002, - $3002, - 0, - abCalcBtnAStr, - 0, - {"A","",0,0} - }}; -}; -resource rPString (abCalcBtnAStr, noCrossBank) { "A" }; - -resource rControlTemplate (abCalcBtnB) { - abCalcBtnB, - {abCalcBtnRow5, abCalcBtnCol1, 0, 0}, - SimpleButtonControl {{ - $0002, - $3002, - 0, - abCalcBtnBStr, - 0, - {"B","",0,0} - }}; -}; -resource rPString (abCalcBtnBStr, noCrossBank) { "B" }; - -resource rControlTemplate (abCalcBtnC) { - abCalcBtnC, - {abCalcBtnRow5, abCalcBtnCol2, 0, 0}, - SimpleButtonControl {{ - $0002, - $3002, - 0, - abCalcBtnCStr, - 0, - {"C","",0,0} - }}; -}; -resource rPString (abCalcBtnCStr, noCrossBank) { "C" }; - -resource rControlTemplate (abCalcBtnD) { - abCalcBtnD, - {abCalcBtnRow6, abCalcBtnCol0, 0, 0}, - SimpleButtonControl {{ - $0002, - $3002, - 0, - abCalcBtnDStr, - 0, - {"D","",0,0} - }}; -}; -resource rPString (abCalcBtnDStr, noCrossBank) { "D" }; - -resource rControlTemplate (abCalcBtnE) { - abCalcBtnE, - {abCalcBtnRow6, abCalcBtnCol1, 0, 0}, - SimpleButtonControl {{ - $0002, - $3002, - 0, - abCalcBtnEStr, - 0, - {"E","",0,0} - }}; -}; -resource rPString (abCalcBtnEStr, noCrossBank) { "E" }; - -resource rControlTemplate (abCalcBtnF) { - abCalcBtnF, - {abCalcBtnRow6, abCalcBtnCol2, 0, 0}, - SimpleButtonControl {{ - $0002, - $3002, - 0, - abCalcBtnFStr, - 0, - {"F","",0,0} - }}; -}; -resource rPString (abCalcBtnFStr, noCrossBank) { "F" }; - -resource rControlTemplate (abCalcStackList) { - abCalcStackList, /* control ID */ - {1, abCalcBtnSpaceX, 41, abCalcWinWidth-abCalcBtnSpaceX}, /* control rect */ - ListControl {{ - $0000, /* flags */ - $1400, /* more flags */ - 0, /* refcon */ - 0, /* list size */ - 4, /* List View */ - $0007, /* List Type */ - 0, /* List Start */ - 10, /* ListMemHeight */ - 5, /* List Mem Size */ - 0, /* List Ref */ - 0 /* Color Ref */ - }}; - }; - -resource rControlTemplate (abCalcOpList) { - abCalcOpList, /* control ID */ - {abCalcBtnRow7, abCalcOpCol, abCalcWinHeight-(3*abCalcBtnSpaceY), abCalcWinWidth-abCalcBtnSpaceX}, /* control rect */ - ListControl {{ - $0000, /* flags */ - $1400, /* more flags */ - 0, /* refcon */ - 0, /* list size */ - 12, /* List View */ - $0007, /* List Type */ - 0, /* List Start */ - 10, /* ListMemHeight */ - 5, /* List Mem Size */ - 0, /* List Ref */ - 0 /* Color Ref */ - }}; - }; - -resource rControlTemplate (abCalcEntryBox) { - abCalcEntryBox, /* control ID */ - {abCalcBtnRow7, abCalcBtnCol0, abCalcBtnRow7+abCalcBtnHeight, abCalcBtnCol3+abCalcBtnWidth}, /* control rect */ - editLineControl {{ - $0000, /* flags */ - $7000, /* more flags */ - 0, /* refcon */ - 34, /* Max size */ - 0 /* text Ref */ - }}; - }; - -resource rAlertString (abCalcErrorAlert) { - "23/" - "*0" - "/^#0\$00" -}; - diff --git a/expr/abCExpReal.c b/expr/abCExpReal.c deleted file mode 100644 index 77d9bc5..0000000 --- a/expr/abCExpReal.c +++ /dev/null @@ -1,217 +0,0 @@ -/* - abCExpReal.c - By: Jeremy Rand - */ - - -#include -#include -#include -#include - -#include "expr/abCExpr.h" - - -static abCalcExpr *abCalcExprRealParse(abCalcExpr *expr, char *buffer); -static char *abCalcExprRealFormat(abCalcExpr *expr, char *buffer); - - -static abCalcExprCallbacks gRealCallbacks = { - abCalcExprRealParse, - abCalcExprRealFormat -}; - - -void abCalcExprRealInit(void) -{ - abCalcRegisterExprType(abCalcExprTypeReal, &gRealCallbacks); -} - - -abCalcExpr *abCalcExprRealParse(abCalcExpr *expr, char *buffer) -{ - int offset; - int expOffset = -1; - int periodOffset = -1; - int len; - int numOffset = -1; - - /* First validate */ - if (buffer == NULL) - return NULL; - - if (expr == NULL) - return NULL; - - len = strlen(buffer); - - for (offset = 0; offset < len; offset++) { - switch (buffer[offset]) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - numOffset = offset; - break; - - case '.': - if (periodOffset != -1) - return NULL; - if (expOffset != -1) - return NULL; - periodOffset = offset; - break; - - case '-': - if (offset == 0) - break; - /* Fallthrough */ - case '+': - if ((expOffset == -1) || - ((expOffset + 1) != offset)) - return NULL; - break; - - case 'e': - case 'E': - if (expOffset != -1) - return NULL; - expOffset = offset; - numOffset = -1; - break; - - default: - return NULL; - } - } - - if (numOffset == -1) - return NULL; - - expr->type = abCalcExprTypeReal; - expr->u.real = atof(buffer); - return expr; -} - - -char *abCalcExprRealFormat(abCalcExpr *expr, char *buffer) -{ - abCalcRealType exp; - abCalcRealType value; - static char format[16]; - int numDecDigits; - int periodPos = -1; - int zerosStart = -1; - int spaceStart = -1; - int expPos = -1; - int len; - int i; - - if (expr == NULL) - return NULL; - - if (buffer == NULL) - return NULL; - - if (expr->type != abCalcExprTypeReal) - return NULL; - - value = expr->u.real; - - if (value == 0.0) { - exp = 0.0; - } else { - exp = floor(log10(fabs(value))); - } - - if (exp >= 0) - exp++; - - if ((exp > 12) || - (exp < -12)) { - strcpy(format, "%-25.11E"); - } else if (exp <= -2) { - double shiftedValue = value * 1.0e12; - if (shiftedValue == floor(shiftedValue)) { - strcpy(format, "%-18.12f"); - } else { - strcpy(format, "%-25.11E"); - } - } else { - int numDecDigits = (int)(12 - exp); - if (numDecDigits > 12) { - numDecDigits = 12; - } - sprintf(format, "%%-28.%df", numDecDigits); - } - - sprintf(buffer, format, value); - len = strlen(buffer); - - for (i = 0; i < len; i++) { - switch (buffer[i]) { - case '.': - periodPos = i; - break; - - case '0': - if (expPos != -1) { - break; - } - if ((periodPos != -1) && - (zerosStart == -1)) { - if (periodPos == i - 1) { - zerosStart = periodPos; - } else { - zerosStart = i; - } - } - break; - case 'E': - expPos = i; - break; - case ' ': - spaceStart = i; - break; - default: - if (expPos == -1) - zerosStart = -1; - break; - } - if (spaceStart != -1) - break; - } - - if (spaceStart != -1) { - buffer[spaceStart] = '\0'; - len = spaceStart; - } - - if (zerosStart != -1) { - if (expPos != -1) { - memmove(&buffer[zerosStart], &buffer[expPos], len - expPos + 1); - len = expPos - zerosStart; - } - else { - buffer[zerosStart] = '\0'; - } - } - - return buffer; -} - - -void abCalcExprRealSet(abCalcExpr *expr, abCalcRealType value) -{ - if (expr == NULL) - return; - - expr->type = abCalcExprTypeReal; - expr->u.real = value; -} diff --git a/expr/abCExpReal.h b/expr/abCExpReal.h deleted file mode 100644 index 8bf5888..0000000 --- a/expr/abCExpReal.h +++ /dev/null @@ -1,17 +0,0 @@ -/* - abCExpReal.h - By: Jeremy Rand - */ - - -#ifndef ABCEXPREAL_H -#define ABCEXPREAL_H - - -struct abCalcExpr; - -void abCalcExprRealInit(void); - -void abCalcExprRealSet(struct abCalcExpr *expr, abCalcRealType value); - -#endif diff --git a/expr/abCExpr.c b/expr/abCExpr.c deleted file mode 100644 index 495951b..0000000 --- a/expr/abCExpr.c +++ /dev/null @@ -1,61 +0,0 @@ -/* - abCExpr.c - By: Jeremy Rand - */ - - -#include - -#include "expr/abCExpr.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/expr/abCExpr.h b/expr/abCExpr.h deleted file mode 100644 index 029298c..0000000 --- a/expr/abCExpr.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - abCExpr.h - By: Jeremy Rand - */ - - -#ifndef ABCEXPR_H -#define ABCEXPR_H - - -typedef enum abCalcExprType { - abCalcExprTypeMin = 0, - abCalcExprTypeReal = 0, - abCalcExprTypeInt, - - abCalcExprTypeMax -} abCalcExprType; - - -typedef double abCalcRealType; -typedef unsigned long abCalcIntType; - - -#define AB_CALC_EXPR_MAX_INT_WIDTH ((sizeof(abCalcIntType) * 8)) - -#define AB_CALC_EXPR_STRING_MAX (AB_CALC_EXPR_MAX_INT_WIDTH + 8) - - -typedef struct abCalcExpr { - abCalcExprType type; - union { - abCalcRealType real; - abCalcIntType integer; - } u; -} abCalcExpr; - - -typedef struct abCalcExprCallbacks { - 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); - - -#endif diff --git a/expr/abCExprInt.c b/expr/abCExprInt.c deleted file mode 100644 index 48aa390..0000000 --- a/expr/abCExprInt.c +++ /dev/null @@ -1,272 +0,0 @@ -/* - abCExprInt.c - By: Jeremy Rand - */ - - -#include -#include -#include - -#include "abCMode.h" - -#include "expr/abCExpr.h" - - -static abCalcExpr *abCalcExprIntParse(abCalcExpr *expr, char *buffer); -static char *abCalcExprIntFormat(abCalcExpr *expr, char *buffer); - - -static abCalcExprCallbacks gIntCallbacks = { - abCalcExprIntParse, - abCalcExprIntFormat -}; - - -void abCalcExprIntInit(void) -{ - abCalcRegisterExprType(abCalcExprTypeInt, &gIntCallbacks); -} - - -abCalcExpr *abCalcExprIntParse(abCalcExpr *expr, char *buffer) -{ - abCalcModeIntBase base = abCalcModeGetBase(); - abCalcIntType value = 0; - int len; - int offset = 1; - - if (buffer == NULL) - return NULL; - - if (expr == NULL) - return NULL; - - len = strlen(buffer); - if (len < 2) - return NULL; - - if (buffer[0] == '$') { - base = abCalcModeHexBase; - } else if ((buffer[0] == '0') && - (buffer[1] == 'x')) { - base = abCalcModeHexBase; - offset = 2; - } else if (buffer[0] != '#') - return NULL; - - switch (base) { - case abCalcModeBinBase: - for ( ; offset < len; offset++) { - value <<= 1; - switch (buffer[offset]) { - case '1': - value++; - break; - - case '0': - break; - - default: - return NULL; - } - } - break; - - case abCalcModeOctBase: - for ( ; offset < len; offset++) { - value <<= 3; - switch (buffer[offset]) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - value += (buffer[offset] - '0');; - break; - - default: - return NULL; - } - } - break; - - case abCalcModeDecBase: - for ( ; offset < len; offset++) { - value *= 10; - switch (buffer[offset]) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - value += (buffer[offset] - '0');; - break; - - default: - return NULL; - } - } - break; - - case abCalcModeHexBase: - for ( ; offset < len; offset++) { - value <<= 4; - switch (buffer[offset]) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - value += (buffer[offset] - '0');; - break; - - case 'a': - case 'A': - value += 10; - break; - - case 'b': - case 'B': - value += 11; - break; - - case 'c': - case 'C': - value += 12; - break; - - case 'd': - case 'D': - value += 13; - break; - - case 'e': - case 'E': - value += 14; - break; - - case 'f': - case 'F': - value += 15; - break; - - default: - return NULL; - } - } - break; - - default: - return NULL; - } - - expr->type = abCalcExprTypeInt; - expr->u.integer = value; - return expr; -} - - -char *abCalcExprIntFormat(abCalcExpr *expr, char *buffer) -{ - abCalcModeIntBase base = abCalcModeGetBase(); - int width = abCalcModeGetIntWidth(); - abCalcIntType value; - char *ptr; - int gotFirstOne; - int i; - - if (expr == NULL) - return NULL; - - if (buffer == NULL) - return NULL; - - if (expr->type != abCalcExprTypeInt) - return NULL; - - value = expr->u.integer; - - if (width < AB_CALC_EXPR_MAX_INT_WIDTH) { - value &= ((1l << width) - 1); - } - - switch (base) { - case abCalcModeBinBase: - gotFirstOne = 0; - ptr = buffer; - *ptr = '#'; - ptr++; - - for (i = width - 1; i >= 0; i--) { - if ((value >> i) & 1) { - *ptr = '1'; - ptr++; - gotFirstOne = 1; - } else { - if (gotFirstOne) { - *ptr = '0'; - ptr++; - } - } - } - if (!gotFirstOne) { - *ptr = '0'; - ptr++; - } - *ptr = ' '; - ptr++; - *ptr = 'b'; - ptr++; - *ptr = '\0'; - break; - - case abCalcModeOctBase: - sprintf(buffer, "#%lo o", value); - break; - - case abCalcModeDecBase: - sprintf(buffer, "#%lu d", value); - break; - - case abCalcModeHexBase: - sprintf(buffer, "#%lX h", value); - break; - - default: - return NULL; - } - - return buffer; -} - - -void abCalcExprIntSet(abCalcExpr *expr, abCalcIntType value) -{ - int width; - - if (expr == NULL) - return; - - width = abCalcModeGetIntWidth(); - - expr->type = abCalcExprTypeInt; - expr->u.integer = value; - - if (width < AB_CALC_EXPR_MAX_INT_WIDTH) { - expr->u.integer &= ((1l << width) - 1); - } -} diff --git a/expr/abCExprInt.h b/expr/abCExprInt.h deleted file mode 100644 index 7d08525..0000000 --- a/expr/abCExprInt.h +++ /dev/null @@ -1,19 +0,0 @@ -/* - abCExprInt.h - By: Jeremy Rand - */ - - -#ifndef ABCEXPRINT_H -#define ABCEXPRINT_H - - -struct abCalcExpr; - - -void abCalcExprIntInit(void); - -void abCalcExprIntSet(struct abCalcExpr *expr, abCalcIntType value); - - -#endif diff --git a/ops/abCOp.c b/ops/abCOp.c deleted file mode 100644 index aeee3e2..0000000 --- a/ops/abCOp.c +++ /dev/null @@ -1,177 +0,0 @@ -/* - abCOp.c - By: Jeremy Rand - */ - - -#include -#include -#include - -#include "abCError.h" -#include "abCStack.h" - -#include "expr/abCExpr.h" - -#include "ops/abCOp.h" - -#include "ops/abCOpAdd.h" -#include "ops/abCOpSubtr.h" -#include "ops/abCOpMult.h" -#include "ops/abCOpDiv.h" -#include "ops/abCOpChs.h" -#include "ops/abCOpInv.h" -#include "ops/abCOpSq.h" -#include "ops/abCOpSqrt.h" -#include "ops/abCOpPower.h" - -#include "ops/abCOpDrop.h" -#include "ops/abCOpSwap.h" -#include "ops/abCOpClear.h" - -#include "ops/abCOpPi.h" -#include "ops/abCOpSin.h" -#include "ops/abCOpCos.h" -#include "ops/abCOpTan.h" -#include "ops/abCOpAsin.h" -#include "ops/abCOpAcos.h" -#include "ops/abCOpAtan.h" - -#include "ops/abCOpLog.h" -#include "ops/abCOpAlog.h" -#include "ops/abCOpLn.h" -#include "ops/abCOpExp.h" -#include "ops/abCOpSinh.h" -#include "ops/abCOpCosh.h" -#include "ops/abCOpTanh.h" - -#include "ops/abCOpR2B.h" -#include "ops/abCOpB2R.h" - -#include "ops/abCOpAnd.h" -#include "ops/abCOpOr.h" -#include "ops/abCOpXor.h" -#include "ops/abCOpNot.h" -#include "ops/abCOpSl.h" -#include "ops/abCOpRl.h" -#include "ops/abCOpSr.h" -#include "ops/abCOpRr.h" -#include "ops/abCOpAsr.h" - -#include "ops/abCOpBin.h" -#include "ops/abCOpOct.h" -#include "ops/abCOpDec.h" -#include "ops/abCOpHex.h" -#include "ops/abCOpStws.h" -#include "ops/abCOpRcws.h" - - -#define AB_CALC_MAX_OPS 128 - - -abCalcOp gOps[AB_CALC_MAX_OPS]; -static int gNumOps = 0; - - -void abCalcOpInit(void) -{ - gNumOps = 0; - memset(gOps, 0, sizeof(gOps)); - - abCalcOpAddInit(); - abCalcOpSubtrInit(); - abCalcOpMultInit(); - abCalcOpDivInit(); - abCalcOpChsInit(); - abCalcOpInvInit(); - abCalcOpSqInit(); - abCalcOpSqrtInit(); - abCalcOpPowerInit(); - - abCalcOpDropInit(); - abCalcOpSwapInit(); - abCalcOpClearInit(); - - abCalcOpPiInit(); - abCalcOpSinInit(); - abCalcOpCosInit(); - abCalcOpTanInit(); - abCalcOpAsinInit(); - abCalcOpAcosInit(); - abCalcOpAtanInit(); - - abCalcOpLogInit(); - abCalcOpAlogInit(); - abCalcOpLnInit(); - abCalcOpExpInit(); - abCalcOpSinhInit(); - abCalcOpCoshInit(); - abCalcOpTanhInit(); - - abCalcOpR2BInit(); - abCalcOpB2RInit(); - - abCalcOpAndInit(); - abCalcOpOrInit(); - abCalcOpXorInit(); - abCalcOpNotInit(); - abCalcOpSlInit(); - abCalcOpRlInit(); - abCalcOpSrInit(); - abCalcOpRrInit(); - abCalcOpAsrInit(); - - abCalcOpBinInit(); - abCalcOpOctInit(); - abCalcOpDecInit(); - abCalcOpHexInit(); - abCalcOpStwsInit(); - abCalcOpRcwsInit(); -} - - -void abCalcOpRegister(char *name, void (*execute)(void)) -{ - if (gNumOps >= AB_CALC_MAX_OPS) { - fprintf(stderr, "Operation registration overflow"); - return; - } - - gOps[gNumOps].name = name; - gOps[gNumOps].execute = execute; - gNumOps++; -} - - -abCalcOp *abCalcOpLookup(char *name) -{ - int i; - - for (i = 0; i < gNumOps; i++) { -#ifdef ABCALC_GSOS - if (stricmp(gOps[i].name, name) == 0) { -#else - if (strcasecmp(gOps[i].name, name) == 0) { -#endif - return &gOps[i]; - } - } - - return NULL; -} - - -abCalcOp *abCalcOpNth(int n) -{ - if ((n < 0) || - (n >= gNumOps)) - return NULL; - - return &gOps[n]; -} - - -int abCalcOpNumOps(void) -{ - return gNumOps; -} diff --git a/ops/abCOp.h b/ops/abCOp.h deleted file mode 100644 index e970000..0000000 --- a/ops/abCOp.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - abCOp.h - By: Jeremy Rand - */ - - -#ifndef ABCOP_H -#define ABCOP_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); -} abCalcOp; - - -void abCalcOpInit(void); - -void abCalcOpRegister(char *name, void (*execute)(void)); - -abCalcOp *abCalcOpLookup(char *name); - -abCalcOp *abCalcOpNth(int n); - -int abCalcOpNumOps(void); - -#endif diff --git a/ops/abCOpAcos.c b/ops/abCOpAcos.c deleted file mode 100644 index 55deec5..0000000 --- a/ops/abCOpAcos.c +++ /dev/null @@ -1,52 +0,0 @@ -/* - abCOpAcos.c - By: Jeremy Rand - */ - - -#include -#include - -#include "abCError.h" -#include "abCStack.h" - -#include "expr/abCExpr.h" -#include "expr/abCExpReal.h" - -#include "ops/abCOp.h" -#include "ops/abCOpAcos.h" - - -#define ACOS_NAME "ACOS" - - -static void acosExecute(void); - - -void abCalcOpAcosInit(void) -{ - abCalcOpRegister(ACOS_NAME, acosExecute); -} - - -void acosExecute(void) -{ - abCalcExpr result; - AB_CALC_OP_ONE_ARG(ACOS_NAME); - - if (expr->type != abCalcExprTypeReal) { - abCalcRaiseError(abCalcBadArgTypeError, ACOS_NAME); - return; - } - - if ((expr->u.real < -1.0) || - (expr->u.real > 1.0)) { - abCalcRaiseError(abCalcComplexResultError, ACOS_NAME); - return; - } - - abCalcExprRealSet(&result, acos(expr->u.real)); - - abCalcStackExprPop(NULL); - abCalcStackExprPush(&result); -} diff --git a/ops/abCOpAcos.h b/ops/abCOpAcos.h deleted file mode 100644 index 157c75a..0000000 --- a/ops/abCOpAcos.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - abCOpAcos.h - By: Jeremy Rand - */ - - -#ifndef ABCOPACOS_H -#define ABCOPACOS_H - - -void abCalcOpAcosInit(void); - - -#endif diff --git a/ops/abCOpAdd.c b/ops/abCOpAdd.c deleted file mode 100644 index 30469cd..0000000 --- a/ops/abCOpAdd.c +++ /dev/null @@ -1,69 +0,0 @@ -/* - abCOpAdd.c - By: Jeremy Rand - */ - - -#include - - -#include "abCError.h" -#include "abCStack.h" - -#include "expr/abCExpr.h" -#include "expr/abCExpReal.h" -#include "expr/abCExprInt.h" - -#include "ops/abCOp.h" -#include "ops/abCOpAdd.h" - - -#define ADD_NAME "+" - - -static void addExecute(void); - - -void abCalcOpAddInit(void) -{ - abCalcOpRegister(ADD_NAME, addExecute); -} - - -void addExecute(void) -{ - abCalcExpr result; - char expr1Real = 0; - char expr2Real = 0; - AB_CALC_OP_TWO_ARGS(ADD_NAME); - - if (expr1->type == abCalcExprTypeReal) { - expr1Real = 1; - } else if (expr1->type != abCalcExprTypeInt) { - abCalcRaiseError(abCalcBadArgTypeError, ADD_NAME); - return; - } - - if (expr2->type == abCalcExprTypeReal) { - expr2Real = 1; - } else if (expr2->type != abCalcExprTypeInt) { - abCalcRaiseError(abCalcBadArgTypeError, ADD_NAME); - return; - } - - if ((expr1Real) && (expr2Real)) { - abCalcExprRealSet(&result, expr2->u.real + expr1->u.real); - } else { - if (expr1Real) { - abCalcExprIntSet(&result, expr2->u.integer + (abCalcIntType)expr1->u.real); - } else if (expr2Real) { - abCalcExprIntSet(&result, (abCalcIntType)expr2->u.real + expr1->u.integer); - } else { - abCalcExprIntSet(&result, expr2->u.integer + expr1->u.integer); - } - } - - abCalcStackExprPop(NULL); - abCalcStackExprPop(NULL); - abCalcStackExprPush(&result); -} diff --git a/ops/abCOpAdd.h b/ops/abCOpAdd.h deleted file mode 100644 index cc3319d..0000000 --- a/ops/abCOpAdd.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - abCOpAdd.h - By: Jeremy Rand - */ - - -#ifndef ABCOPADD_H -#define ABCOPADD_H - - -void abCalcOpAddInit(void); - - -#endif diff --git a/ops/abCOpAlog.c b/ops/abCOpAlog.c deleted file mode 100644 index dd13648..0000000 --- a/ops/abCOpAlog.c +++ /dev/null @@ -1,46 +0,0 @@ -/* - abCOpAlog.c - By: Jeremy Rand - */ - - -#include -#include - -#include "abCError.h" -#include "abCStack.h" - -#include "expr/abCExpr.h" -#include "expr/abCExpReal.h" - -#include "ops/abCOp.h" -#include "ops/abCOpAlog.h" - - -#define ALOG_NAME "ALOG" - - -static void alogExecute(void); - - -void abCalcOpAlogInit(void) -{ - abCalcOpRegister(ALOG_NAME, alogExecute); -} - - -void alogExecute(void) -{ - abCalcExpr result; - AB_CALC_OP_ONE_ARG(ALOG_NAME); - - if (expr->type != abCalcExprTypeReal) { - abCalcRaiseError(abCalcBadArgTypeError, ALOG_NAME); - return; - } - - abCalcExprRealSet(&result, pow(10.0, expr->u.real)); - - abCalcStackExprPop(NULL); - abCalcStackExprPush(&result); -} diff --git a/ops/abCOpAlog.h b/ops/abCOpAlog.h deleted file mode 100644 index fd49111..0000000 --- a/ops/abCOpAlog.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - abCOpAlog.h - By: Jeremy Rand - */ - - -#ifndef ABCOPALOG_H -#define ABCOPALOG_H - - -void abCalcOpAlogInit(void); - - -#endif diff --git a/ops/abCOpAnd.c b/ops/abCOpAnd.c deleted file mode 100644 index c4a92c0..0000000 --- a/ops/abCOpAnd.c +++ /dev/null @@ -1,51 +0,0 @@ -/* - abCOpAnd.c - By: Jeremy Rand - */ - - -#include - -#include "abCError.h" -#include "abCStack.h" - -#include "expr/abCExpr.h" -#include "expr/abCExprInt.h" - -#include "ops/abCOp.h" -#include "ops/abCOpAnd.h" - - -#define AND_NAME "AND" - - -static void andExecute(void); - - -void abCalcOpAndInit(void) -{ - abCalcOpRegister(AND_NAME, andExecute); -} - - -void andExecute(void) -{ - abCalcExpr result; - AB_CALC_OP_TWO_ARGS(AND_NAME); - - if (expr1->type != abCalcExprTypeInt) { - abCalcRaiseError(abCalcBadArgTypeError, AND_NAME); - return; - } - - if (expr2->type != abCalcExprTypeInt) { - abCalcRaiseError(abCalcBadArgTypeError, AND_NAME); - return; - } - - abCalcExprIntSet(&result, expr2->u.integer & expr1->u.integer); - - abCalcStackExprPop(NULL); - abCalcStackExprPop(NULL); - abCalcStackExprPush(&result); -} diff --git a/ops/abCOpAnd.h b/ops/abCOpAnd.h deleted file mode 100644 index 27a0610..0000000 --- a/ops/abCOpAnd.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - abCOpAnd.h - By: Jeremy Rand - */ - - -#ifndef ABCOPAND_H -#define ABCOPAND_H - - -void abCalcOpAndInit(void); - - -#endif diff --git a/ops/abCOpAsin.c b/ops/abCOpAsin.c deleted file mode 100644 index e1d1627..0000000 --- a/ops/abCOpAsin.c +++ /dev/null @@ -1,52 +0,0 @@ -/* - abCOpAsin.c - By: Jeremy Rand - */ - - -#include -#include - -#include "abCError.h" -#include "abCStack.h" - -#include "expr/abCExpr.h" -#include "expr/abCExpReal.h" - -#include "ops/abCOp.h" -#include "ops/abCOpAsin.h" - - -#define ASIN_NAME "ASIN" - - -static void asinExecute(void); - - -void abCalcOpAsinInit(void) -{ - abCalcOpRegister(ASIN_NAME, asinExecute); -} - - -void asinExecute(void) -{ - abCalcExpr result; - AB_CALC_OP_ONE_ARG(ASIN_NAME); - - if (expr->type != abCalcExprTypeReal) { - abCalcRaiseError(abCalcBadArgTypeError, ASIN_NAME); - return; - } - - if ((expr->u.real < -1.0) || - (expr->u.real > 1.0)) { - abCalcRaiseError(abCalcComplexResultError, ASIN_NAME); - return; - } - - abCalcExprRealSet(&result, asin(expr->u.real)); - - abCalcStackExprPop(NULL); - abCalcStackExprPush(&result); -} diff --git a/ops/abCOpAsin.h b/ops/abCOpAsin.h deleted file mode 100644 index f6d88cf..0000000 --- a/ops/abCOpAsin.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - abCOpAsin.h - By: Jeremy Rand - */ - - -#ifndef ABCOPASIN_H -#define ABCOPASIN_H - - -void abCalcOpAsinInit(void); - - -#endif diff --git a/ops/abCOpAsr.c b/ops/abCOpAsr.c deleted file mode 100644 index 7e961ab..0000000 --- a/ops/abCOpAsr.c +++ /dev/null @@ -1,51 +0,0 @@ -/* - abCOpAsr.c - By: Jeremy Rand - */ - - -#include - -#include "abCError.h" -#include "abCMode.h" -#include "abCStack.h" - -#include "expr/abCExpr.h" -#include "expr/abCExprInt.h" - -#include "ops/abCOp.h" -#include "ops/abCOpAsr.h" - - -#define ASR_NAME "ASR" - - -static void asrExecute(void); - - -void abCalcOpAsrInit(void) -{ - abCalcOpRegister(ASR_NAME, asrExecute); -} - - -void asrExecute(void) -{ - abCalcExpr result; - int width; - abCalcIntType upperBit; - AB_CALC_OP_ONE_ARG(ASR_NAME); - - if (expr->type != abCalcExprTypeInt) { - abCalcRaiseError(abCalcBadArgTypeError, ASR_NAME); - return; - } - - width = abCalcModeGetIntWidth(); - upperBit = (expr->u.integer & (1 << (width - 1))); - - abCalcExprIntSet(&result, ((expr->u.integer >> 1) | upperBit)); - - abCalcStackExprPop(NULL); - abCalcStackExprPush(&result); -} diff --git a/ops/abCOpAsr.h b/ops/abCOpAsr.h deleted file mode 100644 index a796c1a..0000000 --- a/ops/abCOpAsr.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - abCOpAsr.h - By: Jeremy Rand - */ - - -#ifndef ABCOPASR_H -#define ABCOPASR_H - - -void abCalcOpAsrInit(void); - - -#endif diff --git a/ops/abCOpAtan.c b/ops/abCOpAtan.c deleted file mode 100644 index 2ceaf9c..0000000 --- a/ops/abCOpAtan.c +++ /dev/null @@ -1,46 +0,0 @@ -/* - abCOpAtan.c - By: Jeremy Rand - */ - - -#include -#include - -#include "abCError.h" -#include "abCStack.h" - -#include "expr/abCExpr.h" -#include "expr/abCExpReal.h" - -#include "ops/abCOp.h" -#include "ops/abCOpAtan.h" - - -#define ATAN_NAME "ATAN" - - -static void atanExecute(void); - - -void abCalcOpAtanInit(void) -{ - abCalcOpRegister(ATAN_NAME, atanExecute); -} - - -void atanExecute(void) -{ - abCalcExpr result; - AB_CALC_OP_ONE_ARG(ATAN_NAME); - - if (expr->type != abCalcExprTypeReal) { - abCalcRaiseError(abCalcBadArgTypeError, ATAN_NAME); - return; - } - - abCalcExprRealSet(&result, atan(expr->u.real)); - - abCalcStackExprPop(NULL); - abCalcStackExprPush(&result); -} diff --git a/ops/abCOpAtan.h b/ops/abCOpAtan.h deleted file mode 100644 index fb38491..0000000 --- a/ops/abCOpAtan.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - abCOpAtan.h - By: Jeremy Rand - */ - - -#ifndef ABCOPATAN_H -#define ABCOPATAN_H - - -void abCalcOpAtanInit(void); - - -#endif diff --git a/ops/abCOpB2R.c b/ops/abCOpB2R.c deleted file mode 100644 index 99a6700..0000000 --- a/ops/abCOpB2R.c +++ /dev/null @@ -1,48 +0,0 @@ -/* - abCOpB2R.c - By: Jeremy Rand - */ - - -#include - -#include "abCError.h" -#include "abCStack.h" - -#include "expr/abCExpr.h" -#include "expr/abCExpReal.h" -#include "expr/abCExprInt.h" - -#include "ops/abCOp.h" -#include "ops/abCOpB2R.h" - - -#define B2R_NAME "B2R" - - -static void b2rExecute(void); - - -void abCalcOpB2RInit(void) -{ - abCalcOpRegister(B2R_NAME, b2rExecute); -} - - -void b2rExecute(void) -{ - abCalcExpr result; - int width; - int topBit; - AB_CALC_OP_ONE_ARG(B2R_NAME); - - if (expr->type != abCalcExprTypeInt) { - abCalcRaiseError(abCalcBadArgTypeError, B2R_NAME); - return; - } - - abCalcExprRealSet(&result, (abCalcRealType)expr->u.integer); - - abCalcStackExprPop(NULL); - abCalcStackExprPush(&result); -} diff --git a/ops/abCOpB2R.h b/ops/abCOpB2R.h deleted file mode 100644 index 1029e1c..0000000 --- a/ops/abCOpB2R.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - abCOpB2R.h - By: Jeremy Rand - */ - - -#ifndef ABCOPB2R_H -#define ABCOPB2R_H - - -void abCalcOpB2RInit(void); - - -#endif diff --git a/ops/abCOpBin.c b/ops/abCOpBin.c deleted file mode 100644 index 073d2b2..0000000 --- a/ops/abCOpBin.c +++ /dev/null @@ -1,30 +0,0 @@ -/* - abCOpBin.c - By: Jeremy Rand - */ - - -#include - -#include "abCMode.h" - -#include "ops/abCOp.h" -#include "ops/abCOpBin.h" - - -#define BIN_NAME "BIN" - - -static void binExecute(void); - - -void abCalcOpBinInit(void) -{ - abCalcOpRegister(BIN_NAME, binExecute); -} - - -void binExecute(void) -{ - abCalcModeSetBase(abCalcModeBinBase); -} diff --git a/ops/abCOpBin.h b/ops/abCOpBin.h deleted file mode 100644 index 15126a2..0000000 --- a/ops/abCOpBin.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - abCOpBin.h - By: Jeremy Rand - */ - - -#ifndef ABCOPBIN_H -#define ABCOPBIN_H - - -void abCalcOpBinInit(void); - - -#endif diff --git a/ops/abCOpChs.c b/ops/abCOpChs.c deleted file mode 100644 index b9ebd11..0000000 --- a/ops/abCOpChs.c +++ /dev/null @@ -1,46 +0,0 @@ -/* - abCOpChs.c - By: Jeremy Rand - */ - - -#include -#include - -#include "abCError.h" -#include "abCStack.h" - -#include "expr/abCExpr.h" -#include "expr/abCExpReal.h" - -#include "ops/abCOp.h" -#include "ops/abCOpChs.h" - - -#define CHS_NAME "CHS" - - -static void chsExecute(void); - - -void abCalcOpChsInit(void) -{ - abCalcOpRegister(CHS_NAME, chsExecute); -} - - -void chsExecute(void) -{ - abCalcExpr result; - AB_CALC_OP_ONE_ARG(CHS_NAME); - - if (expr->type != abCalcExprTypeReal) { - abCalcRaiseError(abCalcBadArgTypeError, CHS_NAME); - return; - } - - abCalcExprRealSet(&result, -1.0 * expr->u.real); - - abCalcStackExprPop(NULL); - abCalcStackExprPush(&result); -} diff --git a/ops/abCOpChs.h b/ops/abCOpChs.h deleted file mode 100644 index af58822..0000000 --- a/ops/abCOpChs.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - abCOpChs.h - By: Jeremy Rand - */ - - -#ifndef ABCOPCHS_H -#define ABCOPCHS_H - - -void abCalcOpChsInit(void); - - -#endif diff --git a/ops/abCOpClear.c b/ops/abCOpClear.c deleted file mode 100644 index 98cf922..0000000 --- a/ops/abCOpClear.c +++ /dev/null @@ -1,31 +0,0 @@ -/* - abCOpClear.c - By: Jeremy Rand - */ - - -#include -#include - -#include "abCStack.h" - -#include "ops/abCOp.h" -#include "ops/abCOpClear.h" - - -#define CLEAR_NAME "CLEAR" - - -static void clearExecute(void); - - -void abCalcOpClearInit(void) -{ - abCalcOpRegister(CLEAR_NAME, clearExecute); -} - - -void clearExecute(void) -{ - abCalcStackClear(); -} diff --git a/ops/abCOpClear.h b/ops/abCOpClear.h deleted file mode 100644 index c7b45f6..0000000 --- a/ops/abCOpClear.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - abCOpClean.h - By: Jeremy Rand - */ - - -#ifndef ABCOPCLEAR_H -#define ABCOPCLEAR_H - - -void abCalcOpClearInit(void); - - -#endif diff --git a/ops/abCOpCos.c b/ops/abCOpCos.c deleted file mode 100644 index 44a00a5..0000000 --- a/ops/abCOpCos.c +++ /dev/null @@ -1,46 +0,0 @@ -/* - abCOpCos.c - By: Jeremy Rand - */ - - -#include -#include - -#include "abCError.h" -#include "abCStack.h" - -#include "expr/abCExpr.h" -#include "expr/abCExpReal.h" - -#include "ops/abCOp.h" -#include "ops/abCOpCos.h" - - -#define COS_NAME "COS" - - -static void cosExecute(void); - - -void abCalcOpCosInit(void) -{ - abCalcOpRegister(COS_NAME, cosExecute); -} - - -void cosExecute(void) -{ - abCalcExpr result; - AB_CALC_OP_ONE_ARG(COS_NAME); - - if (expr->type != abCalcExprTypeReal) { - abCalcRaiseError(abCalcBadArgTypeError, COS_NAME); - return; - } - - abCalcExprRealSet(&result, cos(expr->u.real)); - - abCalcStackExprPop(NULL); - abCalcStackExprPush(&result); -} diff --git a/ops/abCOpCos.h b/ops/abCOpCos.h deleted file mode 100644 index 57edc5b..0000000 --- a/ops/abCOpCos.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - abCOpCos.h - By: Jeremy Rand - */ - - -#ifndef ABCOPCOS_H -#define ABCOPCOS_H - - -void abCalcOpCosInit(void); - - -#endif diff --git a/ops/abCOpCosh.c b/ops/abCOpCosh.c deleted file mode 100644 index f34a929..0000000 --- a/ops/abCOpCosh.c +++ /dev/null @@ -1,46 +0,0 @@ -/* - abCOpCosh.c - By: Jeremy Rand - */ - - -#include -#include - -#include "abCError.h" -#include "abCStack.h" - -#include "expr/abCExpr.h" -#include "expr/abCExpReal.h" - -#include "ops/abCOp.h" -#include "ops/abCOpCosh.h" - - -#define COSH_NAME "COSH" - - -static void coshExecute(void); - - -void abCalcOpCoshInit(void) -{ - abCalcOpRegister(COSH_NAME, coshExecute); -} - - -void coshExecute(void) -{ - abCalcExpr result; - AB_CALC_OP_ONE_ARG(COSH_NAME); - - if (expr->type != abCalcExprTypeReal) { - abCalcRaiseError(abCalcBadArgTypeError, COSH_NAME); - return; - } - - abCalcExprRealSet(&result, cosh(expr->u.real)); - - abCalcStackExprPop(NULL); - abCalcStackExprPush(&result); -} diff --git a/ops/abCOpCosh.h b/ops/abCOpCosh.h deleted file mode 100644 index 5e1b4bf..0000000 --- a/ops/abCOpCosh.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - abCOpCosh.h - By: Jeremy Rand - */ - - -#ifndef ABCOPCOSH_H -#define ABCOPCOSH_H - - -void abCalcOpCoshInit(void); - - -#endif diff --git a/ops/abCOpDec.c b/ops/abCOpDec.c deleted file mode 100644 index 809e86c..0000000 --- a/ops/abCOpDec.c +++ /dev/null @@ -1,30 +0,0 @@ -/* - abCOpDec.c - By: Jeremy Rand - */ - - -#include - -#include "abCMode.h" - -#include "ops/abCOp.h" -#include "ops/abCOpDec.h" - - -#define DEC_NAME "DEC" - - -static void decExecute(void); - - -void abCalcOpDecInit(void) -{ - abCalcOpRegister(DEC_NAME, decExecute); -} - - -void decExecute(void) -{ - abCalcModeSetBase(abCalcModeDecBase); -} diff --git a/ops/abCOpDec.h b/ops/abCOpDec.h deleted file mode 100644 index f47057a..0000000 --- a/ops/abCOpDec.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - abCOpDec.h - By: Jeremy Rand - */ - - -#ifndef ABCOPDEC_H -#define ABCOPDEC_H - - -void abCalcOpDecInit(void); - - -#endif diff --git a/ops/abCOpDiv.c b/ops/abCOpDiv.c deleted file mode 100644 index df04601..0000000 --- a/ops/abCOpDiv.c +++ /dev/null @@ -1,77 +0,0 @@ -/* - abCOpDiv.c - By: Jeremy Rand - */ - - -#include - -#include "abCError.h" -#include "abCStack.h" - -#include "expr/abCExpr.h" -#include "expr/abCExpReal.h" -#include "expr/abCExprInt.h" - -#include "ops/abCOp.h" -#include "ops/abCOpDiv.h" - - -#define DIV_NAME "/" - - -static void divExecute(void); - - -void abCalcOpDivInit(void) -{ - abCalcOpRegister(DIV_NAME, divExecute); -} - - -void divExecute(void) -{ - abCalcExpr result; - char expr1Real = 0; - char expr2Real = 0; - AB_CALC_OP_TWO_ARGS(DIV_NAME); - - if (expr1->type == abCalcExprTypeReal) { - expr1Real = 1; - if (expr1->u.real == 0.0) { - abCalcRaiseError(abCalcInfiniteResultError, DIV_NAME); - return; - } - } else if (expr1->type == abCalcExprTypeInt) { - if (expr1->u.integer == 0l) { - abCalcRaiseError(abCalcInfiniteResultError, DIV_NAME); - return; - } - } else { - abCalcRaiseError(abCalcBadArgTypeError, DIV_NAME); - return; - } - - if (expr2->type == abCalcExprTypeReal) { - expr2Real = 1; - } else if (expr2->type != abCalcExprTypeInt) { - abCalcRaiseError(abCalcBadArgTypeError, DIV_NAME); - return; - } - - if ((expr1Real) && (expr2Real)) { - abCalcExprRealSet(&result, expr2->u.real / expr1->u.real); - } else { - if (expr1Real) { - abCalcExprIntSet(&result, expr2->u.integer / (abCalcIntType)expr1->u.real); - } else if (expr2Real) { - abCalcExprIntSet(&result, (abCalcIntType)expr2->u.real / expr1->u.integer); - } else { - abCalcExprIntSet(&result, expr2->u.integer / expr1->u.integer); - } - } - - abCalcStackExprPop(NULL); - abCalcStackExprPop(NULL); - abCalcStackExprPush(&result); -} diff --git a/ops/abCOpDiv.h b/ops/abCOpDiv.h deleted file mode 100644 index 24f10dd..0000000 --- a/ops/abCOpDiv.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - abCOpDiv.h - By: Jeremy Rand - */ - - -#ifndef ABCOPDIV_H -#define ABCOPDIV_H - - -void abCalcOpDivInit(void); - - -#endif diff --git a/ops/abCOpDrop.c b/ops/abCOpDrop.c deleted file mode 100644 index 3eb44fa..0000000 --- a/ops/abCOpDrop.c +++ /dev/null @@ -1,36 +0,0 @@ -/* - abCOpDrop.c - By: Jeremy Rand - */ - - -#include -#include - -#include "abCError.h" -#include "abCStack.h" - -#include "expr/abCExpr.h" - -#include "ops/abCOp.h" -#include "ops/abCOpDrop.h" - - -#define DROP_NAME "DROP" - - -static void dropExecute(void); - - -void abCalcOpDropInit(void) -{ - abCalcOpRegister(DROP_NAME, dropExecute); -} - - -void dropExecute(void) -{ - AB_CALC_OP_ONE_ARG(DROP_NAME); - - abCalcStackExprPop(NULL); -} diff --git a/ops/abCOpDrop.h b/ops/abCOpDrop.h deleted file mode 100644 index b0927c0..0000000 --- a/ops/abCOpDrop.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - abCOpDrop.h - By: Jeremy Rand - */ - - -#ifndef ABCOPDROP_H -#define ABCOPDROP_H - - -void abCalcOpDropInit(void); - - -#endif diff --git a/ops/abCOpExp.c b/ops/abCOpExp.c deleted file mode 100644 index 74cb743..0000000 --- a/ops/abCOpExp.c +++ /dev/null @@ -1,46 +0,0 @@ -/* - abCOpExp.c - By: Jeremy Rand - */ - - -#include -#include - -#include "abCError.h" -#include "abCStack.h" - -#include "expr/abCExpr.h" -#include "expr/abCExpReal.h" - -#include "ops/abCOp.h" -#include "ops/abCOpExp.h" - - -#define EXP_NAME "EXP" - - -static void expExecute(void); - - -void abCalcOpExpInit(void) -{ - abCalcOpRegister(EXP_NAME, expExecute); -} - - -void expExecute(void) -{ - abCalcExpr result; - AB_CALC_OP_ONE_ARG(EXP_NAME); - - if (expr->type != abCalcExprTypeReal) { - abCalcRaiseError(abCalcBadArgTypeError, EXP_NAME); - return; - } - - abCalcExprRealSet(&result, exp(expr->u.real)); - - abCalcStackExprPop(NULL); - abCalcStackExprPush(&result); -} diff --git a/ops/abCOpExp.h b/ops/abCOpExp.h deleted file mode 100644 index 4c8492a..0000000 --- a/ops/abCOpExp.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - abCOpExp.h - By: Jeremy Rand - */ - - -#ifndef ABCOPEXP_H -#define ABCOPEXP_H - - -void abCalcOpExpInit(void); - - -#endif diff --git a/ops/abCOpHex.c b/ops/abCOpHex.c deleted file mode 100644 index 12973b0..0000000 --- a/ops/abCOpHex.c +++ /dev/null @@ -1,30 +0,0 @@ -/* - abCOpHex.c - By: Jeremy Rand - */ - - -#include - -#include "abCMode.h" - -#include "ops/abCOp.h" -#include "ops/abCOpHex.h" - - -#define HEX_NAME "HEX" - - -static void hexExecute(void); - - -void abCalcOpHexInit(void) -{ - abCalcOpRegister(HEX_NAME, hexExecute); -} - - -void hexExecute(void) -{ - abCalcModeSetBase(abCalcModeHexBase); -} diff --git a/ops/abCOpHex.h b/ops/abCOpHex.h deleted file mode 100644 index 8471eb0..0000000 --- a/ops/abCOpHex.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - abCOpHex.h - By: Jeremy Rand - */ - - -#ifndef ABCOPHEX_H -#define ABCOPHEX_H - - -void abCalcOpHexInit(void); - - -#endif diff --git a/ops/abCOpInv.c b/ops/abCOpInv.c deleted file mode 100644 index 771fd53..0000000 --- a/ops/abCOpInv.c +++ /dev/null @@ -1,51 +0,0 @@ -/* - abCOpInv.c - By: Jeremy Rand - */ - - -#include -#include - -#include "abCError.h" -#include "abCStack.h" - -#include "expr/abCExpr.h" -#include "expr/abCExpReal.h" - -#include "ops/abCOp.h" -#include "ops/abCOpInv.h" - - -#define INV_NAME "INV" - - -static void invExecute(void); - - -void abCalcOpInvInit(void) -{ - abCalcOpRegister(INV_NAME, invExecute); -} - - -void invExecute(void) -{ - abCalcExpr result; - AB_CALC_OP_ONE_ARG(INV_NAME); - - if (expr->type != abCalcExprTypeReal) { - abCalcRaiseError(abCalcBadArgTypeError, INV_NAME); - return; - } - - if (expr->u.real == 0.0) { - abCalcRaiseError(abCalcInfiniteResultError, INV_NAME); - return; - } - - abCalcExprRealSet(&result, 1.0 / expr->u.real); - - abCalcStackExprPop(NULL); - abCalcStackExprPush(&result); -} diff --git a/ops/abCOpInv.h b/ops/abCOpInv.h deleted file mode 100644 index eab8c87..0000000 --- a/ops/abCOpInv.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - abCOpInv.h - By: Jeremy Rand - */ - - -#ifndef ABCOPINV_H -#define ABCOPINV_H - - -void abCalcOpInvInit(void); - - -#endif diff --git a/ops/abCOpLn.c b/ops/abCOpLn.c deleted file mode 100644 index c1593b6..0000000 --- a/ops/abCOpLn.c +++ /dev/null @@ -1,55 +0,0 @@ -/* - abCOpLn.c - By: Jeremy Rand - */ - - -#include -#include - -#include "abCError.h" -#include "abCStack.h" - -#include "expr/abCExpr.h" -#include "expr/abCExpReal.h" - -#include "ops/abCOp.h" -#include "ops/abCOpLn.h" - - -#define LN_NAME "LN" - - -static void lnExecute(void); - - -void abCalcOpLnInit(void) -{ - abCalcOpRegister(LN_NAME, lnExecute); -} - - -void lnExecute(void) -{ - abCalcExpr result; - AB_CALC_OP_ONE_ARG(LN_NAME); - - if (expr->type != abCalcExprTypeReal) { - abCalcRaiseError(abCalcBadArgTypeError, LN_NAME); - return; - } - - if (expr->u.real == 0.0) { - abCalcRaiseError(abCalcInfiniteResultError, LN_NAME); - return; - } - if (expr->u.real < 0.0) { - abCalcRaiseError(abCalcComplexResultError, LN_NAME); - return; - } - - abCalcExprRealSet(&result, log(expr->u.real)); - - abCalcStackExprPop(NULL); - abCalcStackExprPush(&result); -} diff --git a/ops/abCOpLn.h b/ops/abCOpLn.h deleted file mode 100644 index adb0752..0000000 --- a/ops/abCOpLn.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - abCOpLn.h - By: Jeremy Rand - */ - - -#ifndef ABCOPLN_H -#define ABCOPLN_H - - -void abCalcOpLnInit(void); - - -#endif diff --git a/ops/abCOpLog.c b/ops/abCOpLog.c deleted file mode 100644 index 0523ae3..0000000 --- a/ops/abCOpLog.c +++ /dev/null @@ -1,55 +0,0 @@ -/* - abCOpLog.c - By: Jeremy Rand - */ - - -#include -#include - -#include "abCError.h" -#include "abCStack.h" - -#include "expr/abCExpr.h" -#include "expr/abCExpReal.h" - -#include "ops/abCOp.h" -#include "ops/abCOpLog.h" - - -#define LOG_NAME "LOG" - - -static void logExecute(void); - - -void abCalcOpLogInit(void) -{ - abCalcOpRegister(LOG_NAME, logExecute); -} - - -void logExecute(void) -{ - abCalcExpr result; - AB_CALC_OP_ONE_ARG(LOG_NAME); - - if (expr->type != abCalcExprTypeReal) { - abCalcRaiseError(abCalcBadArgTypeError, LOG_NAME); - return; - } - - if (expr->u.real == 0.0) { - abCalcRaiseError(abCalcInfiniteResultError, LOG_NAME); - return; - } - if (expr->u.real < 0.0) { - abCalcRaiseError(abCalcComplexResultError, LOG_NAME); - return; - } - - abCalcExprRealSet(&result, log10(expr->u.real)); - - abCalcStackExprPop(NULL); - abCalcStackExprPush(&result); -} diff --git a/ops/abCOpLog.h b/ops/abCOpLog.h deleted file mode 100644 index b05ca20..0000000 --- a/ops/abCOpLog.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - abCOpLog.h - By: Jeremy Rand - */ - - -#ifndef ABCOPLOG_H -#define ABCOPLOG_H - - -void abCalcOpLogInit(void); - - -#endif diff --git a/ops/abCOpMult.c b/ops/abCOpMult.c deleted file mode 100644 index b097188..0000000 --- a/ops/abCOpMult.c +++ /dev/null @@ -1,68 +0,0 @@ -/* - abCOpMult.c - By: Jeremy Rand - */ - - -#include - -#include "abCError.h" -#include "abCStack.h" - -#include "expr/abCExpr.h" -#include "expr/abCExpReal.h" -#include "expr/abCExprInt.h" - -#include "ops/abCOp.h" -#include "ops/abCOpMult.h" - - -#define MUL_NAME "*" - - -static void multExecute(void); - - -void abCalcOpMultInit(void) -{ - abCalcOpRegister(MUL_NAME, multExecute); -} - - -void multExecute(void) -{ - abCalcExpr result; - char expr1Real = 0; - char expr2Real = 0; - AB_CALC_OP_TWO_ARGS(MUL_NAME); - - if (expr1->type == abCalcExprTypeReal) { - expr1Real = 1; - } else if (expr1->type != abCalcExprTypeInt) { - abCalcRaiseError(abCalcBadArgTypeError, MUL_NAME); - return; - } - - if (expr2->type == abCalcExprTypeReal) { - expr2Real = 1; - } else if (expr2->type != abCalcExprTypeInt) { - abCalcRaiseError(abCalcBadArgTypeError, MUL_NAME); - return; - } - - if ((expr1Real) && (expr2Real)) { - abCalcExprRealSet(&result, expr2->u.real * expr1->u.real); - } else { - if (expr1Real) { - abCalcExprIntSet(&result, expr2->u.integer * (abCalcIntType)expr1->u.real); - } else if (expr2Real) { - abCalcExprIntSet(&result, (abCalcIntType)expr2->u.real * expr1->u.integer); - } else { - abCalcExprIntSet(&result, expr2->u.integer * expr1->u.integer); - } - } - - abCalcStackExprPop(NULL); - abCalcStackExprPop(NULL); - abCalcStackExprPush(&result); -} diff --git a/ops/abCOpMult.h b/ops/abCOpMult.h deleted file mode 100644 index b32db73..0000000 --- a/ops/abCOpMult.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - abCOpMult.h - By: Jeremy Rand - */ - - -#ifndef ABCOPMULT_H -#define ABCOPMULT_H - - -void abCalcOpMultInit(void); - - -#endif diff --git a/ops/abCOpNot.c b/ops/abCOpNot.c deleted file mode 100644 index e321fc8..0000000 --- a/ops/abCOpNot.c +++ /dev/null @@ -1,45 +0,0 @@ -/* - abCOpNot.c - By: Jeremy Rand - */ - - -#include - -#include "abCError.h" -#include "abCStack.h" - -#include "expr/abCExpr.h" -#include "expr/abCExprInt.h" - -#include "ops/abCOp.h" -#include "ops/abCOpNot.h" - - -#define NOT_NAME "NOT" - - -static void notExecute(void); - - -void abCalcOpNotInit(void) -{ - abCalcOpRegister(NOT_NAME, notExecute); -} - - -void notExecute(void) -{ - abCalcExpr result; - AB_CALC_OP_ONE_ARG(NOT_NAME); - - if (expr->type != abCalcExprTypeInt) { - abCalcRaiseError(abCalcBadArgTypeError, NOT_NAME); - return; - } - - abCalcExprIntSet(&result, ~(expr->u.integer)); - - abCalcStackExprPop(NULL); - abCalcStackExprPush(&result); -} diff --git a/ops/abCOpNot.h b/ops/abCOpNot.h deleted file mode 100644 index f7c90b0..0000000 --- a/ops/abCOpNot.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - abCOpNot.h - By: Jeremy Rand - */ - - -#ifndef ABCOPNOT_H -#define ABCOPNOT_H - - -void abCalcOpNotInit(void); - - -#endif diff --git a/ops/abCOpOct.c b/ops/abCOpOct.c deleted file mode 100644 index 1a50f72..0000000 --- a/ops/abCOpOct.c +++ /dev/null @@ -1,30 +0,0 @@ -/* - abCOpOct.c - By: Jeremy Rand - */ - - -#include - -#include "abCMode.h" - -#include "ops/abCOp.h" -#include "ops/abCOpOct.h" - - -#define OCT_NAME "OCT" - - -static void octExecute(void); - - -void abCalcOpOctInit(void) -{ - abCalcOpRegister(OCT_NAME, octExecute); -} - - -void octExecute(void) -{ - abCalcModeSetBase(abCalcModeOctBase); -} diff --git a/ops/abCOpOct.h b/ops/abCOpOct.h deleted file mode 100644 index 6fac438..0000000 --- a/ops/abCOpOct.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - abCOpOct.h - By: Jeremy Rand - */ - - -#ifndef ABCOPOCT_H -#define ABCOPOCT_H - - -void abCalcOpOctInit(void); - - -#endif diff --git a/ops/abCOpOr.c b/ops/abCOpOr.c deleted file mode 100644 index ac2316e..0000000 --- a/ops/abCOpOr.c +++ /dev/null @@ -1,51 +0,0 @@ -/* - abCOpOr.c - By: Jeremy Rand - */ - - -#include - -#include "abCError.h" -#include "abCStack.h" - -#include "expr/abCExpr.h" -#include "expr/abCExprInt.h" - -#include "ops/abCOp.h" -#include "ops/abCOpOr.h" - - -#define OR_NAME "OR" - - -static void orExecute(void); - - -void abCalcOpOrInit(void) -{ - abCalcOpRegister(OR_NAME, orExecute); -} - - -void orExecute(void) -{ - abCalcExpr result; - AB_CALC_OP_TWO_ARGS(OR_NAME); - - if (expr1->type != abCalcExprTypeInt) { - abCalcRaiseError(abCalcBadArgTypeError, OR_NAME); - return; - } - - if (expr2->type != abCalcExprTypeInt) { - abCalcRaiseError(abCalcBadArgTypeError, OR_NAME); - return; - } - - abCalcExprIntSet(&result, expr2->u.integer | expr1->u.integer); - - abCalcStackExprPop(NULL); - abCalcStackExprPop(NULL); - abCalcStackExprPush(&result); -} diff --git a/ops/abCOpOr.h b/ops/abCOpOr.h deleted file mode 100644 index 525968e..0000000 --- a/ops/abCOpOr.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - abCOpOr.h - By: Jeremy Rand - */ - - -#ifndef ABCOPOR_H -#define ABCOPOR_H - - -void abCalcOpOrInit(void); - - -#endif diff --git a/ops/abCOpPi.c b/ops/abCOpPi.c deleted file mode 100644 index 859fac7..0000000 --- a/ops/abCOpPi.c +++ /dev/null @@ -1,42 +0,0 @@ -/* - abCOpPi.c - By: Jeremy Rand - */ - - -#include -#include - -#include "abCStack.h" - -#include "expr/abCExpr.h" -#include "expr/abCExpReal.h" - -#include "ops/abCOp.h" -#include "ops/abCOpPi.h" - - -#define PI_NAME "PI" - - -static void piExecute(void); - - -void abCalcOpPiInit(void) -{ - abCalcOpRegister(PI_NAME, piExecute); -} - - -void piExecute(void) -{ - abCalcExpr result; - -#ifdef ABCALC_GSOS - abCalcExprRealSet(&result, 2.0 * asin(1.0)); -#else - abCalcExprRealSet(&result, M_PI); -#endif - - abCalcStackExprPush(&result); -} diff --git a/ops/abCOpPi.h b/ops/abCOpPi.h deleted file mode 100644 index 5cde26c..0000000 --- a/ops/abCOpPi.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - abCOpPi.h - By: Jeremy Rand - */ - - -#ifndef ABCOPPI_H -#define ABCOPPI_H - - -void abCalcOpPiInit(void); - - -#endif diff --git a/ops/abCOpPower.c b/ops/abCOpPower.c deleted file mode 100644 index 69f76f8..0000000 --- a/ops/abCOpPower.c +++ /dev/null @@ -1,73 +0,0 @@ -/* - abCOpPower.c - By: Jeremy Rand - */ - - -#include -#include - -#include "abCError.h" -#include "abCStack.h" - -#include "expr/abCExpr.h" -#include "expr/abCExpReal.h" - -#include "ops/abCOp.h" -#include "ops/abCOpPower.h" - - -#define POWER_NAME "^" - - -static void powerExecute(void); - - -void abCalcOpPowerInit(void) -{ - abCalcOpRegister(POWER_NAME, powerExecute); -} - - -void powerExecute(void) -{ - abCalcExpr result; - double integral; - AB_CALC_OP_TWO_ARGS(POWER_NAME); - - if (expr1->type != abCalcExprTypeReal) { - abCalcRaiseError(abCalcBadArgTypeError, POWER_NAME); - return; - } - - if (expr2->type != abCalcExprTypeReal) { - abCalcRaiseError(abCalcBadArgTypeError, POWER_NAME); - return; - } - - if (expr2->u.real == 0.0) { - if (expr1->u.real < 0.0) { - abCalcRaiseError(abCalcInfiniteResultError, POWER_NAME); - return; - } - if (expr1->u.real == 0.0) { - abCalcExprRealSet(&result, 1.0); - } else { - abCalcExprRealSet(&result, 0.0); - } - } else { - if (expr2->u.real < 0.0) { - modf(expr1->u.real, &integral); - if (expr1->u.real != integral) { - abCalcRaiseError(abCalcComplexResultError, POWER_NAME); - return; - } - } - - abCalcExprRealSet(&result, pow(expr2->u.real, expr1->u.real)); - } - - abCalcStackExprPop(NULL); - abCalcStackExprPop(NULL); - abCalcStackExprPush(&result); -} diff --git a/ops/abCOpPower.h b/ops/abCOpPower.h deleted file mode 100644 index df058fc..0000000 --- a/ops/abCOpPower.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - abCOpPower.h - By: Jeremy Rand - */ - - -#ifndef ABCOPPOWER_H -#define ABCOPPOWER_H - - -void abCalcOpPowerInit(void); - - -#endif diff --git a/ops/abCOpR2B.c b/ops/abCOpR2B.c deleted file mode 100644 index 5b18989..0000000 --- a/ops/abCOpR2B.c +++ /dev/null @@ -1,48 +0,0 @@ -/* - abCOpR2B.c - By: Jeremy Rand - */ - - -#include - -#include "abCError.h" -#include "abCStack.h" - -#include "expr/abCExpr.h" -#include "expr/abCExpReal.h" -#include "expr/abCExprInt.h" - -#include "ops/abCOp.h" -#include "ops/abCOpR2B.h" - - -#define R2B_NAME "R2B" - - -static void r2bExecute(void); - - -void abCalcOpR2BInit(void) -{ - abCalcOpRegister(R2B_NAME, r2bExecute); -} - - -void r2bExecute(void) -{ - abCalcExpr result; - int width; - int topBit; - AB_CALC_OP_ONE_ARG(R2B_NAME); - - if (expr->type != abCalcExprTypeReal) { - abCalcRaiseError(abCalcBadArgTypeError, R2B_NAME); - return; - } - - abCalcExprIntSet(&result, (abCalcIntType)expr->u.real); - - abCalcStackExprPop(NULL); - abCalcStackExprPush(&result); -} diff --git a/ops/abCOpR2B.h b/ops/abCOpR2B.h deleted file mode 100644 index 4b8c87e..0000000 --- a/ops/abCOpR2B.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - abCOpR2B.h - By: Jeremy Rand - */ - - -#ifndef ABCOPR2B_H -#define ABCOPR2B_H - - -void abCalcOpR2BInit(void); - - -#endif diff --git a/ops/abCOpRcws.c b/ops/abCOpRcws.c deleted file mode 100644 index 222d9d4..0000000 --- a/ops/abCOpRcws.c +++ /dev/null @@ -1,38 +0,0 @@ -/* - abCOpRcws.c - By: Jeremy Rand - */ - - -#include - -#include "abCStack.h" -#include "abCMode.h" - -#include "expr/abCExpr.h" -#include "expr/abCExpReal.h" - -#include "ops/abCOp.h" -#include "ops/abCOpRcws.h" - - -#define RCWS_NAME "RCWS" - - -static void rcwsExecute(void); - - -void abCalcOpRcwsInit(void) -{ - abCalcOpRegister(RCWS_NAME, rcwsExecute); -} - - -void rcwsExecute(void) -{ - abCalcExpr result; - - abCalcExprRealSet(&result, (abCalcRealType)abCalcModeGetIntWidth()); - - abCalcStackExprPush(&result); -} diff --git a/ops/abCOpRcws.h b/ops/abCOpRcws.h deleted file mode 100644 index b6f1ad3..0000000 --- a/ops/abCOpRcws.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - abCOpRcws.h - By: Jeremy Rand - */ - - -#ifndef ABCOPRCWS_H -#define ABCOPRCWS_H - - -void abCalcOpRcwsInit(void); - - -#endif diff --git a/ops/abCOpRl.c b/ops/abCOpRl.c deleted file mode 100644 index a7670b8..0000000 --- a/ops/abCOpRl.c +++ /dev/null @@ -1,51 +0,0 @@ -/* - abCOpRl.c - By: Jeremy Rand - */ - - -#include - -#include "abCError.h" -#include "abCMode.h" -#include "abCStack.h" - -#include "expr/abCExpr.h" -#include "expr/abCExprInt.h" - -#include "ops/abCOp.h" -#include "ops/abCOpRl.h" - - -#define RL_NAME "RL" - - -static void rlExecute(void); - - -void abCalcOpRlInit(void) -{ - abCalcOpRegister(RL_NAME, rlExecute); -} - - -void rlExecute(void) -{ - abCalcExpr result; - int width; - int topBit; - AB_CALC_OP_ONE_ARG(RL_NAME); - - if (expr->type != abCalcExprTypeInt) { - abCalcRaiseError(abCalcBadArgTypeError, RL_NAME); - return; - } - - width = abCalcModeGetIntWidth(); - topBit = ((expr->u.integer >> (width - 1)) & 1); - - abCalcExprIntSet(&result, ((expr->u.integer << 1) | topBit)); - - abCalcStackExprPop(NULL); - abCalcStackExprPush(&result); -} diff --git a/ops/abCOpRl.h b/ops/abCOpRl.h deleted file mode 100644 index 463f867..0000000 --- a/ops/abCOpRl.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - abCOpRl.h - By: Jeremy Rand - */ - - -#ifndef ABCOPRL_H -#define ABCOPRL_H - - -void abCalcOpRlInit(void); - - -#endif diff --git a/ops/abCOpRr.c b/ops/abCOpRr.c deleted file mode 100644 index 41cd173..0000000 --- a/ops/abCOpRr.c +++ /dev/null @@ -1,51 +0,0 @@ -/* - abCOpRr.c - By: Jeremy Rand - */ - - -#include - -#include "abCError.h" -#include "abCMode.h" -#include "abCStack.h" - -#include "expr/abCExpr.h" -#include "expr/abCExprInt.h" - -#include "ops/abCOp.h" -#include "ops/abCOpRr.h" - - -#define RR_NAME "RR" - - -static void rrExecute(void); - - -void abCalcOpRrInit(void) -{ - abCalcOpRegister(RR_NAME, rrExecute); -} - - -void rrExecute(void) -{ - abCalcExpr result; - int width; - abCalcIntType bottomBit; - AB_CALC_OP_ONE_ARG(RR_NAME); - - if (expr->type != abCalcExprTypeInt) { - abCalcRaiseError(abCalcBadArgTypeError, RR_NAME); - return; - } - - width = abCalcModeGetIntWidth(); - bottomBit = (expr->u.integer & 1); - - abCalcExprIntSet(&result, ((expr->u.integer >> 1) | (bottomBit << (width - 1)))); - - abCalcStackExprPop(NULL); - abCalcStackExprPush(&result); -} diff --git a/ops/abCOpRr.h b/ops/abCOpRr.h deleted file mode 100644 index 6184ae9..0000000 --- a/ops/abCOpRr.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - abCOpRr.h - By: Jeremy Rand - */ - - -#ifndef ABCOPRR_H -#define ABCOPRR_H - - -void abCalcOpRrInit(void); - - -#endif diff --git a/ops/abCOpSin.c b/ops/abCOpSin.c deleted file mode 100644 index efe3cf2..0000000 --- a/ops/abCOpSin.c +++ /dev/null @@ -1,46 +0,0 @@ -/* - abCOpSin.c - By: Jeremy Rand - */ - - -#include -#include - -#include "abCError.h" -#include "abCStack.h" - -#include "expr/abCExpr.h" -#include "expr/abCExpReal.h" - -#include "ops/abCOp.h" -#include "ops/abCOpSin.h" - - -#define SIN_NAME "SIN" - - -static void sinExecute(void); - - -void abCalcOpSinInit(void) -{ - abCalcOpRegister(SIN_NAME, sinExecute); -} - - -void sinExecute(void) -{ - abCalcExpr result; - AB_CALC_OP_ONE_ARG(SIN_NAME); - - if (expr->type != abCalcExprTypeReal) { - abCalcRaiseError(abCalcBadArgTypeError, SIN_NAME); - return; - } - - abCalcExprRealSet(&result, sin(expr->u.real)); - - abCalcStackExprPop(NULL); - abCalcStackExprPush(&result); -} diff --git a/ops/abCOpSin.h b/ops/abCOpSin.h deleted file mode 100644 index e6ae3e2..0000000 --- a/ops/abCOpSin.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - abCOpSin.h - By: Jeremy Rand - */ - - -#ifndef ABCOPSIN_H -#define ABCOPSIN_H - - -void abCalcOpSinInit(void); - - -#endif diff --git a/ops/abCOpSinh.c b/ops/abCOpSinh.c deleted file mode 100644 index 42ee78a..0000000 --- a/ops/abCOpSinh.c +++ /dev/null @@ -1,46 +0,0 @@ -/* - abCOpSinh.c - By: Jeremy Rand - */ - - -#include -#include - -#include "abCError.h" -#include "abCStack.h" - -#include "expr/abCExpr.h" -#include "expr/abCExpReal.h" - -#include "ops/abCOp.h" -#include "ops/abCOpSinh.h" - - -#define SINH_NAME "SINH" - - -static void sinhExecute(void); - - -void abCalcOpSinhInit(void) -{ - abCalcOpRegister(SINH_NAME, sinhExecute); -} - - -void sinhExecute(void) -{ - abCalcExpr result; - AB_CALC_OP_ONE_ARG(SINH_NAME); - - if (expr->type != abCalcExprTypeReal) { - abCalcRaiseError(abCalcBadArgTypeError, SINH_NAME); - return; - } - - abCalcExprRealSet(&result, sinh(expr->u.real)); - - abCalcStackExprPop(NULL); - abCalcStackExprPush(&result); -} diff --git a/ops/abCOpSinh.h b/ops/abCOpSinh.h deleted file mode 100644 index dab0958..0000000 --- a/ops/abCOpSinh.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - abCOpSinh.h - By: Jeremy Rand - */ - - -#ifndef ABCOPSINH_H -#define ABCOPSINH_H - - -void abCalcOpSinhInit(void); - - -#endif diff --git a/ops/abCOpSl.c b/ops/abCOpSl.c deleted file mode 100644 index 0834e09..0000000 --- a/ops/abCOpSl.c +++ /dev/null @@ -1,45 +0,0 @@ -/* - abCOpSl.c - By: Jeremy Rand - */ - - -#include - -#include "abCError.h" -#include "abCStack.h" - -#include "expr/abCExpr.h" -#include "expr/abCExprInt.h" - -#include "ops/abCOp.h" -#include "ops/abCOpSl.h" - - -#define SL_NAME "SL" - - -static void slExecute(void); - - -void abCalcOpSlInit(void) -{ - abCalcOpRegister(SL_NAME, slExecute); -} - - -void slExecute(void) -{ - abCalcExpr result; - AB_CALC_OP_ONE_ARG(SL_NAME); - - if (expr->type != abCalcExprTypeInt) { - abCalcRaiseError(abCalcBadArgTypeError, SL_NAME); - return; - } - - abCalcExprIntSet(&result, (expr->u.integer << 1)); - - abCalcStackExprPop(NULL); - abCalcStackExprPush(&result); -} diff --git a/ops/abCOpSl.h b/ops/abCOpSl.h deleted file mode 100644 index e539b78..0000000 --- a/ops/abCOpSl.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - abCOpSl.h - By: Jeremy Rand - */ - - -#ifndef ABCOPSL_H -#define ABCOPSL_H - - -void abCalcOpSlInit(void); - - -#endif diff --git a/ops/abCOpSq.c b/ops/abCOpSq.c deleted file mode 100644 index 4b4e7f0..0000000 --- a/ops/abCOpSq.c +++ /dev/null @@ -1,46 +0,0 @@ -/* - abCOpSq.c - By: Jeremy Rand - */ - - -#include -#include - -#include "abCError.h" -#include "abCStack.h" - -#include "expr/abCExpr.h" -#include "expr/abCExpReal.h" - -#include "ops/abCOp.h" -#include "ops/abCOpSq.h" - - -#define SQ_NAME "SQ" - - -static void sqExecute(void); - - -void abCalcOpSqInit(void) -{ - abCalcOpRegister(SQ_NAME, sqExecute); -} - - -void sqExecute(void) -{ - abCalcExpr result; - AB_CALC_OP_ONE_ARG(SQ_NAME); - - if (expr->type != abCalcExprTypeReal) { - abCalcRaiseError(abCalcBadArgTypeError, SQ_NAME); - return; - } - - abCalcExprRealSet(&result, expr->u.real * expr->u.real); - - abCalcStackExprPop(NULL); - abCalcStackExprPush(&result); -} diff --git a/ops/abCOpSq.h b/ops/abCOpSq.h deleted file mode 100644 index 41ff873..0000000 --- a/ops/abCOpSq.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - abCOpSq.h - By: Jeremy Rand - */ - - -#ifndef ABCOPSQ_H -#define ABCOPSQ_H - - -void abCalcOpSqInit(void); - - -#endif diff --git a/ops/abCOpSqrt.c b/ops/abCOpSqrt.c deleted file mode 100644 index 02e70c0..0000000 --- a/ops/abCOpSqrt.c +++ /dev/null @@ -1,51 +0,0 @@ -/* - abCOpSqrt.c - By: Jeremy Rand - */ - - -#include -#include - -#include "abCError.h" -#include "abCStack.h" - -#include "expr/abCExpr.h" -#include "expr/abCExpReal.h" - -#include "ops/abCOp.h" -#include "ops/abCOpSqrt.h" - - -#define SQRT_NAME "SQRT" - - -static void sqrtExecute(void); - - -void abCalcOpSqrtInit(void) -{ - abCalcOpRegister(SQRT_NAME, sqrtExecute); -} - - -void sqrtExecute(void) -{ - abCalcExpr result; - AB_CALC_OP_ONE_ARG(SQRT_NAME); - - if (expr->type != abCalcExprTypeReal) { - abCalcRaiseError(abCalcBadArgTypeError, SQRT_NAME); - return; - } - - if (expr->u.real < 0.0) { - abCalcRaiseError(abCalcComplexResultError, SQRT_NAME); - return; - } - - abCalcExprRealSet(&result, sqrt(expr->u.real)); - - abCalcStackExprPop(NULL); - abCalcStackExprPush(&result); -} diff --git a/ops/abCOpSqrt.h b/ops/abCOpSqrt.h deleted file mode 100644 index 9b518b5..0000000 --- a/ops/abCOpSqrt.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - abCOpSqrt.h - By: Jeremy Rand - */ - - -#ifndef ABCOPSQRT_H -#define ABCOPSQRT_H - - -void abCalcOpSqrtInit(void); - - -#endif diff --git a/ops/abCOpSr.c b/ops/abCOpSr.c deleted file mode 100644 index b58cfbd..0000000 --- a/ops/abCOpSr.c +++ /dev/null @@ -1,45 +0,0 @@ -/* - abCOpSr.c - By: Jeremy Rand - */ - - -#include - -#include "abCError.h" -#include "abCStack.h" - -#include "expr/abCExpr.h" -#include "expr/abCExprInt.h" - -#include "ops/abCOp.h" -#include "ops/abCOpSr.h" - - -#define SR_NAME "SR" - - -static void srExecute(void); - - -void abCalcOpSrInit(void) -{ - abCalcOpRegister(SR_NAME, srExecute); -} - - -void srExecute(void) -{ - abCalcExpr result; - AB_CALC_OP_ONE_ARG(SR_NAME); - - if (expr->type != abCalcExprTypeInt) { - abCalcRaiseError(abCalcBadArgTypeError, SR_NAME); - return; - } - - abCalcExprIntSet(&result, (expr->u.integer >> 1)); - - abCalcStackExprPop(NULL); - abCalcStackExprPush(&result); -} diff --git a/ops/abCOpSr.h b/ops/abCOpSr.h deleted file mode 100644 index fe41bd5..0000000 --- a/ops/abCOpSr.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - abCOpSr.h - By: Jeremy Rand - */ - - -#ifndef ABCOPSR_H -#define ABCOPSR_H - - -void abCalcOpSrInit(void); - - -#endif diff --git a/ops/abCOpStws.c b/ops/abCOpStws.c deleted file mode 100644 index 040f068..0000000 --- a/ops/abCOpStws.c +++ /dev/null @@ -1,50 +0,0 @@ -/* - abCOpStws.c - By: Jeremy Rand - */ - - -#include - -#include "abCError.h" -#include "abCStack.h" -#include "abCMode.h" - -#include "expr/abCExpr.h" - -#include "ops/abCOp.h" -#include "ops/abCOpStws.h" - - -#define STWS_NAME "STWS" - - -static void stwsExecute(void); - - -void abCalcOpStwsInit(void) -{ - abCalcOpRegister(STWS_NAME, stwsExecute); -} - - -void stwsExecute(void) -{ - int newWidth; - AB_CALC_OP_ONE_ARG(STWS_NAME); - - if (expr->type != abCalcExprTypeReal) { - abCalcRaiseError(abCalcBadArgTypeError, STWS_NAME); - return; - } - - newWidth = (int)expr->u.real; - if ((newWidth < 1) || - (newWidth > AB_CALC_EXPR_MAX_INT_WIDTH)) { - abCalcRaiseError(abCalcBadArgValueError, STWS_NAME); - return; - } - - abCalcModeSetIntWidth(newWidth); - abCalcStackExprPop(NULL); -} diff --git a/ops/abCOpStws.h b/ops/abCOpStws.h deleted file mode 100644 index 52e2120..0000000 --- a/ops/abCOpStws.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - abCOpStws.h - By: Jeremy Rand - */ - - -#ifndef ABCOPSTWS_H -#define ABCOPSTWS_H - - -void abCalcOpStwsInit(void); - - -#endif diff --git a/ops/abCOpSubtr.c b/ops/abCOpSubtr.c deleted file mode 100644 index 3d4dc01..0000000 --- a/ops/abCOpSubtr.c +++ /dev/null @@ -1,68 +0,0 @@ -/* - abCOpSubtr.c - By: Jeremy Rand - */ - - -#include - -#include "abCError.h" -#include "abCStack.h" - -#include "expr/abCExpr.h" -#include "expr/abCExpReal.h" -#include "expr/abCExprInt.h" - -#include "ops/abCOp.h" -#include "ops/abCOpSubtr.h" - - -#define SUB_NAME "-" - - -static void subtrExecute(void); - - -void abCalcOpSubtrInit(void) -{ - abCalcOpRegister(SUB_NAME, subtrExecute); -} - - -void subtrExecute(void) -{ - abCalcExpr result; - char expr1Real = 0; - char expr2Real = 0; - AB_CALC_OP_TWO_ARGS(SUB_NAME); - - if (expr1->type == abCalcExprTypeReal) { - expr1Real = 1; - } else if (expr1->type != abCalcExprTypeInt) { - abCalcRaiseError(abCalcBadArgTypeError, SUB_NAME); - return; - } - - if (expr2->type == abCalcExprTypeReal) { - expr2Real = 1; - } else if (expr2->type != abCalcExprTypeInt) { - abCalcRaiseError(abCalcBadArgTypeError, SUB_NAME); - return; - } - - if ((expr1Real) && (expr2Real)) { - abCalcExprRealSet(&result, expr2->u.real - expr1->u.real); - } else { - if (expr1Real) { - abCalcExprIntSet(&result, expr2->u.integer - (abCalcIntType)expr1->u.real); - } else if (expr2Real) { - abCalcExprIntSet(&result, (abCalcIntType)expr2->u.real - expr1->u.integer); - } else { - abCalcExprIntSet(&result, expr2->u.integer - expr1->u.integer); - } - } - - abCalcStackExprPop(NULL); - abCalcStackExprPop(NULL); - abCalcStackExprPush(&result); -} diff --git a/ops/abCOpSubtr.h b/ops/abCOpSubtr.h deleted file mode 100644 index e2edefa..0000000 --- a/ops/abCOpSubtr.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - abCOpSubtr.h - By: Jeremy Rand - */ - - -#ifndef ABCOPSUBTR_H -#define ABCOPSUBTR_H - - -void abCalcOpSubtrInit(void); - - -#endif diff --git a/ops/abCOpSwap.c b/ops/abCOpSwap.c deleted file mode 100644 index 8c1cee9..0000000 --- a/ops/abCOpSwap.c +++ /dev/null @@ -1,45 +0,0 @@ -/* - abCOpSwap.c - By: Jeremy Rand - */ - - -#include -#include -#include - -#include "abCError.h" -#include "abCStack.h" - -#include "expr/abCExpr.h" - -#include "ops/abCOp.h" -#include "ops/abCOpSwap.h" - - -#define SWAP_NAME "SWAP" - - -static void swapExecute(void); - - -void abCalcOpSwapInit(void) -{ - abCalcOpRegister(SWAP_NAME, swapExecute); -} - - -void swapExecute(void) -{ - abCalcExpr result1; - abCalcExpr result2; - AB_CALC_OP_TWO_ARGS(SWAP_NAME); - - memcpy(&result2, expr2, sizeof(result2)); - memcpy(&result1, expr1, sizeof(result1)); - - abCalcStackExprPop(NULL); - abCalcStackExprPop(NULL); - abCalcStackExprPush(&result1); - abCalcStackExprPush(&result2); -} diff --git a/ops/abCOpSwap.h b/ops/abCOpSwap.h deleted file mode 100644 index 1edff5f..0000000 --- a/ops/abCOpSwap.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - abCOpSwap.h - By: Jeremy Rand - */ - - -#ifndef ABCOPSWAP_H -#define ABCOPSWAP_H - - -void abCalcOpSwapInit(void); - - -#endif diff --git a/ops/abCOpTan.c b/ops/abCOpTan.c deleted file mode 100644 index a8f0f76..0000000 --- a/ops/abCOpTan.c +++ /dev/null @@ -1,46 +0,0 @@ -/* - abCOpTan.c - By: Jeremy Rand - */ - - -#include -#include - -#include "abCError.h" -#include "abCStack.h" - -#include "expr/abCExpr.h" -#include "expr/abCExpReal.h" - -#include "ops/abCOp.h" -#include "ops/abCOpTan.h" - - -#define TAN_NAME "TAN" - - -static void tanExecute(void); - - -void abCalcOpTanInit(void) -{ - abCalcOpRegister(TAN_NAME, tanExecute); -} - - -void tanExecute(void) -{ - abCalcExpr result; - AB_CALC_OP_ONE_ARG(TAN_NAME); - - if (expr->type != abCalcExprTypeReal) { - abCalcRaiseError(abCalcBadArgTypeError, TAN_NAME); - return; - } - - abCalcExprRealSet(&result, tan(expr->u.real)); - - abCalcStackExprPop(NULL); - abCalcStackExprPush(&result); -} diff --git a/ops/abCOpTan.h b/ops/abCOpTan.h deleted file mode 100644 index 78d5e3f..0000000 --- a/ops/abCOpTan.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - abCOpTan.h - By: Jeremy Rand - */ - - -#ifndef ABCOPTAN_H -#define ABCOPTAN_H - - -void abCalcOpTanInit(void); - - -#endif diff --git a/ops/abCOpTanh.c b/ops/abCOpTanh.c deleted file mode 100644 index d9c0224..0000000 --- a/ops/abCOpTanh.c +++ /dev/null @@ -1,46 +0,0 @@ -/* - abCOpTanh.c - By: Jeremy Rand - */ - - -#include -#include - -#include "abCError.h" -#include "abCStack.h" - -#include "expr/abCExpr.h" -#include "expr/abCExpReal.h" - -#include "ops/abCOp.h" -#include "ops/abCOpTanh.h" - - -#define TANH_NAME "TANH" - - -static void tanhExecute(void); - - -void abCalcOpTanhInit(void) -{ - abCalcOpRegister(TANH_NAME, tanhExecute); -} - - -void tanhExecute(void) -{ - abCalcExpr result; - AB_CALC_OP_ONE_ARG(TANH_NAME); - - if (expr->type != abCalcExprTypeReal) { - abCalcRaiseError(abCalcBadArgTypeError, TANH_NAME); - return; - } - - abCalcExprRealSet(&result, tanh(expr->u.real)); - - abCalcStackExprPop(NULL); - abCalcStackExprPush(&result); -} diff --git a/ops/abCOpTanh.h b/ops/abCOpTanh.h deleted file mode 100644 index 47046e9..0000000 --- a/ops/abCOpTanh.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - abCOpTanh.h - By: Jeremy Rand - */ - - -#ifndef ABCOPTANH_H -#define ABCOPTANH_H - - -void abCalcOpTanhInit(void); - - -#endif diff --git a/ops/abCOpXor.c b/ops/abCOpXor.c deleted file mode 100644 index 412dd26..0000000 --- a/ops/abCOpXor.c +++ /dev/null @@ -1,51 +0,0 @@ -/* - abCOpXor.c - By: Jeremy Rand - */ - - -#include - -#include "abCError.h" -#include "abCStack.h" - -#include "expr/abCExpr.h" -#include "expr/abCExprInt.h" - -#include "ops/abCOp.h" -#include "ops/abCOpXor.h" - - -#define XOR_NAME "XOR" - - -static void xorExecute(void); - - -void abCalcOpXorInit(void) -{ - abCalcOpRegister(XOR_NAME, xorExecute); -} - - -void xorExecute(void) -{ - abCalcExpr result; - AB_CALC_OP_TWO_ARGS(XOR_NAME); - - if (expr1->type != abCalcExprTypeInt) { - abCalcRaiseError(abCalcBadArgTypeError, XOR_NAME); - return; - } - - if (expr2->type != abCalcExprTypeInt) { - abCalcRaiseError(abCalcBadArgTypeError, XOR_NAME); - return; - } - - abCalcExprIntSet(&result, expr2->u.integer ^ expr1->u.integer); - - abCalcStackExprPop(NULL); - abCalcStackExprPop(NULL); - abCalcStackExprPush(&result); -} diff --git a/ops/abCOpXor.h b/ops/abCOpXor.h deleted file mode 100644 index 9b9b136..0000000 --- a/ops/abCOpXor.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - abCOpXor.h - By: Jeremy Rand - */ - - -#ifndef ABCOPXOR_H -#define ABCOPXOR_H - - -void abCalcOpXorInit(void); - - -#endif diff --git a/screenshots/abCalc.png b/screenshots/abCalc.png deleted file mode 100644 index 5d8b548f4fe1f3bc3b57febe8e6384045aed329a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61995 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