#include "lint.h" #ifndef lint static char sccs_id[] = "@(#)util.c 2.2 8/13/82"; #endif lint #include #include move(a,b) MINT *a,*b; /* copies a onto b; a is left unchanged */ { int i,j; 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;jval[j]=a->val[j]; return; } short *xalloc(nint,s) char *s; { short *i; char *malloc(); i=(short *)malloc((unsigned)((nint+2)*sizeof(short))); #ifdef DBG fprintf(stderr,"%s: %d words at %o\n",s,nint,i); #endif if (i!=NULL) return(i); fprintf(stderr,"can\'t allocate for %s: %d words\n",s,nint); aperror("ape: no free space"); return(0); } aperror(s) char *s; { fprintf(stderr,"%s\n",s); ignore(fflush(stdout)); sleep(2); abort(); } new(pa) PMINT *pa; /* Pascal-like initializer; gives a zero structure */ { char *calloc(); *pa = (PMINT) calloc (1,sizeof(MINT)); } mcan(a) MINT *a; /* "removes" excess zeroes */ { 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 *shtom(n) short n; { MINT *a; new(&a); 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 /* I think the new makes this unnecessary */ { /*a->len=0;*/ return(a); } } MINT *ltom(ln) long ln; { if (ln < SHORT && (-ln) len = -2; ln = -ln; } else a->len = 2; if (ln > 0L) { a->val = xalloc(2,"ltom1"); a->val[1] = ln/SHORT; a->val[0] = ln%SHORT; return (a); } aperror("ltom problem"); return (NULL); } } makemint(a,ln) PMINT a; long int ln; { PMINT here; here = ltom(ln); move (here, a); afree(here); }