Listing 5

/*  A header file */

   struct s_number
      {
      int number_of_elements;
      int overflow;       /* Overflow (single bit) */
      int sign;           /* Sign (0 = positive, 1 = negative) */
      long int element[]; /* Kept in least significant first order */
      };
   typedef struct s_number *NUMBER;

   NUMBER new_number(long initial_long_value);
   NUMBER add_numbers(NUMBER add1, NUMBER add2);

/*  This is a short program with its use */

main()
   {
   NUMBER first_number;
   NUMBER second_number;
   NUMBER sum;

   first_number= new_number(10000);
   second_number= new_number(10000);
   sum = add_numbers(first_number, second_number);
   }

/*  The routines */

NUMBER new_number(NUMBER number, long initial_long_value)
   {
   number = calloc(sizeof(struct s_number) + 1, 1);
   if (number != NULL)
      {
      number->number_of_elements = 1;
      number->element[0] = initial_long_value;
      }
   return number;
   }

NUMBER add_numbers(NUMBER add1, NUMBER add2)
   {
   NUMBER sum;
   int size_sum;    /* Size of result */
   int size_count;  /* Size of smaller addend */
   int i;
   int overflow;
   int sign;
   int which_is_bigger;

   /* Should check for overflow here and increase size_sum */
   if (add1->number_of_elements > add2->number_of_elements)
      {
      size_sum = add1->number of elements;
      size_count = add2->number_of_elements;
      which_is_bigger: 1;
      }
   else
      {
      size_count = add1->number_of_elements;
      size_sum = add2->number of elements;
      which_is_bigger = 2;
      }

   /* Get a place for the result */
   sum = calloc(sizeof(struct s_number) + size_sum, 1);

   /* Do the addition - will need to check for overflow, sign, etc. */
   for (i = 0; i < size_count++; i++)
      {
      /*  Need to check for overflow */
      sum->element[i] = add1->element[i] + add2->element[i] +
         overflow;
      }

   /* Do the remainder of the larger addend */
   for (i = size_count; i < size_sum; i++)
      {
      if (which_is_bigger == 1)
         sum->element[i] = add1->element[i] + overflow;
      else
         sum->element[i] = add2->element[i] + overflow;
      overflow = 0;
      }

   /* Need to test overflow of the larger addend
     and set sum here */

   return sum;
   }
/* End of File */