Bug 22862 - <alias> ignores <match> <test>s
authorAkira TAGOH <akira@tagoh.org>
Wed, 4 Apr 2012 05:47:57 +0000 (14:47 +0900)
committerAkira TAGOH <akira@tagoh.org>
Fri, 6 Apr 2012 02:14:42 +0000 (11:14 +0900)
Allow to use the test elements in the alias element.

fonts.dtd
src/fcxml.c

index 5f072ee..e1e8b73 100644 (file)
--- a/fonts.dtd
+++ b/fonts.dtd
 <!ATTLIST patelt
          name CDATA    #REQUIRED>
 
-<!ELEMENT alias (family*, prefer?, accept?, default?)>
+<!ELEMENT alias (test?, family*, prefer?, accept?, default?)>
 <!ATTLIST alias
          binding (weak|strong|same) "weak">
 <!ELEMENT prefer (family)*>
index 0fb82b6..79dfc0b 100644 (file)
@@ -1583,7 +1583,7 @@ FcParseAlias (FcConfigParse *parse)
     FcExpr     *family = 0, *accept = 0, *prefer = 0, *def = 0, *new = 0;
     FcEdit     *edit = 0, *next;
     FcVStack   *vstack;
-    FcTest     *test;
+    FcTest     *test = NULL;
     FcValueBinding  binding;
 
     if (!FcConfigLexBinding (parse, FcConfigGetAttribute (parse, "binding"), &binding))
@@ -1626,6 +1626,11 @@ FcParseAlias (FcConfigParse *parse)
            def = vstack->u.expr;
            vstack->tag = FcVStackNone;
            break;
+       case FcVStackTest:
+           vstack->u.test->next = test;
+           test = vstack->u.test;
+           vstack->tag = FcVStackNone;
+           break;
        default:
            FcConfigMessage (parse, FcSevereWarning, "bad alias");
            break;
@@ -1683,11 +1688,21 @@ FcParseAlias (FcConfigParse *parse)
     }
     if (edit)
     {
-       test = FcTestCreate (parse, FcMatchPattern,
-                            FcQualAny,
-                            (FcChar8 *) FC_FAMILY,
-                            FcOpEqual,
-                            family);
+       FcTest *t = FcTestCreate (parse, FcMatchPattern,
+                                 FcQualAny,
+                                 (FcChar8 *) FC_FAMILY,
+                                 FcOpEqual,
+                                 family);
+       if (test)
+       {
+           FcTest *p = test;
+
+           while (p->next)
+               p = p->next;
+           p->next = t;
+       }
+       else
+           test = t;
        if (test)
            if (!FcConfigAddEdit (parse->config, test, edit, FcMatchPattern))
                FcTestDestroy (test);