X-Git-Url: https://git.distorted.org.uk/~mdw/catacomb-python/blobdiff_plain/47061e38e845a33fa1b3a3a231f3707a2a31c20e..2aa7d3a9238bfb3d117ca23191ea402c5c5d6f40:/catacomb-python.h diff --git a/catacomb-python.h b/catacomb-python.h index fe64aeb..c3b120d 100644 --- a/catacomb-python.h +++ b/catacomb-python.h @@ -33,13 +33,11 @@ /*----- Header files ------------------------------------------------------*/ -#define PY_SSIZE_T_CLEAN +#include "pyke/pyke-mLib.h" -#include +PUBLIC_SYMBOLS; #include -#include -#include #include #include #include @@ -119,140 +117,35 @@ #include #include - -/*----- 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 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))) - -#define GEN(func, base) \ - static PyObject *func(void) \ - { \ - PyObject *d = PyDict_New(); \ - PyObject *o; \ - int i; \ - \ - for (i = 0; g##base##tab[i]; i++) { \ - o = gc##base##_pywrap((/*unconst*/ gc##base *)g##base##tab[i]); \ - PyDict_SetItemString(d, \ - (/*unconst*/ char *)g##base##tab[i]->name, \ - o); \ - Py_DECREF(o); \ - } \ - return (d); \ - } +MODULES(DECLARE_MODINIT) -#define KWLIST (/*unconst*/ char **)kwlist +/* Exceptions. */ +#define PGENERR(err) do { pgenerr(err); goto end; } while (0) -struct nameval { const char *name; unsigned f; unsigned long value; }; -#define CF_SIGNED 1u -extern void setconstants(PyObject *, const struct nameval *); +/* 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 *, @@ -260,88 +153,6 @@ extern PyObject *mexp_common(PyObject *, PyObject *, size_t, 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 = ]) -> 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); @@ -369,7 +180,7 @@ extern mp *getgf(PyObject *); extern int convgf(PyObject *, void *); extern PyObject *mp_pywrap(mp *); extern PyObject *gf_pywrap(mp *); -extern long mphash(mp *); +extern Py_hash_t mphash(mp *); extern mp *mp_frompyobject(PyObject *, int); extern PyObject *mp_topystring(mp *, int, const char *, const char *, const char *); @@ -402,7 +213,7 @@ typedef struct fe_pyobj { extern PyTypeObject *fe_pytype; #define FE_PYCHECK(o) PyObject_TypeCheck((o), fe_pytype) #define FE_F(o) (((fe_pyobj *)(o))->f) -#define FE_FOBJ(o) ((PyObject *)(o)->ob_type) +#define FE_FOBJ(o) ((PyObject *)Py_TYPE(o)) #define FE_X(o) (((fe_pyobj *)(o))->x) extern PyObject *fe_pywrap(PyObject *, mp *); @@ -435,7 +246,7 @@ extern PyTypeObject *ecpt_pytype, *ecptcurve_pytype; #define ECPT_PYCHECK(o) PyObject_TypeCheck((o), ecpt_pytype) #define ECPTCURVE_PYCHECK(o) PyObject_TypeCheck((o), ecptcurve_pytype) #define ECPT_C(o) (((ecpt_pyobj *)(o))->c) -#define ECPT_COBJ(o) ((PyObject *)(o)->ob_type) +#define ECPT_COBJ(o) ((PyObject *)Py_TYPE(o)) #define ECPT_FOBJ(o) ECCURVE_FOBJ(ECPT_COBJ((o))) #define ECPT_P(o) (&((ecpt_pyobj *)(o))->p) extern PyObject *ecpt_pywrap(PyObject *, ec *); @@ -470,7 +281,7 @@ extern PyTypeObject *ge_pytype; #define GE_PYCHECK(o) PyObject_TypeCheck((o), ge_pytype) #define GE_X(o) (((ge_pyobj *)(o))->x) #define GE_G(o) (((ge_pyobj *)(o))->g) -#define GE_GOBJ(o) ((PyObject *)(group_pyobj *)(o)->ob_type) +#define GE_GOBJ(o) (PyObject *)(Py_TYPE(o)) extern PyObject *ge_pywrap(PyObject *, ge *); typedef struct group_pyobj {