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 *
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;
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,
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)
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