From 3c3d2716a5e7edb0100fb3d0f98e02c24f689953 Mon Sep 17 00:00:00 2001 From: Elias Bennour Date: Sun, 28 Jan 2024 17:03:10 +0100 Subject: [PATCH] Revert "testing" This reverts commit 221a08e7 --- GC.c | 163 +++-- bigint/Makefile | 22 + bigint/README | 92 +++ bigint/build/bin/testbip | Bin 0 -> 72952 bytes bigint/build/include/bigint.h | 60 ++ bigint/build/include/support.h | 15 + bigint/build/lib/libbigint.a | Bin 0 -> 27544 bytes bigint/src/Makefile | 26 + bigint/src/bigint.c | 987 +++++++++++++++++++++++++ bigint/src/bigint.h | 60 ++ bigint/src/bigint.o | Bin 0 -> 27160 bytes bigint/src/libbigint.a | Bin 0 -> 27544 bytes bigint/src/support.h | 15 + bigint/tst/Makefile | 28 + bigint/tst/support.c | 58 ++ bigint/tst/support.o | Bin 0 -> 3536 bytes bigint/tst/testbip | Bin 0 -> 72952 bytes bigint/tst/testbip.c | 1253 ++++++++++++++++++++++++++++++++ bigint/tst/testbip.o | Bin 0 -> 44472 bytes njvm.o | Bin 56728 -> 53680 bytes objref.c | 4 +- 21 files changed, 2704 insertions(+), 79 deletions(-) create mode 100644 bigint/Makefile create mode 100644 bigint/README create mode 100755 bigint/build/bin/testbip create mode 100644 bigint/build/include/bigint.h create mode 100644 bigint/build/include/support.h create mode 100644 bigint/build/lib/libbigint.a create mode 100644 bigint/src/Makefile create mode 100644 bigint/src/bigint.c create mode 100644 bigint/src/bigint.h create mode 100644 bigint/src/bigint.o create mode 100644 bigint/src/libbigint.a create mode 100644 bigint/src/support.h create mode 100644 bigint/tst/Makefile create mode 100644 bigint/tst/support.c create mode 100644 bigint/tst/support.o create mode 100755 bigint/tst/testbip create mode 100644 bigint/tst/testbip.c create mode 100644 bigint/tst/testbip.o diff --git a/GC.c b/GC.c index bde1048..e02e026 100644 --- a/GC.c +++ b/GC.c @@ -1,104 +1,113 @@ #ifndef GC #define GC +#define HAS_BROKENHEART_FLAG(objRef) (((objRef)->size & 1 << (7 * sizeof(unsigned int) -1)) == 0) #include #include #include #include #include "objref.c" #include "instruktion.c" +#include "support.c" -bool halbspeicher1IsActiv = true; -unsigned char* halbspeicher1; -unsigned char* halbspeicher2; -unsigned char* freizeiger; -unsigned int groesse; +ObjRef heap; +ObjRef freePointer; +ObjRef middle; +ObjRef start; +ObjRef end; +ObjRef finalEnd; +ObjRef scanPtr; +ObjRef tmpEnd; -void initHeap(unsigned int size){ - groesse = size*1024/2; - if((halbspeicher1 = malloc(groesse)) == NULL) perror("malloc"); - if((halbspeicher2 = malloc(groesse)) == NULL) perror("malloc"); - freizeiger = halbspeicher1; +unsigned int defaultHeap = 8192 * 1024; + +void heapAlloc(unsigned int size){ + heap = malloc(size); + if(heap == NULL){ + fatalError("Not enough memory on Heap\n"); + } + + start = heap; + freePointer = start; + middle = (heap + (defaultHeap/2)); + end = middle; + finalEnd = (middle + (defaultHeap/2)); } + +void flip(void){ + freePointer = end; + tmpEnd = finalEnd; +} + ObjRef copyObjToFreeMem(ObjRef obj){ - ObjRef copy = (ObjRef) halbspeicher2[freizeiger]; - unsigned int size = (IS_PRIMITIVE(obj))? obj->size : GET_ELEMENT_COUNT(obj)* sizeof(void *); - memcpy((void *) halbspeicher2[freizeiger], obj, size); - freizeiger += size; - return copy; -} -void setBrokenHeart(ObjRef obj, bool val){ - //TODO -} -bool getBrokenHeart(ObjRef obj){ - //TODO - return true; -} -void setForwardPointer(ObjRef obj, void* ref){ - //TODO -} -void *getForwardPointer(ObjRef obj){ - //TODO - return malloc(0); + ObjRef tmp = freePointer; + memcpy(tmp, obj, obj->size); + if(IS_PRIMITIVE(tmp)){ + freePointer += sizeof(tmp) + tmp->size; + }else{ + freePointer += sizeof(tmp) + tmp->size * sizeof(void*); + } + return tmp; } -ObjRef reallocate(ObjRef orig){ +ObjRef rellocate(ObjRef orig){ ObjRef copy; - if(orig == NULL){ - copy == NULL; - }else{ - if(getBrokenHeart(orig)){ - setForwardPointer(copy,orig); - }else{ + if (orig == NULL){ + + copy = NULL; + } else { + unsigned int tmp = HAS_BROKENHEART_FLAG(orig); + if (tmp){ + copy = orig->forward_pointer; + } else { copy = copyObjToFreeMem(orig); - setBrokenHeart(orig,true); - setForwardPointer(orig,copy); + orig->size = (1 | (1 << (7 * sizeof(unsigned int) -1))); + //SET_BROKENHEART_FLAG(orig); + orig->forward_pointer = copy; } } return copy; } -unsigned int getSize(ObjRef obj){ - return (IS_PRIMITIVE(obj))? obj->size : GET_ELEMENT_COUNT(obj)* sizeof(void *); + +void garbageColl(void){ + flip(); + for(int i = 0; i < program_size; i++){ + static_data_area[i] = rellocate(static_data_area[i]); // alte Objekte werden in neue akktive Halbspeicher geleitet bei relocate! + } + bip.op1 = rellocate(bip.op1); + bip.op2 = rellocate(bip.op2); + bip.res = rellocate(bip.res); + bip.rem = rellocate(bip.rem); + returnValueReg = rellocate(returnValueReg); + + scan(); + end = finalEnd; } + +ObjRef garbageCollectorMalloc(unsigned int size){ + if((freePointer + size) > end){ + garbageColl(); + } else if((freePointer > finalEnd)){ + fatalError("Not enough memory on Heap\n"); + } + ObjRef obj = freePointer; + if(obj == NULL){ + fatalError("Object is Null\n"); + } + freePointer += size; + return obj; +} + + void scan(void){ - void *scan = halbspeicher1; - while (scan < freizeiger){ - if(!IS_PRIMITIVE((ObjRef)scan)){ - for (unsigned int i = 0; i < GET_ELEMENT_COUNT((ObjRef)scan); i += getSize(GET_REFS_PTR((ObjRef)scan)[i])) { - GET_REFS_PTR((ObjRef)scan)[i] = reallocate(GET_REFS_PTR((ObjRef)scan)[i]); + scanPtr = start; //Zielspeicherzeiger; + while (scanPtr < freePointer){ + + if (!IS_PRIMITIVE(scanPtr)){ + + for (int i = 0; i < GET_ELEMENT_COUNT(scanPtr); i++){ + GET_REFS_PTR(scanPtr)[i] = rellocate(GET_REFS_PTR(scanPtr)[i]); } } - scan += getSize((ObjRef)scan); - } -} -void *alloc(unsigned int size){ - if((&freizeiger - &halbspeicher1)/8 + size > groesse) { - printf("Heap Overflow\n"); - exit(EXIT_FAILURE); - } - // Set broken heart to false - setBrokenHeart((ObjRef)freizeiger,false); - freizeiger += sizeof(bool) + sizeof(void *); - void *ptr = &freizeiger; - freizeiger += size; - return ptr; -} -void swap(void){ - unsigned char *tmp = halbspeicher1; - halbspeicher1 = halbspeicher2; - halbspeicher2 = tmp; - freizeiger = halbspeicher1; - halbspeicher1IsActiv = !halbspeicher1IsActiv; -} -void triggerGC(void){ - printf("GC triggered\n"); - //TODO -} -void copy(){ - ObjRef *test; - unsigned int objResSize = 2; - if((test = malloc(2*sizeof(test)))==NULL) perror("malloc"); - for (int i = 0; i < objResSize; ++i) { - } } diff --git a/bigint/Makefile b/bigint/Makefile new file mode 100644 index 0000000..0e1dac6 --- /dev/null +++ b/bigint/Makefile @@ -0,0 +1,22 @@ +# +# Makefile for big integer library and test +# + +DIRS = src tst + +all: clean + for i in $(DIRS) ; do \ + $(MAKE) -C $$i install ; \ + done + +clean: + for i in $(DIRS) ; do \ + $(MAKE) -C $$i clean ; \ + done + rm -rf ./build + rm -f *~ + +dist: clean + (cd .. ; \ + tar -cvf bigint.tar bigint ; \ + gzip -f bigint.tar) diff --git a/bigint/README b/bigint/README new file mode 100644 index 0000000..0f0534d --- /dev/null +++ b/bigint/README @@ -0,0 +1,92 @@ +The "bigint" Package +==================== + +1. What is it? +-------------- + +This package implements a multiple-precision integer arithmetic package, +i.e., a collection of functions which can calculate with integers having +arbitrarily many digits. The algorithms are taken from [D. Knuth: The +Art of Computer Programming, Vol. 2, Seminumerical Algorithms], the +implementation language is C. + + +2. "Multiple Precision" - how does it work? +------------------------------------------- + +Each integer number is represented as an array of digits. The array +is large enough to hold the number of digits necessary to represent +the number. Each digit occupies a single byte, so the number base of +this representation is 256. Addition, subtraction, and multiplication +work as we all have learned it: perform the desired operation digit +by digit, starting from the least significant digit, and observing +any "carries" from one place to the next higher one. Division is a +little bit more complicated because there is a certain amount of +guesswork involved. Knuth gives a formal treatment of this guesswork. + + +3. How do I use it? +------------------- + +Because every big integer may have a differently sized array to hold +its digits, these structures are dynamically allocated on the heap of +the C runtime system, and accessed by pointers. If you want to perform +an arithmetic operation on one or two big integers, you have to load +the corresponding pointers into a structure called BIP ("Big Integer +Processor"), and call the arithmetic function. When the function has +returned, the pointer to the result of the operation can be found in +another component of the BIP. The following functions are available: + + int bigSgn(void); /* sign */ + int bigCmp(void); /* comparison */ + void bigNeg(void); /* negation */ + void bigAdd(void); /* addition */ + void bigSub(void); /* subtraction */ + void bigMul(void); /* multiplication */ + void bigDiv(void); /* division */ + void bigFromInt(int n); /* conversion int --> big */ + int bigToInt(void); /* conversion big --> int */ + void bigRead(FILE *in); /* read a big integer */ + void bigPrint(FILE *out); /* print a big integer */ + void bigDump(FILE *out, BigObjRef bigObjRef); /* dump a big integer */ + +Some of these functions accept or return ordinary integers. For the +exact definition of each function's interface, please see the comments +in the function's source. + + +4. What else is needed? +----------------------- + +The library tries to detect fatal errors in using its functions (e.g., +null pointers to operands) as well as internal errors (which "cannot +happen"). In either case a user-supplied error routine is called, which +is supposed to print an error message and then to terminate the program. + +The library does not attempt to manage memory. For this purpose, it +relies on a user-supplied function "void* newPrimObject(int dataSize)", +which should allocate sufficiently many bytes and return a pointer to +a created object. In addition, the library needs to access a data field +- that implements the size-as-needed cocept - within the created object, +to actualy manage the data structures that represent the values of the +integer number. For this, the following function can be used: + +void * getPrimObjectDataPointer(void * obj){ + ObjRef oo = ((ObjRef) (obj)); + return oo->data; +} + +This function must also be a user-supplied function that must be +implemented by the program that wants to use this library. + +For details about these three user-supplied functions take a look in +the file "support.c" in the directory "tst". + + +5. What is in the directory "tst"? +---------------------------------- + +Well, you may have guessed it already: these are test cases for the +library. You can learn how to link against the library by inspecting +the "Makefile" for the tests, and you can find a simple implementation +of the support library. diff --git a/bigint/build/bin/testbip b/bigint/build/bin/testbip new file mode 100755 index 0000000000000000000000000000000000000000..02f1195ac14732a2717e31f2bb3994bf1634b85f GIT binary patch literal 72952 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

ykNZTRFA>v8Df*z#@K(rk0gACaa< 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 literal 0 HcmV?d00001 diff --git a/bigint/build/include/bigint.h b/bigint/build/include/bigint.h new file mode 100644 index 0000000..b93d88e --- /dev/null +++ b/bigint/build/include/bigint.h @@ -0,0 +1,60 @@ +/* + * bigint.h -- big integer library + */ + + +#ifndef _BIGINT_H_ +#define _BIGINT_H_ + + +/* object representation */ +typedef void* BigObjRef; + + +#include + + +typedef struct { + int nd; /* number of digits; array may be bigger */ + /* nd = 0 exactly when number = 0 */ + unsigned char sign; /* one of BIG_NEGATIVE or BIG_POSITIVE */ + /* zero always has BIG_POSITIVE here */ + unsigned char digits[1]; /* the digits proper; number base is 256 */ + /* LS digit first; MS digit is not zero */ +} Big; + +#include "support.h" + + +/* big integer processor registers */ + +typedef struct { + BigObjRef op1; /* first (or single) operand */ + BigObjRef op2; /* second operand (if present) */ + BigObjRef res; /* result of operation */ + BigObjRef rem; /* remainder in case of division */ +} BIP; + +extern BIP bip; /* registers of the processor */ + + +/* big integer processor functions */ + +int bigSgn(void); /* sign */ +int bigCmp(void); /* comparison */ +void bigNeg(void); /* negation */ +void bigAdd(void); /* addition */ +void bigSub(void); /* subtraction */ +void bigMul(void); /* multiplication */ +void bigDiv(void); /* division */ + +void bigFromInt(int n); /* conversion int --> big */ +int bigToInt(void); /* conversion big --> int */ + +void bigRead(FILE *in); /* read a big integer */ +void bigPrint(FILE *out); /* print a big integer */ + +void bigDump(FILE *out, BigObjRef bigObjRef); /* dump a big integer object */ + + +#endif /* _BIGINT_H_ */ diff --git a/bigint/build/include/support.h b/bigint/build/include/support.h new file mode 100644 index 0000000..8e4455e --- /dev/null +++ b/bigint/build/include/support.h @@ -0,0 +1,15 @@ +/* + * support.h -- object representation and support functions + */ + + +#ifndef _SUPPORT_H_ +#define _SUPPORT_H_ + +/* support functions */ + +void fatalError(char *msg); /* print a message and exit */ +void * newPrimObject(int dataSize); /* create a new primitive object */ +void * getPrimObjectDataPointer(void * primObject); + +#endif /* _SUPPORT_H_ */ diff --git a/bigint/build/lib/libbigint.a b/bigint/build/lib/libbigint.a new file mode 100644 index 0000000000000000000000000000000000000000..01ff5790d3725a84b9548db7f9744e9635bd4f0c GIT binary patch literal 27544 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 literal 0 HcmV?d00001 diff --git a/bigint/src/Makefile b/bigint/src/Makefile new file mode 100644 index 0000000..6973380 --- /dev/null +++ b/bigint/src/Makefile @@ -0,0 +1,26 @@ +# +# Makefile for big integer library +# + +BUILD = ../build + +CC = gcc +CFLAGS = -g -Wall + +all: support.h bigint.h libbigint.a + +install: all + mkdir -p $(BUILD)/include + cp support.h $(BUILD)/include + cp bigint.h $(BUILD)/include + mkdir -p $(BUILD)/lib + cp libbigint.a $(BUILD)/lib + +libbigint.a: bigint.o + ar -crs libbigint.a bigint.o + +bigint.o: bigint.c bigint.h support.h + $(CC) $(CFLAGS) -o bigint.o -c bigint.c + +clean: + rm -f *~ bigint.o libbigint.a diff --git a/bigint/src/bigint.c b/bigint/src/bigint.c new file mode 100644 index 0000000..90aa5ab --- /dev/null +++ b/bigint/src/bigint.c @@ -0,0 +1,987 @@ +/* + * bigint.c -- big integer library + */ + + +#include +#include + +#include "bigint.h" + +/**************************************************************/ + +/* debugging */ + + +#define DIV_CHK_01 0 +#define DIV_CHK_02 0 +#define DIV_CHK_03 0 +#define DIV_CHK_04 0 +#define DIV_CHK_05 0 +#define DIV_CHK_06 0 +#define DIV_CHK_07 0 +#define DIV_CHK_08 0 +#define DIV_CHK_09 0 +#define DIV_CHK_10 0 +#define DIV_CHK_11 0 + + +/**************************************************************/ + +/* big integer representation */ + + +#define BIG_NEGATIVE ((unsigned char) 0) +#define BIG_POSITIVE ((unsigned char) 1) + + +#define BIG_PTR(bigObjRef) ((Big *) (getPrimObjectDataPointer(bigObjRef))) +#define GET_ND(bigObjRef) (BIG_PTR(bigObjRef)->nd) +#define SET_ND(bigObjRef, val) (BIG_PTR(bigObjRef)->nd = (val)) +#define GET_SIGN(bigObjRef) (BIG_PTR(bigObjRef)->sign) +#define SET_SIGN(bigObjRef, val) (BIG_PTR(bigObjRef)->sign = (val)) +#define GET_DIGIT(bigObjRef, i) (BIG_PTR(bigObjRef)->digits[i]) +#define SET_DIGIT(bigObjRef, i, val) (BIG_PTR(bigObjRef)->digits[i] = (val)) + + +/**************************************************************/ + +/* global data */ + + +/* + * registers of the big integer processor + */ +BIP bip = { + NULL, /* op1 */ + NULL, /* op2 */ + NULL, /* res */ + NULL, /* rem */ +}; + + +/**************************************************************/ + + +/* + * construct a new big integer object + * + * number of digits is given by parameter + * a reference to a proper object is returned + * but no component of the big integer is set + * + * ATTENTION: All object references stored in + * places other than the bip registers may become + * invalid as soon as this function is called! + */ +static BigObjRef newBig(int nd) { + int dataSize; + BigObjRef bigObjRef; + + dataSize = sizeof(int) + 1 + nd; + bigObjRef = newPrimObject(dataSize); + return bigObjRef; +} + + +/**************************************************************/ + +/* big integer unsigned arithmetic */ + + +/* + * exchange bip.op1 and bip.op2 + */ +static void bigXchg(void) { + BigObjRef tmp; + + tmp = bip.op1; + bip.op1 = bip.op2; + bip.op2 = tmp; +} + + +/* + * big integer unsigned comparison + * + * operands in bip.op1 and bip.op2 + * result is < 0, = 0, or > 0 if and only if the + * same relation holds for bip.op1 and bip.op2 + */ +static int bigUcmp(void) { + int nd1; + int nd2; + int diff; + + /* compare sizes */ + nd1 = GET_ND(bip.op1); + nd2 = GET_ND(bip.op2); + if (nd1 != nd2) { + /* sizes are different: we know the bigger number */ + return nd1 - nd2; + } + /* sizes are equal: we must look at the digits */ + while (nd1--) { + diff = (int) GET_DIGIT(bip.op1, nd1) - + (int) GET_DIGIT(bip.op2, nd1); + if (diff != 0) { + return diff; + } + } + /* the numbers are equal */ + return 0; +} + + +/* + * big integer unsigned addition + * + * operands in bip.op1 and bip.op2 + * result in bip.res + */ +static void bigUadd(void) { + int nd1; + int nd2; + int i; + unsigned short carry; + unsigned short aux; + int xchgFlag; + + /* make sure op1 has at least as many digits as op2 */ + nd1 = GET_ND(bip.op1); + nd2 = GET_ND(bip.op2); + if (nd1 < nd2) { + /* exchange operands */ + bigXchg(); + i = nd1; + nd1 = nd2; + nd2 = i; + xchgFlag = 1; + } else { + /* don't exchange operands */ + xchgFlag = 0; + } + /* allocate result */ + bip.res = newBig(nd1 + 1); + /* copy op2 to result */ + for (i = 0; i < nd2; i++) { + SET_DIGIT(bip.res, i, GET_DIGIT(bip.op2, i)); + } + /* fill result with 0 up to size of op1 */ + for (; i < nd1; i++) { + SET_DIGIT(bip.res, i, 0); + } + /* res = op1 + res */ + carry = 0x00; + for (i = 0; i < nd1; i++) { + aux = (unsigned short) GET_DIGIT(bip.op1, i) + + (unsigned short) GET_DIGIT(bip.res, i) + + carry; + SET_DIGIT(bip.res, i, aux & 0xFF); + carry = aux >> 8; + } + SET_DIGIT(bip.res, i, carry); + /* determine actual size of result */ + i = nd1 + 1; + while (--i >= 0 && GET_DIGIT(bip.res, i) == 0) ; + SET_ND(bip.res, i + 1); + /* restore operands */ + if (xchgFlag) { + bigXchg(); + } +} + + +/* + * big integer unsigned subtraction + * + * operands in bip.op1 and bip.op2 + * result in bip.res, must not be negative + */ +static void bigUsub(void) { + int nd1; + int nd2; + int i; + unsigned short carry; + unsigned short aux; + + /* op1 must have at least as many digits as op2 */ + nd1 = GET_ND(bip.op1); + nd2 = GET_ND(bip.op2); + if (nd1 < nd2) { + /* unsigned subtraction would yield negative result */ + fatalError("internal library error #1 - THIS SHOULD NEVER HAPPEN!"); + } + /* allocate result */ + bip.res = newBig(nd1); + /* copy op2 to result */ + for (i = 0; i < nd2; i++) { + SET_DIGIT(bip.res, i, GET_DIGIT(bip.op2, i)); + } + /* fill result with 0 up to size of op1 */ + for (; i < nd1; i++) { + SET_DIGIT(bip.res, i, 0); + } + /* res = op1 - res */ + carry = 0x01; + for (i = 0; i < nd1; i++) { + aux = (unsigned short) GET_DIGIT(bip.op1, i) - + (unsigned short) GET_DIGIT(bip.res, i) + + carry + 0xFF; + SET_DIGIT(bip.res, i, aux & 0xFF); + carry = aux >> 8; + } + if (carry != 0x01) { + /* unsigned subtraction would yield negative result */ + fatalError("internal library error #2 - THIS SHOULD NEVER HAPPEN!"); + } + /* determine actual size of result */ + i = nd1; + while (--i >= 0 && GET_DIGIT(bip.res, i) == 0) ; + SET_ND(bip.res, i + 1); +} + + +/* + * big integer unsigned multiplication + * + * operands in bip.op1 and bip.op2 + * result in bip.res + */ +static void bigUmul(void) { + int nd1; + int nd2; + int i, j, k; + unsigned short carry; + unsigned short aux; + + /* get sizes of operands */ + nd1 = GET_ND(bip.op1); + nd2 = GET_ND(bip.op2); + /* allocate result */ + bip.res = newBig(nd1 + nd2); + /* reset lower nd1 digits of result */ + for (i = 0; i < nd1; i++) { + SET_DIGIT(bip.res, i, 0); + } + /* res = op1 * op2 */ + for (j = 0; j < nd2; j++) { + carry = 0x00; + for (k = j, i = 0; i < nd1; k++, i++) { + aux = (unsigned short) GET_DIGIT(bip.op1, i) * + (unsigned short) GET_DIGIT(bip.op2, j) + + (unsigned short) GET_DIGIT(bip.res, k) + + carry; + SET_DIGIT(bip.res, k, aux & 0xFF); + carry = aux >> 8; + } + SET_DIGIT(bip.res, k, carry); + } + /* determine actual size of result */ + i = nd1 + nd2; + while (--i >= 0 && GET_DIGIT(bip.res, i) == 0) ; + SET_ND(bip.res, i + 1); +} + + +/* + * big integer unsigned division by single digit divisor + * + * dividend in bip.rem, divisor in parameter + * quotient in bip.rem, remainder is returned + */ +static unsigned char bigUdiv1(unsigned char divisor) { + BigObjRef tmp; + int nd; + int i; + unsigned short d, r; + unsigned short aux; + + /* get size of dividend */ + nd = GET_ND(bip.rem); + /* check for division by zero */ + d = (unsigned short) divisor; + if (d == 0) { + fatalError("internal library error #3 - THIS SHOULD NEVER HAPPEN!"); + } + /* allocate result */ + tmp = newBig(nd); + /* tmp = dividend / divisor, r = dividend % divisor */ + r = 0; + for (i = nd - 1; i >= 0; i--) { + aux = (r << 8) | (unsigned short) GET_DIGIT(bip.rem, i); + SET_DIGIT(tmp, i, aux / d); + r = aux % d; + } + /* determine actual size of quotient */ + i = nd; + while (--i >= 0 && GET_DIGIT(tmp, i) == 0) ; + SET_ND(tmp, i + 1); + /* store quotient */ + bip.rem = tmp; + /* return remainder */ + return (unsigned char) r; +} + + +/* + * big integer unsigned division + * + * dividend in bip.op1, divisor in bip.op2 + * quotient in bip.res, remainder in bip.rem + */ +static void bigUdiv(void) { + BigObjRef tmp; + int nd1; + int nd2; + int nd3; + int i, j, k, l; + unsigned char r; + unsigned short scale; + unsigned short carry; + unsigned short aux; + unsigned short qhat; + unsigned short v1, v2; + unsigned short uj0, uj1, uj2, two; + + /* get sizes of operands */ + nd1 = GET_ND(bip.op1); + nd2 = GET_ND(bip.op2); + /* check for division by zero */ + if (nd2 == 0) { + fatalError("division by zero"); + } + /* check for small dividend */ + if (bigUcmp() < 0) { + /* res = 0 */ + bip.res = newBig(0); + SET_ND(bip.res, 0); + /* rem = op1; BUT THIS HAS TO BE A COPY! */ + bip.rem = newBig(nd1); + for (i = 0; i < nd1; i++) { + SET_DIGIT(bip.rem, i, GET_DIGIT(bip.op1, i)); + } + SET_ND(bip.rem, nd1); + return; + } + /* check for single digit divisor */ + if (nd2 == 1) { + /* yes - use simple division by single digit divisor */ + bip.rem = bip.op1; + r = bigUdiv1(GET_DIGIT(bip.op2, 0)); + bip.res = bip.rem; + if (r == 0) { + bip.rem = newBig(0); + SET_ND(bip.rem, 0); + } else { + bip.rem = newBig(1); + SET_ND(bip.rem, 1); + SET_DIGIT(bip.rem, 0, r); + } + return; + } + /* + * now for the general case + */ +#if DIV_CHK_01 + printf("div_chk #01: division, general case\n"); + printf(" dividend = "); + bigDump(stdout, bip.op1); + printf("\n"); + printf(" divisor = "); + bigDump(stdout, bip.op2); + printf("\n"); +#endif + /* determine scale factor for normalization */ + scale = (unsigned short) 256 / + ((unsigned short) GET_DIGIT(bip.op2, nd2 - 1) + 1); +#if DIV_CHK_02 + printf("div_chk #02: scale factor = %02X\n", scale); +#endif + /* normalize dividend, result is in bip.rem */ + bip.rem = newBig(nd1 + 1); + carry = 0x00; + for (i = 0; i < nd1; i++) { + aux = (unsigned short) GET_DIGIT(bip.op1, i) * scale + + carry; + SET_DIGIT(bip.rem, i, aux & 0xFF); + carry = aux >> 8; + } + SET_DIGIT(bip.rem, i, carry); + SET_ND(bip.rem, nd1 + 1); +#if DIV_CHK_03 + printf("div_chk #03: normalized dividend = "); + bigDump(stdout, bip.rem); + printf("\n"); +#endif + /* normalize divisor, result is in bip.res */ + bip.res = newBig(nd2); + carry = 0x00; + for (i = 0; i < nd2; i++) { + aux = (unsigned short) GET_DIGIT(bip.op2, i) * scale + + carry; + SET_DIGIT(bip.res, i, aux & 0xFF); + carry = aux >> 8; + } + if (carry != 0x00) { + /* overflow in divisor normalization */ + fatalError("internal library error #4 - THIS SHOULD NEVER HAPPEN!"); + } + SET_ND(bip.res, nd2); +#if DIV_CHK_04 + printf("div_chk #04: normalized divisor = "); + bigDump(stdout, bip.res); + printf("\n"); +#endif + /* allocate quotient */ + nd3 = nd1 - nd2 + 1; + tmp = newBig(nd3); + /* extract the two most significand digits of divisor */ + v1 = (unsigned short) GET_DIGIT(bip.res, nd2 - 1); + v2 = (unsigned short) GET_DIGIT(bip.res, nd2 - 2); + /* loop on digits of dividend and compute digits of quotient */ + /* j is index into dividend, k is index into quotient */ + for (j = nd1, k = nd3 - 1; k >= 0; j--, k--) { +#if DIV_CHK_05 + printf("div_chk #05: j = %d, k = %d\n", j, k); +#endif + /* calculate qhat */ + uj0 = (unsigned short) GET_DIGIT(bip.rem, j); + uj1 = (unsigned short) GET_DIGIT(bip.rem, j - 1); + uj2 = (unsigned short) GET_DIGIT(bip.rem, j - 2); + two = (uj0 << 8) | uj1; + if (uj0 == v1) { + qhat = (unsigned short) 255; +#if DIV_CHK_06 + printf("div_chk #06a: qhat = %02X\n", qhat); +#endif + } else { + qhat = two / v1; +#if DIV_CHK_06 + printf("div_chk #06b: qhat = %02X\n", qhat); +#endif + } + while (qhat * v2 > (((two - qhat * v1) << 8) | uj2)) { + qhat--; +#if DIV_CHK_07 + printf("div_chk #07: qhat decremented, is now %02X\n", qhat); +#endif + } + /* multiply and subtract */ + /* l is index into dividend, i is index into divisor */ + carry = 0xFF; + for (l = j - nd2, i = 0; i < nd2; l++, i++) { + aux = (unsigned short) GET_DIGIT(bip.rem, l) - + (unsigned short) GET_DIGIT(bip.res, i) * qhat + + carry + 0xFE01; + SET_DIGIT(bip.rem, l, aux & 0xFF); + carry = aux >> 8; + } + aux = (unsigned short) GET_DIGIT(bip.rem, l) + + carry + 0xFE01; + SET_DIGIT(bip.rem, l, aux & 0xFF); + carry = aux >> 8; +#if DIV_CHK_08 + printf("div_chk #08: remainder = "); + bigDump(stdout, bip.rem); + printf("\n"); +#endif + /* test remainder and possibly add back */ + if (carry != 0xFF) { + /* qhat is one too large */ + qhat--; +#if DIV_CHK_09 + printf("div_chk #09: qhat final correction, is now %02X\n", qhat); +#endif + /* add back */ + /* l is index into dividend, i is index into divisor */ + carry = 0x00; + for (l = j - nd2, i = 0; i < nd2; l++, i++) { + aux = (unsigned short) GET_DIGIT(bip.rem, l) + + (unsigned short) GET_DIGIT(bip.res, i) + + carry; + SET_DIGIT(bip.rem, l, aux & 0xFF); + carry = aux >> 8; + } + aux = (unsigned short) GET_DIGIT(bip.rem, l) + + carry; + SET_DIGIT(bip.rem, l, aux & 0xFF); + carry = aux >> 8; + if (carry != 0x01) { + /* missing carry in add-back sum */ + fatalError("internal library error #5 - THIS SHOULD NEVER HAPPEN!"); + } +#if DIV_CHK_10 + printf("div_chk #10: remainder = "); + bigDump(stdout, bip.rem); + printf("\n"); +#endif + } + /* store quotient digit */ + SET_DIGIT(tmp, k, qhat); +#if DIV_CHK_11 + printf("div_chk #11: quotient digit = %02X\n", qhat); +#endif + } + /* finish quotient */ + i = nd3; + while (--i >= 0 && GET_DIGIT(tmp, i) == 0) ; + SET_ND(tmp, i + 1); + bip.res = tmp; + /* finish and unnormalize remainder */ + i = nd1 + 1; + while (--i >= 0 && GET_DIGIT(bip.rem, i) == 0) ; + SET_ND(bip.rem, i + 1); + r = bigUdiv1(scale); + if (r != 0) { + /* non-zero remainder in unnormalization */ + fatalError("internal library error #6 - THIS SHOULD NEVER HAPPEN!"); + } +} + + +/**************************************************************/ + +/* nil reference exception */ + + +static void nilRefException(void) { + fatalError("big integer library detected illegal nil reference"); +} + + +/**************************************************************/ + +/* big integer arithmetic */ + + +/* + * big integer sign + * + * operand in bip.op1 + * result is < 0, = 0, or > 0 if and only if + * the same relation holds for bip.op1 + */ +int bigSgn(void) { + if (bip.op1 == NULL) { + nilRefException(); + } + if (GET_ND(bip.op1) == 0) { + return 0; + } + if (GET_SIGN(bip.op1) == BIG_POSITIVE) { + return 1; + } else { + return -1; + } +} + + +/* + * big integer comparison + * + * operands in bip.op1 and bip.op2 + * result is < 0, = 0, or > 0 if and only if the + * same relation holds for bip.op1 and bip.op2 + */ +int bigCmp(void) { + if (bip.op1 == NULL || + bip.op2 == NULL) { + nilRefException(); + } + if (GET_SIGN(bip.op1) == BIG_POSITIVE) { + if (GET_SIGN(bip.op2) == BIG_POSITIVE) { + /* op1 >= 0 and op2 >= 0 */ + return bigUcmp(); + } else { + /* op1 >= 0 and op2 < 0 */ + return 1; + } + } else { + if (GET_SIGN(bip.op2) == BIG_POSITIVE) { + /* op1 < 0 and op2 >= 0 */ + return -1; + } else { + /* op1 < 0 and op2 < 0 */ + return -bigUcmp(); + } + } +} + + +/* + * big integer negation + * + * operand in bip.op1 + * result in bip.res + */ +void bigNeg(void) { + int nd; + int i; + + if (bip.op1 == NULL) { + nilRefException(); + } + /* make copy of operand */ + nd = GET_ND(bip.op1); + bip.res = newBig(nd); + for (i = 0; i < nd; i++) { + SET_DIGIT(bip.res, i, GET_DIGIT(bip.op1, i)); + } + SET_ND(bip.res, nd); + /* store inverted sign */ + if (GET_SIGN(bip.op1) == BIG_NEGATIVE || nd == 0) { + SET_SIGN(bip.res, BIG_POSITIVE); + } else { + SET_SIGN(bip.res, BIG_NEGATIVE); + } +} + + +/* + * big integer addition + * + * operands in bip.op1 and bip.op2 + * result in bip.res + */ +void bigAdd(void) { + if (bip.op1 == NULL || + bip.op2 == NULL) { + nilRefException(); + } + if (GET_SIGN(bip.op1) == BIG_POSITIVE) { + if (GET_SIGN(bip.op2) == BIG_POSITIVE) { + /* op1 >= 0 and op2 >= 0 */ + bigUadd(); + SET_SIGN(bip.res, BIG_POSITIVE); + } else { + /* op1 >= 0 and op2 < 0 */ + if (bigUcmp() >= 0) { + /* |op1| >= |op2| */ + bigUsub(); + SET_SIGN(bip.res, BIG_POSITIVE); + } else { + /* |op1| < |op2| */ + bigXchg(); + bigUsub(); + SET_SIGN(bip.res, BIG_NEGATIVE); + bigXchg(); + } + } + } else { + if (GET_SIGN(bip.op2) == BIG_POSITIVE) { + /* op1 < 0 and op2 >= 0 */ + if (bigUcmp() <= 0) { + /* |op1| <= |op2| */ + bigXchg(); + bigUsub(); + SET_SIGN(bip.res, BIG_POSITIVE); + bigXchg(); + } else { + /* |op1| > |op2| */ + bigUsub(); + SET_SIGN(bip.res, BIG_NEGATIVE); + } + } else { + /* op1 < 0 and op2 < 0 */ + bigUadd(); + SET_SIGN(bip.res, BIG_NEGATIVE); + } + } +} + + +/* + * big integer subtraction + * + * operands in bip.op1 and bip.op2 + * result in bip.res + */ +void bigSub(void) { + if (bip.op1 == NULL || + bip.op2 == NULL) { + nilRefException(); + } + if (GET_SIGN(bip.op1) == BIG_POSITIVE) { + if (GET_SIGN(bip.op2) == BIG_POSITIVE) { + /* op1 >= 0 and op2 >= 0 */ + if (bigUcmp() >= 0) { + /* |op1| >= |op2| */ + bigUsub(); + SET_SIGN(bip.res, BIG_POSITIVE); + } else { + /* |op1| < |op2| */ + bigXchg(); + bigUsub(); + SET_SIGN(bip.res, BIG_NEGATIVE); + bigXchg(); + } + } else { + /* op1 >= 0 and op2 < 0 */ + bigUadd(); + SET_SIGN(bip.res, BIG_POSITIVE); + } + } else { + if (GET_SIGN(bip.op2) == BIG_POSITIVE) { + /* op1 < 0 and op2 >= 0 */ + bigUadd(); + SET_SIGN(bip.res, BIG_NEGATIVE); + } else { + /* op1 < 0 and op2 < 0 */ + if (bigUcmp() <= 0) { + /* |op1| <= |op2| */ + bigXchg(); + bigUsub(); + SET_SIGN(bip.res, BIG_POSITIVE); + bigXchg(); + } else { + /* |op1| > |op2| */ + bigUsub(); + SET_SIGN(bip.res, BIG_NEGATIVE); + } + } + } +} + + +/* + * big integer multiplication + * + * operands in bip.op1 and bip.op2 + * result in bip.res + */ +void bigMul(void) { + if (bip.op1 == NULL || + bip.op2 == NULL) { + nilRefException(); + } + bigUmul(); + if (GET_SIGN(bip.op1) == GET_SIGN(bip.op2) || GET_ND(bip.res) == 0) { + SET_SIGN(bip.res, BIG_POSITIVE); + } else { + SET_SIGN(bip.res, BIG_NEGATIVE); + } +} + + +/* + * big integer division, truncating towards zero + * + * dividend in bip.op1, divisor in bip.op2 + * quotient in bip.res, remainder in bip.rem + */ +void bigDiv(void) { + if (bip.op1 == NULL || + bip.op2 == NULL) { + nilRefException(); + } + bigUdiv(); + if (GET_SIGN(bip.op1) == GET_SIGN(bip.op2) || GET_ND(bip.res) == 0) { + SET_SIGN(bip.res, BIG_POSITIVE); + } else { + SET_SIGN(bip.res, BIG_NEGATIVE); + } + if (GET_SIGN(bip.op1) == BIG_POSITIVE || GET_ND(bip.rem) == 0) { + SET_SIGN(bip.rem, BIG_POSITIVE); + } else { + SET_SIGN(bip.rem, BIG_NEGATIVE); + } +} + + +/**************************************************************/ + +/* big integer conversions */ + + +/* + * conversion int --> big + * + * operand in parameter + * result in bip.res + */ +void bigFromInt(int n) { + int i; + + bip.res = newBig(sizeof(int)); + if (n < 0) { + n = -n; + SET_SIGN(bip.res, BIG_NEGATIVE); + } else { + SET_SIGN(bip.res, BIG_POSITIVE); + } + for (i = 0; i < sizeof(int); i++) { + SET_DIGIT(bip.res, i, n & 0xFF); + n >>= 8; + } + while (--i >= 0 && GET_DIGIT(bip.res, i) == 0) ; + SET_ND(bip.res, i + 1); +} + + +/* + * conversion big --> int + * + * operand in bip.op1 + * result is returned + */ +int bigToInt(void) { + int nd; + int i; + int res; + + if (bip.op1 == NULL) { + nilRefException(); + } + nd = GET_ND(bip.op1); + if (nd > 4 || + (nd == 4 && GET_DIGIT(bip.op1, 3) >= 0x80)) { + fatalError("big integer too big for conversion to int"); + } + res = 0; + for (i = nd - 1; i >= 0; i--) { + res <<= 8; + res |= (unsigned int) GET_DIGIT(bip.op1, i); + } + if (GET_SIGN(bip.op1) == BIG_NEGATIVE) { + res = -res; + } + return res; +} + + +/**************************************************************/ + +/* big integer I/O */ + + +/* + * read a big integer + * + * stream to read from in parameter + * result in bip.res + */ +void bigRead(FILE *in) { + int c; + int positive; + + c = fgetc(in); + while (isspace(c)) { + c = fgetc(in); + } + if (c == '-') { + positive = 0; + c = fgetc(in); + } else { + positive = 1; + if (c == '+') { + c = fgetc(in); + } + } + if (!isdigit(c)) { + fatalError("no digits in input"); + } + bigFromInt(10); + bip.rem = bip.res; + bigFromInt(0); + while (isdigit(c)) { + bip.op1 = bip.res; + bip.op2 = bip.rem; + bigUmul(); + bip.op1 = bip.res; + bigFromInt(c - '0'); + bip.op2 = bip.res; + bigUadd(); + c = fgetc(in); + } + ungetc(c, in); + if (positive || GET_ND(bip.res) == 0) { + SET_SIGN(bip.res, BIG_POSITIVE); + } else { + SET_SIGN(bip.res, BIG_NEGATIVE); + } +} + + +/* + * print a big integer + * + * stream to write to in parameter + * number to print in bip.op1 + */ +void bigPrint(FILE *out) { + int nd; + unsigned char r; + int skipZero; + + if (bip.op1 == NULL) { + nilRefException(); + } + nd = GET_ND(bip.op1); + if (nd == 0) { + fprintf(out, "0"); + return; + } + if (GET_SIGN(bip.op1) == BIG_NEGATIVE) { + fprintf(out, "-"); + } + /* number of digits in base 10 = number of digits + in base 256 * log10(256), and log10(256) < 2.5 */ + nd = 2 * nd + nd / 2; + bip.rem = bip.op1; + bigFromInt(10); + bip.op2 = bip.res; + bigFromInt(1); + while (nd != 0) { + bip.op1 = bip.res; + bigUmul(); + nd--; + } + bip.op1 = bip.rem; + bip.op2 = bip.res; + skipZero = 1; + do { + bigUdiv(); + if (GET_ND(bip.res) == 0) { + if (!skipZero) { + fprintf(out, "0"); + } + } else { + if (GET_ND(bip.res) != 1) { + fatalError("internal library error #7 - THIS SHOULD NEVER HAPPEN!"); + } + fprintf(out, "%c", GET_DIGIT(bip.res, 0) + '0'); + skipZero = 0; + } + bip.op1 = bip.rem; + bip.rem = bip.op2; + r = bigUdiv1(10); + bip.op2 = bip.rem; + } while (r == 0); +} + + +/**************************************************************/ + +/* debugging */ + + +/* + * dump a big integer object + */ +void bigDump(FILE *out, BigObjRef bigObjRef) { + int nd; + unsigned char sign; + int i; + + if (bigObjRef == NULL) { + nilRefException(); + } + nd = GET_ND(bigObjRef); + sign = GET_SIGN(bigObjRef); + fprintf(out, "[%d %c", nd, sign == BIG_POSITIVE ? '+' : '-'); + for (i = 0; i < nd; i++) { + fprintf(out, " %02X", GET_DIGIT(bigObjRef, i)); + } + fprintf(out, "]"); +} diff --git a/bigint/src/bigint.h b/bigint/src/bigint.h new file mode 100644 index 0000000..b93d88e --- /dev/null +++ b/bigint/src/bigint.h @@ -0,0 +1,60 @@ +/* + * bigint.h -- big integer library + */ + + +#ifndef _BIGINT_H_ +#define _BIGINT_H_ + + +/* object representation */ +typedef void* BigObjRef; + + +#include + + +typedef struct { + int nd; /* number of digits; array may be bigger */ + /* nd = 0 exactly when number = 0 */ + unsigned char sign; /* one of BIG_NEGATIVE or BIG_POSITIVE */ + /* zero always has BIG_POSITIVE here */ + unsigned char digits[1]; /* the digits proper; number base is 256 */ + /* LS digit first; MS digit is not zero */ +} Big; + +#include "support.h" + + +/* big integer processor registers */ + +typedef struct { + BigObjRef op1; /* first (or single) operand */ + BigObjRef op2; /* second operand (if present) */ + BigObjRef res; /* result of operation */ + BigObjRef rem; /* remainder in case of division */ +} BIP; + +extern BIP bip; /* registers of the processor */ + + +/* big integer processor functions */ + +int bigSgn(void); /* sign */ +int bigCmp(void); /* comparison */ +void bigNeg(void); /* negation */ +void bigAdd(void); /* addition */ +void bigSub(void); /* subtraction */ +void bigMul(void); /* multiplication */ +void bigDiv(void); /* division */ + +void bigFromInt(int n); /* conversion int --> big */ +int bigToInt(void); /* conversion big --> int */ + +void bigRead(FILE *in); /* read a big integer */ +void bigPrint(FILE *out); /* print a big integer */ + +void bigDump(FILE *out, BigObjRef bigObjRef); /* dump a big integer object */ + + +#endif /* _BIGINT_H_ */ diff --git a/bigint/src/bigint.o b/bigint/src/bigint.o new file mode 100644 index 0000000000000000000000000000000000000000..4e68f95420ef573ae35b673fe7cf9a26ca89ff9b GIT binary patch literal 27160 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 z zQ1H`0RIPvB1ku2H5X7Z|(*(nUO7Jj*D7RN|yWo1krGnE0!-7iiFzQ7zuvc)q;CjKO zg3|=Uf&g7^tmt_On2Ot8UqOQOHerlmJ{oR+akXCZ?e{=?g|^@K{6T2@y-ud+x8LV5 zo~hq{kMpYNw?Eo?R%rX1t?!Dw{k{g-y1e~fW~<2CUvxc28n^vkY=1aaLd^ov5*3T=NYcfHW|*KyN?w!aqRmz%85 z{yy#!q3ti?CJ1eR1NSs(#E|`s;g==f+RLBRr6za%e>0B5#{S^h@2l<k!oB8(pqeq2i99@M&U*Cm=eo~rKTAB^;h{6nH&@8 NO6jtbVi{Z`{|`kcCL90& literal 0 HcmV?d00001 diff --git a/bigint/src/libbigint.a b/bigint/src/libbigint.a new file mode 100644 index 0000000000000000000000000000000000000000..01ff5790d3725a84b9548db7f9744e9635bd4f0c GIT binary patch literal 27544 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 literal 0 HcmV?d00001 diff --git a/bigint/src/support.h b/bigint/src/support.h new file mode 100644 index 0000000..8e4455e --- /dev/null +++ b/bigint/src/support.h @@ -0,0 +1,15 @@ +/* + * support.h -- object representation and support functions + */ + + +#ifndef _SUPPORT_H_ +#define _SUPPORT_H_ + +/* support functions */ + +void fatalError(char *msg); /* print a message and exit */ +void * newPrimObject(int dataSize); /* create a new primitive object */ +void * getPrimObjectDataPointer(void * primObject); + +#endif /* _SUPPORT_H_ */ diff --git a/bigint/tst/Makefile b/bigint/tst/Makefile new file mode 100644 index 0000000..67ca0eb --- /dev/null +++ b/bigint/tst/Makefile @@ -0,0 +1,28 @@ +# +# Makefile for big integer test +# + +BUILD = ../build + +CC = gcc +CFLAGS = -g -Wall -I$(BUILD)/include +LDFLAGS = -g -Wall -L$(BUILD)/lib +LDLIBS = -lbigint + +all: testbip + +install: all + mkdir -p $(BUILD)/bin + cp testbip $(BUILD)/bin + +testbip: testbip.o support.o + $(CC) $(LDFLAGS) -o testbip testbip.o support.o $(LDLIBS) + +testbip.o: testbip.c + $(CC) $(CFLAGS) -o testbip.o -c testbip.c + +support.o: support.c + $(CC) $(CFLAGS) -o support.o -c support.c + +clean: + rm -f *~ testbip.o support.o testbip diff --git a/bigint/tst/support.c b/bigint/tst/support.c new file mode 100644 index 0000000..f8ae80d --- /dev/null +++ b/bigint/tst/support.c @@ -0,0 +1,58 @@ +/* + * support.c -- support functions for big integer library + */ + + +#include +#include +#include + +#include "support.h" + +typedef struct ObjRef{ + bool brokenHeart; + struct ObjRef *forward_pointer; + unsigned int size; + unsigned char data[1]; +} *ObjRef; + + +/* + * This routine is called in case a fatal error has occurred. + * It should print the error message and terminate the program. + */ +void fatalError(char *msg) { + printf("Fatal error: %s\n", msg); + exit(1); +} + + +/* + * This function is called whenever a new primitive object with + * a certain amount of internal memory is needed. It should return + * an object reference to a regular object, which contains a freely + * usable memory area of at least the requested size (measured in + * bytes). The memory area need not be initialized in any way. + * + * Note that this function may move all objects in memory at will + * (due to, e.g., garbage collection), as long as the pointers in + * the global "bip" structure point to the correct objects when + * the function returns. + */ +void * newPrimObject(int dataSize) { + ObjRef bigObjRef; + int size = sizeof(unsigned int) + dataSize * sizeof(unsigned char); + bigObjRef = malloc(size); + bigObjRef->size = size; + if (bigObjRef == NULL) { + fatalError("newPrimObject() got no memory"); + } + bigObjRef->size = size; + return bigObjRef; +} + +void * getPrimObjectDataPointer(void * obj){ + ObjRef oo = ((ObjRef) (obj)); + return oo->data; +} + diff --git a/bigint/tst/support.o b/bigint/tst/support.o new file mode 100644 index 0000000000000000000000000000000000000000..2ad0cc021555cc0eac87223aa52c5fcd4a80cdab GIT binary patch literal 3536 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

ykNZTRFA>v8Df*z#@K(rk0gACaa< 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 literal 0 HcmV?d00001 diff --git a/bigint/tst/testbip.c b/bigint/tst/testbip.c new file mode 100644 index 0000000..7c65754 --- /dev/null +++ b/bigint/tst/testbip.c @@ -0,0 +1,1253 @@ +/* + * testbip.c -- test the big integer processor + */ + + +#include +#include +#include + +#include "bigint.h" + +typedef struct { + unsigned int size; /* byte count of payload data */ + unsigned char data[1]; /* payload data, size as needed */ +} *ObjRef; + +/**************************************************************/ + + +void dump(char *prefix, ObjRef x, char *suffix) { + if (prefix != NULL && *prefix != '\0') { + printf("%s", prefix); + } + bigDump(stdout, x); + if (suffix != NULL && *suffix != '\0') { + printf("%s", suffix); + } +} + + +/**************************************************************/ + + +void test00(void) { + bigFromInt(0); + dump("+0x00000000 = ", bip.res, "\n"); + + bigFromInt(1); + dump("+0x00000001 = ", bip.res, "\n"); + + bigFromInt(2); + dump("+0x00000002 = ", bip.res, "\n"); + + bigFromInt(0x12); + dump("+0x00000012 = ", bip.res, "\n"); + + bigFromInt(0x123); + dump("+0x00000123 = ", bip.res, "\n"); + + bigFromInt(0x1234); + dump("+0x00001234 = ", bip.res, "\n"); + + bigFromInt(0x12345); + dump("+0x00012345 = ", bip.res, "\n"); + + bigFromInt(0x123456); + dump("+0x00123456 = ", bip.res, "\n"); + + bigFromInt(0x1234567); + dump("+0x01234567 = ", bip.res, "\n"); + + bigFromInt(0x12345678); + dump("+0x12345678 = ", bip.res, "\n"); + + bigFromInt(-0); + dump("-0x00000000 = ", bip.res, "\n"); + + bigFromInt(-1); + dump("-0x00000001 = ", bip.res, "\n"); + + bigFromInt(-2); + dump("-0x00000002 = ", bip.res, "\n"); + + bigFromInt(-0x12); + dump("-0x00000012 = ", bip.res, "\n"); + + bigFromInt(-0x123); + dump("-0x00000123 = ", bip.res, "\n"); + + bigFromInt(-0x1234); + dump("-0x00001234 = ", bip.res, "\n"); + + bigFromInt(-0x12345); + dump("-0x00012345 = ", bip.res, "\n"); + + bigFromInt(-0x123456); + dump("-0x00123456 = ", bip.res, "\n"); + + bigFromInt(-0x1234567); + dump("-0x01234567 = ", bip.res, "\n"); + + bigFromInt(-0x12345678); + dump("-0x12345678 = ", bip.res, "\n"); +} + + +/**************************************************************/ + + +void test01(void) { + bigFromInt(0); + bip.op1 = bip.res; + printf("sign(+0x00000000) = %d\n", bigSgn()); + + bigFromInt(1); + bip.op1 = bip.res; + printf("sign(+0x00000001) = %d\n", bigSgn()); + + bigFromInt(2); + bip.op1 = bip.res; + printf("sign(+0x00000002) = %d\n", bigSgn()); + + bigFromInt(0x12); + bip.op1 = bip.res; + printf("sign(+0x00000012) = %d\n", bigSgn()); + + bigFromInt(0x123); + bip.op1 = bip.res; + printf("sign(+0x00000123) = %d\n", bigSgn()); + + bigFromInt(0x1234); + bip.op1 = bip.res; + printf("sign(+0x00001234) = %d\n", bigSgn()); + + bigFromInt(0x12345); + bip.op1 = bip.res; + printf("sign(+0x00012345) = %d\n", bigSgn()); + + bigFromInt(0x123456); + bip.op1 = bip.res; + printf("sign(+0x00123456) = %d\n", bigSgn()); + + bigFromInt(0x1234567); + bip.op1 = bip.res; + printf("sign(+0x01234567) = %d\n", bigSgn()); + + bigFromInt(0x12345678); + bip.op1 = bip.res; + printf("sign(+0x12345678) = %d\n", bigSgn()); + + bigFromInt(-0); + bip.op1 = bip.res; + printf("sign(-0x00000000) = %d\n", bigSgn()); + + bigFromInt(-1); + bip.op1 = bip.res; + printf("sign(-0x00000001) = %d\n", bigSgn()); + + bigFromInt(-2); + bip.op1 = bip.res; + printf("sign(-0x00000002) = %d\n", bigSgn()); + + bigFromInt(-0x12); + bip.op1 = bip.res; + printf("sign(-0x00000012) = %d\n", bigSgn()); + + bigFromInt(-0x123); + bip.op1 = bip.res; + printf("sign(-0x00000123) = %d\n", bigSgn()); + + bigFromInt(-0x1234); + bip.op1 = bip.res; + printf("sign(-0x00001234) = %d\n", bigSgn()); + + bigFromInt(-0x12345); + bip.op1 = bip.res; + printf("sign(-0x00012345) = %d\n", bigSgn()); + + bigFromInt(-0x123456); + bip.op1 = bip.res; + printf("sign(-0x00123456) = %d\n", bigSgn()); + + bigFromInt(-0x1234567); + bip.op1 = bip.res; + printf("sign(-0x01234567) = %d\n", bigSgn()); + + bigFromInt(-0x12345678); + bip.op1 = bip.res; + printf("sign(-0x12345678) = %d\n", bigSgn()); +} + + +/**************************************************************/ + + +void test02(void) { + int m[7]; + ObjRef n[7]; + int i, j; + int res; + + m[0] = 0; + bigFromInt(m[0]); + n[0] = bip.res; + printf("n[0] = %d\n", m[0]); + + m[1] = 100; + bigFromInt(m[1]); + n[1] = bip.res; + printf("n[1] = %d\n", m[1]); + + m[2] = -100; + bigFromInt(m[2]); + n[2] = bip.res; + printf("n[2] = %d\n", m[2]); + + m[3] = 101; + bigFromInt(m[3]); + n[3] = bip.res; + printf("n[3] = %d\n", m[3]); + + m[4] = -101; + bigFromInt(m[4]); + n[4] = bip.res; + printf("n[4] = %d\n", m[4]); + + m[5] = 12345678; + bigFromInt(m[5]); + n[5] = bip.res; + printf("n[5] = %d\n", m[5]); + + m[6] = -12345678; + bigFromInt(m[6]); + n[6] = bip.res; + printf("n[6] = %d\n", m[6]); + + for (i = 0; i < 7; i++) { + for (j = 0; j < 7; j++) { + printf("%12d ", m[i]); + bip.op1 = n[i]; + bip.op2 = n[j]; + res = bigCmp(); + if (res < 0) { + printf("<"); + } else + if (res > 0) { + printf(">"); + } else { + printf("="); + } + printf(" %12d", m[j]); + printf("\n"); + } + } +} + + +/**************************************************************/ + + +void test03(void) { + bigFromInt(0); + bip.op1 = bip.res; + bigNeg(); + dump("+n = ", bip.op1, "\n"); + dump("-n = ", bip.res, "\n"); + + bigFromInt(1); + bip.op1 = bip.res; + bigNeg(); + dump("+n = ", bip.op1, "\n"); + dump("-n = ", bip.res, "\n"); + + bigFromInt(-1); + bip.op1 = bip.res; + bigNeg(); + dump("+n = ", bip.op1, "\n"); + dump("-n = ", bip.res, "\n"); + + bigFromInt(0x12345678); + bip.op1 = bip.res; + bigNeg(); + dump("+n = ", bip.op1, "\n"); + dump("-n = ", bip.res, "\n"); + + bigFromInt(-0x12345678); + bip.op1 = bip.res; + bigNeg(); + dump("+n = ", bip.op1, "\n"); + dump("-n = ", bip.res, "\n"); +} + + +/**************************************************************/ + + +void test04(void) { + int m[6]; + ObjRef n[6]; + int i, j; + + m[0] = +0x12345679; + m[1] = +0x12345678; + m[2] = +0x12345677; + m[3] = -0x12345677; + m[4] = -0x12345678; + m[5] = -0x12345679; + + for (i = 0; i < 6; i++) { + bigFromInt(m[i]); + n[i] = bip.res; + } + + for (i = 0; i < 6; i++) { + for (j = 0; j < 6; j++) { + bip.op1 = n[i]; + bip.op2 = n[j]; + bigAdd(); + printf("%12d + %12d = ", m[i], m[j]); + dump("", bip.res, "\n"); + } + } +} + + +/**************************************************************/ + + +void test05(void) { + int m[5]; + ObjRef n[5]; + int i, j; + + m[0] = +0x12345678; + m[1] = +1; + m[2] = 0; + m[3] = -1; + m[4] = -0x12345678; + + for (i = 0; i < 5; i++) { + bigFromInt(m[i]); + n[i] = bip.res; + } + + for (i = 0; i < 5; i++) { + for (j = 0; j < 5; j++) { + bip.op1 = n[i]; + bip.op2 = n[j]; + bigAdd(); + printf("%12d + %12d = ", m[i], m[j]); + dump("", bip.res, "\n"); + } + } +} + + +/**************************************************************/ + + +void test06(void) { + int m[6]; + ObjRef n[6]; + int i, j; + + m[0] = +0x12345679; + m[1] = +0x12345678; + m[2] = +0x12345677; + m[3] = -0x12345677; + m[4] = -0x12345678; + m[5] = -0x12345679; + + for (i = 0; i < 6; i++) { + bigFromInt(m[i]); + n[i] = bip.res; + } + + for (i = 0; i < 6; i++) { + for (j = 0; j < 6; j++) { + bip.op1 = n[i]; + bip.op2 = n[j]; + bigSub(); + printf("%12d - %12d = ", m[i], m[j]); + dump("", bip.res, "\n"); + } + } +} + + +/**************************************************************/ + + +void test07(void) { + int m[5]; + ObjRef n[5]; + int i, j; + + m[0] = +0x12345678; + m[1] = +1; + m[2] = 0; + m[3] = -1; + m[4] = -0x12345678; + + for (i = 0; i < 5; i++) { + bigFromInt(m[i]); + n[i] = bip.res; + } + + for (i = 0; i < 5; i++) { + for (j = 0; j < 5; j++) { + bip.op1 = n[i]; + bip.op2 = n[j]; + bigSub(); + printf("%12d - %12d = ", m[i], m[j]); + dump("", bip.res, "\n"); + } + } +} + + +/**************************************************************/ + + +void test08(void) { + int i; + + bigFromInt(1); + for (i = 1; i < 100; i++) { + bip.op1 = bip.res; + bip.op2 = bip.res; + bigAdd(); + printf("2 ^ %2d = ", i); + dump("", bip.res, "\n"); + } +} + + +/**************************************************************/ + + +void test09(void) { + int i, j; + + bigFromInt(2); + bip.op2 = bip.res; + for (i = 1; i < 10; i++) { + bip.res = bip.op2; + for (j = 1; j < i * i; j++) { + bip.op1 = bip.res; + bigMul(); + } + printf("2 ^ (%d ^ 2) = ", i); + dump("", bip.res, "\n"); + } +} + + +/**************************************************************/ + + +void factorial(int n) { + bigFromInt(1); + while (n > 0) { + bip.op1 = bip.res; + bigFromInt(n); + bip.op2 = bip.res; + bigMul(); + n--; + } +} + + +void test10(void) { + int i; + + for (i = 0; i < 100; i++) { + factorial(i); + printf("%2d! = ", i); + dump("", bip.res, "\n"); + } +} + + +/**************************************************************/ + + +void test11(void) { + int n, m; + + n = 5; + m = 0; + bigFromInt(n); + bip.op1 = bip.res; + bigFromInt(m); + bip.op2 = bip.res; + bigDiv(); + printf("%12d / %12d = ", n, m); + dump("", bip.res, "\n"); + printf("%12d %% %12d = ", n, m); + dump("", bip.rem, "\n"); +} + + +/**************************************************************/ + + +void test12(void) { + int n, m; + + n = 12; + m = 12345678; + bigFromInt(n); + bip.op1 = bip.res; + bigFromInt(m); + bip.op2 = bip.res; + bigDiv(); + printf("%12d / %12d = ", n, m); + dump("", bip.res, "\n"); + printf("%12d %% %12d = ", n, m); + dump("", bip.rem, "\n"); + + n = 12345677; + m = 12345678; + bigFromInt(n); + bip.op1 = bip.res; + bigFromInt(m); + bip.op2 = bip.res; + bigDiv(); + printf("%12d / %12d = ", n, m); + dump("", bip.res, "\n"); + printf("%12d %% %12d = ", n, m); + dump("", bip.rem, "\n"); + + n = -12; + m = 12345678; + bigFromInt(n); + bip.op1 = bip.res; + bigFromInt(m); + bip.op2 = bip.res; + bigDiv(); + printf("%12d / %12d = ", n, m); + dump("", bip.res, "\n"); + printf("%12d %% %12d = ", n, m); + dump("", bip.rem, "\n"); + + n = -12345677; + m = 12345678; + bigFromInt(n); + bip.op1 = bip.res; + bigFromInt(m); + bip.op2 = bip.res; + bigDiv(); + printf("%12d / %12d = ", n, m); + dump("", bip.res, "\n"); + printf("%12d %% %12d = ", n, m); + dump("", bip.rem, "\n"); + + n = 12; + m = -12345678; + bigFromInt(n); + bip.op1 = bip.res; + bigFromInt(m); + bip.op2 = bip.res; + bigDiv(); + printf("%12d / %12d = ", n, m); + dump("", bip.res, "\n"); + printf("%12d %% %12d = ", n, m); + dump("", bip.rem, "\n"); + + n = 12345677; + m = -12345678; + bigFromInt(n); + bip.op1 = bip.res; + bigFromInt(m); + bip.op2 = bip.res; + bigDiv(); + printf("%12d / %12d = ", n, m); + dump("", bip.res, "\n"); + printf("%12d %% %12d = ", n, m); + dump("", bip.rem, "\n"); + + n = -12; + m = -12345678; + bigFromInt(n); + bip.op1 = bip.res; + bigFromInt(m); + bip.op2 = bip.res; + bigDiv(); + printf("%12d / %12d = ", n, m); + dump("", bip.res, "\n"); + printf("%12d %% %12d = ", n, m); + dump("", bip.rem, "\n"); + + n = -12345677; + m = -12345678; + bigFromInt(n); + bip.op1 = bip.res; + bigFromInt(m); + bip.op2 = bip.res; + bigDiv(); + printf("%12d / %12d = ", n, m); + dump("", bip.res, "\n"); + printf("%12d %% %12d = ", n, m); + dump("", bip.rem, "\n"); +} + + +/**************************************************************/ + + +void test13(void) { + int n, m; + + n = 12345678; + m = 1; + bigFromInt(n); + bip.op1 = bip.res; + bigFromInt(m); + bip.op2 = bip.res; + bigDiv(); + printf("%12d / %12d = ", n, m); + dump("", bip.res, "\n"); + printf("%12d %% %12d = ", n, m); + dump("", bip.rem, "\n"); + + n = 12345678; + m = 17; + bigFromInt(n); + bip.op1 = bip.res; + bigFromInt(m); + bip.op2 = bip.res; + bigDiv(); + printf("%12d / %12d = ", n, m); + dump("", bip.res, "\n"); + printf("%12d %% %12d = ", n, m); + dump("", bip.rem, "\n"); + + n = 12345678; + m = 255; + bigFromInt(n); + bip.op1 = bip.res; + bigFromInt(m); + bip.op2 = bip.res; + bigDiv(); + printf("%12d / %12d = ", n, m); + dump("", bip.res, "\n"); + printf("%12d %% %12d = ", n, m); + dump("", bip.rem, "\n"); + + n = -12345678; + m = 1; + bigFromInt(n); + bip.op1 = bip.res; + bigFromInt(m); + bip.op2 = bip.res; + bigDiv(); + printf("%12d / %12d = ", n, m); + dump("", bip.res, "\n"); + printf("%12d %% %12d = ", n, m); + dump("", bip.rem, "\n"); + + n = -12345678; + m = 17; + bigFromInt(n); + bip.op1 = bip.res; + bigFromInt(m); + bip.op2 = bip.res; + bigDiv(); + printf("%12d / %12d = ", n, m); + dump("", bip.res, "\n"); + printf("%12d %% %12d = ", n, m); + dump("", bip.rem, "\n"); + + n = -12345678; + m = 255; + bigFromInt(n); + bip.op1 = bip.res; + bigFromInt(m); + bip.op2 = bip.res; + bigDiv(); + printf("%12d / %12d = ", n, m); + dump("", bip.res, "\n"); + printf("%12d %% %12d = ", n, m); + dump("", bip.rem, "\n"); + + n = 12345678; + m = -1; + bigFromInt(n); + bip.op1 = bip.res; + bigFromInt(m); + bip.op2 = bip.res; + bigDiv(); + printf("%12d / %12d = ", n, m); + dump("", bip.res, "\n"); + printf("%12d %% %12d = ", n, m); + dump("", bip.rem, "\n"); + + n = 12345678; + m = -17; + bigFromInt(n); + bip.op1 = bip.res; + bigFromInt(m); + bip.op2 = bip.res; + bigDiv(); + printf("%12d / %12d = ", n, m); + dump("", bip.res, "\n"); + printf("%12d %% %12d = ", n, m); + dump("", bip.rem, "\n"); + + n = 12345678; + m = -255; + bigFromInt(n); + bip.op1 = bip.res; + bigFromInt(m); + bip.op2 = bip.res; + bigDiv(); + printf("%12d / %12d = ", n, m); + dump("", bip.res, "\n"); + printf("%12d %% %12d = ", n, m); + dump("", bip.rem, "\n"); + + n = -12345678; + m = -1; + bigFromInt(n); + bip.op1 = bip.res; + bigFromInt(m); + bip.op2 = bip.res; + bigDiv(); + printf("%12d / %12d = ", n, m); + dump("", bip.res, "\n"); + printf("%12d %% %12d = ", n, m); + dump("", bip.rem, "\n"); + + n = -12345678; + m = -17; + bigFromInt(n); + bip.op1 = bip.res; + bigFromInt(m); + bip.op2 = bip.res; + bigDiv(); + printf("%12d / %12d = ", n, m); + dump("", bip.res, "\n"); + printf("%12d %% %12d = ", n, m); + dump("", bip.rem, "\n"); + + n = -12345678; + m = -255; + bigFromInt(n); + bip.op1 = bip.res; + bigFromInt(m); + bip.op2 = bip.res; + bigDiv(); + printf("%12d / %12d = ", n, m); + dump("", bip.res, "\n"); + printf("%12d %% %12d = ", n, m); + dump("", bip.rem, "\n"); +} + + +/**************************************************************/ + + +void test14(void) { + int n, m; + ObjRef dividend; + ObjRef divisor; + int ok; + + printf("divisor"); + for (m = 0; m < 256; m++) { + if (m % 8 == 0) { + printf("\n%3d to %3d: ", m, m + 7); + } + if (m == 0) { + printf(" "); + fflush(stdout); + continue; + } + bigFromInt(m); + divisor = bip.res; + ok = 1; + for (n = 0; n < (1 << 18); n++) { + bigFromInt(n); + dividend = bip.res; + bip.op1 = dividend; + bip.op2 = divisor; + bigDiv(); + bip.op1 = bip.res; + bigMul(); + free(bip.op1); + bip.op1 = bip.res; + bip.op2 = bip.rem; + bigAdd(); + free(bip.op1); + free(bip.op2); + bip.op1 = bip.res; + bip.op2 = dividend; + if (bigCmp() != 0) { + ok = 0; + } + free(bip.op1); + free(dividend); + } + free(divisor); + printf("%c", ok ? '.' : '?'); + fflush(stdout); + } + printf("\n"); +} + + +/**************************************************************/ + + +void test15(void) { + int n, m; + + n = 123456789; + m = (0xFF << 16) + 0x1234; + bigFromInt(n); + bip.op1 = bip.res; + bigFromInt(m); + bip.op2 = bip.res; + bigDiv(); + printf("%12d / %12d = ", n, m); + dump("", bip.res, "\n"); + printf("%12d %% %12d = ", n, m); + dump("", bip.rem, "\n"); + + printf("--------------------------------------------------\n"); + + n = 123456789; + m = (0x80 << 16) + 0x1234; + bigFromInt(n); + bip.op1 = bip.res; + bigFromInt(m); + bip.op2 = bip.res; + bigDiv(); + printf("%12d / %12d = ", n, m); + dump("", bip.res, "\n"); + printf("%12d %% %12d = ", n, m); + dump("", bip.rem, "\n"); + + printf("--------------------------------------------------\n"); + + n = 123456789; + m = (0x7F << 16) + 0x1234; + bigFromInt(n); + bip.op1 = bip.res; + bigFromInt(m); + bip.op2 = bip.res; + bigDiv(); + printf("%12d / %12d = ", n, m); + dump("", bip.res, "\n"); + printf("%12d %% %12d = ", n, m); + dump("", bip.rem, "\n"); + + printf("--------------------------------------------------\n"); + + n = 123456789; + m = (0x55 << 16) + 0x1234; + bigFromInt(n); + bip.op1 = bip.res; + bigFromInt(m); + bip.op2 = bip.res; + bigDiv(); + printf("%12d / %12d = ", n, m); + dump("", bip.res, "\n"); + printf("%12d %% %12d = ", n, m); + dump("", bip.rem, "\n"); + + printf("--------------------------------------------------\n"); + + n = 123456789; + m = (0x2F << 16) + 0x1234; + bigFromInt(n); + bip.op1 = bip.res; + bigFromInt(m); + bip.op2 = bip.res; + bigDiv(); + printf("%12d / %12d = ", n, m); + dump("", bip.res, "\n"); + printf("%12d %% %12d = ", n, m); + dump("", bip.rem, "\n"); + + printf("--------------------------------------------------\n"); + + n = 123456789; + m = (0x18 << 16) + 0x1234; + bigFromInt(n); + bip.op1 = bip.res; + bigFromInt(m); + bip.op2 = bip.res; + bigDiv(); + printf("%12d / %12d = ", n, m); + dump("", bip.res, "\n"); + printf("%12d %% %12d = ", n, m); + dump("", bip.rem, "\n"); + + printf("--------------------------------------------------\n"); + + n = 123456789; + m = (0x0A << 16) + 0x1234; + bigFromInt(n); + bip.op1 = bip.res; + bigFromInt(m); + bip.op2 = bip.res; + bigDiv(); + printf("%12d / %12d = ", n, m); + dump("", bip.res, "\n"); + printf("%12d %% %12d = ", n, m); + dump("", bip.rem, "\n"); + + printf("--------------------------------------------------\n"); + + n = 123456789; + m = (0x03 << 16) + 0x1234; + bigFromInt(n); + bip.op1 = bip.res; + bigFromInt(m); + bip.op2 = bip.res; + bigDiv(); + printf("%12d / %12d = ", n, m); + dump("", bip.res, "\n"); + printf("%12d %% %12d = ", n, m); + dump("", bip.rem, "\n"); + + printf("--------------------------------------------------\n"); + + n = 123456789; + m = (0x02 << 16) + 0x1234; + bigFromInt(n); + bip.op1 = bip.res; + bigFromInt(m); + bip.op2 = bip.res; + bigDiv(); + printf("%12d / %12d = ", n, m); + dump("", bip.res, "\n"); + printf("%12d %% %12d = ", n, m); + dump("", bip.rem, "\n"); + + printf("--------------------------------------------------\n"); + + n = 123456789; + m = (0x01 << 16) + 0x1234; + bigFromInt(n); + bip.op1 = bip.res; + bigFromInt(m); + bip.op2 = bip.res; + bigDiv(); + printf("%12d / %12d = ", n, m); + dump("", bip.res, "\n"); + printf("%12d %% %12d = ", n, m); + dump("", bip.rem, "\n"); +} + + +/**************************************************************/ + + +void test16(void) { + int n1, n2, n3, m; + + n1 = 0x12345678; + n2 = 0x66554433; + n3 = 12; + bigFromInt(n1); + bip.op1 = bip.res; + bigFromInt(n2); + bip.op2 = bip.res; + bigMul(); + bip.op1 = bip.res; + bigFromInt(n3); + bip.op2 = bip.res; + bigMul(); + bip.op1 = bip.res; + m = 0x5764; + bigFromInt(m); + bip.op2 = bip.res; + dump("", bip.op1, " / "); + dump("", bip.op2, " =\n"); + bigDiv(); + dump("", bip.res, " R. "); + dump("", bip.rem, "\n"); + bip.op1 = bip.res; + bigMul(); + bip.op1 = bip.res; + bip.op2 = bip.rem; + bigAdd(); + dump("quotient * divisor + remainder =\n", bip.res, "\n"); +} + + +/**************************************************************/ + + +void test17(void) { + /* prepare two big integers with 8 and 4 digits, respectively */ + bigFromInt(0x11111111); + bip.op1 = bip.res; + bip.op2 = bip.res; + bigMul(); + bip.op1 = bip.res; + /* set all 8 digits of dividend */ + ((ObjRef) bip.op1)->data[5 + 0] = 0xF2; + ((ObjRef) bip.op1)->data[5 + 1] = 0xFB; + ((ObjRef) bip.op1)->data[5 + 2] = 0xE3; + ((ObjRef) bip.op1)->data[5 + 3] = 0x46; + ((ObjRef) bip.op1)->data[5 + 4] = 0x7C; + ((ObjRef) bip.op1)->data[5 + 5] = 0xC2; + ((ObjRef) bip.op1)->data[5 + 6] = 0x54; + ((ObjRef) bip.op1)->data[5 + 7] = 0xF8; + /* set )all 4 digits of divisor */ + ((ObjRef) bip.op2)->data[5 + 0] = 0x1B; + ((ObjRef) bip.op2)->data[5 + 1] = 0xE8; + ((ObjRef) bip.op2)->data[5 + 2] = 0xE7; + ((ObjRef) bip.op2)->data[5 + 3] = 0x8D; + /* divide */ + dump("", bip.op1, " / "); + dump("", bip.op2, " =\n"); + bigDiv(); + dump("", bip.res, " R. "); + dump("", bip.rem, "\n"); + /* verify */ + bip.op1 = bip.res; + bigMul(); + bip.op1 = bip.res; + bip.op2 = bip.rem; + bigAdd(); + dump("quotient * divisor + remainder =\n", bip.res, "\n"); +} + + +/**************************************************************/ + + +void test18(void) { + /* prepare two big integers with 8 and 4 digits, respectively */ + bigFromInt(0x11111111); + bip.op1 = bip.res; + bip.op2 = bip.res; + bigMul(); + bip.op1 = bip.res; + /* set all 8 digits of dividend */ + ((ObjRef) bip.op1)->data[5 + 0] = 0x4D; + ((ObjRef) bip.op1)->data[5 + 1] = 0xCC; + ((ObjRef) bip.op1)->data[5 + 2] = 0x8C; + ((ObjRef) bip.op1)->data[5 + 3] = 0x18; + ((ObjRef) bip.op1)->data[5 + 4] = 0x34; + ((ObjRef) bip.op1)->data[5 + 5] = 0xDF; + ((ObjRef) bip.op1)->data[5 + 6] = 0x1D; + ((ObjRef) bip.op1)->data[5 + 7] = 0xFD; + /* set all 4 digits of divisor */ + ((ObjRef) bip.op2)->data[5 + 0] = 0x69; + ((ObjRef) bip.op2)->data[5 + 1] = 0xF4; + ((ObjRef) bip.op2)->data[5 + 2] = 0x94; + ((ObjRef) bip.op2)->data[5 + 3] = 0x37; + /* divide */ + dump("", bip.op1, " / "); + dump("", bip.op2, " =\n"); + bigDiv(); + dump("", bip.res, " R. "); + dump("", bip.rem, "\n"); + /* verify */ + bip.op1 = bip.res; + bigMul(); + bip.op1 = bip.res; + bip.op2 = bip.rem; + bigAdd(); + dump("quotient * divisor + remainder =\n", bip.res, "\n"); +} + + +/**************************************************************/ + + +void test19(void) { + int n, m; + + n = 0x7FFFFFFF; + bigFromInt(n); + bip.op1 = bip.res; + m = bigToInt(); + printf("%12d = %12d\n", n, m); + + n = 0x00000001; + bigFromInt(n); + bip.op1 = bip.res; + m = bigToInt(); + printf("%12d = %12d\n", n, m); + + n = 0x00000000; + bigFromInt(n); + bip.op1 = bip.res; + m = bigToInt(); + printf("%12d = %12d\n", n, m); + + n = -0x00000001; + bigFromInt(n); + bip.op1 = bip.res; + m = bigToInt(); + printf("%12d = %12d\n", n, m); + + n = -0x7FFFFFFF; + bigFromInt(n); + bip.op1 = bip.res; + m = bigToInt(); + printf("%12d = %12d\n", n, m); +} + + +/**************************************************************/ + + +void test20(void) { + printf("please enter a number: "); + fflush(stdout); + bigRead(stdin); + dump("", bip.res, "\n"); +} + + +/**************************************************************/ + + +void test21(void) { + bigFromInt(0); + dump("", bip.res, " = "); + bip.op1 = bip.res; + bigPrint(stdout); + printf("\n"); + + bigFromInt(1); + dump("", bip.res, " = "); + bip.op1 = bip.res; + bigPrint(stdout); + printf("\n"); + + bigFromInt(-1); + dump("", bip.res, " = "); + bip.op1 = bip.res; + bigPrint(stdout); + printf("\n"); + + bigFromInt(0x1234); + dump("", bip.res, " = "); + bip.op1 = bip.res; + bigPrint(stdout); + printf("\n"); + + bigFromInt(-0x1234); + dump("", bip.res, " = "); + bip.op1 = bip.res; + bigPrint(stdout); + printf("\n"); + + bigFromInt(0x186A0); + dump("", bip.res, " = "); + bip.op1 = bip.res; + bigPrint(stdout); + printf("\n"); + + bigFromInt(-0x186A0); + dump("", bip.res, " = "); + bip.op1 = bip.res; + bigPrint(stdout); + printf("\n"); + + bigFromInt(0x12345678); + dump("", bip.res, " = "); + bip.op1 = bip.res; + bigPrint(stdout); + printf("\n"); + + bigFromInt(-0x12345678); + dump("", bip.res, " = "); + bip.op1 = bip.res; + bigPrint(stdout); + printf("\n"); + + bigFromInt(987654321); + bip.op1 = bip.res; + bip.op2 = bip.res; + bigMul(); + bip.op1 = bip.res; + bip.op2 = bip.res; + bigMul(); + dump("", bip.res, " =\n"); + bip.op1 = bip.res; + bigPrint(stdout); + printf("\n"); +} + + +/**************************************************************/ + + +typedef struct { + void (*func)(void); + char *explanation; +} TestFunc; + + +TestFunc tests[] = { + { test00, "representation" }, + { test01, "sign" }, + { test02, "comparison" }, + { test03, "negation" }, + { test04, "addition, equal sizes" }, + { test05, "addition, different sizes" }, + { test06, "subtraction, equal sizes" }, + { test07, "subtraction, different sizes" }, + { test08, "2^n by addition" }, + { test09, "2^(n^2) by multiplication" }, + { test10, "factorial" }, + { test11, "division by zero" }, + { test12, "division, small dividend" }, + { test13, "division, single digit divisor" }, + { test14, "division, systematic test of simple cases" }, + { test15, "division, general case, different scale factors" }, + { test16, "division, general case, qhat (first guess)" }, + { test17, "division, general case, qhat (decremented twice)" }, + { test18, "division, general case, qhat (final correction)" }, + { test19, "conversion big --> int" }, + { test20, "read from file" }, + { test21, "print to file" }, +}; + +int numTests = sizeof(tests) / sizeof(tests[0]); + + +/**************************************************************/ + + +void usage(char *myself) { + int i; + + printf("Usage: %s \n", myself); + printf("valid test numbers are:\n"); + for (i = 0; i < numTests; i++) { + printf(" %2d: %s\n", i, tests[i].explanation); + } + exit(1); +} + + +int main(int argc, char *argv[]) { + int testNumber; + char *endp; + + if (argc != 2) { + usage(argv[0]); + } + testNumber = strtol(argv[1], &endp, 0); + if (*endp != '\0') { + usage(argv[0]); + } + if (testNumber < 0 || testNumber >= numTests) { + usage(argv[0]); + } + printf("Test %d: %s\n", testNumber, tests[testNumber].explanation); + (*tests[testNumber].func)(); + return 0; +} diff --git a/bigint/tst/testbip.o b/bigint/tst/testbip.o new file mode 100644 index 0000000000000000000000000000000000000000..8acdffdc8b2ccfee22e4b6e2727cac1ccb105978 GIT binary patch literal 44472 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 literal 0 HcmV?d00001 diff --git a/njvm.o b/njvm.o index faea6d5971233b490258ca5b61a9f2ecefb8b36b..649cde959824589b1afb100038d55d7c00d44127 100644 GIT binary patch literal 53680 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 literal 56728 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 Xq=D3vI#NrLhB%Q3gE{H-xNiRe+Bm$v diff --git a/objref.c b/objref.c index 19a75d1..82aca28 100644 --- a/objref.c +++ b/objref.c @@ -4,8 +4,8 @@ typedef struct ObjRef{ // if brkokenHeart and forward_pointer added at this point bip throws errors -// bool brokenHeart; -// struct ObjRef *forward_pointer; + bool brokenHeart; + struct ObjRef *forward_pointer; unsigned int size; unsigned char data[1]; } *ObjRef;