factorial: Fix usage message to fit in with conventions.
[u/mdw/catacomb] / pgen.c
diff --git a/pgen.c b/pgen.c
index e569647..d989a4c 100644 (file)
--- a/pgen.c
+++ b/pgen.c
@@ -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);
@@ -350,6 +351,31 @@ int pgen_primep(mp *p, grand *gr)
 
 #include <mLib/testrig.h>
 
+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 } }
 };