X-Git-Url: https://git.distorted.org.uk/~mdw/catacomb-python/blobdiff_plain/4648f560097060c1eaeb07ba0752e6a036c07ab9..d91d53e0e3b769955cc2adfb8aed493ce84367d3:/pgen.c diff --git a/pgen.c b/pgen.c index 5c8592f..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@ */ @@ -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))); } @@ -911,6 +921,83 @@ static const 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) @@ -1086,6 +1173,7 @@ void pgen_pyinit(void) INITTYPE(pgstep, pgev); INITTYPE(pgjump, pgev); INITTYPE(pgtest, pgev); + INITTYPE(piter, root); addmethods(methods); } @@ -1104,6 +1192,7 @@ 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); }