/* int _DoubleUnsArr(a,n)
 *
 * ARGUMENT
 *      unsigned        *a;
 *      int              n;
 *
 * DESCRIPTION
 *      Multiplies a by 2 and stores the result in a.
 *
 *
 * SIDE EFFECTS
 *
 *
 * RETURNS
 *      SUCCESS if no overflow, otherwise FAILURE.
 *
 * AUTHOR
 *      Brugnoli Giugno 1992
 *
 * MODIFICATIONS
 *
 */

#include <stdio.h>
#include <math.h>
#include "gm.h"
#include "gmsystem.h"

unsigned _DoubleUnsArr(a,n)
unsigned SHORT 				a[];
int             n;
{
  int i;
  unsigned long pdst;
  unsigned SHORT carry = 0;

  if (n>0)
  {
    for (i=0;i<n;i++)
    {
      pdst=carry+(unsigned long)a[i]*2;
      if (pdst>MAXUNSINT)
      {
        carry=(unsigned SHORT)(pdst>> BITSPERUI );
        a[i]=(unsigned SHORT)(pdst & MAXUNSINT );
      }
      else
      {
        a[i]=(unsigned SHORT)pdst;
        carry=0; 
			}
    }
    if ((a[n-1]) >> (BITSPERUI-1))
      return(FAILURE);
  }
  return(GM_SUCCESS);
}