From 8526bbd230c598da6c4890fc8888546f3365b84b Mon Sep 17 00:00:00 2001 From: Mark Wooding Date: Sat, 19 Oct 2019 20:02:08 +0100 Subject: [PATCH] util.c: Use Python's machinery for handling 64-bit integers. Where available. --- util.c | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/util.c b/util.c index cfd4115..027033e 100644 --- a/util.c +++ b/util.c @@ -28,6 +28,8 @@ #include "catacomb-python.h" +/* #undef HAVE_LONG_LONG */ + /*----- External values ---------------------------------------------------*/ static PyObject *modname = 0; @@ -42,12 +44,17 @@ PyObject *getulong(unsigned long w) return (PyLong_FromUnsignedLong(w)); } +#ifndef HAVE_LONG_LONG static PyObject *i32 = 0; static int init_i32(void) { if (!i32 && (i32 = PyInt_FromLong(32)) == 0) return (-1); return (0); } +#endif PyObject *getk64(kludge64 u) { +#ifdef HAVE_LONG_LONG + return (PyLong_FromUnsignedLongLong(GET64(unsigned PY_LONG_LONG, u))); +#else PyObject *i = 0, *j = 0, *t; PyObject *rc = 0; @@ -63,6 +70,7 @@ end: if (i) Py_DECREF(i); if (j) Py_DECREF(j); return (rc); +#endif } PyObject *getbool(int b) @@ -146,11 +154,22 @@ end: int convk64(PyObject *o, void *pp) { - PyObject *i = 0, *t; + PyObject *i = 0; int rc = 0; +#if HAVE_LONG_LONG + unsigned PY_LONG_LONG t; +#else + PyObject *t; uint32 lo, hi; +#endif if (!o) VALERR("can't delete"); +#if HAVE_LONG_LONG + if ((i = PyNumber_Long(o)) == 0) goto end; + t = PyLong_AsUnsignedLongLong(i); + if (t == (unsigned PY_LONG_LONG)-1 && PyErr_Occurred()) goto end; + ASSIGN64(*(kludge64 *)pp, t); +#else if (init_i32()) goto end; if ((i = PyNumber_Int(o)) == 0) goto end; lo = PyInt_AsUnsignedLongMask(i); @@ -161,7 +180,9 @@ int convk64(PyObject *o, void *pp) Py_DECREF(i); i = t; if (PyObject_IsTrue(i)) VALERR("out of range"); SET64(*(kludge64 *)pp, hi, lo); +#endif rc = 1; + end: if (i) Py_DECREF(i); return (rc); -- 2.11.0