#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)
{
exit (1);
}
-/* read serialized state from the cache file */
-static FcBool
-FcCacheFileRead (FcFontSet * set, FcStrSet *dirs, char * dir, char *cache_file)
+static FcBool
+FcCacheGlobalFileReadAndPrint (FcFontSet * set, FcStrSet *dirs, char *cache_file)
{
+ char name_buf[8192];
int fd;
char * current_arch_machine_name;
char candidate_arch_machine_name[9+MACHINE_SIGNATURE_SIZE];
+ char subdirName[FC_MAX_FILE_LEN + 1 + 12 + 1];
off_t current_arch_start = 0;
- char subdirName[FC_MAX_FILE_LEN + 1 + 12 + 1];
if (!cache_file)
- goto bail;
+ goto bail;
current_arch_machine_name = FcCacheMachineSignature();
fd = open(cache_file, O_RDONLY);
if (fd == -1)
- goto bail;
+ goto bail;
current_arch_start = FcCacheSkipToArch(fd, current_arch_machine_name);
if (current_arch_start < 0)
- goto bail1;
+ goto bail1;
lseek (fd, current_arch_start, SEEK_SET);
if (FcCacheReadString (fd, candidate_arch_machine_name,
sizeof (candidate_arch_machine_name)) == 0)
goto bail1;
+ while (1)
+ {
+ char * dir;
+ FcCacheReadString (fd, name_buf, sizeof (name_buf));
+ if (!strlen(name_buf))
+ break;
+ printf ("fc-cat: printing global cache contents for dir %s\n",
+ name_buf);
+
+ do
+ {
+ if (!FcCacheReadString (fd, subdirName,
+ sizeof (subdirName)) ||
+ !strlen (subdirName))
+ break;
+ /* then don't do anything with subdirName. */
+ } while (1);
+
+ if (!FcDirCacheConsume (fd, name_buf, set, 0))
+ goto bail1;
+
+ dir = malloc (strlen (name_buf) + 2);
+ if (!dir)
+ goto bail1;
+
+ strcpy (dir, name_buf);
+ strcat (dir, "/");
+
+ FcCachePrintSet (set, dirs, dir);
+ free (dir);
+
+ FcFontSetDestroy (set);
+ set = FcFontSetCreate();
+ }
+
+ bail1:
+ close (fd);
+ bail:
+ return FcFalse;
+}
+
+/* read serialized state from the cache file */
+static char *
+FcCacheFileRead (FcFontSet * set, FcStrSet *dirs, char *cache_file)
+{
+ int fd;
+ char * current_arch_machine_name;
+ off_t current_arch_start = 0;
+ char subdirName[FC_MAX_FILE_LEN + 1 + 12 + 1];
+ static char name_buf[8192], *dir;
+ FcChar8 * ls;
+
+ if (!cache_file)
+ goto bail;
+
+ current_arch_machine_name = FcCacheMachineSignature();
+ fd = open(cache_file, O_RDONLY);
+ if (fd == -1)
+ goto bail;
+
+ FcCacheReadString (fd, name_buf, sizeof (name_buf));
+ if (!strlen (name_buf))
+ goto bail;
+ if (strcmp (name_buf, FC_GLOBAL_MAGIC_COOKIE) == 0)
+ goto bail;
+ printf ("fc-cat: printing directory cache for cache which would be named %s\n",
+ name_buf);
+
+ current_arch_start = FcCacheSkipToArch(fd, current_arch_machine_name);
+ if (current_arch_start < 0)
+ goto bail1;
+
while (strlen(FcCacheReadString (fd, subdirName, sizeof (subdirName))) > 0)
FcStrSetAdd (dirs, (FcChar8 *)subdirName);
- if (!FcDirCacheConsume (fd, dir, set))
- goto bail1;
-
+ dir = strdup(name_buf);
+ ls = FcStrLastSlash ((FcChar8 *)dir);
+ if (ls)
+ *ls = 0;
+
+ if (!FcDirCacheConsume (fd, dir, set, 0))
+ goto bail2;
+ free (dir);
+
close(fd);
- free (cache_file);
- return FcTrue;
+ return name_buf;
+
+ bail2:
+ free (dir);
bail1:
close (fd);
bail:
- free (cache_file);
- return FcFalse;
+ return 0;
}
/*
}
FcBool
-FcCachePrintSet (FcFontSet *set, FcStrSet *dirs, char *cache_file)
+FcCachePrintSet (FcFontSet *set, FcStrSet *dirs, char *base_name)
{
FcPattern *font;
FcChar8 *name, *dir;
const FcChar8 *file, *base;
+ int ret;
int n;
int id;
- FcBool ret;
FcStrList *list;
list = FcStrListCreate (dirs);
while ((dir = FcStrListNext (list)))
{
- base = FcFileBaseName (cache_file, dir);
+ base = FcFileBaseName (base_name, dir);
if (!FcCacheWriteStringOld (stdout, base))
goto bail3;
if (PUTC (' ', stdout) == EOF)
font = set->fonts[n];
if (FcPatternGetString (font, FC_FILE, 0, (FcChar8 **) &file) != FcResultMatch)
goto bail3;
- base = FcFileBaseName (cache_file, file);
+ base = FcFileBaseName (base_name, file);
if (FcPatternGetInteger (font, FC_INDEX, 0, &id) != FcResultMatch)
goto bail3;
if (FcDebug () & FC_DBG_CACHEV)
bail3:
FcStrListDone (list);
bail2:
-bail1:
-bail0:
return FcFalse;
}
+FcBool
+FcFileIsDir (const FcChar8 *file)
+{
+ struct stat statb;
+
+ if (stat ((const char *) file, &statb) != 0)
+ return FcFalse;
+ return S_ISDIR(statb.st_mode);
+}
+
int
main (int argc, char **argv)
{
int i;
- int ret;
#if HAVE_GETOPT_LONG || HAVE_GETOPT
int c;
FcFontSet *fs = FcFontSetCreate();
FcStrSet *dirs = FcStrSetCreate();
+ char *name_buf;
#if HAVE_GETOPT_LONG
while ((c = getopt_long (argc, argv, "fsVv?", longopts, NULL)) != -1)
i = 1;
#endif
- if (FcCacheFileRead (fs, dirs, dirname (argv[i]), argv[i]))
- FcCachePrintSet (fs, dirs, argv[i]);
+ if (i >= argc)
+ usage (argv[0]);
+
+ if (FcFileIsDir ((const FcChar8 *)argv[i]))
+ {
+ char * dummy_name = (char *)FcStrPlus ((FcChar8 *)argv[i],
+ (FcChar8 *)"/dummy");
+ if (!FcDirScanConfig (fs, dirs, 0, 0,
+ (const FcChar8 *)argv[i], FcFalse, 0))
+ fprintf (stderr, "couldn't load font dir %s\n", argv[i]);
+ else
+ {
+ /* sorry, we can't tell you where the cache file is. */
+ FcCachePrintSet (fs, dirs, dummy_name);
+ FcStrFree ((FcChar8 *)dummy_name);
+ }
+ }
+ else if ((name_buf = FcCacheFileRead (fs, dirs, argv[i])) != 0)
+ FcCachePrintSet (fs, dirs, name_buf);
+ else
+ {
+ FcStrSetDestroy (dirs);
+ dirs = FcStrSetCreate ();
+ if (FcCacheGlobalFileReadAndPrint (fs, dirs, argv[i]))
+ ;
+ }
FcStrSetDestroy (dirs);
FcFontSetDestroy (fs);