X-Git-Url: https://git.wh0rd.org/?a=blobdiff_plain;f=src%2Ffcxml.c;h=441e6dedf67e55a66915b926c839591c3a3bf79b;hb=9a9fd975a1330e21f0184cdb237cfb2a2f19c098;hp=1590358fbd26319fa07a15b50af7f314c1faece7;hpb=f2fb985c7a0e51109b1750e166e4244a833ffbe3;p=fontconfig.git diff --git a/src/fcxml.c b/src/fcxml.c index 1590358..441e6de 100644 --- a/src/fcxml.c +++ b/src/fcxml.c @@ -22,12 +22,12 @@ * PERFORMANCE OF THIS SOFTWARE. */ +#include "fcint.h" #include #include -#include "fcint.h" #include -#if ENABLE_LIBXML2 +#ifdef ENABLE_LIBXML2 #include @@ -65,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); } @@ -162,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; } @@ -218,7 +217,6 @@ FcExprDestroy (FcExpr *e) case FcOpBool: break; case FcOpField: - FcStrFree ((FcChar8 *) e->u.field); break; case FcOpConst: FcStrFree (e->u.constant); @@ -269,7 +267,6 @@ FcEditDestroy (FcEdit *e) { if (e->next) FcEditDestroy (e->next); - FcStrFree ((FcChar8 *) e->field); if (e->expr) FcExprDestroy (e->expr); free (e); @@ -285,6 +282,7 @@ typedef enum _FcElement { FcElementNone, FcElementFontconfig, FcElementDir, + FcElementCacheDir, FcElementCache, FcElementInclude, FcElementConfig, @@ -339,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 }, @@ -546,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)); } @@ -577,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; @@ -657,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); } @@ -669,7 +670,7 @@ FcTestCreate (FcConfigParse *parse, static FcEdit * FcEditCreate (FcConfigParse *parse, - const char *field, + FcObject object, FcOp op, FcExpr *expr, FcValueBinding binding) @@ -681,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); } @@ -1411,7 +1412,7 @@ FcParseAlias (FcConfigParse *parse) if (prefer) { edit = FcEditCreate (parse, - FcConfigSaveField ("family"), + FC_FAMILY_OBJECT, FcOpPrepend, prefer, FcValueBindingWeak); @@ -1424,7 +1425,7 @@ FcParseAlias (FcConfigParse *parse) { next = edit; edit = FcEditCreate (parse, - FcConfigSaveField ("family"), + FC_FAMILY_OBJECT, FcOpAppend, accept, FcValueBindingWeak); @@ -1437,7 +1438,7 @@ FcParseAlias (FcConfigParse *parse) { next = edit; edit = FcEditCreate (parse, - FcConfigSaveField ("family"), + FC_FAMILY_OBJECT, FcOpAppendLast, def, FcValueBindingWeak); @@ -1541,7 +1542,7 @@ FcPopBinary (FcConfigParse *parse, FcOp op) FcConfigMessage (parse, FcSevereError, "out of memory"); FcExprDestroy (left); FcExprDestroy (expr); - break; + return 0; } expr = new; } @@ -1668,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 @@ -1792,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"); @@ -1821,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); @@ -1950,6 +1956,7 @@ FcParsePatelt (FcConfigParse *parse) if (!name) { FcConfigMessage (parse, FcSevereWarning, "missing pattern element name"); + FcPatternDestroy (pattern); return; } @@ -1965,8 +1972,7 @@ FcParsePatelt (FcConfigParse *parse) } } - FcVStackPushPattern (parse, FcPatternFreeze(pattern)); - FcPatternDestroy (pattern); + FcVStackPushPattern (parse, pattern); } static void @@ -1988,6 +1994,7 @@ FcParsePattern (FcConfigParse *parse) if (!FcPatternAppend (pattern, vstack->u.pattern)) { FcConfigMessage (parse, FcSevereError, "out of memory"); + FcPatternDestroy (pattern); return; } break; @@ -2052,7 +2059,7 @@ FcEndElement(void *userData, const XML_Char *name) } FcStrFree (data); break; - case FcElementCache: + case FcElementCacheDir: data = FcStrBufDone (&parse->pstack->str); if (!data) { @@ -2061,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: @@ -2234,7 +2252,7 @@ FcStartDoctypeDecl (void *userData, FcConfigMessage (parse, FcSevereError, "invalid doctype \"%s\"", doctypeName); } -#if ENABLE_LIBXML2 +#ifdef ENABLE_LIBXML2 static void FcInternalSubsetDecl (void *userData, @@ -2359,7 +2377,7 @@ FcConfigParseAndLoad (FcConfig *config, FcConfigParse parse; FcBool error = FcTrue; -#if ENABLE_LIBXML2 +#ifdef ENABLE_LIBXML2 xmlSAXHandler sax; char buf[BUFSIZ]; #else @@ -2398,7 +2416,7 @@ FcConfigParseAndLoad (FcConfig *config, goto bail0; } -#if ENABLE_LIBXML2 +#ifdef ENABLE_LIBXML2 memset(&sax, 0, sizeof(sax)); sax.internalSubset = FcInternalSubsetDecl; @@ -2419,7 +2437,7 @@ FcConfigParseAndLoad (FcConfig *config, if (!FcConfigInit (&parse, name, config, p)) goto bail2; -#if !ENABLE_LIBXML2 +#ifndef ENABLE_LIBXML2 XML_SetUserData (p, &parse); @@ -2430,7 +2448,7 @@ FcConfigParseAndLoad (FcConfig *config, #endif /* ENABLE_LIBXML2 */ do { -#if !ENABLE_LIBXML2 +#ifndef ENABLE_LIBXML2 buf = XML_GetBuffer (p, BUFSIZ); if (!buf) { @@ -2445,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))