diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2011-12-10 20:41:06 -0800 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2011-12-10 20:41:06 -0800 |
commit | 858859cf6fd6becef038cf4d9c1e650c3f2a9cc6 (patch) | |
tree | 081517aa9628b45d86e7fb1e139e3da996bdc89b /mpi-patches/add-mp-set-intptr | |
parent | c940739b8f863f3331f00b36c23ad1526ab1147e (diff) | |
download | txr-858859cf6fd6becef038cf4d9c1e650c3f2a9cc6.tar.gz txr-858859cf6fd6becef038cf4d9c1e650c3f2a9cc6.tar.bz2 txr-858859cf6fd6becef038cf4d9c1e650c3f2a9cc6.zip |
Bignum support in mult function.
* arith.c: Regenerated.
* arith.txr (CNUM_BIT): New constant.
(bignum, bignum_dbl_ipt): New static functions.
(@{add-fname}): Use bignum function.
(mul): New functions, rewrite of mul from lib.c.
* lib.c (mul): Function removed.
* mpi-patches/add-mp-set-intptr (mp_set_intptr): Revised patch.
Local variable v should be int_ptr_t not unsigned long.
Also, the mp_set interface doesn't set the sign; it's an unsigned
interface. We must do that ourselves.
* mpi-patches/fix-mult-bug: The main multiplication function is
also broken in the same way, requiring the cast.
* mpi-patches/mpi-set-double-intptr: Fixed use of wrong type for
local variable v.
Diffstat (limited to 'mpi-patches/add-mp-set-intptr')
-rw-r--r-- | mpi-patches/add-mp-set-intptr | 22 |
1 files changed, 11 insertions, 11 deletions
diff --git a/mpi-patches/add-mp-set-intptr b/mpi-patches/add-mp-set-intptr index a5d50a33..87e4ebb4 100644 --- a/mpi-patches/add-mp-set-intptr +++ b/mpi-patches/add-mp-set-intptr @@ -1,16 +1,17 @@ Index: mpi-1.8.6/mpi.c =================================================================== ---- mpi-1.8.6.orig/mpi.c 2011-12-09 13:52:26.000000000 -0800 -+++ mpi-1.8.6/mpi.c 2011-12-09 13:56:19.000000000 -0800 +--- mpi-1.8.6.orig/mpi.c 2011-12-10 18:20:55.000000000 -0800 ++++ mpi-1.8.6/mpi.c 2011-12-10 19:40:53.000000000 -0800 @@ -528,6 +528,59 @@ /* }}} */ +mp_err mp_set_intptr(mp_int *mp, int_ptr_t z) +{ ++ int_ptr_t v = z > 0 ? z : -z; ++ + if (sizeof z > sizeof (mp_digit)) { + int ix, shift; -+ unsigned long v = z > 0 ? z : -z; + const int nd = (sizeof v + sizeof (mp_digit) - 1) / sizeof (mp_digit); + + ARGCHK(mp != NULL, MP_BADARG); @@ -28,14 +29,13 @@ Index: mpi-1.8.6/mpi.c + { + DIGIT(mp, ix) = (v >> shift) & MP_DIGIT_MAX; + } -+ -+ if(z < 0) -+ SIGN(mp) = MP_NEG; -+ -+ return MP_OKAY; ++ } else { ++ mp_set(mp, v); + } + -+ mp_set(mp, z); ++ if(z < 0) ++ SIGN(mp) = MP_NEG; ++ + return MP_OKAY; +} + @@ -64,8 +64,8 @@ Index: mpi-1.8.6/mpi.c Index: mpi-1.8.6/mpi.h =================================================================== ---- mpi-1.8.6.orig/mpi.h 2011-12-09 13:49:20.000000000 -0800 -+++ mpi-1.8.6/mpi.h 2011-12-09 13:56:19.000000000 -0800 +--- mpi-1.8.6.orig/mpi.h 2011-12-10 18:19:39.000000000 -0800 ++++ mpi-1.8.6/mpi.h 2011-12-10 19:39:58.000000000 -0800 @@ -94,6 +94,8 @@ void mp_zero(mp_int *mp); void mp_set(mp_int *mp, mp_digit d); |