[Fontconfig] fontconfig: Branch 'fc-2_4-keithp' - 2 commits

Keith Packard keithp at kemper.freedesktop.org
Thu Aug 31 14:39:00 PDT 2006


 fc-cache/fc-cache.c     |    4 -
 fc-cat/fc-cat.c         |  119 +++++++++++++++++++++++++++++++++++++-----------
 fc-list/fc-list.c       |    2 
 fontconfig/fontconfig.h |   23 ++-------
 src/fccache.c           |   30 +++++++++---
 src/fcint.h             |    8 ++-
 6 files changed, 131 insertions(+), 55 deletions(-)

New commits:
diff-tree f57783d2e9c7362b1e5d5e3a967ba90fa49ade6e (from 0a87ce715e1862c56702f5be43af9f246aa34e68)
Author: Keith Packard <keithp at neko.keithp.com>
Date:   Thu Aug 31 14:38:18 2006 -0700

    Revert ABI changes from version 2.3
    
    Accidental ABI changes and additions were discovered by looking at the
    differences in fontconfig.h. All of those have been reverted.

diff --git a/fc-cache/fc-cache.c b/fc-cache/fc-cache.c
index cf4ea6c..5fc4092 100644
--- a/fc-cache/fc-cache.c
+++ b/fc-cache/fc-cache.c
@@ -227,7 +227,7 @@ scanDirs (FcStrList *list, FcConfig *con
 	    FcDirCacheUnlink (dir, config);
 
 	if (!force)
-	    was_valid = FcDirCacheValid (dir, config);
+	    was_valid = FcDirCacheValid (dir);
 	
 	if (!FcDirScanConfig (set, subdirs, FcConfigGetBlanks (config), dir, force, config))
 	{
@@ -249,7 +249,7 @@ scanDirs (FcStrList *list, FcConfig *con
 		printf ("caching, %d fonts, %d dirs\n", 
 			set->nfont, nsubdirs (subdirs));
 
-	    if (!FcDirCacheValid (dir, config))
+	    if (!FcDirCacheValid (dir))
 	    {
 		fprintf (stderr, "%s: failed to write cache\n", dir);
 		(void) FcDirCacheUnlink (dir, config);
diff --git a/fc-list/fc-list.c b/fc-list/fc-list.c
index d8a3364..b85dfd7 100644
--- a/fc-list/fc-list.c
+++ b/fc-list/fc-list.c
@@ -150,7 +150,7 @@ main (int argc, char **argv)
 	    FcChar8 *font;
 	    FcChar8 *file;
 
-	    font = FcNameUnparseEscaped (fs->fonts[j], FcFalse);
+	    font = FcNameUnparse (fs->fonts[j]);
 	    if (FcPatternGetString (fs->fonts[j], FC_FILE, 0, &file) == FcResultMatch)
 		printf ("%s: ", file);
 	    printf ("%s\n", font);
diff --git a/fontconfig/fontconfig.h b/fontconfig/fontconfig.h
index 410da1e..feb781e 100644
--- a/fontconfig/fontconfig.h
+++ b/fontconfig/fontconfig.h
@@ -211,15 +211,15 @@ typedef struct _FcLangSet   FcLangSet;
 typedef struct _FcValue {
     FcType	type;
     union {
-	const FcChar8  *s;
+	const FcChar8	*s;
 	int		i;
 	FcBool		b;
 	double		d;
-	const FcMatrix  *m;
-	const FcCharSet *c;
+	const FcMatrix	*m;
+	const FcCharSet	*c;
 	void		*f;
 	const FcPattern	*p;
-	const FcLangSet *l;
+	const FcLangSet	*l;
     } u;
 } FcValue;
 
@@ -273,13 +273,7 @@ typedef struct _FcStrSet    FcStrSet;
 _FCFUNCPROTOBEGIN
 
 FcBool
-FcDirCacheValid (const FcChar8 *cache_file, FcConfig *config);
-
-FcBool
-FcDirCacheHasCurrentArch (const FcChar8 *dir, FcConfig *config);
-
-FcBool
-FcDirCacheUnlink (const FcChar8 *dir, FcConfig *config);
+FcDirCacheValid (const FcChar8 *cache_file);
 
 /* fcblanks.c */
 FcBlanks *
@@ -325,10 +319,6 @@ FcConfigBuildFonts (FcConfig *config);
 FcStrList *
 FcConfigGetFontDirs (FcConfig   *config);
 
-const FcChar8 *
-FcConfigNormalizeFontDir (FcConfig  	*config, 
-			  const FcChar8 *d);
-
 FcStrList *
 FcConfigGetConfigDirs (FcConfig   *config);
 
@@ -665,9 +655,6 @@ FcNameParse (const FcChar8 *name);
 FcChar8 *
 FcNameUnparse (FcPattern *pat);
 
-FcChar8 *
-FcNameUnparseEscaped (FcPattern *pat, FcBool escape);
-
 /* fcpat.c */
 FcPattern *
 FcPatternCreate (void);
diff --git a/src/fccache.c b/src/fccache.c
index 378e39e..dd0896b 100644
--- a/src/fccache.c
+++ b/src/fccache.c
@@ -379,12 +379,24 @@ FcDirCacheValidate (int fd, off_t size, 
     return ret;
 }
 
-FcBool
-FcDirCacheValid (const FcChar8 *dir, FcConfig *config)
+static FcBool
+FcDirCacheValidConfig (const FcChar8 *dir, FcConfig *config)
 {
     return FcDirCacheProcess (config, dir, FcDirCacheValidate, NULL, NULL);
 }
 
+FcBool
+FcDirCacheValid (const FcChar8 *dir)
+{
+    FcConfig	*config;
+    
+    config = FcConfigGetCurrent ();
+    if (!config)
+        return FcFalse;
+
+    return FcDirCacheValidConfig (dir, config);
+}
+
 void
 FcDirCacheUnmap (FcCache *cache)
 {
diff --git a/src/fcint.h b/src/fcint.h
index 73d9331..0bc5df2 100644
--- a/src/fcint.h
+++ b/src/fcint.h
@@ -512,6 +512,9 @@ FcDirCacheMap (const FcChar8 *dir, FcCon
 FcBool
 FcDirCacheLoad (int fd, off_t size, void *closure);
     
+FcBool
+FcDirCacheUnlink (const FcChar8 *dir, FcConfig *config);
+
 /* fccfg.c */
 
 FcBool
@@ -803,6 +806,9 @@ FcNameParseLangSet (const FcChar8 *strin
 FcBool
 FcNameUnparseLangSet (FcStrBuf *buf, const FcLangSet *ls);
 
+FcChar8 *
+FcNameUnparseEscaped (FcPattern *pat, FcBool escape);
+
 /* fclist.c */
 
 FcBool
diff-tree 0a87ce715e1862c56702f5be43af9f246aa34e68 (from d8ab9e6c42cb3513a6623df0c2866e1ebbd96485)
Author: Keith Packard <keithp at neko.keithp.com>
Date:   Thu Aug 31 11:56:43 2006 -0700

    With no args, fc-cat now dumps all directories.
    
    Automatically list all font directories when no arguments are given to
    fc-cat. Also add -r option to recurse from specified cache directories.
    fc-cat also now prints the cache filename in verbose mode, along with the
    related directory name.

diff --git a/fc-cat/fc-cat.c b/fc-cat/fc-cat.c
index 63407e1..6074f1d 100644
--- a/fc-cat/fc-cat.c
+++ b/fc-cat/fc-cat.c
@@ -32,6 +32,7 @@
 #endif
 
 #include "../src/fccache.c"
+#include "../fc-arch/fcarch.h"
 #include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>
@@ -53,6 +54,7 @@
 const struct option longopts[] = {
     {"version", 0, 0, 'V'},
     {"verbose", 0, 0, 'v'},
+    {"recurse", 0, 0, 'r'},
     {"help", 0, 0, '?'},
     {NULL,0,0,0},
 };
@@ -78,9 +80,6 @@ extern int optind, opterr, optopt;
 #define PUTC(c,f) putc(c,f)
 #endif
 
-FcBool
-FcCachePrintSet (FcFontSet *set, FcStrSet *dirs, char *base_name);
-
 static FcBool
 FcCacheWriteChars (FILE *f, const FcChar8 *chars)
 {
@@ -149,13 +148,15 @@ static void
 usage (char *program)
 {
 #if HAVE_GETOPT_LONG
-    fprintf (stderr, "usage: %s [-V?] [--version] [--help] <fonts.cache-2>\n",
-	     program);
+    fprintf (stderr, "usage: %s [-V?] [--version] [--help] {*-%s.cache-2|directory}...\n",
+	     program, FC_ARCHITECTURE);
 #else
-    fprintf (stderr, "usage: %s [-fsvV?] <fonts.cache-2>\n",
-	     program);
+    fprintf (stderr, "usage: %s [-fsvV?] {*-%s.cache-2|directory}...\n",
+	     program, FC_ARCHITECTURE);
 #endif
-    fprintf (stderr, "Reads font information caches in <fonts.cache-2>\n");
+    fprintf (stderr, "Reads font information cache from:\n"); 
+    fprintf (stderr, " 1) specified fontconfig cache file\n");
+    fprintf (stderr, " 2) related to a particular font directory\n");
     fprintf (stderr, "\n");
 #if HAVE_GETOPT_LONG
     fprintf (stderr, "  -V, --version        display font config version and exit\n");
@@ -201,7 +202,7 @@ FcFileBaseName (const char *cache, const
 }
 
 FcBool
-FcCachePrintSet (FcFontSet *set, FcStrSet *dirs, char *base_name)
+FcCachePrintSet (FcFontSet *set, FcStrSet *dirs, char *base_name, FcBool verbose)
 {
     FcPattern	    *font;
     FcChar8	    *name, *dir;
@@ -209,6 +210,7 @@ FcCachePrintSet (FcFontSet *set, FcStrSe
     int		    ret;
     int		    n;
     int		    id;
+    int		    ndir = 0;
     FcStrList	    *list;
 
     list = FcStrListCreate (dirs);
@@ -230,6 +232,7 @@ FcCachePrintSet (FcFontSet *set, FcStrSe
 	    goto bail3;
 	if (PUTC ('\n', stdout) == EOF)
 	    goto bail3;
+	ndir++;
     }
     
     for (n = 0; n < set->nfont; n++)
@@ -261,6 +264,8 @@ FcCachePrintSet (FcFontSet *set, FcStrSe
 	if (PUTC ('\n', stdout) == EOF)
 	    goto bail3;
     }
+    if (verbose && !set->nfont && !ndir)
+	printf ("<empty>\n");
     
     FcStrListDone (list);
 
@@ -286,12 +291,12 @@ FcCacheFileMap (const FcChar8 *file)
 	close (fd);
 	return NULL;
     }
-    if (FcCacheLoad (fd, file_stat.st_size, &cache)) {
+    if (!FcDirCacheLoad (fd, file_stat.st_size, &cache)) {
 	close (fd);
-	return cache;
+	return NULL;
     }
     close (fd);
-    return NULL;
+    return cache;
 }
 
 int
@@ -301,16 +306,21 @@ main (int argc, char **argv)
     int		ret = 0;
     FcFontSet	*fs;
     FcStrSet    *dirs;
+    FcStrSet	*args = NULL;
+    FcStrList	*arglist;
     FcCache	*cache;
     FcConfig	*config;
+    FcChar8	*arg;
     int		verbose = 0;
+    int		recurse = 0;
+    FcBool	first = FcTrue;
 #if HAVE_GETOPT_LONG || HAVE_GETOPT
     int		c;
 
 #if HAVE_GETOPT_LONG
-    while ((c = getopt_long (argc, argv, "Vv?", longopts, NULL)) != -1)
+    while ((c = getopt_long (argc, argv, "Vvr?", longopts, NULL)) != -1)
 #else
-    while ((c = getopt (argc, argv, "Vv?")) != -1)
+    while ((c = getopt (argc, argv, "Vvr?")) != -1)
 #endif
     {
 	switch (c) {
@@ -321,6 +331,9 @@ main (int argc, char **argv)
 	case 'v':
 	    verbose++;
 	    break;
+	case 'r':
+	    recurse++;
+	    break;
 	default:
 	    usage (argv[0]);
 	}
@@ -338,22 +351,62 @@ main (int argc, char **argv)
     }
     FcConfigSetCurrent (config);
     
-    if (i >= argc)
-        usage (argv[0]);
+    args = FcStrSetCreate ();
+    if (!args)
+    {
+	fprintf (stderr, "%s: malloc failure\n", argv[0]);
+	return 1;
+    }
+    if (i < argc)
+    {
+	for (; i < argc; i++)
+	{
+	    if (!FcStrSetAdd (args, argv[i]))
+	    {
+		fprintf (stderr, "%s: malloc failure\n", argv[0]);
+		return 1;
+	    }
+	}
+	arglist = FcStrListCreate (args);
+	if (!arglist)
+	{
+	    fprintf (stderr, "%s: malloc failure\n", argv[0]);
+	    return 1;
+	}
+    }
+    else
+    {
+	recurse++;
+	arglist = FcConfigGetFontDirs (config);
+	while ((arg = FcStrListNext (arglist)))
+	    if (!FcStrSetAdd (args, arg))
+	    {
+		fprintf (stderr, "%s: malloc failure\n", argv[0]);
+		return 1;
+	    }
+	FcStrListDone (arglist);
+    }
+    arglist = FcStrListCreate (args);
+    if (!arglist)
+    {
+	fprintf (stderr, "%s: malloc failure\n", argv[0]);
+	return 1;
+    }
 
-    for (; i < argc; i++)
+    while ((arg = FcStrListNext (arglist)))
     {
-	int	j;
-	off_t	size;
-	intptr_t	*cache_dirs;
+	int	    j;
+	off_t	    size;
+	intptr_t    *cache_dirs;
+	FcChar8	    *cache_file = NULL;
 	
-	if (FcFileIsDir ((const FcChar8 *)argv[i]))
-	    cache = FcDirCacheMap ((const FcChar8 *) argv[i], config);
+	if (FcFileIsDir (arg))
+	    cache = FcDirCacheMap (arg, config, &cache_file);
 	else
-	    cache = FcCacheFileMap (argv[i]);
+	    cache = FcCacheFileMap (arg);
 	if (!cache)
 	{
-	    perror (argv[i]);
+	    perror ((char *) arg);
 	    ret++;
 	    continue;
 	}
@@ -362,17 +415,31 @@ main (int argc, char **argv)
 	fs = FcCacheSet (cache);
 	cache_dirs = FcCacheDirs (cache);
 	for (j = 0; j < cache->dirs_count; j++) 
+	{
 	    FcStrSetAdd (dirs, FcOffsetToPtr (cache_dirs,
 					      cache_dirs[j],
 					      FcChar8));
+	    if (recurse)
+		FcStrSetAdd (args, FcOffsetToPtr (cache_dirs,
+					      cache_dirs[j],
+					      FcChar8));
+	}
 
 	if (verbose)
-	    printf ("Name: %s\nDirectory: %s\n", argv[i], FcCacheDir(cache));
-        FcCachePrintSet (fs, dirs, FcCacheDir (cache));
+	{
+	    if (!first)
+		printf ("\n");
+	    printf ("Directory: %s\nCache: %s\n--------\n",
+		    FcCacheDir(cache), cache_file ? cache_file : arg);
+	    first = FcFalse;
+	}
+        FcCachePrintSet (fs, dirs, FcCacheDir (cache), verbose);
 
 	FcStrSetDestroy (dirs);
 
 	FcDirCacheUnmap (cache);
+	if (cache_file)
+	    FcStrFree (cache_file);
     }
 
     return 0;
diff --git a/src/fccache.c b/src/fccache.c
index 5012581..378e39e 100644
--- a/src/fccache.c
+++ b/src/fccache.c
@@ -197,7 +197,7 @@ FcCacheRead (FcConfig *config)
 static FcBool
 FcDirCacheProcess (FcConfig *config, const FcChar8 *dir, 
 		   FcBool (*callback) (int fd, off_t size, void *closure),
-		   void *closure)
+		   void *closure, FcChar8 **cache_file_ret)
 {
     int		fd = -1;
     FcChar8	cache_base[CACHEBASE_LEN];
@@ -221,7 +221,6 @@ FcDirCacheProcess (FcConfig *config, con
         if (!cache_hashed)
 	    break;
         fd = open((char *) cache_hashed, O_RDONLY | O_BINARY);
-	FcStrFree (cache_hashed);
         if (fd >= 0) {
 	    if (fstat (fd, &file_stat) >= 0 &&
 		dir_stat.st_mtime <= file_stat.st_mtime)
@@ -229,12 +228,17 @@ FcDirCacheProcess (FcConfig *config, con
 		ret = (*callback) (fd, file_stat.st_size, closure);
 		if (ret)
 		{
+		    if (cache_file_ret)
+			*cache_file_ret = cache_hashed;
+		    else
+			FcStrFree (cache_hashed);
 		    close (fd);
 		    break;
 		}
 	    }
 	    close (fd);
 	}
+    	FcStrFree (cache_hashed);
     }
     FcStrListDone (list);
     
@@ -303,13 +307,13 @@ FcDirCacheLoad (int fd, off_t size, void
 }
 
 FcCache *
-FcDirCacheMap (const FcChar8 *dir, FcConfig *config)
+FcDirCacheMap (const FcChar8 *dir, FcConfig *config, FcChar8 **cache_file)
 {
     FcCache *cache = NULL;
 
     if (!FcDirCacheProcess (config, dir,
 			    FcDirCacheLoad,
-			    &cache))
+			    &cache, cache_file))
 	return NULL;
     return cache;
 }
@@ -324,7 +328,7 @@ FcDirCacheRead (FcFontSet * set, FcStrSe
     intptr_t	*cache_dirs;
     FcPattern   **cache_fonts;
 
-    cache = FcDirCacheMap (dir, config);
+    cache = FcDirCacheMap (dir, config, NULL);
     if (!cache)
 	return FcFalse;
     
@@ -378,7 +382,7 @@ FcDirCacheValidate (int fd, off_t size, 
 FcBool
 FcDirCacheValid (const FcChar8 *dir, FcConfig *config)
 {
-    return FcDirCacheProcess (config, dir, FcDirCacheValidate, NULL);
+    return FcDirCacheProcess (config, dir, FcDirCacheValidate, NULL, NULL);
 }
 
 void
diff --git a/src/fcint.h b/src/fcint.h
index f95bb47..73d9331 100644
--- a/src/fcint.h
+++ b/src/fcint.h
@@ -507,7 +507,7 @@ FcBool
 FcDirCacheRead (FcFontSet * set, FcStrSet * dirs, const FcChar8 *dir, FcConfig *config);
  
 FcCache *
-FcDirCacheMap (const FcChar8 *dir, FcConfig *config);
+FcDirCacheMap (const FcChar8 *dir, FcConfig *config, FcChar8 **cache_file);
     
 FcBool
 FcDirCacheLoad (int fd, off_t size, void *closure);


More information about the Fontconfig mailing list