xref: /original-bsd/lib/libmp/util.c (revision 3c32e3a3)
1 /*	@(#)util.c	4.1	12/25/82	*/
2 
3 char *malloc();
4 #ifdef lint
5 int xv_oid;
6 #endif
7 #include <stdio.h>
8 #include <mp.h>
9 move(a,b) MINT *a,*b;
10 {	int i,j;
11 	xfree(b);
12 	b->len=a->len;
13 	if((i=a->len)<0) i = -i;
14 	if(i==0) return;
15 	b->val=xalloc(i,"move");
16 	for(j=0;j<i;j++)
17 		b->val[j]=a->val[j];
18 	return;
19 }
20 dummy(){}
21 short *xalloc(nint,s) char *s;
22 {	short *i;
23 	i=(short *)malloc(2*(unsigned)nint+4);
24 #ifdef DBG
25 	if(dbg) fprintf(stderr, "%s: %o\n",s,i);
26 #endif
27 	if(i!=NULL) return(i);
28 	fatal("mp: no free space");
29 	return(0);
30 }
31 fatal(s) char *s;
32 {
33 	fprintf(stderr,"%s\n",s);
34 	VOID fflush(stdout);
35 	sleep(2);
36 	abort();
37 }
38 xfree(c) MINT *c;
39 {
40 #ifdef DBG
41 	if(dbg) fprintf(stderr, "xfree ");
42 #endif
43 	if(c->len==0) return;
44 	shfree(c->val);
45 	c->len=0;
46 	return;
47 }
48 mcan(a) MINT *a;
49 {	int i,j;
50 	if((i=a->len)==0) return;
51 	else if(i<0) i= -i;
52 	for(j=i;j>0 && a->val[j-1]==0;j--);
53 	if(j==i) return;
54 	if(j==0)
55 	{	xfree(a);
56 		return;
57 	}
58 	if(a->len > 0) a->len=j;
59 	else a->len = -j;
60 }
61 MINT *itom(n)
62 {	MINT *a;
63 	a=(MINT *)xalloc(2,"itom");
64 	if(n>0)
65 	{	a->len=1;
66 		a->val=xalloc(1,"itom1");
67 		*a->val=n;
68 		return(a);
69 	}
70 	else if(n<0)
71 	{	a->len = -1;
72 		a->val=xalloc(1,"itom2");
73 		*a->val= -n;
74 		return(a);
75 	}
76 	else
77 	{	a->len=0;
78 		return(a);
79 	}
80 }
81 mcmp(a,b) MINT *a,*b;
82 {	MINT c;
83 	int res;
84 	if(a->len!=b->len) return(a->len-b->len);
85 	c.len=0;
86 	msub(a,b,&c);
87 	res=c.len;
88 	xfree(&c);
89 	return(res);
90 }
91