aboutsummaryrefslogtreecommitdiff
path: root/fontconfig
diff options
context:
space:
mode:
Diffstat (limited to 'fontconfig')
-rw-r--r--fontconfig/Makefile.am1
-rw-r--r--fontconfig/configure.ac1
-rw-r--r--fontconfig/doc/fontconfig-user.sgml2
-rw-r--r--fontconfig/fonts.dtd4
-rw-r--r--fontconfig/src/fccfg.c10
-rw-r--r--fontconfig/src/fcdbg.c6
-rw-r--r--fontconfig/src/fcint.h1
-rwxr-xr-xfontconfig/src/fcxml.c57
8 files changed, 77 insertions, 5 deletions
diff --git a/fontconfig/Makefile.am b/fontconfig/Makefile.am
index 84c91acbb..8510f556f 100644
--- a/fontconfig/Makefile.am
+++ b/fontconfig/Makefile.am
@@ -59,7 +59,6 @@ MAINTAINERCLEANFILES = \
$(srcdir)/mkinstalldirs \
`find "$(srcdir)" -type f -name Makefile.in -print`
-pkgconfigdir=$(libdir)/pkgconfig
pkgconfig_DATA = fontconfig.pc
baseconfigdir = $(BASECONFIGDIR)
diff --git a/fontconfig/configure.ac b/fontconfig/configure.ac
index f8a41c934..4996b7936 100644
--- a/fontconfig/configure.ac
+++ b/fontconfig/configure.ac
@@ -68,6 +68,7 @@ AC_LIBTOOL_WIN32_DLL
AM_PROG_LIBTOOL
AC_PROG_MAKE_SET
PKG_PROG_PKG_CONFIG
+m4_ifdef([PKG_INSTALLDIR], [PKG_INSTALLDIR], AC_SUBST([pkgconfigdir], ${libdir}/pkgconfig))
AC_MSG_CHECKING([for RM macro])
_predefined_rm=`make -p -f /dev/null 2>/dev/null|grep '^RM ='|sed -e 's/^RM = //'`
diff --git a/fontconfig/doc/fontconfig-user.sgml b/fontconfig/doc/fontconfig-user.sgml
index 90e246b69..eeff69add 100644
--- a/fontconfig/doc/fontconfig-user.sgml
+++ b/fontconfig/doc/fontconfig-user.sgml
@@ -425,6 +425,8 @@ with "same" binding using the value from the matched pattern element.
"prepend_first" Insert at head of list Insert at head of list
"append" Append after matching Append at end of list
"append_last" Append at end of list Append at end of list
+ "delete" Delete matching value Delete all values
+ "delete_all" Delete all values Delete all values
</programlisting>
</para></refsect2>
<refsect2><title><literal>&lt;int&gt;</literal>, <literal>&lt;double&gt;</literal>, <literal>&lt;string&gt;</literal>, <literal>&lt;bool&gt;</literal></title><para>
diff --git a/fontconfig/fonts.dtd b/fontconfig/fonts.dtd
index def8c216f..4c38e77f0 100644
--- a/fontconfig/fonts.dtd
+++ b/fontconfig/fonts.dtd
@@ -140,7 +140,7 @@
if 'target' is 'font', execute the match on the result of a font
selection.
-->
-<!ELEMENT match (test*, edit*)>
+<!ELEMENT match (test*, edit*)+>
<!ATTLIST match
target (pattern|font|scan) "pattern">
@@ -189,7 +189,7 @@
<!ELEMENT edit (%expr;)*>
<!ATTLIST edit
name CDATA #REQUIRED
- mode (assign|assign_replace|prepend|append|prepend_first|append_last) "assign"
+ mode (assign|assign_replace|prepend|append|prepend_first|append_last|delete|delete_all) "assign"
binding (weak|strong|same) "weak">
<!--
diff --git a/fontconfig/src/fccfg.c b/fontconfig/src/fccfg.c
index 12d7e1a97..db878d5f4 100644
--- a/fontconfig/src/fccfg.c
+++ b/fontconfig/src/fccfg.c
@@ -1701,6 +1701,16 @@ FcConfigSubstituteWithPat (FcConfig *config,
case FcOpAppendLast:
FcConfigPatternAdd (p, e->object, l, FcTrue);
break;
+ case FcOpDelete:
+ if (t)
+ {
+ FcConfigDel (&st[i].elt->values, st[i].value);
+ break;
+ }
+ /* fall through ... */
+ case FcOpDeleteAll:
+ FcConfigPatternDel (p, e->object);
+ break;
default:
FcValueListDestroy (l);
break;
diff --git a/fontconfig/src/fcdbg.c b/fontconfig/src/fcdbg.c
index 270d79179..9d02f5ac7 100644
--- a/fontconfig/src/fcdbg.c
+++ b/fontconfig/src/fcdbg.c
@@ -79,7 +79,7 @@ void
FcValuePrintWithPosition (const FcValue v, FcBool show_pos_mark)
{
if (show_pos_mark)
- printf (" [insert here] ");
+ printf (" [marker] ");
else
printf (" ");
_FcValuePrintFile (stdout, v);
@@ -110,7 +110,7 @@ FcValueListPrintWithPosition (FcValueListPtr l, const FcValueListPtr pos)
FcValueBindingPrint (l);
}
if (!pos)
- printf (" [insert here]");
+ printf (" [marker]");
}
void
@@ -222,6 +222,8 @@ FcOpPrint (FcOp op_)
case FcOpPrependFirst: printf ("PrependFirst"); break;
case FcOpAppend: printf ("Append"); break;
case FcOpAppendLast: printf ("AppendLast"); break;
+ case FcOpDelete: printf ("Delete"); break;
+ case FcOpDeleteAll: printf ("DeleteAll"); break;
case FcOpQuest: printf ("Quest"); break;
case FcOpOr: printf ("Or"); break;
case FcOpAnd: printf ("And"); break;
diff --git a/fontconfig/src/fcint.h b/fontconfig/src/fcint.h
index 71b734150..fceb8cc7b 100644
--- a/fontconfig/src/fcint.h
+++ b/fontconfig/src/fcint.h
@@ -208,6 +208,7 @@ typedef enum _FcOp {
FcOpField, FcOpConst,
FcOpAssign, FcOpAssignReplace,
FcOpPrependFirst, FcOpPrepend, FcOpAppend, FcOpAppendLast,
+ FcOpDelete, FcOpDeleteAll,
FcOpQuest,
FcOpOr, FcOpAnd, FcOpEqual, FcOpNotEqual,
FcOpContains, FcOpListing, FcOpNotContains,
diff --git a/fontconfig/src/fcxml.c b/fontconfig/src/fcxml.c
index cd6aa3109..dba58eaeb 100755
--- a/fontconfig/src/fcxml.c
+++ b/fontconfig/src/fcxml.c
@@ -260,6 +260,8 @@ FcExprDestroy (FcExpr *e)
case FcOpPrependFirst:
case FcOpAppend:
case FcOpAppendLast:
+ case FcOpDelete:
+ case FcOpDeleteAll:
break;
case FcOpOr:
case FcOpAnd:
@@ -2322,6 +2324,8 @@ static const FcOpMap fcModeOps[] = {
{ "prepend_first", FcOpPrependFirst },
{ "append", FcOpAppend },
{ "append_last", FcOpAppendLast },
+ { "delete", FcOpDelete },
+ { "delete_all", FcOpDeleteAll },
};
#define NUM_MODE_OPS (int) (sizeof fcModeOps / sizeof fcModeOps[0])
@@ -2364,6 +2368,13 @@ FcParseEdit (FcConfigParse *parse)
return;
expr = FcPopBinary (parse, FcOpComma);
+ if ((mode == FcOpDelete || mode == FcOpDeleteAll) &&
+ expr != NULL)
+ {
+ FcConfigMessage (parse, FcSevereWarning, "Expression doesn't take any effects for delete and delete_all");
+ FcExprDestroy (expr);
+ expr = NULL;
+ }
edit = FcEditCreate (parse, FcObjectFromName ((char *) name),
mode, expr, binding);
if (!edit)
@@ -2376,6 +2387,11 @@ FcParseEdit (FcConfigParse *parse)
FcEditDestroy (edit);
}
+typedef struct FcSubstStack {
+ FcTest *test;
+ FcEdit *edit;
+} FcSubstStack;
+
static void
FcParseMatch (FcConfigParse *parse)
{
@@ -2384,6 +2400,9 @@ FcParseMatch (FcConfigParse *parse)
FcTest *test = 0;
FcEdit *edit = 0;
FcVStack *vstack;
+ FcBool tested = FcFalse;
+ FcSubstStack *sstack = NULL;
+ int len, pos = 0;
kind_name = FcConfigGetAttribute (parse, "target");
if (!kind_name)
@@ -2402,6 +2421,16 @@ FcParseMatch (FcConfigParse *parse)
return;
}
}
+ len = FcVStackElements(parse);
+ if (len > 0)
+ {
+ sstack = malloc (sizeof (FcSubstStack) * (len + 1));
+ if (!sstack)
+ {
+ FcConfigMessage (parse, FcSevereError, "out of memory");
+ return;
+ }
+ }
while ((vstack = FcVStackPeek (parse)))
{
switch ((int) vstack->tag) {
@@ -2409,8 +2438,22 @@ FcParseMatch (FcConfigParse *parse)
vstack->u.test->next = test;
test = vstack->u.test;
vstack->tag = FcVStackNone;
+ tested = FcTrue;
break;
case FcVStackEdit:
+ /* due to the reverse traversal, <edit> node appears faster than
+ * <test> node if any. so we have to deal with it here rather than
+ * the above in FcVStackTest, and put recipes in reverse order.
+ */
+ if (tested)
+ {
+ sstack[pos].test = test;
+ sstack[pos].edit = edit;
+ pos++;
+ test = NULL;
+ edit = NULL;
+ tested = FcFalse;
+ }
vstack->u.edit->next = edit;
edit = vstack->u.edit;
vstack->tag = FcVStackNone;
@@ -2429,6 +2472,20 @@ FcParseMatch (FcConfigParse *parse)
}
if (!FcConfigAddEdit (parse->config, test, edit, kind))
FcConfigMessage (parse, FcSevereError, "out of memory");
+ if (sstack)
+ {
+ int i;
+
+ for (i = 0; i < pos; i++)
+ {
+ if (!FcConfigAddEdit (parse->config, sstack[pos - i - 1].test, sstack[pos - i - 1].edit, kind))
+ {
+ FcConfigMessage (parse, FcSevereError, "out of memory");
+ return;
+ }
+ }
+ free (sstack);
+ }
}
static void