]> git.wh0rd.org - fontconfig.git/blobdiff - src/fcxml.c
Eliminate .so PLT entries for local symbols. (thanks to Arjan van de Ven)
[fontconfig.git] / src / fcxml.c
index b3777b9bb43247f3329a69551cc21ea3eb8551e0..4087183372a5f4665ba15a910b03e37e36030a20 100644 (file)
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-#include <stdarg.h>
 #include "fcint.h"
+#include <fcntl.h>
+#include <stdarg.h>
 #include <dirent.h>
 
-#if ENABLE_LIBXML2
+#ifdef ENABLE_LIBXML2
 
 #include <libxml/parser.h>
 
@@ -64,7 +65,6 @@ FcTestDestroy (FcTest *test)
     if (test->next)
        FcTestDestroy (test->next);
     FcExprDestroy (test->expr);
-    FcStrFree ((FcChar8 *) test->field);
     FcMemFree (FC_MEM_TEST, sizeof (FcTest));
     free (test);
 }
@@ -161,7 +161,7 @@ FcExprCreateField (const char *field)
     {
        FcMemAlloc (FC_MEM_EXPR, sizeof (FcExpr));
        e->op = FcOpField;
-       e->u.field = (char *) FcStrCopy ((FcChar8 *) field);
+       e->u.object = FcObjectFromName (field);
     }
     return e;
 }
@@ -217,7 +217,6 @@ FcExprDestroy (FcExpr *e)
     case FcOpBool:
        break;
     case FcOpField:
-       FcStrFree ((FcChar8 *) e->u.field);
        break;
     case FcOpConst:
        FcStrFree (e->u.constant);
@@ -268,7 +267,6 @@ FcEditDestroy (FcEdit *e)
 {
     if (e->next)
        FcEditDestroy (e->next);
-    FcStrFree ((FcChar8 *) e->field);
     if (e->expr)
        FcExprDestroy (e->expr);
     free (e);
@@ -284,6 +282,7 @@ typedef enum _FcElement {
     FcElementNone,
     FcElementFontconfig,
     FcElementDir,
+    FcElementCacheDir,
     FcElementCache,
     FcElementInclude,
     FcElementConfig,
@@ -338,12 +337,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 },
@@ -492,10 +492,10 @@ FcConfigMessage (FcConfigParse *parse, FcConfigSeverity severe, const char *fmt,
     {
        if (parse->name)
            fprintf (stderr, "Fontconfig %s: \"%s\", line %d: ", s,
-                    parse->name, XML_GetCurrentLineNumber (parse->parser));
+                    parse->name, (int)XML_GetCurrentLineNumber (parse->parser));
        else
            fprintf (stderr, "Fontconfig %s: line %d: ", s,
-                    XML_GetCurrentLineNumber (parse->parser));
+                    (int)XML_GetCurrentLineNumber (parse->parser));
        if (severe >= FcSevereError)
            parse->error = FcTrue;
     }
@@ -545,6 +545,8 @@ FcTypecheckValue (FcConfigParse *parse, FcType value, FcType type)
        if ((value == FcTypeLangSet && type == FcTypeString) ||
            (value == FcTypeString && type == FcTypeLangSet))
            return;
+       if (type == (FcType) -1)
+           return;
        FcConfigMessage (parse, FcSevereWarning, "saw %s, expected %s",
                         FcTypeName (value), FcTypeName (type));
     }
@@ -576,7 +578,7 @@ FcTypecheckExpr (FcConfigParse *parse, FcExpr *expr, FcType type)
     case FcOpNil:
        break;
     case FcOpField:
-       o = FcNameGetObjectType (expr->u.field);
+       o = FcNameGetObjectType (FcObjectName (expr->u.object));
        if (o)
            FcTypecheckValue (parse, o->type, type);
        break;
@@ -656,10 +658,10 @@ FcTestCreate (FcConfigParse *parse,
        test->next = 0;
        test->kind = kind;
        test->qual = qual;
-       test->field = (char *) FcStrCopy (field);
+       test->object = FcObjectFromName ((const char *) field);
        test->op = compare;
        test->expr = expr;
-       o = FcNameGetObjectType (test->field);
+       o = FcNameGetObjectType (FcObjectName (test->object));
        if (o)
            FcTypecheckExpr (parse, expr, o->type);
     }
@@ -668,7 +670,7 @@ FcTestCreate (FcConfigParse *parse,
 
 static FcEdit *
 FcEditCreate (FcConfigParse    *parse,
-             const char        *field,
+             FcObject          object,
              FcOp              op,
              FcExpr            *expr,
              FcValueBinding    binding)
@@ -680,11 +682,11 @@ FcEditCreate (FcConfigParse       *parse,
        const FcObjectType      *o;
 
        e->next = 0;
-       e->field = field;   /* already saved in grammar */
+       e->object = object;
        e->op = op;
        e->expr = expr;
        e->binding = binding;
-       o = FcNameGetObjectType (e->field);
+       o = FcNameGetObjectType (FcObjectName (e->object));
        if (o)
            FcTypecheckExpr (parse, expr, o->type);
     }
@@ -923,7 +925,6 @@ FcVStackElements (FcConfigParse *parse)
 static FcChar8 **
 FcConfigSaveAttr (const XML_Char **attr)
 {
-    int                n;
     int                slen;
     int                i;
     FcChar8    **new;
@@ -933,8 +934,7 @@ FcConfigSaveAttr (const XML_Char **attr)
        return 0;
     slen = 0;
     for (i = 0; attr[i]; i++)
-       slen += strlen (attr[i]) + 1;
-    n = i;
+       slen += strlen ((char *) attr[i]) + 1;
     new = malloc ((i + 1) * sizeof (FcChar8 *) + slen);
     if (!new)
        return 0;
@@ -1024,6 +1024,9 @@ FcConfigGetAttribute (FcConfigParse *parse, const char *attr)
        return 0;
 
     attrs = parse->pstack->attr;
+    if (!attrs)
+        return 0;
+
     while (*attrs)
     {
        if (!strcmp ((char *) *attrs, attr))
@@ -1318,8 +1321,7 @@ FcParseFamilies (FcConfigParse *parse, FcVStackTag tag)
        if (!FcVStackPushExpr (parse, tag, expr))
        {
            FcConfigMessage (parse, FcSevereError, "out of memory");
-           if (expr)
-               FcExprDestroy (expr);
+            FcExprDestroy (expr);
        }
     }
 }
@@ -1410,7 +1412,7 @@ FcParseAlias (FcConfigParse *parse)
     if (prefer)
     {
        edit = FcEditCreate (parse, 
-                            FcConfigSaveField ("family"),
+                            FC_FAMILY_OBJECT,
                             FcOpPrepend,
                             prefer,
                             FcValueBindingWeak);
@@ -1423,7 +1425,7 @@ FcParseAlias (FcConfigParse *parse)
     {
        next = edit;
        edit = FcEditCreate (parse,
-                            FcConfigSaveField ("family"),
+                            FC_FAMILY_OBJECT,
                             FcOpAppend,
                             accept,
                             FcValueBindingWeak);
@@ -1436,7 +1438,7 @@ FcParseAlias (FcConfigParse *parse)
     {
        next = edit;
        edit = FcEditCreate (parse,
-                            FcConfigSaveField ("family"),
+                            FC_FAMILY_OBJECT,
                             FcOpAppendLast,
                             def,
                             FcValueBindingWeak);
@@ -1540,7 +1542,7 @@ FcPopBinary (FcConfigParse *parse, FcOp op)
                FcConfigMessage (parse, FcSevereError, "out of memory");
                FcExprDestroy (left);
                FcExprDestroy (expr);
-               break;
+               return 0;
            }
            expr = new;
        }
@@ -1667,6 +1669,8 @@ FcParseTest (FcConfigParse *parse)
            kind = FcMatchPattern;
        else if (!strcmp ((char *) kind_string, "font"))
            kind = FcMatchFont;
+       else if (!strcmp ((char *) kind_string, "scan"))
+           kind = FcMatchScan;
        else if (!strcmp ((char *) kind_string, "default"))
            kind = FcMatchDefault;
        else
@@ -1791,7 +1795,8 @@ FcParseEdit (FcConfigParse *parse)
        }
     }
     expr = FcPopBinary (parse, FcOpComma);
-    edit = FcEditCreate (parse, (char *) FcStrCopy (name), mode, expr, binding);
+    edit = FcEditCreate (parse, FcObjectFromName ((char *) name),
+                        mode, expr, binding);
     if (!edit)
     {
        FcConfigMessage (parse, FcSevereError, "out of memory");
@@ -1820,6 +1825,8 @@ FcParseMatch (FcConfigParse *parse)
            kind = FcMatchPattern;
        else if (!strcmp ((char *) kind_name, "font"))
            kind = FcMatchFont;
+       else if (!strcmp ((char *) kind_name, "scan"))
+           kind = FcMatchScan;
        else
        {
            FcConfigMessage (parse, FcSevereWarning, "invalid match target \"%s\"", kind_name);
@@ -1949,6 +1956,7 @@ FcParsePatelt (FcConfigParse *parse)
     if (!name)
     {
        FcConfigMessage (parse, FcSevereWarning, "missing pattern element name");
+       FcPatternDestroy (pattern);
        return;
     }
     
@@ -1986,6 +1994,7 @@ FcParsePattern (FcConfigParse *parse)
            if (!FcPatternAppend (pattern, vstack->u.pattern))
            {
                FcConfigMessage (parse, FcSevereError, "out of memory");
+               FcPatternDestroy (pattern);
                return;
            }
            break;
@@ -2046,11 +2055,11 @@ FcEndElement(void *userData, const XML_Char *name)
        if (!FcStrUsesHome (data) || FcConfigHome ())
        {
            if (!FcConfigAddDir (parse->config, data))
-               FcConfigMessage (parse, FcSevereError, "out of memory");
+               FcConfigMessage (parse, FcSevereError, "out of memory; cannot add directory %s", data);
        }
        FcStrFree (data);
        break;
-    case FcElementCache:
+    case FcElementCacheDir:
        data = FcStrBufDone (&parse->pstack->str);
        if (!data)
        {
@@ -2059,9 +2068,20 @@ FcEndElement(void *userData, const XML_Char *name)
        }
        if (!FcStrUsesHome (data) || FcConfigHome ())
        {
-           if (!FcConfigSetCache (parse->config, data))
-               FcConfigMessage (parse, FcSevereError, "out of memory");
+           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)
+       {
+           FcConfigMessage (parse, FcSevereError, "out of memory");
+           break;
        }
+       /* discard this data; no longer used */
        FcStrFree (data);
        break;
     case FcElementInclude:
@@ -2232,7 +2252,7 @@ FcStartDoctypeDecl (void      *userData,
        FcConfigMessage (parse, FcSevereError, "invalid doctype \"%s\"", doctypeName);
 }
 
-#if ENABLE_LIBXML2
+#ifdef ENABLE_LIBXML2
 
 static void
 FcInternalSubsetDecl (void            *userData,
@@ -2352,12 +2372,12 @@ FcConfigParseAndLoad (FcConfig      *config,
 
     XML_Parser     p;
     FcChar8        *filename;
-    FILE           *f;
+    int                    fd;
     int                    len;
     FcConfigParse   parse;
     FcBool         error = FcTrue;
     
-#if ENABLE_LIBXML2
+#ifdef ENABLE_LIBXML2
     xmlSAXHandler   sax;
     char            buf[BUFSIZ];
 #else
@@ -2368,6 +2388,12 @@ FcConfigParseAndLoad (FcConfig       *config,
     if (!filename)
        goto bail0;
     
+    if (FcStrSetMember (config->configFiles, filename))
+    {
+        FcStrFree (filename);
+        return FcTrue;
+    }
+
     if (!FcStrSetAdd (config->configFiles, filename))
     {
        FcStrFree (filename);
@@ -2384,12 +2410,13 @@ FcConfigParseAndLoad (FcConfig      *config,
     if (FcDebug () & FC_DBG_CONFIG)
        printf ("\tLoading config file %s\n", filename);
 
-    f = fopen ((char *) filename, "r");
-    FcStrFree (filename);
-    if (!f)
+    fd = open ((char *) filename, O_RDONLY);
+    if (fd == -1) { 
+       FcStrFree (filename);
        goto bail0;
+    }
     
-#if ENABLE_LIBXML2
+#ifdef ENABLE_LIBXML2
     memset(&sax, 0, sizeof(sax));
 
     sax.internalSubset = FcInternalSubsetDecl;
@@ -2398,10 +2425,11 @@ FcConfigParseAndLoad (FcConfig      *config,
     sax.endElement = FcEndElement;
     sax.characters = FcCharacterData;
 
-    p = xmlCreatePushParserCtxt (&sax, &parse, NULL, 0, filename);
+    p = xmlCreatePushParserCtxt (&sax, &parse, NULL, 0, (const char *) filename);
 #else
     p = XML_ParserCreate ("UTF-8");
 #endif
+    FcStrFree (filename);
 
     if (!p)
        goto bail1;
@@ -2409,7 +2437,7 @@ FcConfigParseAndLoad (FcConfig        *config,
     if (!FcConfigInit (&parse, name, config, p))
        goto bail2;
 
-#if !ENABLE_LIBXML2
+#ifndef ENABLE_LIBXML2
 
     XML_SetUserData (p, &parse);
     
@@ -2420,7 +2448,7 @@ FcConfigParseAndLoad (FcConfig        *config,
 #endif /* ENABLE_LIBXML2 */
 
     do {
-#if !ENABLE_LIBXML2
+#ifndef ENABLE_LIBXML2
        buf = XML_GetBuffer (p, BUFSIZ);
        if (!buf)
        {
@@ -2428,14 +2456,14 @@ FcConfigParseAndLoad (FcConfig      *config,
            goto bail3;
        }
 #endif
-       len = fread (buf, 1, BUFSIZ, f);
+       len = read (fd, buf, BUFSIZ);
        if (len < 0)
        {
            FcConfigMessage (&parse, FcSevereError, "failed reading config file");
            goto bail3;
        }
 
-#if ENABLE_LIBXML2
+#ifdef ENABLE_LIBXML2
        if (xmlParseChunk (p, buf, len, len == 0))
 #else
        if (!XML_ParseBuffer (p, len, len == 0))
@@ -2452,8 +2480,8 @@ bail3:
 bail2:
     XML_ParserFree (p);
 bail1:
-    fclose (f);
-    f = NULL;
+    close (fd);
+    fd = -1;
 bail0:
     if (error && complain)
     {
@@ -2465,3 +2493,6 @@ bail0:
     }
     return FcTrue;
 }
+#define __fcxml__
+#include "fcaliastail.h"
+#undef __fcxml__