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@xxxxxxxxx> 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@xxxxxxx> 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);
_______________________________________________ Fontconfig mailing list Fontconfig@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/fontconfig