|  | #include "os.h" | 
|  | #include <mp.h> | 
|  | #include "dat.h" | 
|  |  | 
|  | /* sum = abs(b1) + abs(b2), i.e., add the magnitudes */ | 
|  | void | 
|  | mpmagadd(mpint *b1, mpint *b2, mpint *sum) | 
|  | { | 
|  | int m, n; | 
|  | mpint *t; | 
|  |  | 
|  | /* get the sizes right */ | 
|  | if(b2->top > b1->top){ | 
|  | t = b1; | 
|  | b1 = b2; | 
|  | b2 = t; | 
|  | } | 
|  | n = b1->top; | 
|  | m = b2->top; | 
|  | if(n == 0){ | 
|  | mpassign(mpzero, sum); | 
|  | return; | 
|  | } | 
|  | if(m == 0){ | 
|  | mpassign(b1, sum); | 
|  | return; | 
|  | } | 
|  | mpbits(sum, (n+1)*Dbits); | 
|  | sum->top = n+1; | 
|  |  | 
|  | mpvecadd(b1->p, n, b2->p, m, sum->p); | 
|  | sum->sign = 1; | 
|  |  | 
|  | mpnorm(sum); | 
|  | } | 
|  |  | 
|  | /* sum = b1 + b2 */ | 
|  | void | 
|  | mpadd(mpint *b1, mpint *b2, mpint *sum) | 
|  | { | 
|  | int sign; | 
|  |  | 
|  | if(b1->sign != b2->sign){ | 
|  | if(b1->sign < 0) | 
|  | mpmagsub(b2, b1, sum); | 
|  | else | 
|  | mpmagsub(b1, b2, sum); | 
|  | } else { | 
|  | sign = b1->sign; | 
|  | mpmagadd(b1, b2, sum); | 
|  | if(sum->top != 0) | 
|  | sum->sign = sign; | 
|  | } | 
|  | } |