PyTypeObject *mp_pytype = 0;
PyTypeObject *gf_pytype = 0;
+#ifndef PyLong_SHIFT
+# define PyLong_SHIFT SHIFT
+#endif
+
+#ifndef PyLong_MASK
+# define PyLong_MASK MASK
+#endif
+
+STATIC_ASSERT(MPW_BITS >= PyLong_SHIFT,
+ "Catacomb's limbs are now narrower than than Python's!");
+
mp *mp_frompylong(PyObject *obj)
{
unsigned long bits;
sz = Py_SIZE(l);
if (sz < 0) sz = -sz;
- assert(MPW_BITS >= SHIFT);
- bits = (unsigned long)sz * SHIFT;
+ bits = (unsigned long)sz * PyLong_SHIFT;
w = (bits + MPW_BITS - 1)/MPW_BITS;
x = mp_new(w, Py_SIZE(l) < 0 ? MP_NEG : 0);
p = x->v;
for (i = 0; i < sz; i++) {
r |= (mpd)l->ob_digit[i] << b;
- b += SHIFT;
+ b += PyLong_SHIFT;
while (b >= MPW_BITS) {
*p++ = MPW(r);
r >>= MPW_BITS;
PyObject *mp_topylong(mp *x)
{
unsigned long bits = mp_bits(x);
- int sz = (bits + SHIFT - 1)/SHIFT;
+ int sz = (bits + PyLong_SHIFT - 1)/PyLong_SHIFT;
PyLongObject *l = _PyLong_New(sz);
mpd r = 0;
int b = 0;
mpw *p = x->v;
int i = 0;
- assert(MPW_BITS >= SHIFT);
while (i < sz && p < x->vl) {
r |= (mpd)*p++ << b;
b += MPW_BITS;
- while (i < sz && b >= SHIFT) {
- l->ob_digit[i++] = r & MASK;
- r >>= SHIFT;
- b -= SHIFT;
+ while (i < sz && b >= PyLong_SHIFT) {
+ l->ob_digit[i++] = r & PyLong_MASK;
+ r >>= PyLong_SHIFT;
+ b -= PyLong_SHIFT;
}
}
while (i < sz && r) {
- l->ob_digit[i++] = r & MASK;
- r >>= SHIFT;
+ l->ob_digit[i++] = r & PyLong_MASK;
+ r >>= PyLong_SHIFT;
}
Py_SIZE(l) = (x->f & MP_NEG) ? -sz : sz;
return ((PyObject *)l);
{
mp *x;
- if (PyString_Check(o)) {
+ if (TEXT_CHECK(o)) {
mptext_stringctx sc;
mp *x;
- sc.buf = PyString_AS_STRING(o);
- sc.lim = sc.buf + PyString_GET_SIZE(o);
+ size_t sz;
+ TEXT_PTRLEN(o, sc.buf, sz); sc.lim = sc.buf + sz;
x = mp_read(MP_NEW, radix, &mptext_stringops, &sc);
if (!x) return (0);
if (sc.buf < sc.lim) { MP_DROP(x); return (0); }
size_t postlen = post ? strlen(post) : 0;
char *p;
MP_COPY(x);
- o = PyString_FromStringAndSize(0, len + 1 + xprelen + prelen + postlen);
- p = PyString_AS_STRING(o);
+ TEXT_PREPAREWRITE(o, p, len + 1 + xprelen + prelen + postlen);
sc.buf = p;
if (xpre) { memcpy(sc.buf, xpre, xprelen); sc.buf += xprelen; }
if (MP_NEGP(x)) { *sc.buf++ = '-'; x = mp_neg(x, x); }
mp_write(x, radix, &mptext_stringops, &sc);
if (post) { memcpy(sc.buf, post, postlen); sc.buf += postlen; }
MP_DROP(x);
- _PyString_Resize(&o, sc.buf - p);
+ TEXT_DONEWRITE(o, sc.buf - p);
return (o);
}
return ((PyObject *)zz);
}
-long mphash(mp *x)
+Py_hash_t mphash(mp *x)
{
PyObject *l = mp_topylong(x);
- long h = PyObject_Hash(l);
+ Py_hash_t h = PyObject_Hash(l);
Py_DECREF(l); return (h);
}
-static long mp_pyhash(PyObject *me) { return (mphash(MP_X(me))); }
+static Py_hash_t mp_pyhash(PyObject *me) { return (mphash(MP_X(me))); }
static PyObject *mpmeth_jacobi(PyObject *me, PyObject *arg)
{
PyObject *arg, PyObject *kw) \
{ \
long len = -1; \
- static const char *const kwlist[] = { "len", 0 }; \
+ static const char *const kwlist[] = { "len", 0 }; \
PyObject *rc = 0; \
\
if (!PyArg_ParseTupleAndKeywords(arg, kw, "|l:" #name, \
if (!len) len = 1; \
} \
rc = bytestring_pywrap(0, len); \
- mp_##name(MP_X(me), PyString_AS_STRING(rc), len); \
+ mp_##name(MP_X(me), BIN_PTR(rc), len); \
end: \
return (rc); \
}
static PyObject *ty##meth_frombuf(PyObject *me, PyObject *arg) \
{ \
buf b; \
- char *p; \
- Py_ssize_t sz; \
+ struct bin in; \
PyObject *rc = 0; \
mp *x; \
\
- if (!PyArg_ParseTuple(arg, "s#:frombuf", &p, &sz)) goto end; \
- buf_init(&b, p, sz); \
+ if (!PyArg_ParseTuple(arg, "O&:frombuf", convbin, &in)) goto end; \
+ buf_init(&b, (/*unconst*/ void *)in.p, in.sz); \
if ((x = buf_getmp(&b)) == 0) VALERR("malformed data"); \
rc = Py_BuildValue("(NN)", ty##_pywrap(x), \
bytestring_pywrapbuf(&b)); \
x = MP_X(me);
n = mp_octets(x) + 3;
rc = bytestring_pywrap(0, n);
- buf_init(&b, PyString_AS_STRING(rc), n);
+ buf_init(&b, BIN_PTR(rc), n);
buf_putmp(&b, x);
assert(BOK(&b));
- _PyString_Resize(&rc, BLEN(&b));
+ BIN_SETLEN(rc, BLEN(&b));
return (rc);
}
#define LOADOP(pre, name) \
static PyObject *pre##meth_##name(PyObject *me, PyObject *arg) \
{ \
- char *p; \
- Py_ssize_t len; \
- if (!PyArg_ParseTuple(arg, "s#:" #name, &p, &len)) return (0); \
- return (pre##_pywrap(mp_##name(MP_NEW, p, len))); \
+ struct bin in; \
+ if (!PyArg_ParseTuple(arg, "O&:" #name, convbin, &in)) return (0); \
+ return (pre##_pywrap(mp_##name(MP_NEW, in.p, in.sz))); \
}
LOADOP(mp, loadl)
LOADOP(mp, loadb)