1 b3f61791 2004-03-21 devnull #include "os.h"
2 b3f61791 2004-03-21 devnull #include <mp.h>
3 b3f61791 2004-03-21 devnull #include "dat.h"
5 cbeb0b26 2006-04-01 devnull /* res = b << shift */
7 b3f61791 2004-03-21 devnull mpleft(mpint *b, int shift, mpint *res)
9 b3f61791 2004-03-21 devnull int d, l, r, i, otop;
10 b3f61791 2004-03-21 devnull mpdigit this, last;
12 b3f61791 2004-03-21 devnull res->sign = b->sign;
13 b3f61791 2004-03-21 devnull if(b->top==0){
14 b3f61791 2004-03-21 devnull res->top = 0;
18 cbeb0b26 2006-04-01 devnull /* a negative left shift is a right shift */
19 b3f61791 2004-03-21 devnull if(shift < 0){
20 b3f61791 2004-03-21 devnull mpright(b, -shift, res);
24 cbeb0b26 2006-04-01 devnull /* b and res may be the same so remember the old top */
25 b3f61791 2004-03-21 devnull otop = b->top;
27 cbeb0b26 2006-04-01 devnull /* shift */
28 cbeb0b26 2006-04-01 devnull mpbits(res, otop*Dbits + shift); /* overkill */
29 b3f61791 2004-03-21 devnull res->top = DIGITS(otop*Dbits + shift);
30 b3f61791 2004-03-21 devnull d = shift/Dbits;
31 b3f61791 2004-03-21 devnull l = shift - d*Dbits;
32 b3f61791 2004-03-21 devnull r = Dbits - l;
34 b3f61791 2004-03-21 devnull if(l == 0){
35 b3f61791 2004-03-21 devnull for(i = otop-1; i >= 0; i--)
36 b3f61791 2004-03-21 devnull res->p[i+d] = b->p[i];
38 b3f61791 2004-03-21 devnull last = 0;
39 b3f61791 2004-03-21 devnull for(i = otop-1; i >= 0; i--) {
40 b3f61791 2004-03-21 devnull this = b->p[i];
41 b3f61791 2004-03-21 devnull res->p[i+d+1] = (last<<l) | (this>>r);
42 b3f61791 2004-03-21 devnull last = this;
44 b3f61791 2004-03-21 devnull res->p[d] = last<<l;
46 b3f61791 2004-03-21 devnull for(i = 0; i < d; i++)
47 b3f61791 2004-03-21 devnull res->p[i] = 0;
49 cbeb0b26 2006-04-01 devnull /* normalize */
50 b3f61791 2004-03-21 devnull while(res->top > 0 && res->p[res->top-1] == 0)
51 b3f61791 2004-03-21 devnull res->top--;