*.c: Split the constant definitions into the various submodules.
[catacomb-python] / rand.c
diff --git a/rand.c b/rand.c
index 964a6a2..2f69336 100644 (file)
--- a/rand.c
+++ b/rand.c
@@ -33,10 +33,11 @@ PRIVATE_SYMBOLS;
 
 /*----- Main code ---------------------------------------------------------*/
 
-PyTypeObject *grand_pytype, *truerand_pytype;
-PyTypeObject *lcrand_pytype, *fibrand_pytype;
-PyTypeObject *dsarand_pytype, *bbs_pytype, *bbspriv_pytype;
-PyTypeObject *sslprf_pytype, *tlsdx_pytype, *tlsprf_pytype;
+PyTypeObject *grand_pytype;
+static PyTypeObject *truerand_pytype;
+static PyTypeObject *lcrand_pytype, *fibrand_pytype;
+static PyTypeObject *dsarand_pytype, *bbs_pytype, *bbspriv_pytype;
+static PyTypeObject *sslprf_pytype, *tlsdx_pytype, *tlsprf_pytype;
 PyObject *rand_pyobj;
 
 static PyObject *gccrands_dict;
@@ -79,16 +80,14 @@ end:
   return (-1);
 }
 
-static PyObject *grmeth_byte(PyObject *me, PyObject *arg)
+static PyObject *grmeth_byte(PyObject *me)
 {
-  if (!PyArg_ParseTuple(arg, ":byte")) return (0);
   if (grand_check(me)) return (0);
   return (PyInt_FromLong(grand_byte(GRAND_R(me))));
 }
 
-static PyObject *grmeth_word(PyObject *me, PyObject *arg)
+static PyObject *grmeth_word(PyObject *me)
 {
-  if (!PyArg_ParseTuple(arg, ":word")) return (0);
   if (grand_check(me)) return (0);
   return (getulong(grand_word(GRAND_R(me))));
 }
@@ -258,7 +257,7 @@ static PyObject *grget_name(PyObject *me, void *hunoz)
 static PyObject *grget_cryptop(PyObject *me, void *hunoz)
   { return (grand_check(me) ? 0 : getbool(GRAND_R(me)->ops->f & GRAND_CRYPTO)); }
 
-static PyGetSetDef grand_pygetset[] = {
+static const PyGetSetDef grand_pygetset[] = {
 #define GETSETNAME(op, name) gr##op##_##name
   GET  (name,          "R.name -> name of this kind of generator")
   GET  (cryptop,       "R.cryptop -> flag: cryptographically strong?")
@@ -266,10 +265,10 @@ static PyGetSetDef grand_pygetset[] = {
   { 0 }
 };
 
-static PyMethodDef grand_pymethods[] = {
+static const PyMethodDef grand_pymethods[] = {
 #define METHNAME(name) grmeth_##name
-  METH (byte,          "R.byte() -> BYTE")
-  METH (word,          "R.word() -> WORD")
+  NAMETH(byte,         "R.byte() -> BYTE")
+  NAMETH(word,         "R.word() -> WORD")
   METH (block,         "R.block(N) -> STRING")
   KWMETH(mp,           "R.mp(bits, [or = 0]) -> MP")
   METH (range,         "R.range(MAX) -> INT")
@@ -283,7 +282,7 @@ static PyMethodDef grand_pymethods[] = {
   { 0 }
 };
 
-static PyTypeObject grand_pytype_skel = {
+static const PyTypeObject grand_pytype_skel = {
   PyObject_HEAD_INIT(0) 0,             /* Header */
   "GRand",                             /* @tp_name@ */
   sizeof(grand_pyobj),                 /* @tp_basicsize@ */
@@ -308,7 +307,7 @@ static PyTypeObject grand_pytype_skel = {
     Py_TPFLAGS_BASETYPE,
 
   /* @tp_doc@ */
-"Generic random number source.",
+  "Generic random number source.",
 
   0,                                   /* @tp_traverse@ */
   0,                                   /* @tp_clear@ */
@@ -316,9 +315,9 @@ static PyTypeObject grand_pytype_skel = {
   0,                                   /* @tp_weaklistoffset@ */
   0,                                   /* @tp_iter@ */
   0,                                   /* @tp_iternext@ */
-  grand_pymethods,                     /* @tp_methods@ */
+  PYMETHODS(grand),                    /* @tp_methods@ */
   0,                                   /* @tp_members@ */
-  grand_pygetset,                      /* @tp_getset@ */
+  PYGETSET(grand),                     /* @tp_getset@ */
   0,                                   /* @tp_base@ */
   0,                                   /* @tp_dict@ */
   0,                                   /* @tp_descr_get@ */
@@ -340,7 +339,7 @@ static PyObject *lcrand_pynew(PyTypeObject *me, PyObject *arg, PyObject *kw)
   return (grand_dopywrap(lcrand_pytype, lcrand_create(n), f_freeme));
 }
 
-static PyTypeObject lcrand_pytype_skel = {
+static const PyTypeObject lcrand_pytype_skel = {
   PyObject_HEAD_INIT(0) 0,             /* Header */
   "LCRand",                            /* @tp_name@ */
   sizeof(grand_pyobj),                 /* @tp_basicsize@ */
@@ -365,7 +364,7 @@ static PyTypeObject lcrand_pytype_skel = {
     Py_TPFLAGS_BASETYPE,
 
   /* @tp_doc@ */
-"LCRand([seed = 0]): linear congruential generator.",
+  "LCRand([seed = 0]): linear congruential generator.",
 
   0,                                   /* @tp_traverse@ */
   0,                                   /* @tp_clear@ */
@@ -397,7 +396,7 @@ static PyObject *fibrand_pynew(PyTypeObject *me, PyObject *arg, PyObject *kw)
   return (grand_dopywrap(fibrand_pytype, fibrand_create(n), f_freeme));
 }
 
-static PyTypeObject fibrand_pytype_skel = {
+static const PyTypeObject fibrand_pytype_skel = {
   PyObject_HEAD_INIT(0) 0,             /* Header */
   "FibRand",                           /* @tp_name@ */
   sizeof(grand_pyobj),                 /* @tp_basicsize@ */
@@ -422,7 +421,7 @@ static PyTypeObject fibrand_pytype_skel = {
     Py_TPFLAGS_BASETYPE,
 
   /* @tp_doc@ */
-"FibRand([seed = 0]): Fibonacci generator.",
+  "FibRand([seed = 0]): Fibonacci generator.",
 
   0,                                   /* @tp_traverse@ */
   0,                                   /* @tp_clear@ */
@@ -447,21 +446,11 @@ static PyTypeObject fibrand_pytype_skel = {
 
 /*----- True random generator ---------------------------------------------*/
 
-static PyObject *trmeth_gate(PyObject *me, PyObject *arg)
-{
-  grand *r = GRAND_R(me);
-  if (!PyArg_ParseTuple(arg, ":gate")) return (0);
-  r->ops->misc(r, RAND_GATE);
-  RETURN_ME;
-}
+static PyObject *trmeth_gate(PyObject *me)
+  { grand *r = GRAND_R(me); r->ops->misc(GRAND_R(me), RAND_GATE); RETURN_ME; }
 
-static PyObject *trmeth_stretch(PyObject *me, PyObject *arg)
-{
-  grand *r = GRAND_R(me);
-  if (!PyArg_ParseTuple(arg, ":stretch")) return (0);
-  r->ops->misc(r, RAND_STRETCH);
-  RETURN_ME;
-}
+static PyObject *trmeth_stretch(PyObject *me)
+  { grand *r = GRAND_R(me); r->ops->misc(r, RAND_STRETCH); RETURN_ME; }
 
 static PyObject *trmeth_add(PyObject *me, PyObject *arg)
 {
@@ -494,13 +483,8 @@ end:
   return (0);
 }
 
-static PyObject *trmeth_timer(PyObject *me, PyObject *arg)
-{
-  grand *r = GRAND_R(me);
-  if (!PyArg_ParseTuple(arg, ":timer")) return (0);
-  r->ops->misc(r, RAND_TIMER);
-  RETURN_ME;
-}
+static PyObject *trmeth_timer(PyObject *me)
+  { grand *r = GRAND_R(me); r->ops->misc(r, RAND_TIMER); RETURN_ME; }
 
 static PyObject *truerand_pynew(PyTypeObject *ty,
                                PyObject *arg, PyObject *kw)
@@ -508,7 +492,7 @@ static PyObject *truerand_pynew(PyTypeObject *ty,
   static const char *const kwlist[] = { 0 };
   grand *r;
   PyObject *rc = 0;
-  if (PyArg_ParseTupleAndKeywords(arg, kw, ":new", KWLIST)) goto end;
+  if (!PyArg_ParseTupleAndKeywords(arg, kw, ":new", KWLIST)) goto end;
   r = rand_create();
   r->ops->misc(r, RAND_NOISESRC, &noise_source);
   r->ops->misc(r, RAND_SEED, 160);
@@ -517,14 +501,14 @@ end:
   return (rc);
 }
 
-static PyMethodDef truerand_pymethods[] = {
+static const PyMethodDef truerand_pymethods[] = {
 #define METHNAME(name) trmeth_##name
-  METH (gate,          "R.gate()")
-  METH (stretch,       "R.stretch()")
+  NAMETH(gate,         "R.gate()")
+  NAMETH(stretch,      "R.stretch()")
   METH (key,           "R.key(BYTES)")
   METH (seed,          "R.seed(NBITS)")
   METH (add,           "R.add(BYTES, GOODBITS")
-  METH (timer,         "R.timer()")
+  NAMETH(timer,                "R.timer()")
 #undef METHNAME
   { 0 }
 };
@@ -535,14 +519,14 @@ static PyObject *trget_goodbits(PyObject *me, void *hunoz)
   return (PyInt_FromLong(r->ops->misc(r, RAND_GOODBITS)));
 }
 
-static PyGetSetDef truerand_pygetset[] = {
+static const PyGetSetDef truerand_pygetset[] = {
 #define GETSETNAME(op, name) tr##op##_##name
   GET  (goodbits,      "R.goodbits -> good bits of entropy remaining")
 #undef GETSETNAME
   { 0 }
 };
 
-static PyTypeObject truerand_pytype_skel = {
+static const PyTypeObject truerand_pytype_skel = {
   PyObject_HEAD_INIT(0) 0,             /* Header */
   "TrueRand",                          /* @tp_name@ */
   sizeof(grand_pyobj),                 /* @tp_basicsize@ */
@@ -567,7 +551,7 @@ static PyTypeObject truerand_pytype_skel = {
     Py_TPFLAGS_BASETYPE,
 
   /* @tp_doc@ */
-"TrueRand(): true random number source.",
+  "TrueRand(): true random number source.",
 
   0,                                   /* @tp_traverse@ */
   0,                                   /* @tp_clear@ */
@@ -575,9 +559,9 @@ static PyTypeObject truerand_pytype_skel = {
   0,                                   /* @tp_weaklistoffset@ */
   0,                                   /* @tp_iter@ */
   0,                                   /* @tp_iternext@ */
-  truerand_pymethods,                  /* @tp_methods@ */
+  PYMETHODS(truerand),                 /* @tp_methods@ */
   0,                                   /* @tp_members@ */
-  truerand_pygetset,                   /* @tp_getset@ */
+  PYGETSET(truerand),                  /* @tp_getset@ */
   0,                                   /* @tp_base@ */
   0,                                   /* @tp_dict@ */
   0,                                   /* @tp_descr_get@ */
@@ -753,13 +737,12 @@ static PyObject *gccrget_name(PyObject *me, void *hunoz)
 static PyObject *gccrget_keysz(PyObject *me, void *hunoz)
   { return (keysz_pywrap(GCCRAND_INFO(me)->keysz)); }
 
-static PyObject *gclrmeth_tell(PyObject *me, PyObject *arg)
+static PyObject *gclrmeth_tell(PyObject *me)
 {
   grand *r = GRAND_R(me);
   PyObject *rc = 0;
   kludge64 off;
 
-  if (!PyArg_ParseTuple(arg, ":tell")) return (0);
   r->ops->misc(r, SALSA20_TELLU64, &off);
   rc = getk64(off);
   return (rc);
@@ -775,23 +758,23 @@ static PyObject *gclrmeth_seek(PyObject *me, PyObject *arg)
   RETURN_ME;
 }
 
-static PyGetSetDef gccrand_pygetset[] = {
+static const PyGetSetDef gccrand_pygetset[] = {
 #define GETSETNAME(op, name) gccr##op##_##name
-  GET  (keysz,                 "CR.keysz -> acceptable key sizes")
-  GET  (name,                  "CR.name -> name of this kind of generator")
+  GET  (keysz,         "CR.keysz -> acceptable key sizes")
+  GET  (name,          "CR.name -> name of this kind of generator")
 #undef GETSETNAME
   { 0 }
 };
 
-static PyMethodDef gclatinrand_pymethods[] = {
+static const PyMethodDef gclatinrand_pymethods[] = {
 #define METHNAME(name) gclrmeth_##name
-  METH (tell,          "R.tell() -> OFF")
+  NAMETH(tell,         "R.tell() -> OFF")
   METH (seek,          "R.seek(OFF)")
 #undef METHNAME
   { 0 }
 };
 
-static PyTypeObject gccrand_pytype_skel = {
+static const PyTypeObject gccrand_pytype_skel = {
   PyObject_HEAD_INIT(0) 0,             /* Header */
   "GCCRand",                           /* @tp_name@ */
   sizeof(gccrand_pyobj),               /* @tp_basicsize@ */
@@ -816,7 +799,7 @@ static PyTypeObject gccrand_pytype_skel = {
     Py_TPFLAGS_BASETYPE,
 
   /* @tp_doc@ */
-"Metaclass for symmetric crypto-based generators.",
+  "Metaclass for symmetric crypto-based generators.",
 
   0,                                   /* @tp_traverse@ */
   0,                                   /* @tp_clear@ */
@@ -826,7 +809,7 @@ static PyTypeObject gccrand_pytype_skel = {
   0,                                   /* @tp_iternext@ */
   0,                                   /* @tp_methods@ */
   0,                                   /* @tp_members@ */
-  gccrand_pygetset,                    /* @tp_getset@ */
+  PYGETSET(gccrand),                   /* @tp_getset@ */
   0,                                   /* @tp_base@ */
   0,                                   /* @tp_dict@ */
   0,                                   /* @tp_descr_get@ */
@@ -839,7 +822,7 @@ static PyTypeObject gccrand_pytype_skel = {
   0                                    /* @tp_is_gc@ */
 };
 
-static PyTypeObject gcrand_pytype_skel = {
+static const PyTypeObject gcrand_pytype_skel = {
   PyObject_HEAD_INIT(0) 0,             /* Header */
   "GCRand",                            /* @tp_name@ */
   sizeof(grand_pyobj),                 /* @tp_basicsize@ */
@@ -864,7 +847,7 @@ static PyTypeObject gcrand_pytype_skel = {
     Py_TPFLAGS_BASETYPE,
 
   /* @tp_doc@ */
-"Abstract base class for symmetric crypto-based generators.",
+  "Abstract base class for symmetric crypto-based generators.",
 
   0,                                   /* @tp_traverse@ */
   0,                                   /* @tp_clear@ */
@@ -887,7 +870,7 @@ static PyTypeObject gcrand_pytype_skel = {
   0                                    /* @tp_is_gc@ */
 };
 
-static PyTypeObject gclatinrand_pytype_skel = {
+static const PyTypeObject gclatinrand_pytype_skel = {
   PyObject_HEAD_INIT(0) 0,             /* Header */
   "GCLatinRand",                       /* @tp_name@ */
   sizeof(grand_pyobj),                 /* @tp_basicsize@ */
@@ -912,7 +895,7 @@ static PyTypeObject gclatinrand_pytype_skel = {
     Py_TPFLAGS_BASETYPE,
 
   /* @tp_doc@ */
-"Abstract base class for symmetric crypto-based generators.",
+  "Abstract base class for symmetric crypto-based generators.",
 
   0,                                   /* @tp_traverse@ */
   0,                                   /* @tp_clear@ */
@@ -920,7 +903,7 @@ static PyTypeObject gclatinrand_pytype_skel = {
   0,                                   /* @tp_weaklistoffset@ */
   0,                                   /* @tp_iter@ */
   0,                                   /* @tp_iternext@ */
-  gclatinrand_pymethods,               /* @tp_methods@ */
+  PYMETHODS(gclatinrand),              /* @tp_methods@ */
   0,                                   /* @tp_members@ */
   0,                                   /* @tp_getset@ */
   0,                                   /* @tp_base@ */
@@ -988,7 +971,7 @@ end:
   return (rc);
 }
 
-static PyTypeObject sslprf_pytype_skel = {
+static const PyTypeObject sslprf_pytype_skel = {
   PyObject_HEAD_INIT(0) 0,             /* Header */
   "SSLRand",                           /* @tp_name@ */
   sizeof(grand_pyobj),                 /* @tp_basicsize@ */
@@ -1013,8 +996,8 @@ static PyTypeObject sslprf_pytype_skel = {
     Py_TPFLAGS_BASETYPE,
 
   /* @tp_doc@ */
-"SSLRand(KEY, SEED, [ohash = md5], [ihash = sha]):\n\
-  RNG for SSL master secret.",
+  "SSLRand(KEY, SEED, [ohash = md5], [ihash = sha]):\n"
+  "  RNG for SSL master secret.",
 
   0,                                   /* @tp_traverse@ */
   0,                                   /* @tp_clear@ */
@@ -1037,7 +1020,7 @@ static PyTypeObject sslprf_pytype_skel = {
   0                                    /* @tp_is_gc@ */
 };
 
-static PyTypeObject tlsdx_pytype_skel = {
+static const PyTypeObject tlsdx_pytype_skel = {
   PyObject_HEAD_INIT(0) 0,             /* Header */
   "TLSDataExpansion",                  /* @tp_name@ */
   sizeof(grand_pyobj),                 /* @tp_basicsize@ */
@@ -1062,8 +1045,8 @@ static PyTypeObject tlsdx_pytype_skel = {
     Py_TPFLAGS_BASETYPE,
 
   /* @tp_doc@ */
-"TLSDataExpansion(KEY, SEED, [mac = sha_hmac]):\n\
-  TLS data expansion function.",
+  "TLSDataExpansion(KEY, SEED, [mac = sha_hmac]):\n"
+  "  TLS data expansion function.",
 
   0,                                   /* @tp_traverse@ */
   0,                                   /* @tp_clear@ */
@@ -1086,7 +1069,7 @@ static PyTypeObject tlsdx_pytype_skel = {
   0                                    /* @tp_is_gc@ */
 };
 
-static PyTypeObject tlsprf_pytype_skel = {
+static const PyTypeObject tlsprf_pytype_skel = {
   PyObject_HEAD_INIT(0) 0,             /* Header */
   "TLSPRF",                            /* @tp_name@ */
   sizeof(grand_pyobj),                 /* @tp_basicsize@ */
@@ -1111,8 +1094,8 @@ static PyTypeObject tlsprf_pytype_skel = {
     Py_TPFLAGS_BASETYPE,
 
   /* @tp_doc@ */
-"TLSPRF(KEY, SEED, [lmac = md5_hmac], [rmac = sha_hmac]):\n\
-  TLS pseudorandom function.",
+  "TLSPRF(KEY, SEED, [lmac = md5_hmac], [rmac = sha_hmac]):\n"
+  "  TLS pseudorandom function.",
 
   0,                                   /* @tp_traverse@ */
   0,                                   /* @tp_clear@ */
@@ -1160,14 +1143,14 @@ static PyObject *drget_seed(PyObject *me, void *hunoz)
   return (rc);
 }
 
-static PyGetSetDef dsarand_pygetset[] = {
+static const PyGetSetDef dsarand_pygetset[] = {
 #define GETSETNAME(op, name) dr##op##_##name
   GET  (seed,          "R.seed -> current generator seed")
 #undef GETSETNAME
   { 0 }
 };
 
-static PyTypeObject dsarand_pytype_skel = {
+static const PyTypeObject dsarand_pytype_skel = {
   PyObject_HEAD_INIT(0) 0,             /* Header */
   "DSARand",                           /* @tp_name@ */
   sizeof(grand_pyobj),                 /* @tp_basicsize@ */
@@ -1192,7 +1175,7 @@ static PyTypeObject dsarand_pytype_skel = {
     Py_TPFLAGS_BASETYPE,
 
   /* @tp_doc@ */
-"DSARand(SEED): pseudorandom number generator for DSA parameters.",
+  "DSARand(SEED): pseudorandom number generator for DSA parameters.",
 
   0,                                   /* @tp_traverse@ */
   0,                                   /* @tp_clear@ */
@@ -1202,7 +1185,7 @@ static PyTypeObject dsarand_pytype_skel = {
   0,                                   /* @tp_iternext@ */
   0,                                   /* @tp_methods@ */
   0,                                   /* @tp_members@ */
-  dsarand_pygetset,                    /* @tp_getset@ */
+  PYGETSET(dsarand),                   /* @tp_getset@ */
   0,                                   /* @tp_base@ */
   0,                                   /* @tp_dict@ */
   0,                                   /* @tp_descr_get@ */
@@ -1233,11 +1216,8 @@ end:
   return (rc);
 }
 
-static PyObject *bbsmeth_step(PyObject *me, PyObject *arg)
-{
-  grand *r = GRAND_R(me); if (!PyArg_ParseTuple(arg, ":step")) return (0);
-  r->ops->misc(r, BBS_STEP); RETURN_ME;
-}
+static PyObject *bbsmeth_step(PyObject *me)
+  { grand *r = GRAND_R(me); r->ops->misc(r, BBS_STEP); RETURN_ME; }
 
 static PyObject *bbsmeth_bits(PyObject *me, PyObject *arg)
 {
@@ -1249,11 +1229,8 @@ end:
   return (0);
 }
 
-static PyObject *bbsmeth_wrap(PyObject *me, PyObject *arg)
-{
-  grand *r = GRAND_R(me); if (!PyArg_ParseTuple(arg, ":wrap")) return (0);
-  r->ops->misc(r, BBS_WRAP); RETURN_ME;
-}
+static PyObject *bbsmeth_wrap(PyObject *me)
+  { grand *r = GRAND_R(me); r->ops->misc(r, BBS_WRAP); RETURN_ME; }
 
 static PyObject *bbsget_n(PyObject *me, void *hunoz)
 {
@@ -1269,7 +1246,7 @@ static PyObject *bbsget_x(PyObject *me, void *hunoz)
 
 static int bbsset_x(PyObject *me, PyObject *val, void *hunoz)
 {
-  mp *x = 0; grand *r = GRAND_R(me); int rc = -1; if (!x) NIERR("__del__");
+  mp *x = 0; grand *r = GRAND_R(me); int rc = -1; if (!val) NIERR("__del__");
   if ((x = getmp(val)) == 0) goto end;
   r->ops->misc(r, BBS_SET, x); rc = 0;
   end: mp_drop(x); return (rc);
@@ -1281,16 +1258,16 @@ static PyObject *bbsget_stepsz(PyObject *me, void *hunoz)
   return (PyInt_FromLong(r->ops->misc(r, BBS_STEPSZ)));
 }
 
-static PyMethodDef bbs_pymethods[] = {
+static const PyMethodDef bbs_pymethods[] = {
 #define METHNAME(name) bbsmeth_##name
-  METH (step,  "R.step(): steps the generator (not useful)")
-  METH (bits,  "R.bits(N) -> W: returns N bits (<= 32) from the generator")
-  METH (wrap,  "R.wrap(): flushes unused bits in internal buffer")
+  NAMETH(step,         "R.step(): steps the generator (not useful)")
+  METH (bits,   "R.bits(N) -> W: returns N bits (<= 32) from the generator")
+  NAMETH(wrap,         "R.wrap(): flushes unused bits in internal buffer")
 #undef METHNAME
   { 0 }
 };
 
-static PyGetSetDef bbs_pygetset[] = {
+static const PyGetSetDef bbs_pygetset[] = {
 #define GETSETNAME(op, name) bbs##op##_##name
   GET  (n,             "R.n -> Blum modulus")
   GETSET(x,            "R.x -> current seed value")
@@ -1299,7 +1276,7 @@ static PyGetSetDef bbs_pygetset[] = {
   { 0 }
 };
 
-static PyTypeObject bbs_pytype_skel = {
+static const PyTypeObject bbs_pytype_skel = {
   PyObject_HEAD_INIT(0) 0,             /* Header */
   "BlumBlumShub",                      /* @tp_name@ */
   sizeof(grand_pyobj),                 /* @tp_basicsize@ */
@@ -1324,7 +1301,7 @@ static PyTypeObject bbs_pytype_skel = {
     Py_TPFLAGS_BASETYPE,
 
   /* @tp_doc@ */
-"BlumBlumShub(N, [x = 2]): Blum-Blum-Shub pseudorandom number generator.",
+  "BlumBlumShub(N, [x = 2]): Blum-Blum-Shub pseudorandom number generator.",
 
   0,                                   /* @tp_traverse@ */
   0,                                   /* @tp_clear@ */
@@ -1332,9 +1309,9 @@ static PyTypeObject bbs_pytype_skel = {
   0,                                   /* @tp_weaklistoffset@ */
   0,                                   /* @tp_iter@ */
   0,                                   /* @tp_iternext@ */
-  bbs_pymethods,                       /* @tp_methods@ */
+  PYMETHODS(bbs),                      /* @tp_methods@ */
   0,                                   /* @tp_members@ */
-  bbs_pygetset,                                /* @tp_getset@ */
+  PYGETSET(bbs),                       /* @tp_getset@ */
   0,                                   /* @tp_base@ */
   0,                                   /* @tp_dict@ */
   0,                                   /* @tp_descr_get@ */
@@ -1380,24 +1357,25 @@ end:
   return ((PyObject *)rc);
 }
 
-static PyObject *meth__BBSPriv_generate(PyObject *me,
-                                       PyObject *arg, PyObject *kw)
+static PyObject *bpmeth_generate(PyObject *me, PyObject *arg, PyObject *kw)
 {
   bbs_priv bp = { 0 };
   mp *x = MP_TWO;
-  pgev evt = { 0 };
+  struct excinfo exc = EXCINFO_INIT;
+  pypgev evt = { { 0 } };
   unsigned nbits, n = 0;
   grand *r = &rand_global;
   static const char *const kwlist[] =
-    { "class", "nbits", "event", "rng", "nsteps", "seed", 0 };
+    { "nbits", "event", "rng", "nsteps", "seed", 0 };
   bbspriv_pyobj *rc = 0;
 
-  if (!PyArg_ParseTupleAndKeywords(arg, kw, "OO&|O&O&O&O&:generate", KWLIST,
-                                  &me, convuint, &nbits, convpgev, &evt,
+  evt.exc = &exc;
+  if (!PyArg_ParseTupleAndKeywords(arg, kw, "O&|O&O&O&O&:generate", KWLIST,
+                                  convuint, &nbits, convpgev, &evt,
                                   convgrand, &r, convuint, &n, convmp, &x))
     goto end;
-  if (bbs_gen(&bp, nbits, r, n, evt.proc, evt.ctx))
-    VALERR("prime genration failed");
+  if (bbs_gen(&bp, nbits, r, n, evt.ev.proc, evt.ev.ctx))
+    PGENERR(&exc);
   rc = PyObject_New(bbspriv_pyobj, bbspriv_pytype);
   rc->gr.r = bbs_rand(bp.n, x);
   rc->gr.f = f_freeme;
@@ -1441,15 +1419,17 @@ static PyObject *bpget_p(PyObject *me, void *hunoz)
 static PyObject *bpget_q(PyObject *me, void *hunoz)
   { return (mp_pywrap(MP_COPY(BBSPRIV_BP(me)->q))); }
 
-static PyMethodDef bbspriv_pymethods[] = {
+static const PyMethodDef bbspriv_pymethods[] = {
 #define METHNAME(name) bpmeth_##name
-  METH (ff,                    "R.ff(N): fast-forward N places")
-  METH (rew,                   "R.rew(N): rewind N places")
+  METH (ff,            "R.ff(N): fast-forward N places")
+  METH (rew,           "R.rew(N): rewind N places")
+  KWSMTH(generate,     "generate(NBITS, [event = pgen_nullev], "
+                             "[rng = rand], [nsteps = 0], [seed = 2]) -> R")
 #undef METHNAME
   { 0 }
 };
 
-static PyGetSetDef bbspriv_pygetset[] = {
+static const PyGetSetDef bbspriv_pygetset[] = {
 #define GETSETNAME(op, name) bp##op##_##name
   GET  (n,             "R.n -> Blum modulus")
   GET  (p,             "R.p -> one of the factors of the modulus")
@@ -1458,7 +1438,7 @@ static PyGetSetDef bbspriv_pygetset[] = {
   { 0 }
 };
 
-static PyTypeObject bbspriv_pytype_skel = {
+static const PyTypeObject bbspriv_pytype_skel = {
   PyObject_HEAD_INIT(0) 0,             /* Header */
   "BBSPriv",                           /* @tp_name@ */
   sizeof(bbspriv_pyobj),               /* @tp_basicsize@ */
@@ -1483,8 +1463,8 @@ static PyTypeObject bbspriv_pytype_skel = {
     Py_TPFLAGS_BASETYPE,
 
   /* @tp_doc@ */
-"BBSPriv(..., seed = 2]): Blum-Blum-Shub, with private key.\n\
-  Keywords: n, p, q; must provide at least two",
+  "BBSPriv(..., [seed = 2]): Blum-Blum-Shub, with private key.\n"
+  "  Keywords: n, p, q; must provide at least two",
 
   0,                                   /* @tp_traverse@ */
   0,                                   /* @tp_clear@ */
@@ -1492,9 +1472,9 @@ static PyTypeObject bbspriv_pytype_skel = {
   0,                                   /* @tp_weaklistoffset@ */
   0,                                   /* @tp_iter@ */
   0,                                   /* @tp_iternext@ */
-  bbspriv_pymethods,                   /* @tp_methods@ */
+  PYMETHODS(bbspriv),                  /* @tp_methods@ */
   0,                                   /* @tp_members@ */
-  bbspriv_pygetset,                    /* @tp_getset@ */
+  PYGETSET(bbspriv),                   /* @tp_getset@ */
   0,                                   /* @tp_base@ */
   0,                                   /* @tp_dict@ */
   0,                                   /* @tp_descr_get@ */
@@ -1509,11 +1489,8 @@ static PyTypeObject bbspriv_pytype_skel = {
 
 /*----- Global stuff ------------------------------------------------------*/
 
-static PyMethodDef methods[] = {
-#define METHNAME(name) meth_##name
-  KWMETH(_BBSPriv_generate,            "\
-generate(NBITS, [event = pgen_nullev, rng = rand, nsteps = 0, seed = 2])")
-#undef METHNAME
+static const struct nameval consts[] = {
+  CONST(RAND_IBITS),
   { 0 }
 };
 
@@ -1534,7 +1511,6 @@ void rand_pyinit(void)
   INITTYPE(gclatinrand, gcrand);
   rand_noisesrc(RAND_GLOBAL, &noise_source);
   rand_seed(RAND_GLOBAL, 160);
-  addmethods(methods);
 }
 
 #define gccrand gccrand_info
@@ -1559,6 +1535,7 @@ void rand_pyinsert(PyObject *mod)
   gccrands_dict = gccrands(); Py_INCREF(gccrands_dict);
   INSERT("gccrands", gccrands_dict);
   INSERT("rand", rand_pyobj);
+  setconstants(mod, consts);
 }
 
 /*----- That's all, folks -------------------------------------------------*/