V10/libmp/util.c

Compare this file to the similar file:
Show the results in this format:

extern char *malloc();
#include "stdio.h"
#include "mp.h"
move(a,b) mint *a,*b;
{	int i,j;
	if(a == b)
		return;
	xfree(b);
	b->len=a->len;
	if((i=a->len)<0)
		i = -i;
	if(i==0)
		return;
	b->val=xalloc(i,"move");
	for(j=0;j<i;j++)
		b->val[j]=a->val[j];
	return;
}
dummy(){ }
/*ARGSUSED*/
short *xalloc(nint,s) char *s;
{	short *i;
	extern short *halloc();
	i = halloc(nint);
#ifdef DBG
	i=(short *)malloc(2*(unsigned)nint+4);
	if(dbg) fprintf(stderr, "%s: %o\n",s,i);
#endif
	if(i!=NULL) return(i);
	fatal("mp: no free space");
	return(0);
}
fatal(s) char *s;
{
	fprintf(stderr,"%s\n",s);
	(void) fflush(stdout);
	sleep(2);
	abort();
}
xfree(c) mint *c;
{
#ifdef DBG
	if(dbg) fprintf(stderr, "xfree ");
#endif
	if(c->len==0) return;
	/*shfree(c->val);*/
	hfree(c->val);
	c->len=0;
	return;
}

mfree(a)
mint *a;
{
	xfree(a);
	hfree(a);
}
mcan(a) mint *a;
{	int i,j;
	if((i=a->len)==0) return;
	else if(i<0) i= -i;
	for(j=i;j>0 && a->val[j-1]==0;j--);
	if(j==i) return;
	if(j==0) {	
		xfree(a);
		return;
	}
	if(a->len > 0) a->len=j;
	else a->len = -j;
}
mint *itom(n)
{	mint *a;
	a=(mint *)xalloc(2,"itom");
	if(n>0) {	
		a->len=1;
		a->val=xalloc(1,"itom1");
		*a->val=n;
		return(a);
	}
	else if(n<0) {	
		a->len = -1;
		a->val=xalloc(1,"itom2");
		*a->val= -n;
		return(a);
	}
	else {	
		a->len=0;
		return(a);
	}
}
mcmp(a,b) mint *a,*b;
{	mint c;
	int res;
	if(a->len < b->len)
		return(-1);
	if(a->len > b->len)
		return(1);
	c.len=0;
	msub(a,b,&c);
	res=c.len;
	xfree(&c);
	if(res < 0)
		return(-1);
	else if(res == 0)
		return(0);
	else
		return(1);
}

dtom(z, r)
double z;
mint *r;
{	int i, sgn;
	static mint *c;
	if(!c) {
		c = itom(16384);
		madd(c, c, c);
	}
	if(z < 0) {
		sgn = 1;
		z = -z;
	}
	else
		sgn = 0;
	for(i = 0; z >= 32768; i++)
		z /= 32768;
	move(c, r);
	r->len = 1;
	r->val[0] = z;
	while(--i >= 0) {
		z -= r->val[0];
		z *= 32768;
		mult(r, c, r);
		r->val[0] = z;
	}
	if(sgn)
		r->len = -r->len;
}