X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/catacomb-python/blobdiff_plain/89157adcd6833444063825f8d8a08a5111c63518..2b1672ca4d5d93f1cbad3acbd728d3fa32986cdb:/algorithms.c diff --git a/algorithms.c b/algorithms.c index b672498..3a618d0 100644 --- a/algorithms.c +++ b/algorithms.c @@ -35,21 +35,31 @@ PyTypeObject *keysz_pytype; PyTypeObject *keyszany_pytype, *keyszrange_pytype, *keyszset_pytype; PyObject *sha_pyobj, *has160_pyobj; +#ifndef KSZ_OPMASK +# define KSZ_OPMASK 0x1f +#endif + +#ifndef KSZ_16BIT +# define KSZ_16BIT 0x20 +#endif + PyObject *keysz_pywrap(const octet *k) { - switch (k[0]) { + unsigned op = *k++; +#define ARG(i) (op&KSZ_16BIT ? LOAD16(k + 2*(i)) : k[i]) + switch (op&KSZ_OPMASK) { case KSZ_ANY: { keysz_pyobj *o = PyObject_New(keysz_pyobj, keyszany_pytype); - o->dfl = k[1]; + o->dfl = ARG(0); return ((PyObject *)o); } break; case KSZ_RANGE: { keyszrange_pyobj *o = PyObject_New(keyszrange_pyobj, keyszrange_pytype); - o->dfl = k[1]; - o->min = k[2]; - o->max = k[3]; - o->mod = k[4]; + o->dfl = ARG(0); + o->min = ARG(1); + o->max = ARG(2); + o->mod = ARG(3); if (!o->mod) o->mod = 1; return ((PyObject *)o); } break; @@ -57,16 +67,17 @@ PyObject *keysz_pywrap(const octet *k) keyszset_pyobj *o = PyObject_New(keyszset_pyobj, keyszset_pytype); int i, n; - o->dfl = k[1]; - for (i = 0; k[i + 1]; i++) ; + o->dfl = ARG(0); + for (i = 0; ARG(i); i++) ; n = i; o->set = PyTuple_New(n); for (i = 0; i < n; i++) - PyTuple_SET_ITEM(o->set, i, PyInt_FromLong(k[i + 1])); + PyTuple_SET_ITEM(o->set, i, PyInt_FromLong(ARG(i))); return ((PyObject *)o); } break; default: abort(); } +#undef ARG } static PyObject *keyszany_pynew(PyTypeObject *ty, @@ -230,7 +241,7 @@ static PyMemberDef keyszset_pymembers[] = { static PyTypeObject keysz_pytype_skel = { PyObject_HEAD_INIT(0) 0, /* Header */ - "catacomb.KeySZ", /* @tp_name@ */ + "KeySZ", /* @tp_name@ */ sizeof(keysz_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -278,7 +289,7 @@ static PyTypeObject keysz_pytype_skel = { static PyTypeObject keyszany_pytype_skel = { PyObject_HEAD_INIT(0) 0, /* Header */ - "catacomb.KeySZAny", /* @tp_name@ */ + "KeySZAny", /* @tp_name@ */ sizeof(keysz_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -326,7 +337,7 @@ static PyTypeObject keyszany_pytype_skel = { static PyTypeObject keyszrange_pytype_skel = { PyObject_HEAD_INIT(0) 0, /* Header */ - "catacomb.KeySZRange", /* @tp_name@ */ + "KeySZRange", /* @tp_name@ */ sizeof(keyszrange_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -375,7 +386,7 @@ sizes, and requires the key length to be a multiple of some value.", static PyTypeObject keyszset_pytype_skel = { PyObject_HEAD_INIT(0) 0, /* Header */ - "catacomb.KeySZSet", /* @tp_name@ */ + "KeySZSet", /* @tp_name@ */ sizeof(keyszset_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -487,7 +498,7 @@ PyObject *gccipher_pywrap(gccipher *cc) g->ty.ht_type.tp_alloc = PyType_GenericAlloc; g->ty.ht_type.tp_free = 0; g->ty.ht_type.tp_new = gcipher_pynew; - PyType_Ready(&g->ty.ht_type); + typeready(&g->ty.ht_type); return ((PyObject *)g); } @@ -607,7 +618,7 @@ static PyMethodDef gcipher_pymethods[] = { static PyTypeObject gccipher_pytype_skel = { PyObject_HEAD_INIT(0) 0, /* Header */ - "catacomb.GCCipher", /* @tp_name@ */ + "GCCipher", /* @tp_name@ */ sizeof(gccipher_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -655,7 +666,7 @@ static PyTypeObject gccipher_pytype_skel = { static PyTypeObject gcipher_pytype_skel = { PyObject_HEAD_INIT(0) 0, /* Header */ - "catacomb.GCipher", /* @tp_name@ */ + "GCipher", /* @tp_name@ */ sizeof(gcipher_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -731,7 +742,7 @@ PyObject *gchash_pywrap(gchash *ch) g->ty.ht_type.tp_alloc = PyType_GenericAlloc; g->ty.ht_type.tp_free = 0; g->ty.ht_type.tp_new = ghash_pynew; - PyType_Ready(&g->ty.ht_type); + typeready(&g->ty.ht_type); return ((PyObject *)g); } @@ -842,7 +853,7 @@ static PyMethodDef ghash_pymethods[] = { static PyTypeObject gchash_pytype_skel = { PyObject_HEAD_INIT(0) 0, /* Header */ - "catacomb.GCHash", /* @tp_name@ */ + "GCHash", /* @tp_name@ */ sizeof(gchash_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -890,7 +901,7 @@ static PyTypeObject gchash_pytype_skel = { static PyTypeObject ghash_pytype_skel = { PyObject_HEAD_INIT(0) 0, /* Header */ - "catacomb.GHash", /* @tp_name@ */ + "GHash", /* @tp_name@ */ sizeof(ghash_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -986,7 +997,7 @@ PyObject *gcmac_pywrap(gcmac *cm) g->ty.ht_type.tp_alloc = PyType_GenericAlloc; g->ty.ht_type.tp_free = 0; g->ty.ht_type.tp_new = gmac_pynew; - PyType_Ready(&g->ty.ht_type); + typeready(&g->ty.ht_type); return ((PyObject *)g); } @@ -1006,7 +1017,7 @@ PyObject *gmac_pywrap(PyObject *cobj, gmac *m, unsigned f) g->ty.ht_type.tp_alloc = PyType_GenericAlloc; g->ty.ht_type.tp_free = 0; g->ty.ht_type.tp_new = gmhash_pynew; - PyType_Ready(&g->ty.ht_type); + typeready(&g->ty.ht_type); g->m = m; g->f = f; return ((PyObject *)g); @@ -1040,7 +1051,7 @@ static PyGetSetDef gcmac_pygetset[] = { static PyTypeObject gcmac_pytype_skel = { PyObject_HEAD_INIT(0) 0, /* Header */ - "catacomb.GCMAC", /* @tp_name@ */ + "GCMAC", /* @tp_name@ */ sizeof(gchash_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -1088,7 +1099,7 @@ static PyTypeObject gcmac_pytype_skel = { static PyTypeObject gmac_pytype_skel = { PyObject_HEAD_INIT(0) 0, /* Header */ - "catacomb.GMAC", /* @tp_name@ */ + "GMAC", /* @tp_name@ */ sizeof(gmac_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -1136,7 +1147,7 @@ static PyTypeObject gmac_pytype_skel = { static PyTypeObject gmhash_pytype_skel = { PyObject_HEAD_INIT(0) 0, /* Header */ - "catacomb.GMACHash", /* @tp_name@ */ + "GMACHash", /* @tp_name@ */ sizeof(ghash_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -1275,7 +1286,7 @@ static PyObject *gcprp_pywrap(const prpinfo *prp) g->ty.ht_type.tp_alloc = PyType_GenericAlloc; g->ty.ht_type.tp_free = 0; g->ty.ht_type.tp_new = gprp_pynew; - PyType_Ready(&g->ty.ht_type); + typeready(&g->ty.ht_type); return ((PyObject *)g); } @@ -1333,7 +1344,7 @@ static PyMethodDef gprp_pymethods[] = { static PyTypeObject gcprp_pytype_skel = { PyObject_HEAD_INIT(0) 0, /* Header */ - "catacomb.GCPRP", /* @tp_name@ */ + "GCPRP", /* @tp_name@ */ sizeof(gcprp_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -1381,7 +1392,7 @@ static PyTypeObject gcprp_pytype_skel = { static PyTypeObject gprp_pytype_skel = { PyObject_HEAD_INIT(0) 0, /* Header */ - "catacomb.GPRP", /* @tp_name@ */ + "GPRP", /* @tp_name@ */ sizeof(gprp_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */