X-Git-Url: https://git.distorted.org.uk/~mdw/catacomb-python/blobdiff_plain/b16009b07a50a62a03e7a7c781e9d777ba4450ad..d91d53e0e3b769955cc2adfb8aed493ce84367d3:/pgen.c diff --git a/pgen.c b/pgen.c index 6e9584c..27d1f9c 100644 --- a/pgen.c +++ b/pgen.c @@ -125,8 +125,10 @@ static PyObject *pfilt_pyint(PyObject *me) return (rc); } +#ifdef PY2 static PyObject *pfilt_pylong(PyObject *me) { return (mp_topylong(PFILT_F(me)->m)); } +#endif static PyObject *pfget_x(PyObject *me, void *hunoz) { return (mp_pywrap(MP_COPY(PFILT_F(me)->m))); } @@ -156,7 +158,9 @@ static const PyNumberMethods pfilt_pynumber = { 0, /* @nb_add@ */ 0, /* @nb_subtract@ */ 0, /* @nb_multiply@ */ +#ifdef PY2 0, /* @nb_divide@ */ +#endif 0, /* @nb_remainder@ */ 0, /* @nb_divmod@ */ 0, /* @nb_power@ */ @@ -170,17 +174,23 @@ static const PyNumberMethods pfilt_pynumber = { 0, /* @nb_and@ */ 0, /* @nb_xor@ */ 0, /* @nb_or@ */ +#ifdef PY2 0, /* @nb_coerce@ */ +#endif pfilt_pyint, /* @nb_int@ */ - pfilt_pylong, /* @nb_long@ */ + PY23(pfilt_pylong, 0), /* @nb_long@ */ 0, /* @nb_float@ */ +#ifdef PY2 0, /* @nb_oct@ */ 0, /* @nb_hex@ */ +#endif 0, /* @nb_inplace_add@ */ 0, /* @nb_inplace_subtract@ */ 0, /* @nb_inplace_multiply@ */ +#ifdef PY2 0, /* @nb_inplace_divide@ */ +#endif 0, /* @nb_inplace_remainder@ */ 0, /* @nb_inplace_power@ */ 0, /* @nb_inplace_lshift@ */ @@ -195,8 +205,8 @@ static const PyNumberMethods pfilt_pynumber = { 0, /* @nb_inplace_true_divide@ */ }; -static PyTypeObject pfilt_pytype_skel = { - PyObject_HEAD_INIT(0) 0, /* Header */ +static const PyTypeObject pfilt_pytype_skel = { + PyVarObject_HEAD_INIT(0, 0) /* Header */ "PrimeFilter", /* @tp_name@ */ sizeof(pfilt_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -329,8 +339,8 @@ static const PyMethodDef rabin_pymethods[] = { { 0 } }; -static PyTypeObject rabin_pytype_skel = { - PyObject_HEAD_INIT(0) 0, /* Header */ +static const PyTypeObject rabin_pytype_skel = { + PyVarObject_HEAD_INIT(0, 0) /* Header */ "RabinMiller", /* @tp_name@ */ sizeof(rabin_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -419,7 +429,7 @@ static void pgevent_pydealloc(PyObject *me) } while (0) static PyObject *peget_name(PyObject *me, void *hunoz) - { PGEVENT_CHECK(me); return (PyString_FromString(PGEVENT_EV(me)->name)); } + { PGEVENT_CHECK(me); return (TEXT_FROMSTR(PGEVENT_EV(me)->name)); } static PyObject *peget_x(PyObject *me, void *hunoz) { PGEVENT_CHECK(me); return (mp_pywrap(MP_COPY(PGEVENT_EV(me)->m))); } @@ -466,8 +476,8 @@ static const PyGetSetDef pgevent_pygetset[] = { { 0 } }; -static PyTypeObject pgevent_pytype_skel = { - PyObject_HEAD_INIT(0) 0, /* Header */ +static const PyTypeObject pgevent_pytype_skel = { + PyVarObject_HEAD_INIT(0, 0) /* Header */ "PrimeGenEvent", /* @tp_name@ */ sizeof(pgevent_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -645,8 +655,8 @@ static const PyMethodDef pgev_pymethods[] = { { 0 } }; -static PyTypeObject pgev_pytype_skel = { - PyObject_HEAD_INIT(0) 0, /* Header */ +static const PyTypeObject pgev_pytype_skel = { + PyVarObject_HEAD_INIT(0, 0) /* Header */ "PrimeGenBuiltinHandler", /* @tp_name@ */ sizeof(pgev_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -719,8 +729,8 @@ static const PyGetSetDef pgstep_pygetset[] = { { 0 } }; -static PyTypeObject pgstep_pytype_skel = { - PyObject_HEAD_INIT(0) 0, /* Header */ +static const PyTypeObject pgstep_pytype_skel = { + PyVarObject_HEAD_INIT(0, 0) /* Header */ "PrimeGenStepper", /* @tp_name@ */ sizeof(pgstep_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -801,8 +811,8 @@ static const PyGetSetDef pgjump_pygetset[] = { { 0 } }; -static PyTypeObject pgjump_pytype_skel = { - PyObject_HEAD_INIT(0) 0, /* Header */ +static const PyTypeObject pgjump_pytype_skel = { + PyVarObject_HEAD_INIT(0, 0) /* Header */ "PrimeGenJumper", /* @tp_name@ */ sizeof(pgjump_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -863,8 +873,8 @@ end: return ((PyObject *)rc); } -static PyTypeObject pgtest_pytype_skel = { - PyObject_HEAD_INIT(0) 0, /* Header */ +static const PyTypeObject pgtest_pytype_skel = { + PyVarObject_HEAD_INIT(0, 0) /* Header */ "PrimeGenTester", /* @tp_name@ */ sizeof(pgtest_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -911,6 +921,83 @@ static PyTypeObject pgtest_pytype_skel = { 0 /* @tp_is_gc@ */ }; +/*----- Prime iteration ---------------------------------------------------*/ + +static PyTypeObject *piter_pytype; + +typedef struct piter_pyobj { + PyObject_HEAD + primeiter i; +} piter_pyobj; +#define PITER_I(o) (&((piter_pyobj *)(o))->i) + +static PyObject *piter_pynew(PyTypeObject *ty, PyObject *arg, PyObject *kw) +{ + piter_pyobj *rc; + mp *n = 0; + static const char *const kwlist[] = { "start", 0 }; + + if (!PyArg_ParseTupleAndKeywords(arg, kw, "|O&:new", KWLIST, convmp, &n)) + return (0); + rc = (piter_pyobj *)ty->tp_alloc(ty, 0); + primeiter_create(&rc->i, n); + return ((PyObject *)rc); +} + +static void piter_pydealloc(PyObject *me) + { primeiter_destroy(PITER_I(me)); FREEOBJ(me); } + +static PyObject *piter_pynext(PyObject *me) + { return (mp_pywrap(primeiter_next(PITER_I(me), 0))); } + +static const PyTypeObject piter_pytype_skel = { + PyVarObject_HEAD_INIT(0, 0) /* Header */ + "PrimeIter", /* @tp_name@ */ + sizeof(piter_pyobj), /* @tp_basicsize@ */ + 0, /* @tp_itemsize@ */ + + piter_pydealloc, /* @tp_dealloc@ */ + 0, /* @tp_print@ */ + 0, /* @tp_getattr@ */ + 0, /* @tp_setattr@ */ + 0, /* @tp_compare@ */ + 0, /* @tp_repr@ */ + 0, /* @tp_as_number@ */ + 0, /* @tp_as_sequence@ */ + 0, /* @tp_as_mapping@ */ + 0, /* @tp_hash@ */ + 0, /* @tp_call@ */ + 0, /* @tp_str@ */ + 0, /* @tp_getattro@ */ + 0, /* @tp_setattro@ */ + 0, /* @tp_as_buffer@ */ + Py_TPFLAGS_DEFAULT | /* @tp_flags@ */ + Py_TPFLAGS_BASETYPE, + + /* @tp_doc@ */ + "PrimeIter([start = N]): Prime-number iterator.", + + 0, /* @tp_traverse@ */ + 0, /* @tp_clear@ */ + 0, /* @tp_richcompare@ */ + 0, /* @tp_weaklistoffset@ */ + PyObject_SelfIter, /* @tp_iter@ */ + piter_pynext, /* @tp_iternext@ */ + 0, /* @tp_methods@ */ + 0, /* @tp_members@ */ + 0, /* @tp_getset@ */ + 0, /* @tp_base@ */ + 0, /* @tp_dict@ */ + 0, /* @tp_descr_get@ */ + 0, /* @tp_descr_set@ */ + 0, /* @tp_dictoffset@ */ + 0, /* @tp_init@ */ + PyType_GenericAlloc, /* @tp_alloc@ */ + piter_pynew, /* @tp_new@ */ + 0, /* @tp_free@ */ + 0 /* @tp_is_gc@ */ +}; + /*----- Prime generation functions ----------------------------------------*/ void pgenerr(struct excinfo *exc) @@ -1051,6 +1138,12 @@ end: /*----- Global stuff ------------------------------------------------------*/ +static const struct nameval consts[] = { + CONST(PGEN_PASS), CONST(PGEN_FAIL), CONST(PGEN_BEGIN), CONST(PGEN_TRY), + CONST(PGEN_DONE), CONST(PGEN_ABORT), + { 0 } +}; + static const PyMethodDef methods[] = { #define METHNAME(name) meth_##name KWMETH(pgen, @@ -1080,6 +1173,7 @@ void pgen_pyinit(void) INITTYPE(pgstep, pgev); INITTYPE(pgjump, pgev); INITTYPE(pgtest, pgev); + INITTYPE(piter, root); addmethods(methods); } @@ -1098,6 +1192,8 @@ void pgen_pyinsert(PyObject *mod) INSERT("pgen_stdev", pgev_stdev(pgen_ev)); INSERT("pgen_spinev", pgev_stdev(pgen_evspin)); INSERT("pgen_subev", pgev_stdev(pgen_subev)); + INSERT("PrimeIter", piter_pytype); + setconstants(mod, consts); } /*----- That's all, folks -------------------------------------------------*/