diff --git a/src/modules/Gmp/mpz_glue.c b/src/modules/Gmp/mpz_glue.c index 116835f98fd42910bccbdfcd23e18f0a8d071c3b..5340740494ea53a6783961a9b99dcaa77ee8c8d9 100644 --- a/src/modules/Gmp/mpz_glue.c +++ b/src/modules/Gmp/mpz_glue.c @@ -4,7 +4,7 @@ ||| See the files COPYING and DISCLAIMER for more information. \*/ #include "global.h" -RCSID("$Id: mpz_glue.c,v 1.25 1998/01/26 20:01:17 hubbe Exp $"); +RCSID("$Id: mpz_glue.c,v 1.26 1998/01/30 12:39:52 mirar Exp $"); #include "gmp_machine.h" #if !defined(HAVE_LIBGMP) @@ -166,10 +166,16 @@ static struct pike_string *low_get_digits(MP_INT *mpz, int base) else if (base == 256) { INT32 i; +#if 0 mpz_t tmp; +#endif + mp_limb_t *src; + unsigned char *dst; + if (mpz_sgn(mpz) < 0) error("only non-negative numbers can be converted to base 256.\n"); +#if 0 len = (mpz_sizeinbase(mpz, 2) + 7) / 8; s = begin_shared_string(len); mpz_init_set(tmp, mpz); @@ -180,6 +186,23 @@ static struct pike_string *low_get_digits(MP_INT *mpz, int base) mpz_fdiv_q_2exp(tmp, tmp, 8); } mpz_clear(tmp); +#endif + + /* lets optimize this /Mirar & Per */ + + len = mpz->_mp_size*sizeof(mp_limb_t); + s = begin_shared_string(len); + + src=mpz->_mp_d; + dst=s->str+s->len; + while (len) + { + mp_limb_t x=*(src++); + for (i=0; i<sizeof(mp_limb_t); i++) + *(--dst)=x&0xff,x>>=8; + len-=sizeof(mp_limb_t); + } + s = end_shared_string(s); } else