commit:     1a3bd54dd8283bae00506af7336bd048c1542f82
Author:     Mike Gilbert <floppym <AT> gentoo <DOT> org>
AuthorDate: Mon May 28 18:45:54 2018 +0000
Commit:     Mike Gilbert <floppym <AT> gentoo <DOT> org>
CommitDate: Mon May 28 18:46:22 2018 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=1a3bd54d

media-gfx/fontforge: fix python3.6 compat

Closes: https://bugs.gentoo.org/646278
Package-Manager: Portage-2.3.40_p4, Repoman-2.3.9_p236

 .../fontforge/files/20170731-PyMem_Free.patch      | 197 +++++++++++++++++++++
 media-gfx/fontforge/fontforge-20170731-r4.ebuild   | 121 +++++++++++++
 2 files changed, 318 insertions(+)

diff --git a/media-gfx/fontforge/files/20170731-PyMem_Free.patch 
b/media-gfx/fontforge/files/20170731-PyMem_Free.patch
new file mode 100644
index 00000000000..48301dabb2f
--- /dev/null
+++ b/media-gfx/fontforge/files/20170731-PyMem_Free.patch
@@ -0,0 +1,197 @@
+From b6089f11bd7534c9aa38b875ef1e830fc3b898b4 Mon Sep 17 00:00:00 2001
+From: Jeremy Tan <[email protected]>
+Date: Wed, 13 Sep 2017 17:22:18 +0800
+Subject: [PATCH] python: Use PyMem_Free wherever PyArg_ParseTuple+es is used
+
+https://docs.python.org/2.0/ext/parseTuple.html
+
+diff --git a/fontforge/python.c b/fontforge/python.c
+index 5d6820c40..c6d7aca2b 100644
+--- a/fontforge/python.c
++++ b/fontforge/python.c
+@@ -607,7 +607,13 @@ return( NULL );
+       }
+     }
+ 
+-    if ( !SetPrefs((char *) prefname,&val,NULL)) {
++    bool succeeded = SetPrefs((char *) prefname,&val,NULL);
++    if (val.type == v_str && val.u.sval) {
++        PyMem_Free(val.u.sval);
++        val.u.sval = NULL;
++    }
++
++    if (!succeeded) {
+       PyErr_Format(PyExc_NameError, "Unknown preference item in SetPrefs: 
%s", prefname );
+ return( NULL );
+     }
+@@ -728,7 +734,7 @@ static PyObject *PyFF_UnicodeFromName(PyObject 
*UNUSED(self), PyObject *args) {
+ return( NULL );
+ 
+     ret = Py_BuildValue("i", UniFromName((char *) name, ui_none,&custom));
+-    free(name);
++    PyMem_Free(name);
+ return( ret );
+ }
+ 
+@@ -1361,12 +1367,14 @@ Py_RETURN_NONE;                        /* Well, that 
was pointless */
+     if ( import==Py_None )
+       import=NULL;
+     else if ( !PyCallable_Check(import) ) {
++      PyMem_Free(name);
+       PyErr_Format(PyExc_TypeError, "First argument is not callable" );
+ return( NULL );
+     }
+     if ( export==Py_None )
+       export=NULL;
+     else if ( !PyCallable_Check(export) ) {
++      PyMem_Free(name);
+       PyErr_Format(PyExc_TypeError, "Second argument is not callable" );
+ return( NULL );
+     }
+@@ -1472,7 +1480,7 @@ static PyObject *PyFF_logError(PyObject *UNUSED(self), 
PyObject *args) {
+     if ( !PyArg_ParseTuple(args,"es","UTF-8", &msg) )
+ return( NULL );
+     LogError(msg);
+-    free(msg);
++    PyMem_Free(msg);
+ Py_RETURN_NONE;
+ }
+ 
+@@ -1486,6 +1494,8 @@ static PyObject *PyFF_postError(PyObject *UNUSED(self), 
PyObject *args) {
+ return( NULL );
+     if( showPythonErrors )
+         ff_post_error(title,msg);             /* Prints to stderr if no ui */
++    PyMem_Free(title);
++    PyMem_Free(msg);
+ Py_RETURN_NONE;
+ }
+ 
+@@ -1494,6 +1504,8 @@ static PyObject *PyFF_postNotice(PyObject *UNUSED(self), 
PyObject *args) {
+     if ( !PyArg_ParseTuple(args,"eses","UTF-8", &title, "UTF-8", &msg) )
+ return( NULL );
+     ff_post_notice(title,msg);                /* Prints to stderr if no ui */
++    PyMem_Free(title);
++    PyMem_Free(msg);
+ Py_RETURN_NONE;
+ }
+ 
+@@ -1511,8 +1523,8 @@ return( NULL );
+ return( NULL );
+ 
+     ret = ff_open_filename(title,def,filter);
+-    free(title);
+-    free(def);
++    PyMem_Free(title);
++    PyMem_Free(def);
+     if ( ret==NULL )
+ Py_RETURN_NONE;
+     reto = DECODE_UTF8(ret,strlen(ret),NULL);
+@@ -1534,8 +1546,8 @@ return( NULL );
+ return( NULL );
+ 
+     ret = ff_save_filename(title,def,filter);
+-    free(title);
+-    free(def);
++    PyMem_Free(title);
++    PyMem_Free(def);
+     if ( ret==NULL )
+ Py_RETURN_NONE;
+     reto = DECODE_UTF8(ret,strlen(ret),NULL);
+@@ -1558,8 +1570,8 @@ return( NULL );
+ return( NULL );
+     if ( !PySequence_Check(answero) || STRING_CHECK(answero)) {
+       PyErr_Format(PyExc_TypeError, "Expected a tuple of strings for the 
third argument");
+-      free(title);
+-      free(quest);
++      PyMem_Free(title);
++      PyMem_Free(quest);
+ return( NULL );
+     }
+     cnt = PySequence_Size(answero);
+@@ -1568,16 +1580,16 @@ return( NULL );
+       cancel = cnt-1;
+     if ( cancel<0 || cancel>=cnt || def<0 || def>=cnt ) {
+       PyErr_Format(PyExc_ValueError, "Value out of bounds for 4th or 5th 
argument");
+-      free(title);
+-      free(quest);
++      PyMem_Free(title);
++      PyMem_Free(quest);
+       free(answers);
+ return( NULL );
+     }
+     for ( i=0; i<cnt; ++i ) {
+         PyObject *utf8_name = PYBYTES_UTF8(PySequence_GetItem(answero,i));
+       if ( utf8_name==NULL ) {
+-          free(title);
+-          free(quest);
++          PyMem_Free(title);
++          PyMem_Free(quest);
+           FreeStringArray( i, answers );
+ return( NULL );
+       }
+@@ -1587,8 +1599,8 @@ return( NULL );
+     answers[cnt] = NULL;
+ 
+     ret = ff_ask(title,(const char **) answers,def,cancel,quest);
+-    free(title);
+-    free(quest);
++    PyMem_Free(title);
++    PyMem_Free(quest);
+     FreeStringArray( cnt, answers );
+ return( Py_BuildValue("i",ret));
+ }
+@@ -1608,23 +1620,23 @@ return( NULL );
+ return( NULL );
+     if ( !PySequence_Check(answero) || STRING_CHECK(answero)) {
+       PyErr_Format(PyExc_TypeError, "Expected a tuple of strings for the 
third argument");
+-      free(title);
+-      free(quest);
++      PyMem_Free(title);
++      PyMem_Free(quest);
+ return( NULL );
+     }
+     cnt = PySequence_Size(answero);
+     answers = calloc(cnt+1, sizeof(char *));
+     if ( def<0 || def>=cnt ) {
+       PyErr_Format(PyExc_ValueError, "Value out of bounds for 4th argument");
+-      free(title);
+-      free(quest);
++      PyMem_Free(title);
++      PyMem_Free(quest);
+ return( NULL );
+     }
+     for ( i=0; i<cnt; ++i ) {
+         PyObject *utf8_name = PYBYTES_UTF8(PySequence_GetItem(answero,i));
+         if ( utf8_name==NULL ) {
+-          free(title);
+-          free(quest);
++          PyMem_Free(title);
++          PyMem_Free(quest);
+           FreeStringArray( i, answers );
+ return( NULL );
+       }
+@@ -1634,8 +1646,8 @@ return( NULL );
+     answers[cnt] = NULL;
+ 
+     ret = ff_choose(title,(const char **) answers,cnt,def,quest);
+-    free(title);
+-    free(quest);
++    PyMem_Free(title);
++    PyMem_Free(quest);
+     FreeStringArray( cnt, answers );
+ return( Py_BuildValue("i",ret));
+ }
+@@ -1654,8 +1666,8 @@ return( NULL );
+ return( NULL );
+ 
+     ret = ff_ask_string(title,def,quest);
+-    free(title);
+-    free(quest);
++    PyMem_Free(title);
++    PyMem_Free(quest);
+     free(def);
+     if ( ret==NULL )
+ Py_RETURN_NONE;
+-- 
+2.17.0
+

diff --git a/media-gfx/fontforge/fontforge-20170731-r4.ebuild 
b/media-gfx/fontforge/fontforge-20170731-r4.ebuild
new file mode 100644
index 00000000000..7316a2594e4
--- /dev/null
+++ b/media-gfx/fontforge/fontforge-20170731-r4.ebuild
@@ -0,0 +1,121 @@
+# Copyright 1999-2018 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=6
+
+PYTHON_COMPAT=( python{2_7,3_4,3_5,3_6} )
+
+inherit gnome2-utils python-single-r1 xdg-utils
+
+DESCRIPTION="postscript font editor and converter"
+HOMEPAGE="http://fontforge.github.io/";
+SRC_URI="https://github.com/fontforge/fontforge/releases/download/${PV}/fontforge-dist-${PV}.tar.xz";
+
+LICENSE="BSD GPL-3+"
+SLOT="0"
+KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~ia64 ~mips ~ppc ~ppc64 ~s390 ~sh 
~sparc ~x86 ~amd64-fbsd ~x86-fbsd ~amd64-linux ~x86-linux ~ppc-macos ~x86-macos"
+IUSE="cairo truetype-debugger gif gtk jpeg png +python readline test tiff svg 
unicode X"
+
+RESTRICT="!test? ( test )"
+
+REQUIRED_USE="
+       cairo? ( png )
+       python? ( ${PYTHON_REQUIRED_USE} )
+       test? ( png python )
+"
+
+RDEPEND="
+       dev-libs/libltdl:0
+       dev-libs/libxml2:2=
+       >=media-libs/freetype-2.3.7:2=
+       cairo? (
+               >=x11-libs/cairo-1.6:0=
+               x11-libs/pango:0=
+       )
+       gif? ( media-libs/giflib:0= )
+       jpeg? ( virtual/jpeg:0 )
+       png? ( media-libs/libpng:0= )
+       tiff? ( media-libs/tiff:0= )
+       truetype-debugger? ( 
>=media-libs/freetype-2.3.8:2[fontforge,-bindist(-)] )
+       gtk? ( x11-libs/gtk+:2= )
+       python? ( ${PYTHON_DEPS} )
+       readline? ( sys-libs/readline:0= )
+       unicode? ( media-libs/libuninameslist:0= )
+       X? (
+               x11-libs/libX11:0=
+               x11-libs/libXi:0=
+               >=x11-libs/pango-1.10:0=[X]
+       )
+       !media-gfx/pfaedit
+"
+DEPEND="${RDEPEND}
+       sys-devel/gettext
+       virtual/pkgconfig
+       X? ( x11-base/xorg-proto )
+"
+
+# Needs keywording on many arches.
+#      zeromq? (
+#              >=net-libs/czmq-2.2.0:0=
+#              >=net-libs/zeromq-4.0.4:0=
+#      )
+
+S="${WORKDIR}/fontforge-2.0.${PV}"
+
+PATCHES=(
+       "${FILESDIR}"/20170731-startnoui-FindOrMakeEncoding.patch
+       "${FILESDIR}"/20170731-tilepath.patch
+       "${FILESDIR}"/20170731-gethex-unaligned.patch
+       "${FILESDIR}"/20170731-PyMem_Free.patch
+)
+
+pkg_setup() {
+       use python && python-single-r1_pkg_setup
+}
+
+src_configure() {
+       local myeconfargs=(
+               --disable-static
+               $(use_enable truetype-debugger freetype-debugger 
"${EPREFIX}/usr/include/freetype2/internal4fontforge")
+               $(use_enable gtk gtk2-use)
+               $(use_enable python python-extension)
+               $(use_enable python python-scripting)
+               --enable-tile-path
+               --enable-gb12345
+               $(use_with cairo)
+               $(use_with gif giflib)
+               $(use_with jpeg libjpeg)
+               $(use_with png libpng)
+               $(use_with readline libreadline)
+               --without-libspiro
+               $(use_with tiff libtiff)
+               $(use_with unicode libuninameslist)
+               #$(use_with zeromq libzmq)
+               --without-libzmq
+               $(use_with X x)
+       )
+       econf "${myeconfargs[@]}"
+}
+
+src_compile() {
+       # Build system deps are broken
+       emake -C plugins
+       emake
+}
+
+src_install() {
+       default
+       find "${D}" -name '*.la' -delete || die
+}
+
+pkg_postrm() {
+       gnome2_icon_cache_update
+       xdg_desktop_database_update
+       xdg_mimeinfo_database_update
+}
+
+pkg_postinst() {
+       gnome2_icon_cache_update
+       xdg_desktop_database_update
+       xdg_mimeinfo_database_update
+}

Reply via email to