| #include "os.h" | 
 | #include <mp.h> | 
 | #include "dat.h" | 
 |  | 
 | /* res = b << shift */ | 
 | void | 
 | mpleft(mpint *b, int shift, mpint *res) | 
 | { | 
 | 	int d, l, r, i, otop; | 
 | 	mpdigit this, last; | 
 |  | 
 | 	res->sign = b->sign; | 
 | 	if(b->top==0){ | 
 | 		res->top = 0; | 
 | 		return; | 
 | 	} | 
 |  | 
 | 	/* a negative left shift is a right shift */ | 
 | 	if(shift < 0){ | 
 | 		mpright(b, -shift, res); | 
 | 		return; | 
 | 	} | 
 |  | 
 | 	/* b and res may be the same so remember the old top */ | 
 | 	otop = b->top; | 
 |  | 
 | 	/* shift */ | 
 | 	mpbits(res, otop*Dbits + shift);	/* overkill */ | 
 | 	res->top = DIGITS(otop*Dbits + shift); | 
 | 	d = shift/Dbits; | 
 | 	l = shift - d*Dbits; | 
 | 	r = Dbits - l; | 
 |  | 
 | 	if(l == 0){ | 
 | 		for(i = otop-1; i >= 0; i--) | 
 | 			res->p[i+d] = b->p[i]; | 
 | 	} else { | 
 | 		last = 0; | 
 | 		for(i = otop-1; i >= 0; i--) { | 
 | 			this = b->p[i]; | 
 | 			res->p[i+d+1] = (last<<l) | (this>>r); | 
 | 			last = this; | 
 | 		} | 
 | 		res->p[d] = last<<l; | 
 | 	} | 
 | 	for(i = 0; i < d; i++) | 
 | 		res->p[i] = 0; | 
 |  | 
 | 	/* normalize */ | 
 | 	while(res->top > 0 && res->p[res->top-1] == 0) | 
 | 		res->top--; | 
 | } |