Blame


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"
4 b3f61791 2004-03-21 devnull
5 cbeb0b26 2006-04-01 devnull /* res = b << shift */
6 b3f61791 2004-03-21 devnull void
7 b3f61791 2004-03-21 devnull mpleft(mpint *b, int shift, mpint *res)
8 b3f61791 2004-03-21 devnull {
9 b3f61791 2004-03-21 devnull int d, l, r, i, otop;
10 b3f61791 2004-03-21 devnull mpdigit this, last;
11 b3f61791 2004-03-21 devnull
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;
15 b3f61791 2004-03-21 devnull return;
16 b3f61791 2004-03-21 devnull }
17 b3f61791 2004-03-21 devnull
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);
21 b3f61791 2004-03-21 devnull return;
22 b3f61791 2004-03-21 devnull }
23 b3f61791 2004-03-21 devnull
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;
26 b3f61791 2004-03-21 devnull
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;
33 b3f61791 2004-03-21 devnull
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];
37 b3f61791 2004-03-21 devnull } else {
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;
43 b3f61791 2004-03-21 devnull }
44 b3f61791 2004-03-21 devnull res->p[d] = last<<l;
45 b3f61791 2004-03-21 devnull }
46 b3f61791 2004-03-21 devnull for(i = 0; i < d; i++)
47 b3f61791 2004-03-21 devnull res->p[i] = 0;
48 b3f61791 2004-03-21 devnull
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--;
52 b3f61791 2004-03-21 devnull }