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);
}
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); \
}
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);
}