xref: /plan9/sys/src/cmd/unix/drawterm/libmp/mpvecsub.c (revision 8ccd4a6360d974db7bd7bbd4f37e7018419ea908)
1*8ccd4a63SDavid du Colombier #include "os.h"
2*8ccd4a63SDavid du Colombier #include <mp.h>
3*8ccd4a63SDavid du Colombier #include "dat.h"
4*8ccd4a63SDavid du Colombier 
5*8ccd4a63SDavid du Colombier // prereq: a >= b, alen >= blen, diff has at least alen digits
6*8ccd4a63SDavid du Colombier void
mpvecsub(mpdigit * a,int alen,mpdigit * b,int blen,mpdigit * diff)7*8ccd4a63SDavid du Colombier mpvecsub(mpdigit *a, int alen, mpdigit *b, int blen, mpdigit *diff)
8*8ccd4a63SDavid du Colombier {
9*8ccd4a63SDavid du Colombier 	int i, borrow;
10*8ccd4a63SDavid du Colombier 	mpdigit x, y;
11*8ccd4a63SDavid du Colombier 
12*8ccd4a63SDavid du Colombier 	borrow = 0;
13*8ccd4a63SDavid du Colombier 	for(i = 0; i < blen; i++){
14*8ccd4a63SDavid du Colombier 		x = *a++;
15*8ccd4a63SDavid du Colombier 		y = *b++;
16*8ccd4a63SDavid du Colombier 		y += borrow;
17*8ccd4a63SDavid du Colombier 		if(y < borrow)
18*8ccd4a63SDavid du Colombier 			borrow = 1;
19*8ccd4a63SDavid du Colombier 		else
20*8ccd4a63SDavid du Colombier 			borrow = 0;
21*8ccd4a63SDavid du Colombier 		if(x < y)
22*8ccd4a63SDavid du Colombier 			borrow++;
23*8ccd4a63SDavid du Colombier 		*diff++ = x - y;
24*8ccd4a63SDavid du Colombier 	}
25*8ccd4a63SDavid du Colombier 	for(; i < alen; i++){
26*8ccd4a63SDavid du Colombier 		x = *a++;
27*8ccd4a63SDavid du Colombier 		y = x - borrow;
28*8ccd4a63SDavid du Colombier 		if(y > x)
29*8ccd4a63SDavid du Colombier 			borrow = 1;
30*8ccd4a63SDavid du Colombier 		else
31*8ccd4a63SDavid du Colombier 			borrow = 0;
32*8ccd4a63SDavid du Colombier 		*diff++ = y;
33*8ccd4a63SDavid du Colombier 	}
34*8ccd4a63SDavid du Colombier }
35