]> git.wh0rd.org - fontconfig.git/blobdiff - src/fcxml.c
Add filename-based accept/reject to ammend available fonts.
[fontconfig.git] / src / fcxml.c
index 657959c158c7c4733b3df510c1be4f3e41e51163..3cdbaa4ca2c0566f8a0da9e55407e2b5061b9e91 100644 (file)
@@ -317,6 +317,11 @@ typedef enum _FcElement {
     FcElementDefault,
     FcElementFamily,
 
+    FcElementSelectfont,
+    FcElementAcceptfont,
+    FcElementRejectfont,
+    FcElementGlob,
+
     FcElementTest,
     FcElementEdit,
     FcElementInt,
@@ -373,6 +378,11 @@ FcElementMap (const XML_Char *name)
        { "default",    FcElementDefault },
        { "family",     FcElementFamily },
 
+       { "selectfont", FcElementSelectfont },
+       { "acceptfont", FcElementAcceptfont },
+       { "rejectfont", FcElementRejectfont },
+       { "glob",       FcElementGlob },
+
        { "test",       FcElementTest },
        { "edit",       FcElementEdit },
        { "int",        FcElementInt },
@@ -428,6 +438,7 @@ typedef enum _FcVStackTag {
     FcVStackFamily,
     FcVStackField,
     FcVStackConstant,
+    FcVStackGlob,
     
     FcVStackPrefer,
     FcVStackAccept,
@@ -544,6 +555,7 @@ FcVStackDestroy (FcVStack *vstack)
        case FcVStackFamily:
        case FcVStackField:
        case FcVStackConstant:
+       case FcVStackGlob:
            FcStrFree (vstack->u.string);
            break;
        case FcVStackInteger:
@@ -1639,6 +1651,30 @@ FcParseMatch (FcConfigParse *parse)
        FcConfigMessage (parse, FcSevereError, "out of memory");
 }
 
+static void
+FcParseAcceptRejectFont (FcConfigParse *parse, FcElement element)
+{
+    FcVStack   *vstack;
+
+    while ((vstack = FcVStackPop (parse)))
+    {
+       switch (vstack->tag) {
+       case FcVStackGlob:
+           if (!FcConfigGlobAdd (parse->config, 
+                                 vstack->u.string,
+                                 element == FcElementAcceptfont))
+           {
+               FcConfigMessage (parse, FcSevereError, "out of memory");
+           }
+           break;
+       default:
+           FcConfigMessage (parse, FcSevereWarning, "bad font selector");
+           break;
+       }
+       FcVStackDestroy (vstack);
+    }
+}
+
 static void
 FcEndElement(void *userData, const XML_Char *name)
 {
@@ -1761,7 +1797,15 @@ FcEndElement(void *userData, const XML_Char *name)
     case FcElementCharset:
 /*     FcParseCharset (parse); */
        break;
-
+    case FcElementSelectfont:
+       break;
+    case FcElementAcceptfont:
+    case FcElementRejectfont:
+       FcParseAcceptRejectFont (parse, parse->pstack->element);
+       break;
+    case FcElementGlob:
+       FcParseString (parse, FcVStackGlob);
+       break;
     case FcElementName:
        FcParseString (parse, FcVStackField);
        break;