configure.ac | 50 ++++++++++++++++++++++++++------------------------ src/fccfg.c | 27 ++++++++++++++++----------- src/fcint.h | 1 + src/fcxml.c | 37 ++++++++++++++++++++++++++++++++++++- 4 files changed, 79 insertions(+), 36 deletions(-) New commits: commit ab5b535704fbcab43040d80100cb19cb33f6219d Author: Akira TAGOH <akira@xxxxxxxxx> Date: Tue Jul 2 18:54:29 2013 +0900 Ignore scandir() check on mingw diff --git a/configure.ac b/configure.ac index a2b1c72..aeb1513 100644 --- a/configure.ac +++ b/configure.ac @@ -161,35 +161,37 @@ AC_LINK_IFELSE([AC_LANG_SOURCE([[ AC_MSG_RESULT([yes]) AC_DEFINE([HAVE_POSIX_FADVISE], [1], [Define to 1 if you have the 'posix_fadvise' function.]) ],[AC_MSG_RESULT([no])]) -AC_MSG_CHECKING([for scandir]) -AC_LINK_IFELSE([AC_LANG_SOURCE([[ - #include <dirent.h> - int comp(const struct dirent **, const struct dirent **); - int comp(const struct dirent **a, const struct dirent **b) { return 0; } - int main(void) { - struct dirent **d; - return scandir(".", &d, 0, &comp) >= 0; - } - ]])],[ - AC_MSG_RESULT([yes]) - AC_DEFINE([HAVE_SCANDIR], [1], [Define to 1 if you have the 'scandir' function.]) - ],[ - AC_LINK_IFELSE([AC_LANG_SOURCE([[ - #include <dirent.h> - int comp(const void *, const void *); - int comp(const void *a, const void *b) { return 0; } - int main(void) { - struct dirent **d; - return scandir(".", &d, 0, &comp) >= 0; - } +if test "$os_win32" = "no"; then + AC_MSG_CHECKING([for scandir]) + AC_LINK_IFELSE([AC_LANG_SOURCE([[ + #include <dirent.h> + int comp(const struct dirent **, const struct dirent **); + int comp(const struct dirent **a, const struct dirent **b) { return 0; } + int main(void) { + struct dirent **d; + return scandir(".", &d, 0, &comp) >= 0; + } ]])],[ AC_MSG_RESULT([yes]) - AC_DEFINE([HAVE_SCANDIR_VOID_P], [1], [Define to 1 if you have the 'scandir' function with int (* compar)(const void *, const void *)]) + AC_DEFINE([HAVE_SCANDIR], [1], [Define to 1 if you have the 'scandir' function.]) ],[ - AC_MSG_ERROR([ + AC_LINK_IFELSE([AC_LANG_SOURCE([[ + #include <dirent.h> + int comp(const void *, const void *); + int comp(const void *a, const void *b) { return 0; } + int main(void) { + struct dirent **d; + return scandir(".", &d, 0, &comp) >= 0; + } + ]])],[ + AC_MSG_RESULT([yes]) + AC_DEFINE([HAVE_SCANDIR_VOID_P], [1], [Define to 1 if you have the 'scandir' function with int (* compar)(const void *, const void *)]) + ],[ + AC_MSG_ERROR([ *** No scandir function available.]) + ]) ]) - ]) +fi CFLAGS="$fc_saved_CFLAGS" # commit 0907589a79d05aeed9bc6bff783838b0eb25736b Author: Akira TAGOH <akira@xxxxxxxxx> Date: Fri Jun 28 15:54:38 2013 +0900 Fix the behavior of intermixed tests end edits in match to get the following recipe working: <match> <test1 .../> <edit1 .../> <test2 .../> <edit2 .../> </match> as: <match> <test1 .../> </edit1 .../> </match> <match> <test1 .../> <test2 .../> <edit2 .../> </match> diff --git a/src/fccfg.c b/src/fccfg.c index 9c0be24..3cf31e8 100644 --- a/src/fccfg.c +++ b/src/fccfg.c @@ -226,20 +226,25 @@ FcSubstDestroy (FcSubst *s) FcExpr * FcConfigAllocExpr (FcConfig *config) { - if (!config->expr_pool || config->expr_pool->next == config->expr_pool->end) - { - FcExprPage *new_page; + FcExpr *e; - new_page = malloc (sizeof (FcExprPage)); - if (!new_page) - return 0; + if (!config->expr_pool || config->expr_pool->next == config->expr_pool->end) + { + FcExprPage *new_page; - new_page->next_page = config->expr_pool; - new_page->next = new_page->exprs; - config->expr_pool = new_page; - } + new_page = malloc (sizeof (FcExprPage)); + if (!new_page) + return 0; + + new_page->next_page = config->expr_pool; + new_page->next = new_page->exprs; + config->expr_pool = new_page; + } + + e = config->expr_pool->next++; + FcRefInit (&e->ref, 1); - return config->expr_pool->next++; + return e; } FcConfig * diff --git a/src/fcint.h b/src/fcint.h index 0137dee..92777ea 100644 --- a/src/fcint.h +++ b/src/fcint.h @@ -240,6 +240,7 @@ typedef struct _FcExprName { typedef struct _FcExpr { FcOp op; + FcRef ref; union { int ival; double dval; diff --git a/src/fcxml.c b/src/fcxml.c index 7e03230..4b8049f 100644 --- a/src/fcxml.c +++ b/src/fcxml.c @@ -223,11 +223,24 @@ FcExprCreateOp (FcConfig *config, FcExpr *left, FcOp op, FcExpr *right) return e; } +static FcExpr * +FcExprReference (FcExpr *e) +{ + if (e) + { + FcRefInc (&e->ref); + } + + return e; +} + static void FcExprDestroy (FcExpr *e) { if (!e) return; + if (FcRefDec (&e->ref) != 1) + return; switch (FC_OP_GET_OP (e->op)) { case FcOpInteger: break; @@ -727,6 +740,21 @@ FcTestCreate (FcConfigParse *parse, return test; } +static FcTest * +FcTestDuplicate (FcTest *test) +{ + FcTest *retval = (FcTest *) malloc (sizeof (FcTest)); + + if (retval) + { + memcpy (retval, test, sizeof (FcTest)); + retval->next = NULL; + retval->expr = FcExprReference (test->expr); + } + + return retval; +} + static FcEdit * FcEditCreate (FcConfigParse *parse, FcObject object, @@ -2401,7 +2429,7 @@ FcParseMatch (FcConfigParse *parse) FcVStack *vstack; FcBool tested = FcFalse; FcSubstStack *sstack = NULL; - int len, pos = 0; + int len, pos = 0, i; kind_name = FcConfigGetAttribute (parse, "target"); if (!kind_name) @@ -2438,6 +2466,13 @@ FcParseMatch (FcConfigParse *parse) test = vstack->u.test; vstack->tag = FcVStackNone; tested = FcTrue; + for (i = 0; i < pos; i++) + { + FcTest *t = FcTestDuplicate(test); + + t->next = sstack[i].test; + sstack[i].test = t; + } break; case FcVStackEdit: /* due to the reverse traversal, <edit> node appears faster than _______________________________________________ Fontconfig mailing list Fontconfig@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/fontconfig