*** 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
***************
*** 1,10 ****
- 
  /*
-  *  $Header: /cvs/faces/faces/compface/arith.c,v 1.2 2002/01/15 22:58:46 devface Exp $
-  *
   *  Compface - 48x48x1 image compression and decompression
   *
!  *  Copyright (c) 1990-2002 James Ashton - Sydney University
   *
   *  Permission is given to distribute these sources, as long as the
   *  copyright messages are not removed, and no monies are exchanged. 
--- 1,9 ----
  /*
   *  Compface - 48x48x1 image compression and decompression
   *
!  *  Copyright (c) James Ashton - Sydney University - June 1990.
!  *
!  *  Written 11th November 1989.
   *
   *  Permission is given to distribute these sources, as long as the
   *  copyright messages are not removed, and no monies are exchanged. 
***************
*** 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()
  {
