[Fontconfig] fontconfig: Branch 'master' - 2 commits

Akira TAGOH tagoh at kemper.freedesktop.org
Mon Jun 12 05:28:11 UTC 2017


 src/fclang.c         |   14 ++++-
 test/Makefile.am     |    4 +
 test/test-bz131804.c |  136 +++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 152 insertions(+), 2 deletions(-)

New commits:
commit 7940ada7a89115455b493e64f961e9c3d2cc5045
Author: Akira TAGOH <akira at tagoh.org>
Date:   Mon Jun 12 13:36:56 2017 +0900

    Add a testcase for Bug#131804

diff --git a/test/Makefile.am b/test/Makefile.am
index df12587..1332981 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -39,6 +39,10 @@ test_bz89617_CFLAGS = \
 test_bz89617_LDADD = $(top_builddir)/src/libfontconfig.la
 TESTS += test-bz89617
 
+check_PROGRAMS += test-bz131804
+test_bz131804_LDADD = $(top_builddir)/src/libfontconfig.la
+TESTS += test-bz131804
+
 noinst_PROGRAMS = $(check_PROGRAMS)
 
 if !OS_WIN32
diff --git a/test/test-bz131804.c b/test/test-bz131804.c
new file mode 100644
index 0000000..f89756b
--- /dev/null
+++ b/test/test-bz131804.c
@@ -0,0 +1,136 @@
+/*
+ * fontconfig/test/test-bz89617.c
+ *
+ * Copyright © 2000 Keith Packard
+ * Copyright © 2015 Akira TAGOH
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of the author(s) not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission.  The authors make no
+ * representations about the suitability of this software for any purpose.  It
+ * is provided "as is" without express or implied warranty.
+ *
+ * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+#include <stdio.h>
+#include <fontconfig/fontconfig.h>
+
+FcLangResult
+comp(const FcChar8 *l1, const FcChar8 *l2)
+{
+    FcLangSet *ls1, *ls2;
+    FcLangResult result;
+
+    ls1 = FcLangSetCreate();
+    ls2 = FcLangSetCreate();
+    FcLangSetAdd(ls1, l1);
+    FcLangSetAdd(ls2, l2);
+
+    result = FcLangSetCompare(ls1, ls2);
+    FcLangSetDestroy(ls1);
+    FcLangSetDestroy(ls2);
+
+    return result;
+}
+
+int
+main(void)
+{
+    FcLangResult result;
+    int i = 1;
+
+    /* 1 */
+    if (comp((const FcChar8 *)"ku-am", (const FcChar8 *)"ku-iq") != FcLangDifferentTerritory)
+	return i;
+    i++;
+    /* 2 */
+    if (comp((const FcChar8 *)"ku-am", (const FcChar8 *)"ku-ir") != FcLangDifferentTerritory)
+	return i;
+    i++;
+    /* 3 */
+    if (comp((const FcChar8 *)"ku-am", (const FcChar8 *)"ku-tr") != FcLangDifferentTerritory)
+	return i;
+    i++;
+    /* 4 */
+    if (comp((const FcChar8 *)"ku-iq", (const FcChar8 *)"ku-ir") != FcLangDifferentTerritory)
+	return i;
+    i++;
+    /* 5 */
+    if (comp((const FcChar8 *)"ku-iq", (const FcChar8 *)"ku-tr") != FcLangDifferentTerritory)
+	return i;
+    i++;
+    /* 6 */
+    if (comp((const FcChar8 *)"ku-ir", (const FcChar8 *)"ku-tr") != FcLangDifferentTerritory)
+	return i;
+    i++;
+    /* 7 */
+    if (comp((const FcChar8 *)"ps-af", (const FcChar8 *)"ps-pk") != FcLangDifferentTerritory)
+	return i;
+    i++;
+    /* 8 */
+    if (comp((const FcChar8 *)"ti-er", (const FcChar8 *)"ti-et") != FcLangDifferentTerritory)
+	return i;
+    i++;
+    /* 9 */
+    if (comp((const FcChar8 *)"zh-cn", (const FcChar8 *)"zh-hk") != FcLangDifferentTerritory)
+	return i;
+    i++;
+    /* 10 */
+    if (comp((const FcChar8 *)"zh-cn", (const FcChar8 *)"zh-mo") != FcLangDifferentTerritory)
+	return i;
+    i++;
+    /* 11 */
+    if (comp((const FcChar8 *)"zh-cn", (const FcChar8 *)"zh-sg") != FcLangDifferentTerritory)
+	return i;
+    i++;
+    /* 12 */
+    if (comp((const FcChar8 *)"zh-cn", (const FcChar8 *)"zh-tw") != FcLangDifferentTerritory)
+	return i;
+    i++;
+    /* 13 */
+    if (comp((const FcChar8 *)"zh-hk", (const FcChar8 *)"zh-mo") != FcLangDifferentTerritory)
+	return i;
+    i++;
+    /* 14 */
+    if (comp((const FcChar8 *)"zh-hk", (const FcChar8 *)"zh-sg") != FcLangDifferentTerritory)
+	return i;
+    i++;
+    /* 15 */
+    if (comp((const FcChar8 *)"zh-hk", (const FcChar8 *)"zh-tw") != FcLangDifferentTerritory)
+	return i;
+    i++;
+    /* 16 */
+    if (comp((const FcChar8 *)"zh-mo", (const FcChar8 *)"zh-sg") != FcLangDifferentTerritory)
+	return i;
+    i++;
+    /* 17 */
+    if (comp((const FcChar8 *)"zh-mo", (const FcChar8 *)"zh-tw") != FcLangDifferentTerritory)
+	return i;
+    i++;
+    /* 18 */
+    if (comp((const FcChar8 *)"zh-sg", (const FcChar8 *)"zh-tw") != FcLangDifferentTerritory)
+	return i;
+    i++;
+    /* 19 */
+    if (comp((const FcChar8 *)"mn-mn", (const FcChar8 *)"mn-cn") != FcLangDifferentTerritory)
+	return i;
+    i++;
+    /* 20 */
+    if (comp((const FcChar8 *)"pap-an", (const FcChar8 *)"pap-aw") != FcLangDifferentTerritory)
+	return i;
+    i++;
+
+    return 0;
+}
+
+
commit b0a5b4b48e9c94bcebe902fb88fbe447f2ccd04e
Author: Florent Rougon <f.rougon at free.fr>
Date:   Thu Jun 8 09:34:53 2017 +0200

    FcLangSetCompare(): fix bug when two charsets come from different "buckets"
    
    In fcLangCountrySets, it may happen that two charsets for the same
    language but different territories are found in different FcChar32
    "buckets" (different "columns" on the same line). This is currently the
    case for the following pairs:
    
      mn-cn  and mn-mn
      pap-an and pap-aw
    
    The FcLangSetCompare() code so far used to return FcLangDifferentLang
    instead of FcLangDifferentTerritory when comparing:
    
      an FcLangSet containing only mn-cn with one containing only mn-mn
    
    or
    
      an FcLangSet containing only pap-an with one containing only pap-aw
    
    This commit fixes this problem.

diff --git a/src/fclang.c b/src/fclang.c
index dbbe721..18a373c 100644
--- a/src/fclang.c
+++ b/src/fclang.c
@@ -680,6 +680,7 @@ FcLangSetCompare (const FcLangSet *lsa, const FcLangSet *lsb)
 {
     int		    i, j, count;
     FcLangResult    best, r;
+    FcChar32 aInCountrySet, bInCountrySet;
 
     count = FC_MIN (lsa->map_size, lsb->map_size);
     count = FC_MIN (NUM_LANG_SET_MAP, count);
@@ -688,13 +689,22 @@ FcLangSetCompare (const FcLangSet *lsa, const FcLangSet *lsb)
 	    return FcLangEqual;
     best = FcLangDifferentLang;
     for (j = 0; j < NUM_COUNTRY_SET; j++)
+    {
+	aInCountrySet = 0;
+	bInCountrySet = 0;
+
 	for (i = 0; i < count; i++)
-	    if ((lsa->map[i] & fcLangCountrySets[j][i]) &&
-		(lsb->map[i] & fcLangCountrySets[j][i]))
+	{
+	    aInCountrySet |= lsa->map[i] & fcLangCountrySets[j][i];
+	    bInCountrySet |= lsb->map[i] & fcLangCountrySets[j][i];
+
+	    if (aInCountrySet && bInCountrySet)
 	    {
 		best = FcLangDifferentTerritory;
 		break;
 	    }
+	}
+    }
     if (lsa->extra)
     {
 	r = FcLangSetCompareStrSet (lsb, lsa->extra);


More information about the Fontconfig mailing list