-----BEGIN PGP SIGNED MESSAGE-----
Moin,
here is the final version:
void
_modinv(class,x,y)
SV* class
mpz_t* x
mpz_t* y
PREINIT:
int rc, sign;
SV* s;
mpz_t* RETVAL;
PPCODE:
NEW_GMP_MPZ_T_INIT;
rc = mpz_invert(*RETVAL, *x, *y);
EXTEND(SP, 2); /* we return two values */
if (rc == 0)
{
/* inverse doesn't exist, return value undefined */
PUSHs ( &PL_sv_undef );
PUSHs ( &PL_sv_undef );
}
else
{
/* inverse exists, get sign */
sign = mpz_sgn (*RETVAL);
/* absolute result */
mpz_abs (*RETVAL, *x);
PUSHs(sv_setref_pv(sv_newmortal(), "Math::BigInt::GMP", (void*)RETVAL));
if (sign >= 0)
{
PUSHs ( &PL_sv_undef ); /* result is ok, keep it */
}
else
{
s = sv_newmortal();
sv_setpvn (s, "+", 1);
PUSHs ( s ); /* result must be negated */
}
}
That works now! Thank you! (indeed, you need to create two mpz_t objects,
otherwise a double free occurs).
Cheers,
Tels
- --
Signed on Sun Jan 11 13:42:39 2004 with key 0x93B84C15.
Visit my photo gallery at http://bloodgate.com/photos/
PGP key on http://bloodgate.com/tels.asc or per email.
"Remember: If the game let's you do it, it's not cheating." -- Xarax
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.2-rc1-SuSE (GNU/Linux)
Comment: When cryptography is outlawed, bayl bhgynjf jvyy unir cevinpl.
iQEVAwUBQAFFCHcLPEOTuEwVAQESLgf+M4TafW48DIF9xo1fWmv3Qs9oK4kbn4EV
tdwAlpaF0vvXNQs4yk+X9r0Pxr/DYdFiPD5B/Q/1PyfnYflf7ybg04KNpdP2VwFI
5wou2Ycj4zEAHzdVsxA3iyr6jhckhJnOUkjfaCXbzU8+5fbj9aZmQMaOofAPrewL
7uCWbvfkIYrJ08XFC9tmI4sFxF1FUtfI+n4c7nEg3rO8/RP0yf4wPJUEHaw+mXvq
4ECwFZKkVQZTYkpMSUqhQx1ucSkiME1g5jqfZipnVqrD2fFluqn/y38Cybdnhtql
noZzGO9H3lqDJkFEA72Tpd2G7DoSyCt30X7XGPnOG0ypuVDtXT8TAA==
=qeEN
-----END PGP SIGNATURE-----