From dafebc5bb70303f0b5baf0b087cf4d9a64b5c7f0 Mon Sep 17 00:00:00 2001 From: marha Date: Mon, 12 Sep 2011 11:27:51 +0200 Subject: Synchronised line endinge with release branch --- fontconfig/fc-cache/Makefile.am | 136 +++--- fontconfig/fc-cache/fc-cache.c | 944 +++++++++++++++++++------------------- fontconfig/fc-cache/fc-cache.sgml | 440 +++++++++--------- 3 files changed, 760 insertions(+), 760 deletions(-) (limited to 'fontconfig/fc-cache') diff --git a/fontconfig/fc-cache/Makefile.am b/fontconfig/fc-cache/Makefile.am index 4402d8952..300c96697 100644 --- a/fontconfig/fc-cache/Makefile.am +++ b/fontconfig/fc-cache/Makefile.am @@ -1,68 +1,68 @@ -# -# fontconfig/fc-cache/Makefile.am -# -# Copyright © 2003 Keith Packard -# -# Permission to use, copy, modify, distribute, and sell this software and its -# documentation for any purpose is hereby granted without fee, provided that -# the above copyright notice appear in all copies and that both that -# copyright notice and this permission notice appear in supporting -# documentation, and that the name of the author(s) not be used in -# advertising or publicity pertaining to distribution of the software without -# specific, written prior permission. The authors make no -# representations about the suitability of this software for any purpose. It -# is provided "as is" without express or implied warranty. -# -# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, -# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO -# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR -# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, -# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER -# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -# PERFORMANCE OF THIS SOFTWARE. - -DOC2MAN = docbook2man - -FC_CACHE_SRC=${top_srcdir}/fc-cache - -SGML = ${FC_CACHE_SRC}/fc-cache.sgml - -if OS_WIN32 -else -install-data-local: - -$(mkinstalldirs) "$(DESTDIR)$(fc_cachedir)" - -uninstall-local: - -$(RM) -rf "$(DESTDIR)$(fc_cachedir)" -endif - -INCLUDES=-I${top_srcdir} -I${top_srcdir}/src $(WARN_CFLAGS) - -bin_PROGRAMS=fc-cache - -BUILT_MANS=fc-cache.1 - -if ENABLE_DOCS -man_MANS=${BUILT_MANS} -endif - -EXTRA_DIST=fc-cache.sgml $(BUILT_MANS) - -fc_cache_LDADD = ${top_builddir}/src/libfontconfig.la - -if USEDOCBOOK - -${man_MANS}: ${SGML} - $(RM) $@ - $(DOC2MAN) ${SGML} - $(RM) manpage.* - -all-local: $(man_MANS) - -clean-local: - $(RM) $(man_MANS) - -else -all-local: -clean-local: -endif +# +# fontconfig/fc-cache/Makefile.am +# +# Copyright © 2003 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of the author(s) not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. The authors make no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. + +DOC2MAN = docbook2man + +FC_CACHE_SRC=${top_srcdir}/fc-cache + +SGML = ${FC_CACHE_SRC}/fc-cache.sgml + +if OS_WIN32 +else +install-data-local: + -$(mkinstalldirs) "$(DESTDIR)$(fc_cachedir)" + +uninstall-local: + -$(RM) -rf "$(DESTDIR)$(fc_cachedir)" +endif + +INCLUDES=-I${top_srcdir} -I${top_srcdir}/src $(WARN_CFLAGS) + +bin_PROGRAMS=fc-cache + +BUILT_MANS=fc-cache.1 + +if ENABLE_DOCS +man_MANS=${BUILT_MANS} +endif + +EXTRA_DIST=fc-cache.sgml $(BUILT_MANS) + +fc_cache_LDADD = ${top_builddir}/src/libfontconfig.la + +if USEDOCBOOK + +${man_MANS}: ${SGML} + $(RM) $@ + $(DOC2MAN) ${SGML} + $(RM) manpage.* + +all-local: $(man_MANS) + +clean-local: + $(RM) $(man_MANS) + +else +all-local: +clean-local: +endif diff --git a/fontconfig/fc-cache/fc-cache.c b/fontconfig/fc-cache/fc-cache.c index c7dcbbfd7..d2653507e 100644 --- a/fontconfig/fc-cache/fc-cache.c +++ b/fontconfig/fc-cache/fc-cache.c @@ -1,472 +1,472 @@ -/* - * fontconfig/fc-cache/fc-cache.c - * - * Copyright © 2002 Keith Packard - * - * Permission to use, copy, modify, distribute, and sell this software and its - * documentation for any purpose is hereby granted without fee, provided that - * the above copyright notice appear in all copies and that both that - * copyright notice and this permission notice appear in supporting - * documentation, and that the name of the author(s) not be used in - * advertising or publicity pertaining to distribution of the software without - * specific, written prior permission. The authors make no - * representations about the suitability of this software for any purpose. It - * is provided "as is" without express or implied warranty. - * - * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, - * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO - * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR - * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER - * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - * PERFORMANCE OF THIS SOFTWARE. - */ - -#include "../src/fcarch.h" - -#ifdef HAVE_CONFIG_H -#include -#else -#ifdef linux -#define HAVE_GETOPT_LONG 1 -#endif -#define HAVE_GETOPT 1 -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#if defined (_WIN32) -#define STRICT -#include -#define sleep(x) Sleep((x) * 1000) -#undef STRICT -#endif - -#ifndef O_BINARY -#define O_BINARY 0 -#endif - -#ifndef HAVE_GETOPT -#define HAVE_GETOPT 0 -#endif -#ifndef HAVE_GETOPT_LONG -#define HAVE_GETOPT_LONG 0 -#endif - -#if HAVE_GETOPT_LONG -#undef _GNU_SOURCE -#define _GNU_SOURCE -#include -const struct option longopts[] = { - {"force", 0, 0, 'f'}, - {"really-force", 0, 0, 'r'}, - {"system-only", 0, 0, 's'}, - {"version", 0, 0, 'V'}, - {"verbose", 0, 0, 'v'}, - {"help", 0, 0, 'h'}, - {NULL,0,0,0}, -}; -#else -#if HAVE_GETOPT -extern char *optarg; -extern int optind, opterr, optopt; -#endif -#endif - -static void -usage (char *program, int error) -{ - FILE *file = error ? stderr : stdout; -#if HAVE_GETOPT_LONG - fprintf (file, "usage: %s [-frsvVh] [--force|--really-force] [--system-only] [--verbose] [--version] [--help] [dirs]\n", - program); -#else - fprintf (file, "usage: %s [-frsvVh] [dirs]\n", - program); -#endif - fprintf (file, "Build font information caches in [dirs]\n" - "(all directories in font configuration by default).\n"); - fprintf (file, "\n"); -#if HAVE_GETOPT_LONG - fprintf (file, " -f, --force scan directories with apparently valid caches\n"); - fprintf (file, " -r, --really-force erase all existing caches, then rescan\n"); - fprintf (file, " -s, --system-only scan system-wide directories only\n"); - fprintf (file, " -v, --verbose display status information while busy\n"); - fprintf (file, " -V, --version display font config version and exit\n"); - fprintf (file, " -h, --help display this help and exit\n"); -#else - fprintf (file, " -f (force) scan directories with apparently valid caches\n"); - fprintf (file, " -r, (really force) erase all existing caches, then rescan\n"); - fprintf (file, " -s (system) scan system-wide directories only\n"); - fprintf (file, " -v (verbose) display status information while busy\n"); - fprintf (file, " -V (version) display font config version and exit\n"); - fprintf (file, " -h (help) display this help and exit\n"); -#endif - exit (error); -} - -static FcStrSet *processed_dirs; - -static int -scanDirs (FcStrList *list, FcConfig *config, FcBool force, FcBool really_force, FcBool verbose, int *changed) -{ - int ret = 0; - const FcChar8 *dir; - FcStrSet *subdirs; - FcStrList *sublist; - FcCache *cache; - struct stat statb; - FcBool was_valid; - int i; - - /* - * Now scan all of the directories into separate databases - * and write out the results - */ - while ((dir = FcStrListNext (list))) - { - if (verbose) - { - printf ("%s: ", dir); - fflush (stdout); - } - - if (!dir) - { - if (verbose) - printf ("skipping, no such directory\n"); - continue; - } - - if (FcStrSetMember (processed_dirs, dir)) - { - if (verbose) - printf ("skipping, looped directory detected\n"); - continue; - } - - if (stat ((char *) dir, &statb) == -1) - { - switch (errno) { - case ENOENT: - case ENOTDIR: - if (verbose) - printf ("skipping, no such directory\n"); - break; - default: - fprintf (stderr, "\"%s\": ", dir); - perror (""); - ret++; - break; - } - continue; - } - - if (!S_ISDIR (statb.st_mode)) - { - fprintf (stderr, "\"%s\": not a directory, skipping\n", dir); - continue; - } - - if (really_force) - FcDirCacheUnlink (dir, config); - - cache = NULL; - was_valid = FcFalse; - if (!force) { - cache = FcDirCacheLoad (dir, config, NULL); - if (cache) - was_valid = FcTrue; - } - - if (!cache) - { - (*changed)++; - cache = FcDirCacheRead (dir, FcTrue, config); - if (!cache) - { - fprintf (stderr, "%s: error scanning\n", dir); - ret++; - continue; - } - } - - if (was_valid) - { - if (verbose) - printf ("skipping, existing cache is valid: %d fonts, %d dirs\n", - FcCacheNumFont (cache), FcCacheNumSubdir (cache)); - } - else - { - if (verbose) - printf ("caching, new cache contents: %d fonts, %d dirs\n", - FcCacheNumFont (cache), FcCacheNumSubdir (cache)); - - if (!FcDirCacheValid (dir)) - { - fprintf (stderr, "%s: failed to write cache\n", dir); - (void) FcDirCacheUnlink (dir, config); - ret++; - } - } - - subdirs = FcStrSetCreate (); - if (!subdirs) - { - fprintf (stderr, "%s: Can't create subdir set\n", dir); - ret++; - FcDirCacheUnload (cache); - continue; - } - for (i = 0; i < FcCacheNumSubdir (cache); i++) - FcStrSetAdd (subdirs, FcCacheSubdir (cache, i)); - - FcDirCacheUnload (cache); - - sublist = FcStrListCreate (subdirs); - FcStrSetDestroy (subdirs); - if (!sublist) - { - fprintf (stderr, "%s: Can't create subdir list\n", dir); - ret++; - continue; - } - FcStrSetAdd (processed_dirs, dir); - ret += scanDirs (sublist, config, force, really_force, verbose, changed); - } - FcStrListDone (list); - return ret; -} - -static FcBool -cleanCacheDirectory (FcConfig *config, FcChar8 *dir, FcBool verbose) -{ - DIR *d; - struct dirent *ent; - FcChar8 *dir_base; - FcBool ret = FcTrue; - FcBool remove; - FcCache *cache; - struct stat target_stat; - - dir_base = FcStrPlus (dir, (FcChar8 *) "/"); - if (!dir_base) - { - fprintf (stderr, "%s: out of memory\n", dir); - return FcFalse; - } - if (access ((char *) dir, W_OK) != 0) - { - if (verbose) - printf ("%s: not cleaning %s cache directory\n", dir, - access ((char *) dir, F_OK) == 0 ? "unwritable" : "non-existent"); - FcStrFree (dir_base); - return FcTrue; - } - if (verbose) - printf ("%s: cleaning cache directory\n", dir); - d = opendir ((char *) dir); - if (!d) - { - perror ((char *) dir); - FcStrFree (dir_base); - return FcFalse; - } - while ((ent = readdir (d))) - { - FcChar8 *file_name; - const FcChar8 *target_dir; - - if (ent->d_name[0] == '.') - continue; - /* skip cache files for different architectures and */ - /* files which are not cache files at all */ - if (strlen(ent->d_name) != 32 + strlen ("-" FC_ARCHITECTURE FC_CACHE_SUFFIX) || - strcmp(ent->d_name + 32, "-" FC_ARCHITECTURE FC_CACHE_SUFFIX)) - continue; - - file_name = FcStrPlus (dir_base, (FcChar8 *) ent->d_name); - if (!file_name) - { - fprintf (stderr, "%s: allocation failure\n", dir); - ret = FcFalse; - break; - } - remove = FcFalse; - cache = FcDirCacheLoadFile (file_name, NULL); - if (!cache) - { - if (verbose) - printf ("%s: invalid cache file: %s\n", dir, ent->d_name); - remove = FcTrue; - } - else - { - target_dir = FcCacheDir (cache); - if (stat ((char *) target_dir, &target_stat) < 0) - { - if (verbose) - printf ("%s: %s: missing directory: %s \n", - dir, ent->d_name, target_dir); - remove = FcTrue; - } - } - if (remove) - { - if (unlink ((char *) file_name) < 0) - { - perror ((char *) file_name); - ret = FcFalse; - } - } - FcDirCacheUnload (cache); - FcStrFree (file_name); - } - - closedir (d); - FcStrFree (dir_base); - return ret; -} - -static FcBool -cleanCacheDirectories (FcConfig *config, FcBool verbose) -{ - FcStrList *cache_dirs = FcConfigGetCacheDirs (config); - FcChar8 *cache_dir; - FcBool ret = FcTrue; - - if (!cache_dirs) - return FcFalse; - while ((cache_dir = FcStrListNext (cache_dirs))) - { - if (!cleanCacheDirectory (config, cache_dir, verbose)) - { - ret = FcFalse; - break; - } - } - FcStrListDone (cache_dirs); - return ret; -} - -int -main (int argc, char **argv) -{ - FcStrSet *dirs; - FcStrList *list; - FcBool verbose = FcFalse; - FcBool force = FcFalse; - FcBool really_force = FcFalse; - FcBool systemOnly = FcFalse; - FcConfig *config; - int i; - int changed; - int ret; -#if HAVE_GETOPT_LONG || HAVE_GETOPT - int c; - -#if HAVE_GETOPT_LONG - while ((c = getopt_long (argc, argv, "frsVvh", longopts, NULL)) != -1) -#else - while ((c = getopt (argc, argv, "frsVvh")) != -1) -#endif - { - switch (c) { - case 'r': - really_force = FcTrue; - /* fall through */ - case 'f': - force = FcTrue; - break; - case 's': - systemOnly = FcTrue; - break; - case 'V': - fprintf (stderr, "fontconfig version %d.%d.%d\n", - FC_MAJOR, FC_MINOR, FC_REVISION); - exit (0); - case 'v': - verbose = FcTrue; - break; - case 'h': - usage (argv[0], 0); - default: - usage (argv[0], 1); - } - } - i = optind; -#else - i = 1; -#endif - - if (systemOnly) - FcConfigEnableHome (FcFalse); - config = FcInitLoadConfig (); - if (!config) - { - fprintf (stderr, "%s: Can't init font config library\n", argv[0]); - return 1; - } - FcConfigSetCurrent (config); - - if (argv[i]) - { - dirs = FcStrSetCreate (); - if (!dirs) - { - fprintf (stderr, "%s: Can't create list of directories\n", - argv[0]); - return 1; - } - while (argv[i]) - { - if (!FcStrSetAddFilename (dirs, (FcChar8 *) argv[i])) - { - fprintf (stderr, "%s: Can't add directory\n", argv[0]); - return 1; - } - i++; - } - list = FcStrListCreate (dirs); - FcStrSetDestroy (dirs); - } - else - list = FcConfigGetConfigDirs (config); - - if ((processed_dirs = FcStrSetCreate()) == NULL) { - fprintf(stderr, "Cannot malloc\n"); - return 1; - } - - changed = 0; - ret = scanDirs (list, config, force, really_force, verbose, &changed); - - FcStrSetDestroy (processed_dirs); - - cleanCacheDirectories (config, verbose); - - /* - * Now we need to sleep a second (or two, to be extra sure), to make - * sure that timestamps for changes after this run of fc-cache are later - * then any timestamps we wrote. We don't use gettimeofday() because - * sleep(3) can't be interrupted by a signal here -- this isn't in the - * library, and there aren't any signals flying around here. - */ - FcConfigDestroy (config); - FcFini (); - if (changed) - sleep (2); - if (verbose) - printf ("%s: %s\n", argv[0], ret ? "failed" : "succeeded"); - return ret; -} +/* + * fontconfig/fc-cache/fc-cache.c + * + * Copyright © 2002 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of the author(s) not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. The authors make no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#include "../src/fcarch.h" + +#ifdef HAVE_CONFIG_H +#include +#else +#ifdef linux +#define HAVE_GETOPT_LONG 1 +#endif +#define HAVE_GETOPT 1 +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined (_WIN32) +#define STRICT +#include +#define sleep(x) Sleep((x) * 1000) +#undef STRICT +#endif + +#ifndef O_BINARY +#define O_BINARY 0 +#endif + +#ifndef HAVE_GETOPT +#define HAVE_GETOPT 0 +#endif +#ifndef HAVE_GETOPT_LONG +#define HAVE_GETOPT_LONG 0 +#endif + +#if HAVE_GETOPT_LONG +#undef _GNU_SOURCE +#define _GNU_SOURCE +#include +const struct option longopts[] = { + {"force", 0, 0, 'f'}, + {"really-force", 0, 0, 'r'}, + {"system-only", 0, 0, 's'}, + {"version", 0, 0, 'V'}, + {"verbose", 0, 0, 'v'}, + {"help", 0, 0, 'h'}, + {NULL,0,0,0}, +}; +#else +#if HAVE_GETOPT +extern char *optarg; +extern int optind, opterr, optopt; +#endif +#endif + +static void +usage (char *program, int error) +{ + FILE *file = error ? stderr : stdout; +#if HAVE_GETOPT_LONG + fprintf (file, "usage: %s [-frsvVh] [--force|--really-force] [--system-only] [--verbose] [--version] [--help] [dirs]\n", + program); +#else + fprintf (file, "usage: %s [-frsvVh] [dirs]\n", + program); +#endif + fprintf (file, "Build font information caches in [dirs]\n" + "(all directories in font configuration by default).\n"); + fprintf (file, "\n"); +#if HAVE_GETOPT_LONG + fprintf (file, " -f, --force scan directories with apparently valid caches\n"); + fprintf (file, " -r, --really-force erase all existing caches, then rescan\n"); + fprintf (file, " -s, --system-only scan system-wide directories only\n"); + fprintf (file, " -v, --verbose display status information while busy\n"); + fprintf (file, " -V, --version display font config version and exit\n"); + fprintf (file, " -h, --help display this help and exit\n"); +#else + fprintf (file, " -f (force) scan directories with apparently valid caches\n"); + fprintf (file, " -r, (really force) erase all existing caches, then rescan\n"); + fprintf (file, " -s (system) scan system-wide directories only\n"); + fprintf (file, " -v (verbose) display status information while busy\n"); + fprintf (file, " -V (version) display font config version and exit\n"); + fprintf (file, " -h (help) display this help and exit\n"); +#endif + exit (error); +} + +static FcStrSet *processed_dirs; + +static int +scanDirs (FcStrList *list, FcConfig *config, FcBool force, FcBool really_force, FcBool verbose, int *changed) +{ + int ret = 0; + const FcChar8 *dir; + FcStrSet *subdirs; + FcStrList *sublist; + FcCache *cache; + struct stat statb; + FcBool was_valid; + int i; + + /* + * Now scan all of the directories into separate databases + * and write out the results + */ + while ((dir = FcStrListNext (list))) + { + if (verbose) + { + printf ("%s: ", dir); + fflush (stdout); + } + + if (!dir) + { + if (verbose) + printf ("skipping, no such directory\n"); + continue; + } + + if (FcStrSetMember (processed_dirs, dir)) + { + if (verbose) + printf ("skipping, looped directory detected\n"); + continue; + } + + if (stat ((char *) dir, &statb) == -1) + { + switch (errno) { + case ENOENT: + case ENOTDIR: + if (verbose) + printf ("skipping, no such directory\n"); + break; + default: + fprintf (stderr, "\"%s\": ", dir); + perror (""); + ret++; + break; + } + continue; + } + + if (!S_ISDIR (statb.st_mode)) + { + fprintf (stderr, "\"%s\": not a directory, skipping\n", dir); + continue; + } + + if (really_force) + FcDirCacheUnlink (dir, config); + + cache = NULL; + was_valid = FcFalse; + if (!force) { + cache = FcDirCacheLoad (dir, config, NULL); + if (cache) + was_valid = FcTrue; + } + + if (!cache) + { + (*changed)++; + cache = FcDirCacheRead (dir, FcTrue, config); + if (!cache) + { + fprintf (stderr, "%s: error scanning\n", dir); + ret++; + continue; + } + } + + if (was_valid) + { + if (verbose) + printf ("skipping, existing cache is valid: %d fonts, %d dirs\n", + FcCacheNumFont (cache), FcCacheNumSubdir (cache)); + } + else + { + if (verbose) + printf ("caching, new cache contents: %d fonts, %d dirs\n", + FcCacheNumFont (cache), FcCacheNumSubdir (cache)); + + if (!FcDirCacheValid (dir)) + { + fprintf (stderr, "%s: failed to write cache\n", dir); + (void) FcDirCacheUnlink (dir, config); + ret++; + } + } + + subdirs = FcStrSetCreate (); + if (!subdirs) + { + fprintf (stderr, "%s: Can't create subdir set\n", dir); + ret++; + FcDirCacheUnload (cache); + continue; + } + for (i = 0; i < FcCacheNumSubdir (cache); i++) + FcStrSetAdd (subdirs, FcCacheSubdir (cache, i)); + + FcDirCacheUnload (cache); + + sublist = FcStrListCreate (subdirs); + FcStrSetDestroy (subdirs); + if (!sublist) + { + fprintf (stderr, "%s: Can't create subdir list\n", dir); + ret++; + continue; + } + FcStrSetAdd (processed_dirs, dir); + ret += scanDirs (sublist, config, force, really_force, verbose, changed); + } + FcStrListDone (list); + return ret; +} + +static FcBool +cleanCacheDirectory (FcConfig *config, FcChar8 *dir, FcBool verbose) +{ + DIR *d; + struct dirent *ent; + FcChar8 *dir_base; + FcBool ret = FcTrue; + FcBool remove; + FcCache *cache; + struct stat target_stat; + + dir_base = FcStrPlus (dir, (FcChar8 *) "/"); + if (!dir_base) + { + fprintf (stderr, "%s: out of memory\n", dir); + return FcFalse; + } + if (access ((char *) dir, W_OK) != 0) + { + if (verbose) + printf ("%s: not cleaning %s cache directory\n", dir, + access ((char *) dir, F_OK) == 0 ? "unwritable" : "non-existent"); + FcStrFree (dir_base); + return FcTrue; + } + if (verbose) + printf ("%s: cleaning cache directory\n", dir); + d = opendir ((char *) dir); + if (!d) + { + perror ((char *) dir); + FcStrFree (dir_base); + return FcFalse; + } + while ((ent = readdir (d))) + { + FcChar8 *file_name; + const FcChar8 *target_dir; + + if (ent->d_name[0] == '.') + continue; + /* skip cache files for different architectures and */ + /* files which are not cache files at all */ + if (strlen(ent->d_name) != 32 + strlen ("-" FC_ARCHITECTURE FC_CACHE_SUFFIX) || + strcmp(ent->d_name + 32, "-" FC_ARCHITECTURE FC_CACHE_SUFFIX)) + continue; + + file_name = FcStrPlus (dir_base, (FcChar8 *) ent->d_name); + if (!file_name) + { + fprintf (stderr, "%s: allocation failure\n", dir); + ret = FcFalse; + break; + } + remove = FcFalse; + cache = FcDirCacheLoadFile (file_name, NULL); + if (!cache) + { + if (verbose) + printf ("%s: invalid cache file: %s\n", dir, ent->d_name); + remove = FcTrue; + } + else + { + target_dir = FcCacheDir (cache); + if (stat ((char *) target_dir, &target_stat) < 0) + { + if (verbose) + printf ("%s: %s: missing directory: %s \n", + dir, ent->d_name, target_dir); + remove = FcTrue; + } + } + if (remove) + { + if (unlink ((char *) file_name) < 0) + { + perror ((char *) file_name); + ret = FcFalse; + } + } + FcDirCacheUnload (cache); + FcStrFree (file_name); + } + + closedir (d); + FcStrFree (dir_base); + return ret; +} + +static FcBool +cleanCacheDirectories (FcConfig *config, FcBool verbose) +{ + FcStrList *cache_dirs = FcConfigGetCacheDirs (config); + FcChar8 *cache_dir; + FcBool ret = FcTrue; + + if (!cache_dirs) + return FcFalse; + while ((cache_dir = FcStrListNext (cache_dirs))) + { + if (!cleanCacheDirectory (config, cache_dir, verbose)) + { + ret = FcFalse; + break; + } + } + FcStrListDone (cache_dirs); + return ret; +} + +int +main (int argc, char **argv) +{ + FcStrSet *dirs; + FcStrList *list; + FcBool verbose = FcFalse; + FcBool force = FcFalse; + FcBool really_force = FcFalse; + FcBool systemOnly = FcFalse; + FcConfig *config; + int i; + int changed; + int ret; +#if HAVE_GETOPT_LONG || HAVE_GETOPT + int c; + +#if HAVE_GETOPT_LONG + while ((c = getopt_long (argc, argv, "frsVvh", longopts, NULL)) != -1) +#else + while ((c = getopt (argc, argv, "frsVvh")) != -1) +#endif + { + switch (c) { + case 'r': + really_force = FcTrue; + /* fall through */ + case 'f': + force = FcTrue; + break; + case 's': + systemOnly = FcTrue; + break; + case 'V': + fprintf (stderr, "fontconfig version %d.%d.%d\n", + FC_MAJOR, FC_MINOR, FC_REVISION); + exit (0); + case 'v': + verbose = FcTrue; + break; + case 'h': + usage (argv[0], 0); + default: + usage (argv[0], 1); + } + } + i = optind; +#else + i = 1; +#endif + + if (systemOnly) + FcConfigEnableHome (FcFalse); + config = FcInitLoadConfig (); + if (!config) + { + fprintf (stderr, "%s: Can't init font config library\n", argv[0]); + return 1; + } + FcConfigSetCurrent (config); + + if (argv[i]) + { + dirs = FcStrSetCreate (); + if (!dirs) + { + fprintf (stderr, "%s: Can't create list of directories\n", + argv[0]); + return 1; + } + while (argv[i]) + { + if (!FcStrSetAddFilename (dirs, (FcChar8 *) argv[i])) + { + fprintf (stderr, "%s: Can't add directory\n", argv[0]); + return 1; + } + i++; + } + list = FcStrListCreate (dirs); + FcStrSetDestroy (dirs); + } + else + list = FcConfigGetConfigDirs (config); + + if ((processed_dirs = FcStrSetCreate()) == NULL) { + fprintf(stderr, "Cannot malloc\n"); + return 1; + } + + changed = 0; + ret = scanDirs (list, config, force, really_force, verbose, &changed); + + FcStrSetDestroy (processed_dirs); + + cleanCacheDirectories (config, verbose); + + /* + * Now we need to sleep a second (or two, to be extra sure), to make + * sure that timestamps for changes after this run of fc-cache are later + * then any timestamps we wrote. We don't use gettimeofday() because + * sleep(3) can't be interrupted by a signal here -- this isn't in the + * library, and there aren't any signals flying around here. + */ + FcConfigDestroy (config); + FcFini (); + if (changed) + sleep (2); + if (verbose) + printf ("%s: %s\n", argv[0], ret ? "failed" : "succeeded"); + return ret; +} diff --git a/fontconfig/fc-cache/fc-cache.sgml b/fontconfig/fc-cache/fc-cache.sgml index b5328f173..3740be77f 100644 --- a/fontconfig/fc-cache/fc-cache.sgml +++ b/fontconfig/fc-cache/fc-cache.sgml @@ -1,220 +1,220 @@ - manpage.1'. You may view - the manual page with: `docbook-to-man manpage.sgml | nroff -man | - less'. A typical entry in a Makefile or Makefile.am is: - -manpage.1: manpage.sgml - docbook-to-man $< > $@ - - - The docbook-to-man binary is found in the docbook-to-man package. - Please remember that if you create the nroff version in one of the - debian/rules file targets (such as build), you will need to include - docbook-to-man in your Build-Depends control field. - - --> - - - Josselin"> - Mouette"> - - Aug 13, 2008"> - - 1"> - joss@debian.org"> - - fc-cache"> - - - Debian"> - GNU"> - GPL"> -]> - - - -
- &dhemail; -
- - &dhfirstname; - &dhsurname; - - - 2003 - &dhusername; - - &dhdate; -
- - &dhucpackage; - - &dhsection; - - - &dhpackage; - - build font information cache files - - - - &dhpackage; - - - - - - - - - - - - - - DESCRIPTION - - &dhpackage; scans the font directories on - the system and builds font information cache files for - applications using fontconfig for their font handling. - - If directory arguments are not given, - &dhpackage; uses each directory in the - current font configuration. Each directory is scanned for - font files readable by FreeType. A cache is created which - contains properties of each font and the associated filename. - This cache is used to speed up application startup when using - the fontconfig library. - - Note that &dhpackage; must be executed - once per architecture to generate font information customized - for that architecture. - - - - OPTIONS - - This program follows the usual &gnu; command line syntax, - with long options starting with two dashes (`-'). A summary of - options is included below. - - - - - - - - Force re-generation of apparently up-to-date cache files, - overriding the timestamp checking. - - - - - - - - Erase all existing cache files and rescan. - - - - - - - - Only scan system-wide directories, omitting the places - located in the user's home directory. - - - - - - - - Display status information while busy. - - - - - - - - Show summary of options. - - - - - - - - Show version of the program and exit. - - - - - - - Directory to scan for fonts. - - - - - - - FILES - - - %cachdir%/*-%arch%.cache-2 - - These files are generated by &dhpackage; - and contain maps from file names to font properties. They are - read by the fontconfig library at application startup to locate - appropriate fonts. - - - - - - - SEE ALSO - - - fc-cat(1) - fc-list(1) - fc-match(1) - fc-pattern(1) - fc-query(1) - fc-scan(1) - - - The fontconfig user's guide, in HTML format: - /usr/share/doc/fontconfig/fontconfig-user.html. - - - - AUTHOR - - This manual page was written by Keith Packard - keithp@keithp.com and &dhusername; &dhemail;. - - -
- - + manpage.1'. You may view + the manual page with: `docbook-to-man manpage.sgml | nroff -man | + less'. A typical entry in a Makefile or Makefile.am is: + +manpage.1: manpage.sgml + docbook-to-man $< > $@ + + + The docbook-to-man binary is found in the docbook-to-man package. + Please remember that if you create the nroff version in one of the + debian/rules file targets (such as build), you will need to include + docbook-to-man in your Build-Depends control field. + + --> + + + Josselin"> + Mouette"> + + Aug 13, 2008"> + + 1"> + joss@debian.org"> + + fc-cache"> + + + Debian"> + GNU"> + GPL"> +]> + + + +
+ &dhemail; +
+ + &dhfirstname; + &dhsurname; + + + 2003 + &dhusername; + + &dhdate; +
+ + &dhucpackage; + + &dhsection; + + + &dhpackage; + + build font information cache files + + + + &dhpackage; + + + + + + + + + + + + + + DESCRIPTION + + &dhpackage; scans the font directories on + the system and builds font information cache files for + applications using fontconfig for their font handling. + + If directory arguments are not given, + &dhpackage; uses each directory in the + current font configuration. Each directory is scanned for + font files readable by FreeType. A cache is created which + contains properties of each font and the associated filename. + This cache is used to speed up application startup when using + the fontconfig library. + + Note that &dhpackage; must be executed + once per architecture to generate font information customized + for that architecture. + + + + OPTIONS + + This program follows the usual &gnu; command line syntax, + with long options starting with two dashes (`-'). A summary of + options is included below. + + + + + + + + Force re-generation of apparently up-to-date cache files, + overriding the timestamp checking. + + + + + + + + Erase all existing cache files and rescan. + + + + + + + + Only scan system-wide directories, omitting the places + located in the user's home directory. + + + + + + + + Display status information while busy. + + + + + + + + Show summary of options. + + + + + + + + Show version of the program and exit. + + + + + + + Directory to scan for fonts. + + + + + + + FILES + + + %cachdir%/*-%arch%.cache-2 + + These files are generated by &dhpackage; + and contain maps from file names to font properties. They are + read by the fontconfig library at application startup to locate + appropriate fonts. + + + + + + + SEE ALSO + + + fc-cat(1) + fc-list(1) + fc-match(1) + fc-pattern(1) + fc-query(1) + fc-scan(1) + + + The fontconfig user's guide, in HTML format: + /usr/share/doc/fontconfig/fontconfig-user.html. + + + + AUTHOR + + This manual page was written by Keith Packard + keithp@keithp.com and &dhusername; &dhemail;. + + +
+ + -- cgit v1.2.3