X-Git-Url: https://git.wh0rd.org/?a=blobdiff_plain;f=src%2Ffccfg.c;h=3c3681a100620e9c803e811aae0f55195121e340;hb=db50cbdaf592349c204ab0af0e7061ea72237044;hp=fc70fefd09af5fcefbd0e1408d61a0857e6df930;hpb=3ea92166a0e45b0c7d7e9ecc0546317640c50336;p=fontconfig.git diff --git a/src/fccfg.c b/src/fccfg.c index fc70fef..3c3681a 100644 --- a/src/fccfg.c +++ b/src/fccfg.c @@ -22,9 +22,9 @@ * PERFORMANCE OF THIS SOFTWARE. */ +#include "fcint.h" #include #include -#include "fcint.h" #if defined (_WIN32) && (defined (PIC) || defined (DLL_EXPORT)) #define STRICT @@ -100,13 +100,17 @@ FcConfigCreate (void) if (!FcConfigSetCache (config, cache_dir)) { FcStrFree (cache_dir); - goto bail6; + goto bail8; } FcStrFree (cache_dir); } } #endif + config->cacheDirs = FcStrSetCreate (); + if (!config->cacheDirs) + goto bail9; + config->blanks = 0; config->substPattern = 0; @@ -120,6 +124,8 @@ FcConfigCreate (void) return config; +bail9: + FcStrFree (config->cache); bail8: FcFontSetDestroy (config->rejectPatterns); bail7: @@ -226,6 +232,7 @@ FcConfigDestroy (FcConfig *config) FcStrSetDestroy (config->configDirs); FcStrSetDestroy (config->fontDirs); + FcStrSetDestroy (config->cacheDirs); FcStrSetDestroy (config->configFiles); FcStrSetDestroy (config->acceptGlobs); FcStrSetDestroy (config->rejectGlobs); @@ -283,7 +290,7 @@ FcConfigBuildFonts (FcConfig *config) { list = FcConfigGetFontDirs (config); if (!list) - goto bail2; + goto bail3; while ((dir = FcStrListNext (list))) { @@ -334,9 +341,10 @@ FcConfigBuildFonts (FcConfig *config) FcConfigSetFonts (config, fonts, FcSetSystem); return FcTrue; +bail3: + FcStrSetDestroy (oldDirs); bail2: FcGlobalCacheDestroy (cache); - FcStrSetDestroy (oldDirs); bail1: FcFontSetDestroy (fonts); bail0: @@ -384,123 +392,42 @@ FcConfigGetConfigDirs (FcConfig *config) return FcStrListCreate (config->configDirs); } -static FcChar8 * -FcConfigInodeMatchFontDir (FcConfig *config, const FcChar8 *d) -{ - int n; - ino_t di; - dev_t dd; - struct stat s; - - /* first we do string matches rather than file accesses */ - /* FcStrSetMember doesn't tell us the index so that we can return - * the config-owned copy. */ - for (n = 0; n < config->fontDirs->num; n++) - { - if (!FcStrCmp (config->fontDirs->strs[n], d)) - return config->fontDirs->strs[n]; - } - - /* If this is a bottleneck, we can cache the fontDir inodes. */ - if (stat ((char *)d, &s) == -1) - return 0; - di = s.st_ino; dd = s.st_dev; - - for (n = 0; n < config->fontDirs->num; n++) - { - if (stat ((char *)config->fontDirs->strs[n], &s) == -1) - continue; - if (di == s.st_ino && dd == s.st_dev) - return config->fontDirs->strs[n]; - } - return 0; -} - FcBool FcConfigAddFontDir (FcConfig *config, const FcChar8 *d) { - /* Avoid adding d if it's an alias of something else, too. */ - if (FcConfigInodeMatchFontDir(config, d)) - return FcTrue; return FcStrSetAddFilename (config->fontDirs, d); } -static FcBool -FcConfigAddFontDirSubdirs (FcConfig *config, - const FcChar8 *d) +FcBool +FcConfigAddDir (FcConfig *config, + const FcChar8 *d) { - DIR *dir; - struct dirent *e; - FcChar8 *subdir; - FcBool added = FcFalse; - - if (!(dir = opendir ((char *) d))) - return FcFalse; - if (!(subdir = (FcChar8 *) malloc (strlen ((char *) d) + FC_MAX_FILE_LEN + 2))) - { - fprintf (stderr, "out of memory"); - return FcFalse; - } - while ((e = readdir (dir))) - { - if (strcmp (e->d_name, ".") && strcmp (e->d_name, "..") && - strlen (e->d_name) < FC_MAX_FILE_LEN) - { - strcpy ((char *)subdir, (char *)d); - strcat ((char *)subdir, "/"); - strcat ((char *)subdir, e->d_name); - if (FcFileIsDir (subdir)) - { - if (FcConfigInodeMatchFontDir(config, subdir)) - continue; /* already added */ - FcStrSetAddFilename (config->fontDirs, subdir); - FcConfigAddFontDirSubdirs (config, subdir); - added = FcTrue; - } - } - } - free (subdir); - closedir (dir); - return added; + return (FcConfigAddConfigDir (config, d) && + FcConfigAddFontDir (config, d)); } -const FcChar8 * -FcConfigNormalizeFontDir (FcConfig *config, - const FcChar8 *d) +FcStrList * +FcConfigGetFontDirs (FcConfig *config) { - FcChar8 *d0; - int n, n0; - FcBool added = FcFalse; - - d0 = FcConfigInodeMatchFontDir(config, d); - if (d0) - return d0; - - /* Ok, we didn't find it in fontDirs; let's add subdirs.... */ - for (n = 0, n0 = config->fontDirs->num; n < n0; n++) + if (!config) { - if (FcConfigAddFontDirSubdirs (config, config->fontDirs->strs[n])) - added = FcTrue; + config = FcConfigGetCurrent (); + if (!config) + return 0; } - - /* ... and try again. */ - if (added) - return FcConfigInodeMatchFontDir(config, d); - - return 0; + return FcStrListCreate (config->fontDirs); } FcBool -FcConfigAddDir (FcConfig *config, - const FcChar8 *d) +FcConfigAddCacheDir (FcConfig *config, + const FcChar8 *d) { - return (FcConfigAddConfigDir (config, d) && - FcConfigAddFontDir (config, d)); + return FcStrSetAddFilename (config->cacheDirs, d); } FcStrList * -FcConfigGetFontDirs (FcConfig *config) +FcConfigGetCacheDirs (FcConfig *config) { if (!config) { @@ -508,9 +435,9 @@ FcConfigGetFontDirs (FcConfig *config) if (!config) return 0; } - return FcStrListCreate (config->fontDirs); + return FcStrListCreate (config->cacheDirs); } - + FcBool FcConfigAddConfigFile (FcConfig *config, const FcChar8 *f) @@ -605,17 +532,21 @@ FcBool FcConfigAddBlank (FcConfig *config, FcChar32 blank) { - FcBlanks *b; + FcBlanks *b, *freeme = 0; b = config->blanks; if (!b) { - b = FcBlanksCreate (); + freeme = b = FcBlanksCreate (); if (!b) return FcFalse; } if (!FcBlanksAdd (b, blank)) + { + if (freeme) + FcBlanksDestroy (freeme); return FcFalse; + } config->blanks = b; return FcTrue; } @@ -1507,7 +1438,8 @@ FcConfigSubstituteWithPat (FcConfig *config, /* * Delete the marked value */ - FcConfigDel (&st[i].elt->values, thisValue); + if (thisValue) + FcConfigDel (&st[i].elt->values, thisValue); /* * Adjust any pointers into the value list to ensure * future edits occur at the same place @@ -1562,6 +1494,7 @@ FcConfigSubstituteWithPat (FcConfig *config, FcConfigPatternAdd (p, e->field, l, FcTrue); break; default: + FcValueListDestroy (FcValueListPtrCreateDynamic(l)); break; } }