/*----- Header files ------------------------------------------------------*/
-#define PY_SSIZE_T_CLEAN
+#include "pyke/pyke-mLib.h"
-#include <Python.h>
+PUBLIC_SYMBOLS;
#include <longintrepr.h>
-#include <structmember.h>
#include <mLib/dstr.h>
#include <mLib/macros.h>
#include <catacomb/share.h>
#include <catacomb/gfshare.h>
-
-/*----- Other preliminaries -----------------------------------------------*/
-
-#define GOBBLE_SEMI extern int notexist
-#if defined(__GNUC__) && defined(__ELF__)
-# define PRIVATE_SYMBOLS _Pragma("GCC visibility push(hidden)") GOBBLE_SEMI
-# define PUBLIC_SYMBOLS _Pragma("GCC visibility pop") GOBBLE_SEMI
-# define EXPORT __attribute__((__visibility__("default")))
-#else
-# define PRIVATE_SYMBOLS GOBBLE_SEMI
-# define PUBLIC_SYMBOLS GOBBLE_SEMI
-# define EXPORT
-#endif
-
PRIVATE_SYMBOLS;
-/*----- Utility macros ----------------------------------------------------*/
-
-#define RETURN_OBJ(obj) do { Py_INCREF(obj); return (obj); } while (0)
-#define RETURN_NONE RETURN_OBJ(Py_None)
-#define RETURN_NOTIMPL RETURN_OBJ(Py_NotImplemented)
-#define RETURN_TRUE RETURN_OBJ(Py_True)
-#define RETURN_FALSE RETURN_OBJ(Py_False)
-#define RETURN_ME RETURN_OBJ(me)
-
-#define EXCERR(exc, str) do { \
- PyErr_SetString(exc, str); \
- goto end; \
-} while (0)
-#define VALERR(str) EXCERR(PyExc_ValueError, str)
-#define OVFERR(str) EXCERR(PyExc_OverflowError, str)
-#define TYERR(str) EXCERR(PyExc_TypeError, str)
-#define IXERR(str) EXCERR(PyExc_IndexError, str)
-#define ZDIVERR(str) EXCERR(PyExc_ZeroDivisionError, str)
-#define SYSERR(str) EXCERR(PyExc_SystemError, str)
-#define NIERR(str) EXCERR(PyExc_NotImplementedError, str)
-#define INDEXERR(idx) do { \
- PyErr_SetObject(PyExc_KeyError, idx); \
- goto end; \
-} while (0)
-#define OSERR(name) do { \
- PyErr_SetFromErrnoWithFilename(PyExc_OSError, name); \
- goto end; \
-} while (0)
-#define PGENERR(exc) do { pgenerr(exc); goto end; } while (0)
-
-#define CONVFUNC(ty, cty, ext) \
- int conv##ty(PyObject *o, void *p) \
- { \
- if (!PyObject_TypeCheck(o, ty##_pytype)) \
- TYERR("wanted a " #ty); \
- *(cty *)p = ext(o); \
- return (1); \
- end: \
- return (0); \
- }
-
-#define root_pytype 0
-#define type_pytype &PyType_Type
-#define INITTYPE_META(ty, base, meta) do { \
- ty##_pytype_skel.tp_base = base##_pytype; \
- ty##_pytype = inittype(&ty##_pytype_skel, meta##_pytype); \
-} while (0)
-#define INITTYPE(ty, base) INITTYPE_META(ty, base, type)
-
-extern PyObject *home_module;
-extern PyObject *modname;
-
-#define INSERT(name, ob) do { \
- PyObject *_o = (PyObject *)(ob); \
- Py_INCREF(_o); \
- PyModule_AddObject(mod, name, _o); \
-} while (0)
-
-#define INSEXC(name, var, base, meth) \
- INSERT(name, var = mkexc(mod, base, name, meth))
-
-#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 },
+/*----- Miscellaneous preliminaries ---------------------------------------*/
+/* Submodules. */
#define MODULES(_) \
- _(util) \
+ _(pyke_core) _(pyke_gmap) \
_(bytestring) _(buffer) \
_(rand) _(algorithms) _(pubkey) _(pgen) \
_(mp) _(field) _(ec) _(group) \
_(passphrase) _(share) _(key)
-#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 DECLARE_MODINIT(m) \
- extern void m##_pyinit(void); \
- extern void m##_pyinsert(PyObject *);
-
MODULES(DECLARE_MODINIT)
-#define FREEOBJ(obj) \
- (((PyObject *)(obj))->ob_type->tp_free((PyObject *)(obj)))
+/* Exceptions. */
+#define PGENERR(err) do { pgenerr(err); goto end; } while (0)
+
+/* Conversions. */
+extern int convmpw(PyObject *, void *);
+/* Make a dictionary of generic-crypto classes. */
#define GEN(func, base) \
static PyObject *func(void) \
{ \
return (d); \
}
-#define KWLIST (/*unconst*/ char **)kwlist
-
-struct nameval { const char *name; unsigned f; unsigned long value; };
-#define CF_SIGNED 1u
-extern void setconstants(PyObject *, const struct nameval *);
-
+/* Common handling for simultaneous exponentiation. */
extern PyObject *mexp_common(PyObject *, PyObject *, size_t,
PyObject *(*id)(PyObject *),
int (*fill)(void *, PyObject *,
PyObject *(*exp)(PyObject *, void *, int),
void (*drop)(void *));
-extern int convulong(PyObject *, void *);
-#define DECL_CONVU_(n) extern int convu##n(PyObject *, void *);
-DOUINTSZ(DECL_CONVU_)
-extern int convmpw(PyObject *, void *);
-extern int convuint(PyObject *, void *);
-extern int convk64(PyObject *, void *);
-extern int convszt(PyObject *, void *);
-extern int convbool(PyObject *, void *);
-extern PyObject *abstract_pynew(PyTypeObject *, PyObject *, PyObject *);
-extern PyObject *getbool(int);
-extern PyObject *getulong(unsigned long);
-extern PyObject *getk64(kludge64);
-extern void *newtype(PyTypeObject *, const PyTypeObject *, const char *);
-
-struct excinfo { PyObject *ty, *val, *tb; };
-#define EXCINFO_INIT { 0, 0, 0 }
-
-extern PyObject *mkexc(PyObject *, PyObject *, const char *, PyMethodDef *);
-#define INIT_EXCINFO(exc) do { \
- struct excinfo *_exc = (exc); _exc->ty = _exc->val = _exc->tb = 0; \
-} while (0)
-#define RELEASE_EXCINFO(exc) do { \
- struct excinfo *_exc = (exc); \
- Py_XDECREF(_exc->ty); _exc->ty = 0; \
- Py_XDECREF(_exc->val); _exc->val = 0; \
- Py_XDECREF(_exc->tb); _exc->tb = 0; \
-} while (0)
-#define STASH_EXCINFO(exc) do { \
- struct excinfo *_exc = (exc); \
- PyErr_Fetch(&_exc->ty, &_exc->val, &_exc->tb); \
- PyErr_NormalizeException(&_exc->ty, &_exc->val, &_exc->tb); \
-} while (0)
-#define RESTORE_EXCINFO(exc) do { \
- struct excinfo *_exc = (exc); \
- PyErr_Restore(_exc->ty, _exc->val, _exc->tb); \
- _exc->ty = _exc->val = _exc->tb = 0; \
-} while (0)
-extern void report_lost_exception(struct excinfo *, const char *, ...);
-extern void report_lost_exception_v(struct excinfo *, const char *, va_list);
-extern void stash_exception(struct excinfo *, const char *, ...);
-extern void restore_exception(struct excinfo *, const char *, ...);
-
-extern void typeready(PyTypeObject *);
-extern PyTypeObject *inittype(PyTypeObject *, PyTypeObject *);
-extern void addmethods(const PyMethodDef *);
-extern PyMethodDef *donemethods(void);
-
-/*----- Mapping methods ---------------------------------------------------*/
-
-#define GMAP_METH(func, doc) { #func, gmapmeth_##func, METH_VARARGS, doc },
-#define GMAP_KWMETH(func, doc) \
- { #func, (PyCFunction)gmapmeth_##func, METH_VARARGS|METH_KEYWORDS, doc },
-#define GMAP_METHDECL(func, doc) \
- extern PyObject *gmapmeth_##func(PyObject *, PyObject *);
-#define GMAP_KWMETHDECL(func, doc) \
- extern PyObject *gmapmeth_##func(PyObject *, PyObject *, PyObject *);
-
-#define GMAP_DOROMETHODS(METH, KWMETH) \
- METH (has_key, "D.has_key(KEY) -> BOOL") \
- METH (keys, "D.keys() -> LIST") \
- METH (values, "D.values() -> LIST") \
- METH (items, "D.items() -> LIST") \
- METH (iterkeys, "D.iterkeys() -> ITER") \
- METH (itervalues, "D.itervalues() -> ITER") \
- METH (iteritems, "D.iteritems() -> ITER") \
- KWMETH(get, "D.get(KEY, [default = None]) -> VALUE") \
-
-#define GMAP_DOMETHODS(METH, KWMETH) \
- GMAP_DOROMETHODS(METH, KWMETH) \
- METH (clear, "D.clear()") \
- KWMETH(setdefault, "D.setdefault(K, [default = None]) -> VALUE") \
- KWMETH(pop, "D.pop(KEY, [default = <error>]) -> VALUE") \
- METH (popitem, "D.popitem() -> (KEY, VALUE)") \
- METH (update, "D.update(MAP)")
-
-GMAP_DOMETHODS(GMAP_METHDECL, GMAP_KWMETHDECL)
-#define GMAP_ROMETHODS GMAP_DOROMETHODS(GMAP_METH, GMAP_KWMETH)
-#define GMAP_METHODS GMAP_DOMETHODS(GMAP_METH, GMAP_KWMETH)
-extern Py_ssize_t gmap_pysize(PyObject *);
-extern PySequenceMethods gmap_pysequence;
-extern PyMethodDef gmap_pymethods[];
-
/*----- Bytestrings -------------------------------------------------------*/
PyObject *bytestring_pywrap(const void *, size_t);