X-Git-Url: https://git.wh0rd.org/?a=blobdiff_plain;f=src%2Ffcxml.c;h=bb0da1caf5693548a693401a9db361ba0ba0b799;hb=2d9c79c049d084c82fdda9a71c5a65502ae94cee;hp=52172b25dcdb0adf67165144da8672556fd8efbc;hpb=38e528e77673f0395ab802cd1040947e307f0c6c;p=fontconfig.git diff --git a/src/fcxml.c b/src/fcxml.c index 52172b2..bb0da1c 100644 --- a/src/fcxml.c +++ b/src/fcxml.c @@ -24,6 +24,7 @@ #include #include "fcint.h" +#include #ifndef HAVE_XMLPARSE_H #define HAVE_XMLPARSE_H 0 @@ -2077,6 +2078,84 @@ FcEndDoctypeDecl (void *userData) { } +static FcBool +FcConfigParseAndLoadDir (FcConfig *config, + const FcChar8 *name, + const FcChar8 *dir, + FcBool complain) +{ + DIR *d; + struct dirent *e; + FcBool ret = FcTrue; + FcChar8 *file; + FcChar8 *base; + FcStrSet *files; + + d = opendir ((char *) dir); + if (!d) + { + if (complain) + FcConfigMessage (0, FcSevereError, "Cannot open config dir \"%s\"", + name); + ret = FcFalse; + goto bail0; + } + /* freed below */ + file = (FcChar8 *) malloc (strlen ((char *) dir) + 1 + FC_MAX_FILE_LEN + 1); + if (!file) + { + ret = FcFalse; + goto bail1; + } + + strcpy ((char *) file, (char *) dir); + strcat ((char *) file, "/"); + base = file + strlen ((char *) file); + + files = FcStrSetCreate (); + if (!files) + { + ret = FcFalse; + goto bail2; + } + + if (FcDebug () & FC_DBG_CONFIG) + printf ("\tScanning config dir %s\n", dir); + + while (ret && (e = readdir (d))) + { + /* + * Add all files of the form [0-9]* + */ + if ('0' <= e->d_name[0] && e->d_name[0] <= '9' && + strlen (e->d_name) < FC_MAX_FILE_LEN) + { + strcpy ((char *) base, (char *) e->d_name); + if (!FcStrSetAdd (files, file)) + { + ret = FcFalse; + goto bail3; + } + } + } + if (ret) + { + int i; + qsort (files->strs, files->num, sizeof (FcChar8 *), + (int (*)(const void *, const void *)) FcStrCmp); + for (i = 0; ret && i < files->num; i++) + ret = FcConfigParseAndLoad (config, files->strs[i], complain); + } +bail3: + FcStrSetDestroy (files); +bail2: + free (file); +bail1: + closedir (d); +bail0: + return ret || !complain; +} + FcBool FcConfigParseAndLoad (FcConfig *config, const FcChar8 *name, @@ -2101,6 +2180,16 @@ FcConfigParseAndLoad (FcConfig *config, goto bail0; } + if (FcFileIsDir (filename)) + { + FcBool ret = FcConfigParseAndLoadDir (config, name, filename, complain); + FcStrFree (filename); + return ret; + } + + if (FcDebug () & FC_DBG_CONFIG) + printf ("\tLoading config file %s\n", filename); + f = fopen ((char *) filename, "r"); FcStrFree (filename); if (!f)