-----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-----

Reply via email to