|
|
researchv10 Norman
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;
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.