From abb617ff62cffc1ec67f152f2f939621f439f807 Mon Sep 17 00:00:00 2001 From: Benjamin Trigona-Harany Date: Thu, 15 Mar 2018 23:39:57 -0700 Subject: [PATCH] libraries/tre: Add Python 3 support. Signed-off-by: Benjamin Trigona-Harany --- libraries/tre/python3.patch | 278 +++++++++++++++++++++++++++++++++++ libraries/tre/tre.SlackBuild | 30 ++-- 2 files changed, 298 insertions(+), 10 deletions(-) create mode 100644 libraries/tre/python3.patch diff --git a/libraries/tre/python3.patch b/libraries/tre/python3.patch new file mode 100644 index 0000000000..fb94678b19 --- /dev/null +++ b/libraries/tre/python3.patch @@ -0,0 +1,278 @@ +--- tre-python.c 2009-09-19 07:38:42.000000000 -0700 ++++ /home/ben/Downloads/tre-python.c 2018-03-15 23:32:07.540064053 -0700 +@@ -86,9 +86,9 @@ + TreFuzzynessObject *self = (TreFuzzynessObject*)obj; + PyObject *o; + +- o = PyString_FromFormat("%s(delcost=%d,inscost=%d,maxcost=%d,subcost=%d," ++ o = PyUnicode_FromFormat("%s(delcost=%d,inscost=%d,maxcost=%d,subcost=%d," + "maxdel=%d,maxerr=%d,maxins=%d,maxsub=%d)", +- self->ob_type->tp_name, self->ap.cost_del, ++ Py_TYPE(self)->tp_name, self->ap.cost_del, + self->ap.cost_ins, self->ap.max_cost, + self->ap.cost_subst, self->ap.max_del, + self->ap.max_err, self->ap.max_ins, +@@ -118,8 +118,7 @@ + }; + + static PyTypeObject TreFuzzynessType = { +- PyObject_HEAD_INIT(NULL) +- 0, /* ob_size */ ++ PyVarObject_HEAD_INIT(NULL, 0) + TRE_MODULE ".Fuzzyness", /* tp_name */ + sizeof(TreFuzzynessObject), /* tp_basicsize */ + 0, /* tp_itemsize */ +@@ -193,7 +192,7 @@ + } + + static PyObject * +-PyTreMatch_groupi(PyObject *obj, int gn) ++PyTreMatch_groupi(PyObject *obj, Py_ssize_t gn) + { + TreMatchObject *self = (TreMatchObject*)obj; + PyObject *result; +@@ -220,7 +219,7 @@ + PyObject *result; + long gn; + +- gn = PyInt_AsLong(grpno); ++ gn = PyLong_AsLong(grpno); + + if (PyErr_Occurred()) + return NULL; +@@ -277,8 +276,7 @@ + }; + + static PyTypeObject TreMatchType = { +- PyObject_HEAD_INIT(NULL) +- 0, /* ob_size */ ++ PyVarObject_HEAD_INIT(NULL, 0) + TRE_MODULE ".Match", /* tp_name */ + sizeof(TreMatchObject), /* tp_basicsize */ + 0, /* tp_itemsize */ +@@ -337,9 +335,18 @@ + char *targ; + size_t tlen; + +- if (!PyArg_ParseTuple(args, "SO!|i:match", &pstring, &TreFuzzynessType, ++ if (PyTuple_Size(args) > 0 && PyUnicode_Check(PyTuple_GetItem(args, 0))) ++ { ++ if (!PyArg_ParseTuple(args, "UO!|i:search", &pstring, &TreFuzzynessType, + &fz, &eflags)) +- return NULL; ++ return NULL; ++ } ++ else ++ { ++ if (!PyArg_ParseTuple(args, "SO!|i:search", &pstring, &TreFuzzynessType, ++ &fz, &eflags)) ++ return NULL; ++ } + + mo = newTreMatchObject(); + if (mo == NULL) +@@ -347,22 +354,35 @@ + + nsub = self->rgx.re_nsub + 1; + pm = PyMem_New(regmatch_t, nsub); +- if (pm != NULL) +- { +- mo->am.nmatch = nsub; +- mo->am.pmatch = pm; +- } +- else ++ if (!pm) + { +- /* XXX */ + Py_DECREF(mo); +- return NULL; ++ return PyErr_NoMemory(); + } + +- targ = PyString_AsString(pstring); +- tlen = PyString_Size(pstring); ++ mo->am.nmatch = nsub; ++ mo->am.pmatch = pm; + +- rc = tre_reganexec(&self->rgx, targ, tlen, &mo->am, fz->ap, eflags); ++ if (PyUnicode_Check(pstring)) ++ { ++ Py_ssize_t len = PyUnicode_GetSize(pstring); ++ wchar_t *buf = calloc(sizeof(wchar_t), len); ++ if(!buf) ++ { ++ Py_DECREF(mo); ++ return PyErr_NoMemory(); ++ } ++ PyUnicode_AsWideChar(pstring, buf, len); ++ rc = tre_regawnexec(&self->rgx, buf, len, &mo->am, fz->ap, eflags); ++ free(buf); ++ } ++ else ++ { ++ targ = PyBytes_AsString(pstring); ++ tlen = PyBytes_Size(pstring); ++ ++ rc = tre_reganexec(&self->rgx, targ, tlen, &mo->am, fz->ap, eflags); ++ } + + if (PyErr_Occurred()) + { +@@ -392,7 +412,7 @@ + + static PyMethodDef TrePattern_methods[] = { + { "search", (PyCFunction)PyTrePattern_search, METH_VARARGS, +- "try to match against given string, returning " TRE_MODULE ".match object " ++ "try to search in the given string, returning " TRE_MODULE ".match object " + "or None on failure" }, + {NULL, NULL} + }; +@@ -411,8 +431,7 @@ + } + + static PyTypeObject TrePatternType = { +- PyObject_HEAD_INIT(NULL) +- 0, /* ob_size */ ++ PyVarObject_HEAD_INIT(NULL, 0) + TRE_MODULE ".Pattern", /* tp_name */ + sizeof(TrePatternObject), /* tp_basicsize */ + 0, /* tp_itemsize */ +@@ -445,7 +464,7 @@ + }; + + static TrePatternObject * +-newTrePatternObject(PyObject *args) ++newTrePatternObject(void) + { + TrePatternObject *self; + +@@ -460,19 +479,43 @@ + PyTre_ncompile(PyObject *self, PyObject *args) + { + TrePatternObject *rv; +- char *pattern; ++ PyObject *upattern = NULL; ++ char *pattern = NULL; + int pattlen; + int cflags = 0; + int rc; + +- if (!PyArg_ParseTuple(args, "s#|i:compile", &pattern, &pattlen, &cflags)) +- return NULL; ++ if (PyTuple_Size(args) > 0 && PyUnicode_Check(PyTuple_GetItem(args, 0))) ++ { ++ if (!PyArg_ParseTuple(args, "U|i:compile", &upattern, &cflags)) ++ return NULL; ++ } ++ else ++ { ++ if (!PyArg_ParseTuple(args, "s#|i:compile", &pattern, &pattlen, &cflags)) ++ return NULL; ++ } + +- rv = newTrePatternObject(args); ++ rv = newTrePatternObject(); + if (rv == NULL) + return NULL; + +- rc = tre_regncomp(&rv->rgx, (char*)pattern, pattlen, cflags); ++ if (upattern != NULL) ++ { ++ Py_ssize_t len = PyUnicode_GetSize(upattern); ++ wchar_t *buf = calloc(sizeof(wchar_t), len); ++ if(!buf) ++ { ++ Py_DECREF(rv); ++ return PyErr_NoMemory(); ++ } ++ PyUnicode_AsWideChar(upattern, buf, len); ++ rc = tre_regwncomp(&rv->rgx, buf, len, cflags); ++ free(buf); ++ } ++ else ++ rc = tre_regncomp(&rv->rgx, (char*)pattern, pattlen, cflags); ++ + if (rc != REG_OK) + { + if (!PyErr_Occurred()) +@@ -491,9 +534,8 @@ + { NULL, NULL } + }; + +-static char *tre_doc = +-"Python module for TRE library\n\nModule exports " +-"the only function: compile"; ++ ++#define tre_doc "Python module for TRE library\n\nModule exports the only function: compile" + + static struct _tre_flags { + char *name; +@@ -510,40 +552,57 @@ + { NULL, 0 } + }; + ++ ++static struct PyModuleDef moduledef = { ++ PyModuleDef_HEAD_INIT, ++ TRE_MODULE ".Module", /* m_name */ ++ tre_doc, /* m_doc */ ++ -1, /* m_size */ ++ tre_methods, /* m_methods */ ++ NULL, /* m_reload */ ++ NULL, /* m_traverse */ ++ NULL, /* m_clear */ ++ NULL, /* m_free */ ++}; ++ ++ + PyMODINIT_FUNC +-inittre(void) ++PyInit_tre(void) + { + PyObject *m; + struct _tre_flags *fp; + + if (PyType_Ready(&TreFuzzynessType) < 0) +- return; ++ return NULL; + if (PyType_Ready(&TreMatchType) < 0) +- return; ++ return NULL; + if (PyType_Ready(&TrePatternType) < 0) +- return; ++ return NULL; + + /* Create the module and add the functions */ +- m = Py_InitModule3(TRE_MODULE, tre_methods, tre_doc); ++ ++ m = PyModule_Create (&moduledef); ++ + if (m == NULL) +- return; ++ return NULL; + + Py_INCREF(&TreFuzzynessType); + if (PyModule_AddObject(m, "Fuzzyness", (PyObject*)&TreFuzzynessType) < 0) +- return; ++ return NULL; + Py_INCREF(&TreMatchType); + if (PyModule_AddObject(m, "Match", (PyObject*)&TreMatchType) < 0) +- return; ++ return NULL; + Py_INCREF(&TrePatternType); + if (PyModule_AddObject(m, "Pattern", (PyObject*)&TrePatternType) < 0) +- return; ++ return NULL; + ErrorObject = PyErr_NewException(TRE_MODULE ".Error", NULL, NULL); + Py_INCREF(ErrorObject); + if (PyModule_AddObject(m, "Error", ErrorObject) < 0) +- return; ++ return NULL; + + /* Insert the flags */ + for (fp = tre_flags; fp->name != NULL; fp++) + if (PyModule_AddIntConstant(m, fp->name, fp->val) < 0) +- return; ++ return NULL; ++ return m; + } diff --git a/libraries/tre/tre.SlackBuild b/libraries/tre/tre.SlackBuild index 504818c7c1..54560e0c0c 100644 --- a/libraries/tre/tre.SlackBuild +++ b/libraries/tre/tre.SlackBuild @@ -29,7 +29,7 @@ TAG=${TAG:-_SBo} if [ -z "$ARCH" ]; then case "$( uname -m )" in - i?86) ARCH=i486 ;; + i?86) ARCH=i586 ;; arm*) ARCH=arm ;; *) ARCH=$( uname -m ) ;; esac @@ -40,8 +40,8 @@ TMP=${TMP:-/tmp/SBo} PKG=$TMP/package-$PRGNAM OUTPUT=${OUTPUT:-/tmp} -if [ "$ARCH" = "i486" ]; then - SLKCFLAGS="-O2 -march=i486 -mtune=i686" +if [ "$ARCH" = "i586" ]; then + SLKCFLAGS="-O2 -march=i586 -mtune=i686" LIBDIRSUFFIX="" elif [ "$ARCH" = "i686" ]; then SLKCFLAGS="-O2 -march=i686 -mtune=i686" @@ -60,14 +60,14 @@ rm -rf $PKG mkdir -p $TMP $PKG $OUTPUT cd $TMP rm -rf $PRGNAM-$VERSION -tar xvf $CWD/$PRGNAM-$VERSION.tar.?z* +tar xvf $CWD/$PRGNAM-$VERSION.tar.bz2 cd $PRGNAM-$VERSION chown -R root:root . find -L . \ - \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 -o -perm 511 \) \ - -exec chmod 755 {} \; -o \ - \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \ - -exec chmod 644 {} \; + \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \ + -o -perm 511 \) -exec chmod 755 {} \; -o \ + \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \ + -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \; CFLAGS="$SLKCFLAGS" \ ./configure \ @@ -78,14 +78,24 @@ CFLAGS="$SLKCFLAGS" \ --mandir=/usr/man \ --build=$ARCH-slackware-linux -make make install-strip DESTDIR=$PKG +cp -r python python3 cd python CFLAGS="-I$PKG/usr/include" \ LDFLAGS="-L$PKG/usr/lib$LIBDIRSUFFIX" \ python setup.py install --root=$PKG -cd .. +cd - + +if $(python3 -c 'import sys' 2>/dev/null); then + cd python3 + # Python 3 support from https://github.com/ahomansikka/tre/commit/d6a0220 + patch -p0 < $CWD/python3.patch + CFLAGS="-I$PKG/usr/include" \ + LDFLAGS="-L$PKG/usr/lib$LIBDIRSUFFIX" \ + python3 setup.py install --root=$PKG + cd - +fi find $PKG/usr/man -type f -exec gzip -9 {} \; for i in $( find $PKG/usr/man -type l ) ; do ln -s $( readlink $i ).gz $i.gz ; rm $i ; done