X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/catacomb-python/blobdiff_plain/3aa33042dc760937bb9da54c09f7c668f00eb241..963a61481edc7a83698b18b518bf20cd93d268a6:/algorithms.c diff --git a/algorithms.c b/algorithms.c index a740a71..cd7a04d 100644 --- a/algorithms.c +++ b/algorithms.c @@ -231,7 +231,7 @@ static PyMemberDef keyszset_pymembers[] = { }; static PyTypeObject keysz_pytype_skel = { - PyObject_HEAD_INIT(&PyType_Type) 0, /* Header */ + PyObject_HEAD_INIT(0) 0, /* Header */ "catacomb.KeySZ", /* @tp_name@ */ sizeof(keysz_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -262,7 +262,7 @@ static PyTypeObject keysz_pytype_skel = { 0, /* @tp_richcompare@ */ 0, /* @tp_weaklistoffset@ */ 0, /* @tp_iter@ */ - 0, /* @tp_iternexr@ */ + 0, /* @tp_iternext@ */ 0, /* @tp_methods@ */ keysz_pymembers, /* @tp_members@ */ 0, /* @tp_getset@ */ @@ -279,7 +279,7 @@ static PyTypeObject keysz_pytype_skel = { }; static PyTypeObject keyszany_pytype_skel = { - PyObject_HEAD_INIT(&PyType_Type) 0, /* Header */ + PyObject_HEAD_INIT(0) 0, /* Header */ "catacomb.KeySZAny", /* @tp_name@ */ sizeof(keysz_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -310,7 +310,7 @@ static PyTypeObject keyszany_pytype_skel = { 0, /* @tp_richcompare@ */ 0, /* @tp_weaklistoffset@ */ 0, /* @tp_iter@ */ - 0, /* @tp_iternexr@ */ + 0, /* @tp_iternext@ */ 0, /* @tp_methods@ */ 0, /* @tp_members@ */ keyszany_pygetset, /* @tp_getset@ */ @@ -327,7 +327,7 @@ static PyTypeObject keyszany_pytype_skel = { }; static PyTypeObject keyszrange_pytype_skel = { - PyObject_HEAD_INIT(&PyType_Type) 0, /* Header */ + PyObject_HEAD_INIT(0) 0, /* Header */ "catacomb.KeySZRange", /* @tp_name@ */ sizeof(keyszrange_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -359,7 +359,7 @@ sizes, and requires the key length to be a multiple of some value.", 0, /* @tp_richcompare@ */ 0, /* @tp_weaklistoffset@ */ 0, /* @tp_iter@ */ - 0, /* @tp_iternexr@ */ + 0, /* @tp_iternext@ */ 0, /* @tp_methods@ */ keyszrange_pymembers, /* @tp_members@ */ 0, /* @tp_getset@ */ @@ -376,7 +376,7 @@ sizes, and requires the key length to be a multiple of some value.", }; static PyTypeObject keyszset_pytype_skel = { - PyObject_HEAD_INIT(&PyType_Type) 0, /* Header */ + PyObject_HEAD_INIT(0) 0, /* Header */ "catacomb.KeySZSet", /* @tp_name@ */ sizeof(keyszset_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -408,7 +408,7 @@ few listed sizes.", 0, /* @tp_richcompare@ */ 0, /* @tp_weaklistoffset@ */ 0, /* @tp_iter@ */ - 0, /* @tp_iternexr@ */ + 0, /* @tp_iternext@ */ 0, /* @tp_methods@ */ keyszset_pymembers, /* @tp_members@ */ keyszset_pygetset, /* @tp_getset@ */ @@ -460,19 +460,18 @@ end: PyObject *gccipher_pywrap(gccipher *cc) { - gccipher_pyobj *g = newtype(gccipher_pytype, 0); + gccipher_pyobj *g = newtype(gccipher_pytype, 0, cc->name); g->cc = cc; - g->ty.tp_name = (/*unconst*/ char *)cc->name; - g->ty.tp_basicsize = sizeof(gcipher_pyobj); - g->ty.tp_base = gcipher_pytype; + g->ty.type.tp_basicsize = sizeof(gcipher_pyobj); + g->ty.type.tp_base = gcipher_pytype; Py_INCREF(gcipher_pytype); - g->ty.tp_flags = (Py_TPFLAGS_DEFAULT | - Py_TPFLAGS_BASETYPE | - Py_TPFLAGS_HEAPTYPE); - g->ty.tp_alloc = PyType_GenericAlloc; - g->ty.tp_free = 0; - g->ty.tp_new = gcipher_pynew; - PyType_Ready(&g->ty); + g->ty.type.tp_flags = (Py_TPFLAGS_DEFAULT | + Py_TPFLAGS_BASETYPE | + Py_TPFLAGS_HEAPTYPE); + g->ty.type.tp_alloc = PyType_GenericAlloc; + g->ty.type.tp_free = 0; + g->ty.type.tp_new = gcipher_pynew; + PyType_Ready(&g->ty.type); return ((PyObject *)g); } @@ -591,7 +590,7 @@ static PyMethodDef gcipher_pymethods[] = { }; static PyTypeObject gccipher_pytype_skel = { - PyObject_HEAD_INIT(&PyType_Type) 0, /* Header */ + PyObject_HEAD_INIT(0) 0, /* Header */ "catacomb.GCCipher", /* @tp_name@ */ sizeof(gccipher_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -622,7 +621,7 @@ static PyTypeObject gccipher_pytype_skel = { 0, /* @tp_richcompare@ */ 0, /* @tp_weaklistoffset@ */ 0, /* @tp_iter@ */ - 0, /* @tp_iternexr@ */ + 0, /* @tp_iternext@ */ 0, /* @tp_methods@ */ 0, /* @tp_members@ */ gccipher_pygetset, /* @tp_getset@ */ @@ -639,7 +638,7 @@ static PyTypeObject gccipher_pytype_skel = { }; static PyTypeObject gcipher_pytype_skel = { - PyObject_HEAD_INIT(&PyType_Type) 0, /* Header */ + PyObject_HEAD_INIT(0) 0, /* Header */ "catacomb.GCipher", /* @tp_name@ */ sizeof(gcipher_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -670,7 +669,7 @@ static PyTypeObject gcipher_pytype_skel = { 0, /* @tp_richcompare@ */ 0, /* @tp_weaklistoffset@ */ 0, /* @tp_iter@ */ - 0, /* @tp_iternexr@ */ + 0, /* @tp_iternext@ */ gcipher_pymethods, /* @tp_methods@ */ 0, /* @tp_members@ */ 0, /* @tp_getset@ */ @@ -705,19 +704,18 @@ end: PyObject *gchash_pywrap(gchash *ch) { - gchash_pyobj *g = newtype(gchash_pytype, 0); + gchash_pyobj *g = newtype(gchash_pytype, 0, ch->name); g->ch = ch; - g->ty.tp_name = (/*unconst*/ char *)ch->name; - g->ty.tp_basicsize = sizeof(ghash_pyobj); - g->ty.tp_base = ghash_pytype; + g->ty.type.tp_basicsize = sizeof(ghash_pyobj); + g->ty.type.tp_base = ghash_pytype; Py_INCREF(ghash_pytype); - g->ty.tp_flags = (Py_TPFLAGS_DEFAULT | - Py_TPFLAGS_BASETYPE | - Py_TPFLAGS_HEAPTYPE); - g->ty.tp_alloc = PyType_GenericAlloc; - g->ty.tp_free = 0; - g->ty.tp_new = ghash_pynew; - PyType_Ready(&g->ty); + g->ty.type.tp_flags = (Py_TPFLAGS_DEFAULT | + Py_TPFLAGS_BASETYPE | + Py_TPFLAGS_HEAPTYPE); + g->ty.type.tp_alloc = PyType_GenericAlloc; + g->ty.type.tp_free = 0; + g->ty.type.tp_new = ghash_pynew; + PyType_Ready(&g->ty.type); return ((PyObject *)g); } @@ -779,16 +777,55 @@ static PyGetSetDef gchash_pygetset[] = { { 0 } }; +#define GHMETH_HASHU_(n, W, w) \ + static PyObject *ghmeth_hashu##w(PyObject *me, PyObject *arg) \ + { \ + uint##n x; \ + if (!PyArg_ParseTuple(arg, "O&:hashu" #w, convu##n, &x)) goto end; \ + GH_HASHU##W(GHASH_H(me), x); \ + RETURN_ME; \ + end: \ + return (0); \ + } +DOUINTCONV(GHMETH_HASHU_) + +#define GHMETH_HASHBUF_(n, W, w) \ + static PyObject *ghmeth_hashbuf##w(PyObject *me, PyObject *arg) \ + { \ + char *p; \ + int sz; \ + if (!PyArg_ParseTuple(arg, "s#:hashbuf" #w, &p, &sz)) goto end; \ + if (sz > MASK##n) TYERR("string too long"); \ + GH_HASHBUF##W(GHASH_H(me), p, sz); \ + RETURN_ME; \ + end: \ + return (0); \ + } +DOUINTCONV(GHMETH_HASHBUF_) + +static PyObject *ghmeth_hashstrz(PyObject *me, PyObject *arg) +{ + char *p; + if (!PyArg_ParseTuple(arg, "s:hashstrz", &p)) return (0); + GH_HASHSTRZ(GHASH_H(me), p); + RETURN_ME; +} + static PyMethodDef ghash_pymethods[] = { #define METHNAME(name) ghmeth_##name METH (hash, "H.hash(M)") +#define METHU_(n, W, w) METH(hashu##w, "H.hashu" #w "(WORD)") + DOUINTCONV(METHU_) +#define METHBUF_(n, W, w) METH(hashbuf##w, "H.hashbuf" #w "(BYTES)") + DOUINTCONV(METHBUF_) + METH (hashstrz, "H.hashstrz(STRING)") METH (done, "H.done() -> HASH") #undef METHNAME { 0 } }; static PyTypeObject gchash_pytype_skel = { - PyObject_HEAD_INIT(&PyType_Type) 0, /* Header */ + PyObject_HEAD_INIT(0) 0, /* Header */ "catacomb.GCHash", /* @tp_name@ */ sizeof(gchash_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -819,7 +856,7 @@ static PyTypeObject gchash_pytype_skel = { 0, /* @tp_richcompare@ */ 0, /* @tp_weaklistoffset@ */ 0, /* @tp_iter@ */ - 0, /* @tp_iternexr@ */ + 0, /* @tp_iternext@ */ 0, /* @tp_methods@ */ 0, /* @tp_members@ */ gchash_pygetset, /* @tp_getset@ */ @@ -836,7 +873,7 @@ static PyTypeObject gchash_pytype_skel = { }; static PyTypeObject ghash_pytype_skel = { - PyObject_HEAD_INIT(&PyType_Type) 0, /* Header */ + PyObject_HEAD_INIT(0) 0, /* Header */ "catacomb.GHash", /* @tp_name@ */ sizeof(ghash_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -867,7 +904,7 @@ static PyTypeObject ghash_pytype_skel = { 0, /* @tp_richcompare@ */ 0, /* @tp_weaklistoffset@ */ 0, /* @tp_iter@ */ - 0, /* @tp_iternexr@ */ + 0, /* @tp_iternext@ */ ghash_pymethods, /* @tp_methods@ */ 0, /* @tp_members@ */ 0, /* @tp_getset@ */ @@ -922,19 +959,18 @@ static PyObject *gmhash_pynew(PyTypeObject *ty, PyObject *arg, PyObject *kw) PyObject *gcmac_pywrap(gcmac *cm) { - gcmac_pyobj *g = newtype(gcmac_pytype, 0); + gcmac_pyobj *g = newtype(gcmac_pytype, 0, cm->name); g->cm = cm; - g->ty.tp_name = (/*unconst*/ char *)cm->name; - g->ty.tp_basicsize = sizeof(gmac_pyobj); - g->ty.tp_base = gmac_pytype; + g->ty.type.tp_basicsize = sizeof(gmac_pyobj); + g->ty.type.tp_base = gmac_pytype; Py_INCREF(gmac_pytype); - g->ty.tp_flags = (Py_TPFLAGS_DEFAULT | + g->ty.type.tp_flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HEAPTYPE); - g->ty.tp_alloc = PyType_GenericAlloc; - g->ty.tp_free = 0; - g->ty.tp_new = gmac_pynew; - PyType_Ready(&g->ty); + g->ty.type.tp_alloc = PyType_GenericAlloc; + g->ty.type.tp_free = 0; + g->ty.type.tp_new = gmac_pynew; + PyType_Ready(&g->ty.type); return ((PyObject *)g); } @@ -943,18 +979,18 @@ PyObject *gmac_pywrap(PyObject *cobj, gmac *m, unsigned f) gmac_pyobj *g; if (!cobj) cobj = gcmac_pywrap((/*unconst*/ gcmac *)GM_CLASS(m)); else Py_INCREF(cobj); - g = newtype((PyTypeObject *)cobj, 0); - g->nameobj = PyString_FromFormat("%s(keyed)", m->ops->c->name); - g->ty.tp_name = PyString_AS_STRING(g->nameobj); - g->ty.tp_base = gmhash_pytype; + g = newtype((PyTypeObject *)cobj, 0, 0); + g->ty.name = PyString_FromFormat("%s(keyed)", m->ops->c->name); + g->ty.type.tp_name = PyString_AS_STRING(g->ty.name); + g->ty.type.tp_base = gmhash_pytype; Py_INCREF(gmac_pytype); - g->ty.tp_flags = (Py_TPFLAGS_DEFAULT | - Py_TPFLAGS_BASETYPE | - Py_TPFLAGS_HEAPTYPE); - g->ty.tp_alloc = PyType_GenericAlloc; - g->ty.tp_free = 0; - g->ty.tp_new = gmhash_pynew; - PyType_Ready(&g->ty); + g->ty.type.tp_flags = (Py_TPFLAGS_DEFAULT | + Py_TPFLAGS_BASETYPE | + Py_TPFLAGS_HEAPTYPE); + g->ty.type.tp_alloc = PyType_GenericAlloc; + g->ty.type.tp_free = 0; + g->ty.type.tp_new = gmhash_pynew; + PyType_Ready(&g->ty.type); g->m = m; g->f = f; return ((PyObject *)g); @@ -965,7 +1001,6 @@ static void gmac_pydealloc(PyObject *me) if (GMAC_F(me) & f_freeme) GM_DESTROY(GMAC_M(me)); Py_DECREF(me->ob_type); - Py_DECREF(GMAC_NAMEOBJ(me)); PyType_Type.tp_dealloc(me); } @@ -988,7 +1023,7 @@ static PyGetSetDef gcmac_pygetset[] = { }; static PyTypeObject gcmac_pytype_skel = { - PyObject_HEAD_INIT(&PyType_Type) 0, /* Header */ + PyObject_HEAD_INIT(0) 0, /* Header */ "catacomb.GCMAC", /* @tp_name@ */ sizeof(gchash_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -1019,7 +1054,7 @@ static PyTypeObject gcmac_pytype_skel = { 0, /* @tp_richcompare@ */ 0, /* @tp_weaklistoffset@ */ 0, /* @tp_iter@ */ - 0, /* @tp_iternexr@ */ + 0, /* @tp_iternext@ */ 0, /* @tp_methods@ */ 0, /* @tp_members@ */ gcmac_pygetset, /* @tp_getset@ */ @@ -1036,7 +1071,7 @@ static PyTypeObject gcmac_pytype_skel = { }; static PyTypeObject gmac_pytype_skel = { - PyObject_HEAD_INIT(&PyType_Type) 0, /* Header */ + PyObject_HEAD_INIT(0) 0, /* Header */ "catacomb.GMAC", /* @tp_name@ */ sizeof(gmac_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -1067,7 +1102,7 @@ static PyTypeObject gmac_pytype_skel = { 0, /* @tp_richcompare@ */ 0, /* @tp_weaklistoffset@ */ 0, /* @tp_iter@ */ - 0, /* @tp_iternexr@ */ + 0, /* @tp_iternext@ */ 0, /* @tp_methods@ */ 0, /* @tp_members@ */ 0, /* @tp_getset@ */ @@ -1084,7 +1119,7 @@ static PyTypeObject gmac_pytype_skel = { }; static PyTypeObject gmhash_pytype_skel = { - PyObject_HEAD_INIT(&PyType_Type) 0, /* Header */ + PyObject_HEAD_INIT(0) 0, /* Header */ "catacomb.GMACHash", /* @tp_name@ */ sizeof(ghash_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -1115,7 +1150,7 @@ static PyTypeObject gmhash_pytype_skel = { 0, /* @tp_richcompare@ */ 0, /* @tp_weaklistoffset@ */ 0, /* @tp_iter@ */ - 0, /* @tp_iternexr@ */ + 0, /* @tp_iternext@ */ 0, /* @tp_methods@ */ 0, /* @tp_members@ */ 0, /* @tp_getset@ */