commit cfd7f6f4406e0ff361e23956a339fbffdbe32345
parent 3324df6a90d6629af5ae299b721763cfcc390179
Author: Andres Navarro <canavarro82@gmail.com>
Date:   Tue, 12 Apr 2011 13:52:25 -0300
Added klisp_State parameter to mp_int_add/sub/add_value/sub_value.
Diffstat:
3 files changed, 45 insertions(+), 39 deletions(-)
diff --git a/src/imath.c b/src/imath.c
@@ -582,7 +582,7 @@ mp_result mp_int_neg(klisp_State *K, mp_int a, mp_int c)
 
 /* {{{ mp_int_add(a, b, c) */
 
-mp_result mp_int_add(mp_int a, mp_int b, mp_int c)
+mp_result mp_int_add(klisp_State *K, mp_int a, mp_int b, mp_int c)
 { 
   mp_size  ua, ub, uc, max;
 
@@ -595,14 +595,14 @@ mp_result mp_int_add(mp_int a, mp_int b, mp_int c)
     /* Same sign -- add magnitudes, preserve sign of addends */
     mp_digit carry;
 
-    if(!s_pad(KK, c, max))
+    if(!s_pad(K, c, max))
       return MP_MEMORY;
 
     carry = s_uadd(MP_DIGITS(a), MP_DIGITS(b), MP_DIGITS(c), ua, ub);
     uc = max;
 
     if(carry) {
-      if(!s_pad(KK, c, max + 1))
+      if(!s_pad(K, c, max + 1))
 	return MP_MEMORY;
 
       c->digits[max] = carry;
@@ -632,7 +632,7 @@ mp_result mp_int_add(mp_int a, mp_int b, mp_int c)
       x = a; y = b;
     }
 
-    if(!s_pad(KK, c, MP_USED(x)))
+    if(!s_pad(K, c, MP_USED(x)))
       return MP_MEMORY;
 
     /* Subtract smaller from larger */
@@ -651,21 +651,21 @@ mp_result mp_int_add(mp_int a, mp_int b, mp_int c)
 
 /* {{{ mp_int_add_value(a, value, c) */
 
-mp_result mp_int_add_value(mp_int a, mp_small value, mp_int c)
+mp_result mp_int_add_value(klisp_State *K, mp_int a, mp_small value, mp_int c)
 {
   mpz_t     vtmp;
   mp_digit  vbuf[MP_VALUE_DIGITS(value)];
 
   s_fake(&vtmp, value, vbuf);
 
-  return mp_int_add(a, &vtmp, c);
+  return mp_int_add(K, a, &vtmp, c);
 }
 
 /* }}} */
 
 /* {{{ mp_int_sub(a, b, c) */
 
-mp_result mp_int_sub(mp_int a, mp_int b, mp_int c)
+mp_result mp_int_sub(klisp_State *K, mp_int a, mp_int b, mp_int c)
 {
   mp_size  ua, ub, uc, max;
 
@@ -678,14 +678,14 @@ mp_result mp_int_sub(mp_int a, mp_int b, mp_int c)
     /* Different signs -- add magnitudes and keep sign of a */
     mp_digit carry;
 
-    if(!s_pad(KK, c, max))
+    if(!s_pad(K, c, max))
       return MP_MEMORY;
 
     carry = s_uadd(MP_DIGITS(a), MP_DIGITS(b), MP_DIGITS(c), ua, ub);
     uc = max;
 
     if(carry) {
-      if(!s_pad(KK, c, max + 1))
+      if(!s_pad(K, c, max + 1))
 	return MP_MEMORY;
 
       c->digits[max] = carry;
@@ -702,7 +702,7 @@ mp_result mp_int_sub(mp_int a, mp_int b, mp_int c)
     mp_sign osign;
     int     cmp = s_ucmp(a, b);
 
-    if(!s_pad(KK, c, max))
+    if(!s_pad(K, c, max))
       return MP_MEMORY;
 
     if(cmp >= 0) {
@@ -729,14 +729,14 @@ mp_result mp_int_sub(mp_int a, mp_int b, mp_int c)
 
 /* {{{ mp_int_sub_value(a, value, c) */
 
-mp_result mp_int_sub_value(mp_int a, mp_small value, mp_int c)
+mp_result mp_int_sub_value(klisp_State *K, mp_int a, mp_small value, mp_int c)
 {
   mpz_t     vtmp;
   mp_digit  vbuf[MP_VALUE_DIGITS(value)];
 
   s_fake(&vtmp, value, vbuf);
 
-  return mp_int_sub(a, &vtmp, c);
+  return mp_int_sub(K, a, &vtmp, c);
 }
 
 /* }}} */
@@ -1007,7 +1007,7 @@ mp_result mp_int_mod(mp_int a, mp_int m, mp_int c)
     goto CLEANUP;
 
   if(CMPZ(out) < 0)
-    res = mp_int_add(out, m, c);
+    res = mp_int_add(KK, out, m, c);
   else
     res = mp_int_copy(KK, out, c);
 
@@ -1425,7 +1425,7 @@ mp_result mp_int_invmod(mp_int a, mp_int m, mp_int c)
      the value is okay as it stands.
    */
   if(sa == MP_NEG)
-    res = mp_int_sub(m, TEMP(1), c);
+    res = mp_int_sub(KK, m, TEMP(1), c);
   else
     res = mp_int_copy(KK, TEMP(1), c);
 
@@ -1495,7 +1495,7 @@ mp_result mp_int_gcd(mp_int a, mp_int b, mp_int c)
 	goto CLEANUP;
     }
 
-    if((res = mp_int_sub(&u, &v, &t)) != MP_OK)
+    if((res = mp_int_sub(KK, &u, &v, &t)) != MP_OK)
       goto CLEANUP;
 
     if(CMPZ(&t) == 0)
@@ -1576,9 +1576,9 @@ mp_result mp_int_egcd(mp_int a, mp_int b, mp_int c,
       s_qdiv(TEMP(4), 1);
       
       if(mp_int_is_odd(TEMP(0)) || mp_int_is_odd(TEMP(1))) {
-	if((res = mp_int_add(TEMP(0), TEMP(7), TEMP(0))) != MP_OK) 
+	if((res = mp_int_add(KK, TEMP(0), TEMP(7), TEMP(0))) != MP_OK) 
 	  goto CLEANUP;
-	if((res = mp_int_sub(TEMP(1), TEMP(6), TEMP(1))) != MP_OK) 
+	if((res = mp_int_sub(KK, TEMP(1), TEMP(6), TEMP(1))) != MP_OK) 
 	  goto CLEANUP;
       }
 
@@ -1590,9 +1590,9 @@ mp_result mp_int_egcd(mp_int a, mp_int b, mp_int c,
       s_qdiv(TEMP(5), 1);
 
       if(mp_int_is_odd(TEMP(2)) || mp_int_is_odd(TEMP(3))) {
-	if((res = mp_int_add(TEMP(2), TEMP(7), TEMP(2))) != MP_OK) 
+	if((res = mp_int_add(KK, TEMP(2), TEMP(7), TEMP(2))) != MP_OK) 
 	  goto CLEANUP;
-	if((res = mp_int_sub(TEMP(3), TEMP(6), TEMP(3))) != MP_OK) 
+	if((res = mp_int_sub(KK, TEMP(3), TEMP(6), TEMP(3))) != MP_OK) 
 	  goto CLEANUP;
       }
 
@@ -1601,14 +1601,14 @@ mp_result mp_int_egcd(mp_int a, mp_int b, mp_int c,
     }
 
     if(mp_int_compare(TEMP(4), TEMP(5)) >= 0) {
-      if((res = mp_int_sub(TEMP(4), TEMP(5), TEMP(4))) != MP_OK) goto CLEANUP;
-      if((res = mp_int_sub(TEMP(0), TEMP(2), TEMP(0))) != MP_OK) goto CLEANUP;
-      if((res = mp_int_sub(TEMP(1), TEMP(3), TEMP(1))) != MP_OK) goto CLEANUP;
+      if((res = mp_int_sub(KK, TEMP(4), TEMP(5), TEMP(4))) != MP_OK) goto CLEANUP;
+      if((res = mp_int_sub(KK, TEMP(0), TEMP(2), TEMP(0))) != MP_OK) goto CLEANUP;
+      if((res = mp_int_sub(KK, TEMP(1), TEMP(3), TEMP(1))) != MP_OK) goto CLEANUP;
     } 
     else {
-      if((res = mp_int_sub(TEMP(5), TEMP(4), TEMP(5))) != MP_OK) goto CLEANUP;
-      if((res = mp_int_sub(TEMP(2), TEMP(0), TEMP(2))) != MP_OK) goto CLEANUP;
-      if((res = mp_int_sub(TEMP(3), TEMP(1), TEMP(3))) != MP_OK) goto CLEANUP;
+      if((res = mp_int_sub(KK, TEMP(5), TEMP(4), TEMP(5))) != MP_OK) goto CLEANUP;
+      if((res = mp_int_sub(KK, TEMP(2), TEMP(0), TEMP(2))) != MP_OK) goto CLEANUP;
+      if((res = mp_int_sub(KK, TEMP(3), TEMP(1), TEMP(3))) != MP_OK) goto CLEANUP;
     }
 
     if(CMPZ(TEMP(4)) == 0) {
@@ -1736,7 +1736,7 @@ mp_result mp_int_root(mp_int a, mp_small b, mp_int c)
     if(mp_int_compare_unsigned(TEMP(2), TEMP(0)) <= 0)
       break;
 
-    if((res = mp_int_sub(TEMP(2), TEMP(0), TEMP(2))) != MP_OK)
+    if((res = mp_int_sub(KK, TEMP(2), TEMP(0), TEMP(2))) != MP_OK)
       goto CLEANUP;
     if((res = mp_int_expt(TEMP(1), b - 1, TEMP(3))) != MP_OK)
       goto CLEANUP;
@@ -1744,11 +1744,11 @@ mp_result mp_int_root(mp_int a, mp_small b, mp_int c)
       goto CLEANUP;
     if((res = mp_int_div(TEMP(2), TEMP(3), TEMP(4), NULL)) != MP_OK)
       goto CLEANUP;
-    if((res = mp_int_sub(TEMP(1), TEMP(4), TEMP(4))) != MP_OK)
+    if((res = mp_int_sub(KK, TEMP(1), TEMP(4), TEMP(4))) != MP_OK)
       goto CLEANUP;
 
     if(mp_int_compare_unsigned(TEMP(1), TEMP(4)) == 0) {
-      if((res = mp_int_sub_value(TEMP(4), 1, TEMP(4))) != MP_OK)
+      if((res = mp_int_sub_value(KK, TEMP(4), 1, TEMP(4))) != MP_OK)
 	goto CLEANUP;
     }
     if((res = mp_int_copy(KK, TEMP(4), TEMP(1))) != MP_OK)
@@ -3058,7 +3058,7 @@ STATIC int       s_reduce(mp_int x, mp_int m, mp_int mu, mp_int q1, mp_int q2)
    */
   UMUL(q2, m, q1);
   s_qmod(q1, umb_p1);
-  (void) mp_int_sub(x, q1, x); /* can't fail */
+  (void) mp_int_sub(KK, x, q1, x); /* can't fail */
 
   /* The result may be < 0; if it is, add b^(k+1) to pin it in the
      proper range. */
@@ -3068,9 +3068,9 @@ STATIC int       s_reduce(mp_int x, mp_int m, mp_int mu, mp_int q1, mp_int q2)
   /* If x > m, we need to back it off until it is in range.
      This will be required at most twice.  */
   if(mp_int_compare(x, m) >= 0) {
-    (void) mp_int_sub(x, m, x);
+    (void) mp_int_sub(KK, x, m, x);
     if(mp_int_compare(x, m) >= 0)
-      (void) mp_int_sub(x, m, x);
+      (void) mp_int_sub(KK, x, m, x);
   }
 
   /* At this point, x has been properly reduced. */
@@ -3221,7 +3221,7 @@ STATIC mp_result s_udiv(mp_int a, mp_int b)
       t.used = ub + 1; CLAMP(&t);
       while(s_ucmp(&t, &r) > 0) {
 	--qdigit;
-	(void) mp_int_sub(&t, b, &t); /* cannot fail */
+	(void) mp_int_sub(KK, &t, b, &t); /* cannot fail */
       }
       
       s_usub(r.digits, t.digits, r.digits, r.used, t.used);
diff --git a/src/imath.h b/src/imath.h
@@ -139,6 +139,7 @@ extern const mp_sign   MP_ZPOS;
 #define mp_int_is_odd(Z)  ((Z)->digits[0] & 1)
 #define mp_int_is_even(Z) !((Z)->digits[0] & 1)
 
+/* NOTE: this doesn't use the allocator */
 mp_result mp_int_init(mp_int z);
 mp_int    mp_int_alloc(klisp_State *K);
 mp_result mp_int_init_size(klisp_State *K, mp_int z, mp_size prec);
@@ -149,14 +150,20 @@ void      mp_int_clear(klisp_State *K, mp_int z);
 void      mp_int_free(klisp_State *K, mp_int z);
 
 mp_result mp_int_copy(klisp_State *K, mp_int a, mp_int c); /* c = a */
+/* NOTE: this doesn't use the allocator */
 void      mp_int_swap(mp_int a, mp_int c);           /* swap a, c */
-void      mp_int_zero(mp_int z);                     /* z = 0 */
+/* NOTE: this doesn't use the allocator */
+void      mp_int_zero(mp_int z);     /* z = 0 */
 mp_result mp_int_abs(klisp_State *K, mp_int a, mp_int c); /* c = |a| */
 mp_result mp_int_neg(klisp_State *K, mp_int a, mp_int c); /* c = -a  */
-mp_result mp_int_add(mp_int a, mp_int b, mp_int c);  /* c = a + b */
-mp_result mp_int_add_value(mp_int a, mp_small value, mp_int c);
-mp_result mp_int_sub(mp_int a, mp_int b, mp_int c);  /* c = a - b */
-mp_result mp_int_sub_value(mp_int a, mp_small value, mp_int c);
+/* c = a + b */
+mp_result mp_int_add(klisp_State *K, mp_int a, mp_int b, mp_int c);  
+mp_result mp_int_add_value(klisp_State *K, mp_int a, mp_small value, 
+			   mp_int c);
+/* c = a - b */
+mp_result mp_int_sub(klisp_State *K, mp_int a, mp_int b, mp_int c);  
+mp_result mp_int_sub_value(klisp_State *K, mp_int a, mp_small value, 
+			   mp_int c);
 mp_result mp_int_mul(mp_int a, mp_int b, mp_int c);  /* c = a * b */
 mp_result mp_int_mul_value(mp_int a, mp_small value, mp_int c);
 mp_result mp_int_mul_pow2(mp_int a, mp_small p2, mp_int c);
diff --git a/src/kinteger.c b/src/kinteger.c
@@ -55,10 +55,9 @@ TValue kbigint_copy(klisp_State *K, TValue src)
 void kbigint_add_digit(klisp_State *K, TValue tv_bigint, int32_t base, 
 		       int32_t digit)
 {
-    UNUSED(K);
     Bigint *bigint = tv2bigint(tv_bigint);
     UNUSED(mp_int_mul_value(bigint, base, bigint));
-    UNUSED(mp_int_add_value(bigint, digit, bigint));
+    UNUSED(mp_int_add_value(K, bigint, digit, bigint));
 }
 
 /* This is used by the writer to get the digits of a number