#ident "@(#)addbignum.c	1.2 5/24/96 11:29:58"
/*
/* Copyright John Moyer 1996
/* permission is granted to use this for any purpose provided proper
/* credit is given to the author
*/

#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <string.h>

#include "bignum.h"

int addbignum( BigNum *x1, BigNum *y1, BigNum *z1)
{
int i, j;

if (x1->c == 0 )
  {
  *z1 = *y1;
  return 0;
  }
if (y1->c == 0 )
  {
  *z1 = *x1;
  return 0;
  }

int2bcd(0,z1);
j = x1->c;
if ( y1->c > j )
  j = y1->c;

if (x1->isign == y1->isign)
  {
  bcdadd(x1->x,y1->x,z1->x,j);
  if ( x1->isign == 1 )
    z1->isign = 1;
  else
    z1->isign = -1;
  }
else
  {
  if ( x1->c == y1->c && memcmp(x1->x, y1->x, x1->c ) == 0 )
    {
    z1->isign = 0;
    z1->c = 0;
    }
  else
    {
    z1->isign = bcdsub(x1->x,y1->x,z1->x,j);
    if ( z1->isign == 15 )
      {
      memset(z1->x,0,ISIZE);
      bcdsub(y1->x,x1->x,z1->x,j);
      if ( y1->isign == -1 && x1->isign == 1 )
        z1->isign = -1;
      else
        z1->isign = 1;
      }
    else
      {
      if ( x1->isign == -1 && y1->isign == 1 )
        z1->isign = -1;
      else
        z1->isign = 1;
      }
    }
  }


if ( z1->isign == 0 )
  z1->isign = 1;

for ( z1->c = 0, i = ISIZE -1 ; i >= 0; i-- )
  if ( z1->x[i] != 0 )
    {
    z1->c = i+1;
    break;
    }


return 0;
}


