X-Git-Url: https://git.distorted.org.uk/u/mdw/catacomb/blobdiff_plain/4108c8d21f2dff8c2666fdeebc5a76b449e2808c..5278d9afdf1aff9fd6f64073ea42395d756ee58c:/pgen.c diff --git a/pgen.c b/pgen.c index e569647..1a2a8ac 100644 --- a/pgen.c +++ b/pgen.c @@ -7,7 +7,7 @@ * (c) 1999 Straylight/Edgeware */ -/*----- Licensing notice --------------------------------------------------* +/*----- Licensing notice --------------------------------------------------* * * This file is part of Catacomb. * @@ -15,12 +15,12 @@ * it under the terms of the GNU Library General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. - * + * * Catacomb is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. - * + * * You should have received a copy of the GNU Library General Public * License along with Catacomb; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, @@ -49,7 +49,7 @@ int pgen_filter(int rq, pgen_event *ev, void *p) { pgen_filterctx *f = p; - int rc = PGEN_ABORT; + int rc = PGEN_FAIL; switch (rq) { case PGEN_BEGIN: @@ -58,16 +58,17 @@ int pgen_filter(int rq, pgen_event *ev, void *p) break; case PGEN_TRY: mp_drop(ev->m); - if (!((f->step | f->f.m->v[0]) & 1)) - rc = pfilt_step(&f->f, 1); - else - rc = pfilt_step(&f->f, f->step); break; case PGEN_DONE: pfilt_destroy(&f->f); return (PGEN_DONE); + default: + rc = PGEN_ABORT; + break; } - + + if (rc == PGEN_FAIL && !((f->step | f->f.m->v[0]) & 1)) + rc = pfilt_step(&f->f, 1); while (rc == PGEN_FAIL) rc = pfilt_step(&f->f, f->step); ev->m = MP_COPY(f->f.m); @@ -105,7 +106,7 @@ int pgen_jump(int rq, pgen_event *ev, void *p) pfilt_destroy(&f->f); return (PGEN_DONE); } - + while (rc == PGEN_FAIL) rc = pfilt_jump(&f->f, f->j); ev->m = MP_COPY(f->f.m); @@ -287,7 +288,7 @@ mp *pgen(const char *name, mp *d, mp *m, pgen_proc *event, void *ectx, if (p == P_TEST) act |= A_ENDTEST; } - } + } /* --- Close down tester and stepper functions --- */ @@ -350,6 +351,31 @@ int pgen_primep(mp *p, grand *gr) #include +static int t_primep(dstr *v) +{ + mp *m = *(mp **)v[0].buf; + int e = *(int *)v[1].buf; + int r; + grand *rng; + int ok = 1; + + rng = fibrand_create(0); + r = pgen_primep(m, rng); + GR_DESTROY(rng); + if (e != r) { + fputs("\n*** primep failed", stderr); + fputs("\nm = ", stderr); mp_writefile(m, stderr, 10); + fprintf(stderr, "\nexpected %d", e); + fprintf(stderr, "\nreported %d", r); + fputc('\n', stderr); + ok = 0; + } + + mp_drop(m); + assert(mparena_count(MPARENA_GLOBAL) == 0); + return (ok); +} + static int verify(dstr *v) { mp *m = *(mp **)v[0].buf; @@ -381,6 +407,7 @@ static int verify(dstr *v) static test_chunk tests[] = { { "pgen", verify, { &type_mp, &type_mp, 0 } }, + { "primep", t_primep, { &type_mp, &type_int, 0 } }, { 0, 0, { 0 } } };