+int pgen_jump(int rq, pgen_event *ev, void *p)
+{
+ pgen_jumpctx *f = p;
+ int rc = PGEN_ABORT;
+
+ switch (rq) {
+ case PGEN_BEGIN: {
+ mp *g = MP_NEW;
+ mp_gcd(&g, 0, 0, ev->m, f->j->m);
+ if (MP_CMP(g, >, MP_ONE)) {
+ mp_drop(g);
+ return (PGEN_ABORT);
+ }
+ mp_drop(g);
+ rc = pfilt_create(&f->f, ev->m);
+ mp_drop(ev->m);
+ } break;
+ case PGEN_TRY:
+ mp_drop(ev->m);
+ rc = pfilt_jump(&f->f, f->j);
+ break;
+ case PGEN_DONE:
+ 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);
+ return (rc);
+}
+
+/*----- Standard prime test -----------------------------------------------*/
+
+/* --- @pgen_test@ --- */
+
+int pgen_test(int rq, pgen_event *ev, void *p)