/* -*-c-*-
- *
- * $Id$
*
* Abstract fields
*
* (c) 2004 Straylight/Edgeware
*/
-/*----- Licensing notice --------------------------------------------------*
+/*----- Licensing notice --------------------------------------------------*
*
* This file is part of the Python interface to Catacomb.
*
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
- *
+ *
* Catacomb/Python is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
+ *
* You should have received a copy of the GNU General Public License
* along with Catacomb/Python; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
static PyObject *field_dopywrap(PyTypeObject *ty, field *f)
{
- field_pyobj *fobj = newtype(ty, 0);
+ field_pyobj *fobj = newtype(ty, 0, f->ops->name);
fobj->f = f;
- fobj->ty.tp_name = (/*unconst*/ char *)f->ops->name;
- fobj->ty.tp_basicsize = sizeof(fe_pyobj);
- fobj->ty.tp_base = fe_pytype;
+ fobj->ty.ht_type.tp_basicsize = sizeof(fe_pyobj);
+ fobj->ty.ht_type.tp_base = fe_pytype;
Py_INCREF(fe_pytype);
- fobj->ty.tp_flags = (Py_TPFLAGS_DEFAULT |
- Py_TPFLAGS_BASETYPE |
- Py_TPFLAGS_CHECKTYPES |
- Py_TPFLAGS_HEAPTYPE);
- fobj->ty.tp_alloc = PyType_GenericAlloc;
- fobj->ty.tp_free = _PyObject_Del;
- fobj->ty.tp_new = fe_pynew;
- PyType_Ready(&fobj->ty);
+ fobj->ty.ht_type.tp_flags = (Py_TPFLAGS_DEFAULT |
+ Py_TPFLAGS_BASETYPE |
+ Py_TPFLAGS_CHECKTYPES |
+ Py_TPFLAGS_HEAPTYPE);
+ fobj->ty.ht_type.tp_alloc = PyType_GenericAlloc;
+ fobj->ty.ht_type.tp_free = 0;
+ fobj->ty.ht_type.tp_new = fe_pynew;
+ typeready(&fobj->ty.ht_type);
return ((PyObject *)fobj);
}
if (FE_PYCHECK(o)) {
if (FE_F(o) != f && !field_samep(FE_F(o), f)) return (0);
- y = FE_X(o);
- }
- if ((x = tomp(o)) != 0) {
+ y = MP_COPY(FE_X(o));
+ } else if ((x = tomp(o)) != 0) {
if (MP_ZEROP(x))
- y = f->zero;
+ y = MP_COPY(f->zero);
else if (MP_EQ(x, MP_ONE))
- y = f->one;
+ y = MP_COPY(f->one);
+ else
+ y = F_IN(f, MP_NEW, x);
+ MP_DROP(x);
}
- if (x) MP_DROP(x);
- if (y) MP_COPY(y);
return (y);
}
}
static long fe_pyhash(PyObject *me)
-{
- long i = mp_tolong(FE_X(me));
- i ^= 0xdcf62d6c; /* random perturbance */
- if (i == -1)
- i = -2;
- return (i);
-}
+ { return (mphash(FE_X(me))); }
static int fe_pycoerce(PyObject **x, PyObject **y)
{
static PyObject *fe_pyint(PyObject *x)
{
long l;
+ PyObject *rc;
mp *xx = F_OUT(FE_F(x), MP_NEW, FE_X(x));
- if (mp_tolong_checked(xx, &l)) { MP_DROP(xx); return (0); }
+ if (!mp_tolong_checked(xx, &l, 0)) rc = PyInt_FromLong(l);
+ else rc = mp_topylong(xx);
MP_DROP(xx);
- return (PyInt_FromLong(l));
+ return (rc);
}
static PyObject *fe_pylong(PyObject *x)
{
mp *xx = F_OUT(FE_F(x), MP_NEW, FE_X(x));
- PyObject *rc = (PyObject *)mp_topylong(xx);
+ PyObject *rc = mp_topylong(xx);
MP_DROP(xx);
return (rc);
}
{
Py_DECREF(FE_FOBJ(me));
MP_DROP(FE_X(me));
- PyObject_DEL(me);
+ FREEOBJ(me);
}
#define UNOP(name, check) \
static PyGetSetDef fe_pygetset[] = {
#define GETSETNAME(op, name) fe##op##_##name
GET (field, "X.field -> field containing X")
- GET (value, "X.value -> `natural' integer representation of X")
- GET (_value, "X._value -> internal integer representation of X")
+ GET (value, "X.value -> `natural' MP/GF representation of X")
+ GET (_value, "X._value -> internal MP/GF representation of X")
#undef GETSETNAME
{ 0 }
};
};
static PyTypeObject fe_pytype_skel = {
- PyObject_HEAD_INIT(&PyType_Type) 0, /* Header */
- "catacomb.FE", /* @tp_name@ */
+ PyObject_HEAD_INIT(0) 0, /* Header */
+ "FE", /* @tp_name@ */
sizeof(fe_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
fe_pyrichcompare, /* @tp_richcompare@ */
0, /* @tp_weaklistoffset@ */
0, /* @tp_iter@ */
- 0, /* @tp_iternexr@ */
+ 0, /* @tp_iternext@ */
fe_pymethods, /* @tp_methods@ */
0, /* @tp_members@ */
fe_pygetset, /* @tp_getset@ */
0, /* @tp_init@ */
PyType_GenericAlloc, /* @tp_alloc@ */
abstract_pynew, /* @tp_new@ */
- _PyObject_Del, /* @tp_free@ */
+ 0, /* @tp_free@ */
0 /* @tp_is_gc@ */
};
};
static PyTypeObject field_pytype_skel = {
- PyObject_HEAD_INIT(&PyType_Type) 0, /* Header */
- "catacomb.Field", /* @tp_name@ */
+ PyObject_HEAD_INIT(0) 0, /* Header */
+ "Field", /* @tp_name@ */
sizeof(field_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
field_pyrichcompare, /* @tp_richcompare@ */
0, /* @tp_weaklistoffset@ */
0, /* @tp_iter@ */
- 0, /* @tp_iternexr@ */
+ 0, /* @tp_iternext@ */
field_pymethods, /* @tp_methods@ */
0, /* @tp_members@ */
field_pygetset, /* @tp_getset@ */
0, /* @tp_init@ */
PyType_GenericAlloc, /* @tp_alloc@ */
abstract_pynew, /* @tp_new@ */
- _PyObject_Del, /* @tp_free@ */
+ 0, /* @tp_free@ */
0 /* @tp_is_gc@ */
};
field *f;
char *kwlist[] = { "p", 0 };
- if (!PyArg_ParseTupleAndKeywords(arg, kw, "O:primefield", kwlist,
+ if (!PyArg_ParseTupleAndKeywords(arg, kw, "O&:primefield", kwlist,
convmp, &xx))
goto end;
if ((f = field_prime(xx)) == 0)
static PyGetSetDef primefield_pygetset[] = {
#define GETSETNAME(op, name) pf##op##_##name
- GET (p, "F.p -> prime field characteristic")
+ GET (p, "F.p -> prime field characteristic")
#undef GETSETNAME
};
static PyTypeObject primefield_pytype_skel = {
- PyObject_HEAD_INIT(&PyType_Type) 0, /* Header */
- "catacomb.PrimeField", /* @tp_name@ */
+ PyObject_HEAD_INIT(0) 0, /* Header */
+ "PrimeField", /* @tp_name@ */
sizeof(field_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
field_pyrichcompare, /* @tp_richcompare@ */
0, /* @tp_weaklistoffset@ */
0, /* @tp_iter@ */
- 0, /* @tp_iternexr@ */
+ 0, /* @tp_iternext@ */
0, /* @tp_methods@ */
0, /* @tp_members@ */
primefield_pygetset, /* @tp_getset@ */
0, /* @tp_init@ */
PyType_GenericAlloc, /* @tp_alloc@ */
primefield_pynew, /* @tp_new@ */
- _PyObject_Del, /* @tp_free@ */
+ 0, /* @tp_free@ */
0 /* @tp_is_gc@ */
};
}
static PyTypeObject niceprimefield_pytype_skel = {
- PyObject_HEAD_INIT(&PyType_Type) 0, /* Header */
- "catacomb.NicePrimeField", /* @tp_name@ */
+ PyObject_HEAD_INIT(0) 0, /* Header */
+ "NicePrimeField", /* @tp_name@ */
sizeof(field_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
field_pyrichcompare, /* @tp_richcompare@ */
0, /* @tp_weaklistoffset@ */
0, /* @tp_iter@ */
- 0, /* @tp_iternexr@ */
+ 0, /* @tp_iternext@ */
0, /* @tp_methods@ */
0, /* @tp_members@ */
0, /* @tp_getset@ */
0, /* @tp_init@ */
PyType_GenericAlloc, /* @tp_alloc@ */
niceprimefield_pynew, /* @tp_new@ */
- _PyObject_Del, /* @tp_free@ */
+ 0, /* @tp_free@ */
0 /* @tp_is_gc@ */
};
static PyGetSetDef binfield_pygetset[] = {
#define GETSETNAME(op, name) bf##op##_##name
- GET (m, "F.m -> field polynomial degree")
+ GET (m, "F.m -> field polynomial degree")
#undef GETSETNAME
{ 0 }
};
static PyTypeObject binfield_pytype_skel = {
- PyObject_HEAD_INIT(&PyType_Type) 0, /* Header */
- "catacomb.BinField", /* @tp_name@ */
+ PyObject_HEAD_INIT(0) 0, /* Header */
+ "BinField", /* @tp_name@ */
sizeof(field_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
field_pyrichcompare, /* @tp_richcompare@ */
0, /* @tp_weaklistoffset@ */
0, /* @tp_iter@ */
- 0, /* @tp_iternexr@ */
+ 0, /* @tp_iternext@ */
0, /* @tp_methods@ */
0, /* @tp_members@ */
binfield_pygetset, /* @tp_getset@ */
0, /* @tp_init@ */
PyType_GenericAlloc, /* @tp_alloc@ */
abstract_pynew, /* @tp_new@ */
- _PyObject_Del, /* @tp_free@ */
+ 0, /* @tp_free@ */
0 /* @tp_is_gc@ */
};
static PyGetSetDef binpolyfield_pygetset[] = {
#define GETSETNAME(op, name) pf##op##_##name
- GET (p, "F.p -> field polynomial")
+ GET (p, "F.p -> field polynomial")
#undef GETSETNAME
{ 0 }
};
static PyTypeObject binpolyfield_pytype_skel = {
- PyObject_HEAD_INIT(&PyType_Type) 0, /* Header */
- "catacomb.BinPolyField", /* @tp_name@ */
+ PyObject_HEAD_INIT(0) 0, /* Header */
+ "BinPolyField", /* @tp_name@ */
sizeof(field_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
field_pyrichcompare, /* @tp_richcompare@ */
0, /* @tp_weaklistoffset@ */
0, /* @tp_iter@ */
- 0, /* @tp_iternexr@ */
+ 0, /* @tp_iternext@ */
0, /* @tp_methods@ */
0, /* @tp_members@ */
binpolyfield_pygetset, /* @tp_getset@ */
0, /* @tp_init@ */
PyType_GenericAlloc, /* @tp_alloc@ */
binpolyfield_pynew, /* @tp_new@ */
- _PyObject_Del, /* @tp_free@ */
+ 0, /* @tp_free@ */
0 /* @tp_is_gc@ */
};
static PyGetSetDef binnormfield_pygetset[] = {
#define GETSETNAME(op, name) pf##op##_##name
- GET (p, "F.p -> field polynomial")
+ GET (p, "F.p -> field polynomial")
#undef GETSETNAME
#define GETSETNAME(op, name) bnf##op##_##name
- GET (beta, "F.beta -> conversion factor")
+ GET (beta, "F.beta -> conversion factor")
#undef GETSETNAME
{ 0 }
};
static PyTypeObject binnormfield_pytype_skel = {
- PyObject_HEAD_INIT(&PyType_Type) 0, /* Header */
- "catacomb.BinNormField", /* @tp_name@ */
+ PyObject_HEAD_INIT(0) 0, /* Header */
+ "BinNormField", /* @tp_name@ */
sizeof(field_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
field_pyrichcompare, /* @tp_richcompare@ */
0, /* @tp_weaklistoffset@ */
0, /* @tp_iter@ */
- 0, /* @tp_iternexr@ */
+ 0, /* @tp_iternext@ */
0, /* @tp_methods@ */
0, /* @tp_members@ */
binnormfield_pygetset, /* @tp_getset@ */
0, /* @tp_init@ */
PyType_GenericAlloc, /* @tp_alloc@ */
binnormfield_pynew, /* @tp_new@ */
- _PyObject_Del, /* @tp_free@ */
+ 0, /* @tp_free@ */
0 /* @tp_is_gc@ */
};
qd.p = p;
qd.e = 0;
if ((f = field_parse(&qd)) == 0)
- SYNERR(qd.e);
+ VALERR(qd.e);
rc = Py_BuildValue("(Ns)", field_pywrap(f), qd.p);
end:
return (rc);
static PyMethodDef methods[] = {
#define METHNAME(func) meth_##func
- METH (_Field_parse, "parse(STR) -> F, REST")
+ METH (_Field_parse, "parse(STR) -> F, REST")
#undef METHNAME
{ 0 }
};