]> git.wh0rd.org - fontconfig.git/blobdiff - src/fcxml.c
2006-08-04 Keith Packard (keithp@keithp.com) reviewed by: plam
[fontconfig.git] / src / fcxml.c
index 817486fe04fb08f55e44c11ca909f38f304744e3..c5c90656dbec37fb5435882cba6201ad891ed03a 100644 (file)
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
+#include "fcint.h"
 #include <fcntl.h>
 #include <stdarg.h>
-#include "fcint.h"
 #include <dirent.h>
 
-#if ENABLE_LIBXML2
+#ifdef ENABLE_LIBXML2
 
 #include <libxml/parser.h>
 
@@ -285,6 +285,7 @@ typedef enum _FcElement {
     FcElementNone,
     FcElementFontconfig,
     FcElementDir,
+    FcElementCacheDir,
     FcElementCache,
     FcElementInclude,
     FcElementConfig,
@@ -339,12 +340,13 @@ typedef enum _FcElement {
     FcElementUnknown
 } FcElement;
 
-static struct {
+static const struct {
     const char  name[16];
     FcElement   element;
 } fcElementMap[] = {
     { "fontconfig",    FcElementFontconfig },
     { "dir",           FcElementDir },
+    { "cachedir",      FcElementCacheDir },
     { "cache",         FcElementCache },
     { "include",       FcElementInclude },
     { "config",                FcElementConfig },
@@ -924,7 +926,6 @@ FcVStackElements (FcConfigParse *parse)
 static FcChar8 **
 FcConfigSaveAttr (const XML_Char **attr)
 {
-    int                n;
     int                slen;
     int                i;
     FcChar8    **new;
@@ -935,7 +936,6 @@ FcConfigSaveAttr (const XML_Char **attr)
     slen = 0;
     for (i = 0; attr[i]; i++)
        slen += strlen ((char *) attr[i]) + 1;
-    n = i;
     new = malloc ((i + 1) * sizeof (FcChar8 *) + slen);
     if (!new)
        return 0;
@@ -1322,8 +1322,7 @@ FcParseFamilies (FcConfigParse *parse, FcVStackTag tag)
        if (!FcVStackPushExpr (parse, tag, expr))
        {
            FcConfigMessage (parse, FcSevereError, "out of memory");
-           if (expr)
-               FcExprDestroy (expr);
+            FcExprDestroy (expr);
        }
     }
 }
@@ -1544,7 +1543,7 @@ FcPopBinary (FcConfigParse *parse, FcOp op)
                FcConfigMessage (parse, FcSevereError, "out of memory");
                FcExprDestroy (left);
                FcExprDestroy (expr);
-               break;
+               return 0;
            }
            expr = new;
        }
@@ -1953,6 +1952,7 @@ FcParsePatelt (FcConfigParse *parse)
     if (!name)
     {
        FcConfigMessage (parse, FcSevereWarning, "missing pattern element name");
+       FcPatternDestroy (pattern);
        return;
     }
     
@@ -1968,8 +1968,7 @@ FcParsePatelt (FcConfigParse *parse)
        }
     }
 
-    FcVStackPushPattern (parse, FcPatternFreeze(pattern));
-    FcPatternDestroy (pattern);
+    FcVStackPushPattern (parse, pattern);
 }
 
 static void
@@ -1991,6 +1990,7 @@ FcParsePattern (FcConfigParse *parse)
            if (!FcPatternAppend (pattern, vstack->u.pattern))
            {
                FcConfigMessage (parse, FcSevereError, "out of memory");
+               FcPatternDestroy (pattern);
                return;
            }
            break;
@@ -2055,6 +2055,21 @@ FcEndElement(void *userData, const XML_Char *name)
        }
        FcStrFree (data);
        break;
+    case FcElementCacheDir:
+       data = FcStrBufDone (&parse->pstack->str);
+       if (!data)
+       {
+           FcConfigMessage (parse, FcSevereError, "out of memory");
+           break;
+       }
+       if (!FcStrUsesHome (data) || FcConfigHome ())
+       {
+           if (!FcConfigAddCacheDir (parse->config, data))
+               FcConfigMessage (parse, FcSevereError, "out of memory; cannot add cache directory %s", data);
+       }
+       FcStrFree (data);
+       break;
+       
     case FcElementCache:
        data = FcStrBufDone (&parse->pstack->str);
        if (!data)
@@ -2237,7 +2252,7 @@ FcStartDoctypeDecl (void      *userData,
        FcConfigMessage (parse, FcSevereError, "invalid doctype \"%s\"", doctypeName);
 }
 
-#if ENABLE_LIBXML2
+#ifdef ENABLE_LIBXML2
 
 static void
 FcInternalSubsetDecl (void            *userData,
@@ -2362,7 +2377,7 @@ FcConfigParseAndLoad (FcConfig        *config,
     FcConfigParse   parse;
     FcBool         error = FcTrue;
     
-#if ENABLE_LIBXML2
+#ifdef ENABLE_LIBXML2
     xmlSAXHandler   sax;
     char            buf[BUFSIZ];
 #else
@@ -2401,7 +2416,7 @@ FcConfigParseAndLoad (FcConfig        *config,
        goto bail0;
     }
     
-#if ENABLE_LIBXML2
+#ifdef ENABLE_LIBXML2
     memset(&sax, 0, sizeof(sax));
 
     sax.internalSubset = FcInternalSubsetDecl;
@@ -2422,7 +2437,7 @@ FcConfigParseAndLoad (FcConfig        *config,
     if (!FcConfigInit (&parse, name, config, p))
        goto bail2;
 
-#if !ENABLE_LIBXML2
+#ifndef ENABLE_LIBXML2
 
     XML_SetUserData (p, &parse);
     
@@ -2433,7 +2448,7 @@ FcConfigParseAndLoad (FcConfig        *config,
 #endif /* ENABLE_LIBXML2 */
 
     do {
-#if !ENABLE_LIBXML2
+#ifndef ENABLE_LIBXML2
        buf = XML_GetBuffer (p, BUFSIZ);
        if (!buf)
        {
@@ -2448,7 +2463,7 @@ FcConfigParseAndLoad (FcConfig        *config,
            goto bail3;
        }
 
-#if ENABLE_LIBXML2
+#ifdef ENABLE_LIBXML2
        if (xmlParseChunk (p, buf, len, len == 0))
 #else
        if (!XML_ParseBuffer (p, len, len == 0))