*** compface/arith.c Tue Jan 15 23:58:46 2002
--- /home/lkoeller/tmp/ports/mail/faces/work/faces/compface/arith.c Thu Oct 24 03:28:07 1991
***************
*** 17,33 ****
#include "compface.h"
void
! RevPush(Prob *p)
{
! if (NumProbs >= PIXELS * 2 - 1) {
longjmp(comp_env, ERR_INTERNAL);
- }
ProbBuf[NumProbs++] = p;
}
-
void
! BigPush(Prob *p)
{
static WORD tmp;
--- 16,32 ----
#include "compface.h"
void
! RevPush(p)
! Prob *p;
{
! if (NumProbs >= PIXELS * 2 - 1)
longjmp(comp_env, ERR_INTERNAL);
ProbBuf[NumProbs++] = p;
}
void
! BigPush(p)
! Prob *p;
{
static WORD tmp;
***************
*** 36,76 ****
BigAdd(tmp + p->p_offset);
}
-
int
! BigPop(Prob *p)
{
static WORD tmp;
! int i;
BigDiv(0, &tmp);
i = 0;
! while ((tmp < p->p_offset) || (tmp >= p->p_range + p->p_offset)) {
p++;
i++;
}
BigMul(p->p_range);
BigAdd(tmp - p->p_offset);
! return(i);
}
-
#ifdef DEBUG
void
! BigPrint() /* Print a BigInt in HexaDecimal. */
{
! int i, c, count;
! WORD *w;
count = 0;
w = B.b_word + (i = B.b_words);
! while (i--) {
w--;
c = *((*w >> 4) + HexDigits);
putc(c, stderr);
c = *((*w & 0xf) + HexDigits);
putc(c, stderr);
! if (++count >= 36) {
putc('\\', stderr);
putc('\n', stderr);
count = 0;
--- 35,79 ----
BigAdd(tmp + p->p_offset);
}
int
! BigPop(p)
! register Prob *p;
{
static WORD tmp;
! register int i;
BigDiv(0, &tmp);
i = 0;
! while ((tmp < p->p_offset) || (tmp >= p->p_range + p->p_offset))
! {
p++;
i++;
}
BigMul(p->p_range);
BigAdd(tmp - p->p_offset);
! return i;
}
#ifdef DEBUG
+ /* Print a BigInt in HexaDecimal
+ */
void
! BigPrint()
{
! register int i, c, count;
! register WORD *w;
count = 0;
w = B.b_word + (i = B.b_words);
! while (i--)
! {
w--;
c = *((*w >> 4) + HexDigits);
putc(c, stderr);
c = *((*w & 0xf) + HexDigits);
putc(c, stderr);
! if (++count >= 36)
! {
putc('\\', stderr);
putc('\n', stderr);
count = 0;
***************
*** 78,110 ****
}
putc('\n', stderr);
}
! #endif /*DEBUG*/
!
/* Divide B by a storing the result in B and the remainder in the word
! * pointer to by r.
*/
-
void
! BigDiv(WORD a, WORD *r)
{
! int i;
! WORD *w;
! COMP c, d;
a &= WORDMASK;
! if ((a == 1) || (B.b_words == 0)) {
*r = 0;
return;
}
!
! /* Treat this as a == WORDCARRY and just shift everything right a WORD */
!
! if (a == 0) {
i = --B.b_words;
w = B.b_word;
*r = *w;
! while (i--) {
*w = *(w + 1);
w++;
}
--- 81,112 ----
}
putc('\n', stderr);
}
! #endif
/* Divide B by a storing the result in B and the remainder in the word
! * pointer to by r
*/
void
! BigDiv(a, r)
! register WORD a, *r;
{
! register int i;
! register WORD *w;
! register COMP c, d;
a &= WORDMASK;
! if ((a == 1) || (B.b_words == 0))
! {
*r = 0;
return;
}
! if (a == 0) /* treat this as a == WORDCARRY */
! { /* and just shift everything right a WORD */
i = --B.b_words;
w = B.b_word;
*r = *w;
! while (i--)
! {
*w = *(w + 1);
w++;
}
***************
*** 113,154 ****
}
w = B.b_word + (i = B.b_words);
c = 0;
! while (i--) {
c <<= BITSPERWORD;
! c += (COMP) *--w;
! d = c / (COMP) a;
! c = c % (COMP) a;
! *w = (WORD) (d & WORDMASK);
}
*r = c;
! if (B.b_word[B.b_words - 1] == 0) {
B.b_words--;
- }
}
!
! /* Multiply a by B storing the result in B. */
!
void
! BigMul(WORD a)
{
! int i;
! WORD *w;
! COMP c;
a &= WORDMASK;
! if ((a == 1) || (B.b_words == 0)) {
return;
! }
!
! /* Treat this as a == WORDCARRY and just shift everything left a WORD */
!
! if (a == 0) {
! if ((i = B.b_words++) >= MAXWORDS - 1) {
longjmp(comp_env, ERR_INTERNAL);
- }
w = B.b_word + i;
! while (i--) {
*w = *(w - 1);
w--;
}
--- 115,153 ----
}
w = B.b_word + (i = B.b_words);
c = 0;
! while (i--)
! {
c <<= BITSPERWORD;
! c += (COMP)*--w;
! d = c / (COMP)a;
! c = c % (COMP)a;
! *w = (WORD)(d & WORDMASK);
}
*r = c;
! if (B.b_word[B.b_words - 1] == 0)
B.b_words--;
}
! /* Multiply a by B storing the result in B
! */
void
! BigMul(a)
! register WORD a;
{
! register int i;
! register WORD *w;
! register COMP c;
a &= WORDMASK;
! if ((a == 1) || (B.b_words == 0))
return;
! if (a == 0) /* treat this as a == WORDCARRY */
! { /* and just shift everything left a WORD */
! if ((i = B.b_words++) >= MAXWORDS - 1)
longjmp(comp_env, ERR_INTERNAL);
w = B.b_word + i;
! while (i--)
! {
*w = *(w - 1);
w--;
}
***************
*** 158,239 ****
i = B.b_words;
w = B.b_word;
c = 0;
! while (i--) {
c += (COMP)*w * (COMP)a;
*(w++) = (WORD)(c & WORDMASK);
c >>= BITSPERWORD;
}
! if (c) {
! if (B.b_words++ >= MAXWORDS) {
longjmp(comp_env, ERR_INTERNAL);
- }
*w = (COMP)(c & WORDMASK);
}
}
!
! /* Subtract a from B storing the result in B. */
!
void
! BigSub(WORD a)
{
! int i;
! WORD *w;
! COMP c;
a &= WORDMASK;
! if (a == 0) {
return;
- }
i = 1;
w = B.b_word;
! c = (COMP) *w - (COMP) a;
! *w = (WORD) (c & WORDMASK);
! while (c & WORDCARRY) {
! if (i >= B.b_words) {
longjmp(comp_env, ERR_INTERNAL);
! }
! c = (COMP) *++w - 1;
! *w = (WORD) (c & WORDMASK);
i++;
}
! if ((i == B.b_words) && (*w == 0) && (i > 0)) {
B.b_words--;
- }
}
!
! /* Add to a to B storing the result in B. */
!
void
! BigAdd(WORD a)
{
! int i;
! WORD *w;
! COMP c;
a &= WORDMASK;
! if (a == 0) {
return;
- }
i = 0;
w = B.b_word;
c = a;
! while ((i < B.b_words) && c) {
! c += (COMP) *w;
! *w++ = (WORD) (c & WORDMASK);
c >>= BITSPERWORD;
i++;
}
! if ((i == B.b_words) && c) {
! if (B.b_words++ >= MAXWORDS) {
longjmp(comp_env, ERR_INTERNAL);
! }
! *w = (COMP) (c & WORDMASK);
}
}
-
void
BigClear()
{
--- 157,238 ----
i = B.b_words;
w = B.b_word;
c = 0;
! while (i--)
! {
c += (COMP)*w * (COMP)a;
*(w++) = (WORD)(c & WORDMASK);
c >>= BITSPERWORD;
}
! if (c)
! {
! if (B.b_words++ >= MAXWORDS)
longjmp(comp_env, ERR_INTERNAL);
*w = (COMP)(c & WORDMASK);
}
}
! #if 0
! /* Subtract a from B storing the result in B
! */
void
! BigSub(a)
! WORD a;
{
! register int i;
! register WORD *w;
! register COMP c;
a &= WORDMASK;
! if (a == 0)
return;
i = 1;
w = B.b_word;
! c = (COMP)*w - (COMP)a;
! *w = (WORD)(c & WORDMASK);
! while (c & WORDCARRY)
! {
! if (i >= B.b_words)
longjmp(comp_env, ERR_INTERNAL);
! c = (COMP)*++w - 1;
! *w = (WORD)(c & WORDMASK);
i++;
}
! if ((i == B.b_words) && (*w == 0) && (i > 0))
B.b_words--;
}
+ #endif
! /* Add to a to B storing the result in B
! */
void
! BigAdd(a)
! WORD a;
{
! register int i;
! register WORD *w;
! register COMP c;
a &= WORDMASK;
! if (a == 0)
return;
i = 0;
w = B.b_word;
c = a;
! while ((i < B.b_words) && c)
! {
! c += (COMP)*w;
! *w++ = (WORD)(c & WORDMASK);
c >>= BITSPERWORD;
i++;
}
! if ((i == B.b_words) && c)
! {
! if (B.b_words++ >= MAXWORDS)
longjmp(comp_env, ERR_INTERNAL);
! *w = (COMP)(c & WORDMASK);
}
}
void
BigClear()
{