-#define root_pytype 0
-#define type_pytype &PyType_Type
-#define INITTYPE(ty, base) do { \
- ty##_pytype_skel.tp_base = base##_pytype; \
- ty##_pytype = inittype(&ty##_pytype_skel); \
-} while (0)
-
-#define INSERT(name, ob) do { \
- PyObject *_o = (PyObject *)(ob); \
- Py_INCREF(_o); \
- PyModule_AddObject(mod, name, _o); \
-} while (0)
-
-#define METH(func, doc) \
- { #func, METHNAME(func), METH_VARARGS, doc },
-#define KWMETH(func, doc) \
- { #func, (PyCFunction)METHNAME(func), \
- METH_VARARGS | METH_KEYWORDS, doc },
-
-#define GET(func, doc) \
- { #func, GETSETNAME(get, func), 0, doc },
-#define GETSET(func, doc) \
- { #func, GETSETNAME(get, func), GETSETNAME(set, func), doc },
-
-#define MEMBER(name, ty, f, doc) \
- { #name, ty, offsetof(MEMBERSTRUCT, name), f, doc },
-
-#define MODULES(DO) \
- DO(bytestring) \
- DO(rand) DO(algorithms) DO(pubkey) DO(pgen) \
- DO(mp) DO(field) DO(ec) DO(group) \
- DO(passphrase)
-#define DOMODINIT(m) m##_pyinit();
-#define DOMODINSERT(m) m##_pyinsert(mod);
-#define INIT_MODULES do { MODULES(DOMODINIT) } while (0)
-#define INSERT_MODULES do { MODULES(DOMODINSERT) } while (0)
-
-#define DO(m) \
- extern void m##_pyinit(void); \
- extern void m##_pyinsert(PyObject *);
-MODULES(DO)
-#undef DO
-
-#define FREEOBJ(obj) \
- (((PyObject *)(obj))->ob_type->tp_free((PyObject *)(obj)))
+/* Submodules. */
+#define MODULES(_) \
+ _(pyke_core) _(pyke_gmap) \
+ _(bytestring) _(buffer) \
+ _(rand) _(algorithms) _(pubkey) _(pgen) \
+ _(mp) _(field) _(ec) _(group) \
+ _(passphrase) _(share) _(key)
+MODULES(DECLARE_MODINIT)
+
+/* Exceptions. */
+#define PGENERR(err) do { pgenerr(err); goto end; } while (0)
+
+/* Conversions. */
+extern int convmpw(PyObject *, void *);
+
+/* Building tables of things. */
+extern PyObject *make_algtab(const void *tab, size_t esz,
+ const char *(*namefn)(const void *),
+ PyObject *(*valfn)(const void *));
+extern PyObject *make_grouptab(const void *tab, size_t esz,
+ const char *(*namefn)(const void *),
+ int (*ixfn)(const void *),
+ PyObject *(*valfn)(int));
+
+/* Common handling for simultaneous exponentiation. */
+extern PyObject *mexp_common(PyObject *, PyObject *, size_t,
+ PyObject *(*id)(PyObject *),
+ int (*fill)(void *, PyObject *,
+ PyObject *, PyObject *),
+ PyObject *(*exp)(PyObject *, void *, int),
+ void (*drop)(void *));