X-Git-Url: https://git.distorted.org.uk/~mdw/catacomb-perl/blobdiff_plain/f9952aec1cf6c64a5681308eea817b6113a37433..fcd15e0b7a3d0f0ca2f30953573f8d1f6b8e8bd2:/pgen.xs diff --git a/pgen.xs b/pgen.xs index 5da3c69..dd413a6 100644 --- 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