]> git.wh0rd.org - fontconfig.git/commitdiff
With no args, fc-cat now dumps all directories.
authorKeith Packard <keithp@neko.keithp.com>
Thu, 31 Aug 2006 18:56:43 +0000 (11:56 -0700)
committerKeith Packard <keithp@neko.keithp.com>
Thu, 31 Aug 2006 18:56:43 +0000 (11:56 -0700)
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.

fc-cat/fc-cat.c
src/fccache.c
src/fcint.h

index 63407e1904c417bd353fc395dc6dafb9c304f180..6074f1d92f1fe81670fa15e877979dccb82fb1fc 100644 (file)
@@ -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 FcChar8 *file)
 }
 
 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, FcStrSet *dirs, char *base_name)
     int                    ret;
     int                    n;
     int                    id;
+    int                    ndir = 0;
     FcStrList      *list;
 
     list = FcStrListCreate (dirs);
@@ -230,6 +232,7 @@ FcCachePrintSet (FcFontSet *set, FcStrSet *dirs, char *base_name)
            goto bail3;
        if (PUTC ('\n', stdout) == EOF)
            goto bail3;
+       ndir++;
     }
     
     for (n = 0; n < set->nfont; n++)
@@ -261,6 +264,8 @@ FcCachePrintSet (FcFontSet *set, FcStrSet *dirs, char *base_name)
        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;
index 5012581aa66e6d5bf7f6ee8043766e0e94979c86..378e39e1879023d7504a9c5e6c00be26d0df3ef4 100644 (file)
@@ -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, const FcChar8 *dir,
         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, const FcChar8 *dir,
                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 *closure)
 }
 
 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, FcStrSet * dirs,
     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, void *closure)
 FcBool
 FcDirCacheValid (const FcChar8 *dir, FcConfig *config)
 {
-    return FcDirCacheProcess (config, dir, FcDirCacheValidate, NULL);
+    return FcDirCacheProcess (config, dir, FcDirCacheValidate, NULL, NULL);
 }
 
 void
index f95bb4762cb74da52fed07dd67672c0458478d90..73d93315fb1e1ced8429367d062cd7c2376057af 100644 (file)
@@ -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);