Much wider support for Catacomb in all its glory.
[catacomb-perl] / pgen.xs
diff --git a/pgen.xs b/pgen.xs
index 5da3c69..dd413a6 100644 (file)
--- a/pgen.xs
+++ b/pgen.xs
@@ -1,6 +1,6 @@
 # -*-fundamental-*-
 #
-# $Id: pgen.xs,v 1.2 2004/04/08 01:36:21 mdw Exp $
+# $Id$
 #
 # Prime generation gubbins
 #
@@ -60,9 +60,9 @@ muladd(pf, m, a)
        U32 a
        CODE:
        if (m > MPW_MAX)
-         croak("multiplier too large in Catacomb::MP::Prime::Filter::muladd");
+         croak("multiplier too large");
        if (a > MPW_MAX)
-         croak("step too large in Catacomb::MP::Prime::Filter::muladd");
+         croak("step too large");
        RETVAL = CREATE(MP_Prime_Filter);
        RETVAL->rc = pfilt_muladd(&RETVAL->pf, &pf->pf, m, a);
        OUTPUT:
@@ -74,7 +74,7 @@ step(pf, n)
        U32 n
        CODE:
        if (n > MPW_MAX)
-         croak("step too large in Catacomb::MP::Prime::Filter::step");
+         croak("step too large");
        RETVAL = pf->rc = pfilt_step(&pf->pf, n);
        OUTPUT:
        RETVAL
@@ -128,12 +128,11 @@ new(me, x)
        SV *me
        mp *x
        CODE:
-       if (x->f & MP_NEG)
-         croak("Argument to Catacomb::MP::Prime::Rabin must be positive");
-       if (x->v == x->vl || !(x->v[0] & 1u))
-         croak("Argument to Catacomb::MP::Prime::Rabin must be odd");
        RETVAL = CREATE(MP_Prime_Rabin);
-       rabin_create(RETVAL, x);
+       if (rabin_create(RETVAL, x)) {
+         DESTROY(RETVAL);
+         RETVAL = 0;
+       }
        OUTPUT:
        RETVAL
 
@@ -150,6 +149,14 @@ rabin_test(r, g)
        MP_Prime_Rabin *r
        mp *g
 
+mp *
+m(r)
+       MP_Prime_Rabin *r
+       CODE:
+       RETVAL = MP_COPY(r->mm.m);
+       OUTPUT:
+       RETVAL
+
 int
 rabin_iters(r)
        MP_Prime_Rabin *r
@@ -157,7 +164,8 @@ rabin_iters(r)
        mp_bits(r->mm.m)
 
 int
-ntests(bits)
+ntests(me, bits)
+       SV *me
        int bits
        CODE:
        RETVAL = rabin_iters(bits);
@@ -243,10 +251,26 @@ subev(me)
        OUTPUT:
        RETVAL
 
+int
+PG_BEGIN(me, ev)
+       SV *me
+       MP_Prime_Gen_Event *ev
+       ALIAS:
+       PG_TRY = 0
+       PG_PASS = 1
+       PG_FAIL = 2
+       PG_ABORT = 3
+       PG_DONE = 4
+       CODE:
+       RETVAL = 0;
+       OUTPUT:
+       RETVAL
+
 MODULE = Catacomb PACKAGE = Catacomb::MP::Prime
 
 mp *
-gen(name, m, steps, stepper, tests, tester, events = &PL_sv_undef)
+gen(me, name, m, steps, stepper, tests, tester, events = &PL_sv_undef)
+       SV *me
        char *name
        mp *m
        MP_Prime_Gen_NullProc *events
@@ -267,7 +291,8 @@ gen(name, m, steps, stepper, tests, tester, events = &PL_sv_undef)
        RETVAL
 
 void
-strongprime_setup(name, bits, r = &rand_global, n = 0, events = &PL_sv_undef)
+strongprime_setup(me, name, bits, r = &rand_global, n = 0, events = &PL_sv_undef)
+       SV *me
        char *name
        unsigned bits
        grand *r
@@ -283,11 +308,9 @@ strongprime_setup(name, bits, r = &rand_global, n = 0, events = &PL_sv_undef)
        j = CREATE(MP_Prime_Gen_JumpStepper);
        d = strongprime_setup(name, MP_NEW, &j->pf, bits, r, n, ev, ectx);
        EXTEND(SP, 2);
-       if (!d) {
+       if (!d)
          DESTROY(j);
-         PUSHs(&PL_sv_undef);
-         PUSHs(&PL_sv_undef);
-       } else {
+       else {
          j->j.j = &j->pf;
          j->mg.p = pgen_jump;
          j->mg.ctx = &j->j;
@@ -296,7 +319,8 @@ strongprime_setup(name, bits, r = &rand_global, n = 0, events = &PL_sv_undef)
        }
 
 void
-limlee(name, qbits, pbits, r = &rand_global, on = 0, oevents = &PL_sv_undef, ievents = &PL_sv_undef)
+limlee(me, name, qbits, pbits, r = &rand_global, on = 0, oevents = &PL_sv_undef, ievents = &PL_sv_undef)
+       SV *me
        char *name
        unsigned qbits
        unsigned pbits
@@ -316,11 +340,13 @@ limlee(name, qbits, pbits, r = &rand_global, on = 0, oevents = &PL_sv_undef, iev
        if (GIMME_V == G_SCALAR) {
          x = limlee(name, MP_NEW, MP_NEW, qbits, pbits, r, on,
                     oev, oec, iev, iec, 0, 0);
+         if (!x) return;
          EXTEND(SP, 1);
          PUSHs(RET_MP(x));
        } else {
          x = limlee(name, MP_NEW, MP_NEW, qbits, pbits, r, on,
                     oev, oec, iev, iec, &nf, &f);
+         if (!x) return;
          EXTEND(SP, 1 + nf);
          PUSHs(RET_MP(x));
          for (i = 0; i < nf; i++)
@@ -339,18 +365,38 @@ name(ev)
        RETVAL
 
 mp *
-mp(ev, m = 0)
+m(ev, x = &PL_sv_undef)
        MP_Prime_Gen_Event *ev
-       mp *m
+       SV *x
+       PREINIT:
+       mp *y;
        CODE:
        RETVAL = mp_copy(ev->m);
-       if (items > 1) {
+       if (SvOK(x)) {
+         if ((y = mp_fromsv(x, "x", 0, 1)) == 0)
+           croak("bad integer");
          mp_drop(ev->m);
-         ev->m = mp_copy(m);
+         ev->m = y;
        }
        OUTPUT:
        RETVAL
 
+int
+steps(ev)
+       MP_Prime_Gen_Event *ev
+       CODE:
+       RETVAL = ev->steps;
+       OUTPUT:
+       RETVAL
+
+int
+tests(ev)
+       MP_Prime_Gen_Event *ev
+       CODE:
+       RETVAL = ev->tests;
+       OUTPUT:
+       RETVAL
+
 SV *
 rand(ev)
        MP_Prime_Gen_Event *ev