do post-order visit if FTS_SKIP or FTS_XDEV apply to preorder visit
[unix-history] / usr / src / lib / libmp / madd.c
CommitLineData
051b1e55 1#ifndef lint
3bc5312c 2static char sccsid[] = "@(#)madd.c 5.2 (Berkeley) %G%";
051b1e55 3#endif not lint
7bd4c8d6
SL
4
5#include <mp.h>
6m_add(a,b,c) struct mint *a,*b,*c;
7{ int carry,i;
8 int x;
9 short *cval;
10 cval=xalloc(a->len+1,"m_add");
11 carry=0;
12 for(i=0;i<b->len;i++)
13 { x=carry+a->val[i]+b->val[i];
14 if(x&0100000)
15 { carry=1;
16 cval[i]=x&077777;
17 }
18 else
19 { carry=0;
20 cval[i]=x;
21 }
22 }
23 for(;i<a->len;i++)
24 { x=carry+a->val[i];
25 if(x&0100000) cval[i]=x&077777;
26 else
27 { carry=0;
28 cval[i]=x;
29 }
30
31 }
32 if(carry==1)
33 { cval[i]=1;
34 c->len=i+1;
35 }
36 else c->len=a->len;
37 c->val=cval;
38 if(c->len==0) shfree(cval);
39 return;
40}
41madd(a,b,c) struct mint *a,*b,*c;
42{ struct mint x,y,z;
43 int sign;
44 x.len=a->len;
45 x.val=a->val;
46 y.len=b->len;
47 y.val=b->val;
48 z.len=0;
49 sign=1;
50 if(x.len>=0)
51 if(y.len>=0)
52 if(x.len>=y.len) m_add(&x,&y,&z);
53 else m_add(&y,&x,&z);
54 else
55 { y.len= -y.len;
56 msub(&x,&y,&z);
57 }
58 else if(y.len<=0)
59 { x.len = -x.len;
60 y.len= -y.len;
61 sign= -1;
62 madd(&x,&y,&z);
63 }
64 else
65 { x.len= -x.len;
66 msub(&y,&x,&z);
67 }
68 xfree(c);
69 c->val=z.val;
70 c->len=sign*z.len;
71 return;
72}
73m_sub(a,b,c) struct mint *a,*b,*c;
74{ int x,i;
75 int borrow;
76 short one;
77 struct mint mone;
78 one=1; mone.len= 1; mone.val= &one;
79 c->val=xalloc(a->len,"m_sub");
80 borrow=0;
81 for(i=0;i<b->len;i++)
82 { x=borrow+a->val[i]-b->val[i];
83 if(x&0100000)
84 { borrow= -1;
85 c->val[i]=x&077777;
86 }
87 else
88 { borrow=0;
89 c->val[i]=x;
90 }
91 }
92 for(;i<a->len;i++)
93 { x=borrow+a->val[i];
94 if(x&0100000) c->val[i]=x&077777;
95 else
96 { borrow=0;
97 c->val[i]=x;
98 }
99 }
100 if(borrow<0)
101 { for(i=0;i<a->len;i++) c->val[i] ^= 077777;
102 c->len=a->len;
103 madd(c,&mone,c);
104 }
105 for(i=a->len-1;i>=0;--i) if(c->val[i]>0)
106 { if(borrow==0) c->len=i+1;
107 else c->len= -i-1;
108 return;
109 }
110 shfree(c->val);
111 return;
112}
113msub(a,b,c) struct mint *a,*b,*c;
114{ struct mint x,y,z;
115 int sign;
116 x.len=a->len;
117 y.len=b->len;
118 x.val=a->val;
119 y.val=b->val;
120 z.len=0;
121 sign=1;
122 if(x.len>=0)
123 if(y.len>=0)
124 if(x.len>=y.len) m_sub(&x,&y,&z);
125 else
126 { sign= -1;
127 msub(&y,&x,&z);
128 }
129 else
130 { y.len= -y.len;
131 madd(&x,&y,&z);
132 }
133 else if(y.len<=0)
134 { sign= -1;
135 x.len= -x.len;
136 y.len= -y.len;
137 msub(&y,&x,&z);
138 }
139 else
140 { x.len= -x.len;
141 madd(&x,&y,&z);
142 sign= -1;
143 }
144 if(a==c && x.len!=0) xfree(a);
145 else if(b==c && y.len!=0) xfree(b);
146 else xfree(c);
147 c->val=z.val;
148 c->len=sign*z.len;
149 return;
150}