Add self to AUTHORS list.
Minor change to global cache file format to fix fc-cat bug reported by Frederic Crozat, and buglet with not globally caching directories with zero fonts cached.
This commit is contained in:
parent
52ac91f7c1
commit
c60ec7cc6d
2
AUTHORS
2
AUTHORS
|
@ -1 +1,3 @@
|
||||||
Keith Packard <keithp@keithp.com>
|
Keith Packard <keithp@keithp.com>
|
||||||
|
Patrick Lam <plam@mit.edu>
|
||||||
|
|
||||||
|
|
18
ChangeLog
18
ChangeLog
|
@ -1,3 +1,21 @@
|
||||||
|
2006-01-05 Patrick Lam <plam@mit.edu>
|
||||||
|
* AUTHORS:
|
||||||
|
|
||||||
|
Add self to AUTHORS list.
|
||||||
|
|
||||||
|
* fc-cat/fc-cat.c (FcCacheGlobalFileReadAndPrint,
|
||||||
|
FcCacheFileRead, FcCachePrintSet, main):
|
||||||
|
* src/fccache.c (FcGlobalCacheLoad, FcGlobalCacheUpdate,
|
||||||
|
FcGlobalCacheSave, FcCacheNextOffset,
|
||||||
|
FcDirCacheHasCurrentArch, FcDirCacheRead,
|
||||||
|
FcDirCacheConsume, FcDirCacheWrite):
|
||||||
|
* src/fcint.h:
|
||||||
|
* src/fcpat.c (comment):
|
||||||
|
|
||||||
|
Minor change to global cache file format to fix fc-cat bug
|
||||||
|
reported by Frederic Crozat, and buglet with not globally caching
|
||||||
|
directories with zero fonts cached.
|
||||||
|
|
||||||
2006-01-02 Lubos Lunak <l.lunak@suse.cz>
|
2006-01-02 Lubos Lunak <l.lunak@suse.cz>
|
||||||
reviewed by: plam
|
reviewed by: plam
|
||||||
|
|
||||||
|
|
|
@ -79,7 +79,7 @@ extern int optind, opterr, optopt;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
FcBool
|
FcBool
|
||||||
FcCachePrintSet (FcFontSet *set, FcStrSet *dirs, char *cache_file);
|
FcCachePrintSet (FcFontSet *set, FcStrSet *dirs, char *base_name);
|
||||||
|
|
||||||
static FcBool
|
static FcBool
|
||||||
FcCacheWriteChars (FILE *f, const FcChar8 *chars)
|
FcCacheWriteChars (FILE *f, const FcChar8 *chars)
|
||||||
|
@ -168,7 +168,7 @@ usage (char *program)
|
||||||
}
|
}
|
||||||
|
|
||||||
static FcBool
|
static FcBool
|
||||||
FcCacheGlobalFileReadAndPrint (FcFontSet * set, FcStrSet *dirs, char * dir, char *cache_file)
|
FcCacheGlobalFileReadAndPrint (FcFontSet * set, FcStrSet *dirs, char *cache_file)
|
||||||
{
|
{
|
||||||
char name_buf[8192];
|
char name_buf[8192];
|
||||||
int fd;
|
int fd;
|
||||||
|
@ -184,8 +184,7 @@ FcCacheGlobalFileReadAndPrint (FcFontSet * set, FcStrSet *dirs, char * dir, char
|
||||||
if (fd == -1)
|
if (fd == -1)
|
||||||
goto bail;
|
goto bail;
|
||||||
|
|
||||||
current_arch_start = FcCacheSkipToArch(fd, current_arch_machine_name,
|
current_arch_start = FcCacheSkipToArch(fd, current_arch_machine_name);
|
||||||
FcTrue);
|
|
||||||
if (current_arch_start < 0)
|
if (current_arch_start < 0)
|
||||||
goto bail1;
|
goto bail1;
|
||||||
|
|
||||||
|
@ -196,16 +195,21 @@ FcCacheGlobalFileReadAndPrint (FcFontSet * set, FcStrSet *dirs, char * dir, char
|
||||||
|
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
|
char * dir, * ls;
|
||||||
FcCacheReadString (fd, name_buf, sizeof (name_buf));
|
FcCacheReadString (fd, name_buf, sizeof (name_buf));
|
||||||
if (!strlen(name_buf))
|
if (!strlen(name_buf))
|
||||||
break;
|
break;
|
||||||
printf ("fc-cat: printing global cache contents for dir %s\n",
|
printf ("fc-cat: printing global cache contents for dir %s\n",
|
||||||
name_buf);
|
name_buf);
|
||||||
|
|
||||||
if (!FcDirCacheConsume (fd, dir, set))
|
if (!FcDirCacheConsume (fd, name_buf, set))
|
||||||
goto bail1;
|
goto bail1;
|
||||||
|
|
||||||
FcCachePrintSet (set, dirs, name_buf);
|
dir = strdup(name_buf);
|
||||||
|
strcat (dir, "/");
|
||||||
|
|
||||||
|
FcCachePrintSet (set, dirs, dir);
|
||||||
|
free (dir);
|
||||||
|
|
||||||
FcFontSetDestroy (set);
|
FcFontSetDestroy (set);
|
||||||
set = FcFontSetCreate();
|
set = FcFontSetCreate();
|
||||||
|
@ -218,15 +222,16 @@ FcCacheGlobalFileReadAndPrint (FcFontSet * set, FcStrSet *dirs, char * dir, char
|
||||||
}
|
}
|
||||||
|
|
||||||
/* read serialized state from the cache file */
|
/* read serialized state from the cache file */
|
||||||
static FcBool
|
static char *
|
||||||
FcCacheFileRead (FcFontSet * set, FcStrSet *dirs, char * dir, char *cache_file)
|
FcCacheFileRead (FcFontSet * set, FcStrSet *dirs, char *cache_file)
|
||||||
{
|
{
|
||||||
int fd;
|
int fd;
|
||||||
char * current_arch_machine_name;
|
char * current_arch_machine_name;
|
||||||
char candidate_arch_machine_name[9+MACHINE_SIGNATURE_SIZE];
|
char candidate_arch_machine_name[9+MACHINE_SIGNATURE_SIZE];
|
||||||
off_t current_arch_start = 0;
|
off_t current_arch_start = 0;
|
||||||
char subdirName[FC_MAX_FILE_LEN + 1 + 12 + 1];
|
char subdirName[FC_MAX_FILE_LEN + 1 + 12 + 1];
|
||||||
char name_buf[8192];
|
static char name_buf[8192], *dir;
|
||||||
|
FcChar8 * ls;
|
||||||
|
|
||||||
if (!cache_file)
|
if (!cache_file)
|
||||||
goto bail;
|
goto bail;
|
||||||
|
@ -239,32 +244,37 @@ FcCacheFileRead (FcFontSet * set, FcStrSet *dirs, char * dir, char *cache_file)
|
||||||
FcCacheReadString (fd, name_buf, sizeof (name_buf));
|
FcCacheReadString (fd, name_buf, sizeof (name_buf));
|
||||||
if (!strlen (name_buf))
|
if (!strlen (name_buf))
|
||||||
goto bail;
|
goto bail;
|
||||||
printf ("fc-cat: printing directory cache contents for dir %s\n",
|
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);
|
name_buf);
|
||||||
|
|
||||||
current_arch_start = FcCacheSkipToArch(fd, current_arch_machine_name,
|
current_arch_start = FcCacheSkipToArch(fd, current_arch_machine_name);
|
||||||
FcFalse);
|
|
||||||
if (current_arch_start < 0)
|
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 (strlen(FcCacheReadString (fd, subdirName, sizeof (subdirName))) > 0)
|
while (strlen(FcCacheReadString (fd, subdirName, sizeof (subdirName))) > 0)
|
||||||
FcStrSetAdd (dirs, (FcChar8 *)subdirName);
|
FcStrSetAdd (dirs, (FcChar8 *)subdirName);
|
||||||
|
|
||||||
|
dir = strdup(name_buf);
|
||||||
|
ls = FcStrLastSlash ((FcChar8 *)dir);
|
||||||
|
if (ls)
|
||||||
|
*ls = 0;
|
||||||
|
|
||||||
if (!FcDirCacheConsume (fd, dir, set))
|
if (!FcDirCacheConsume (fd, dir, set))
|
||||||
goto bail1;
|
goto bail2;
|
||||||
|
free (dir);
|
||||||
|
|
||||||
close(fd);
|
close(fd);
|
||||||
return FcTrue;
|
return name_buf;
|
||||||
|
|
||||||
|
bail2:
|
||||||
|
free (dir);
|
||||||
|
|
||||||
bail1:
|
bail1:
|
||||||
close (fd);
|
close (fd);
|
||||||
bail:
|
bail:
|
||||||
return FcFalse;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -284,7 +294,7 @@ FcFileBaseName (const char *cache, const FcChar8 *file)
|
||||||
}
|
}
|
||||||
|
|
||||||
FcBool
|
FcBool
|
||||||
FcCachePrintSet (FcFontSet *set, FcStrSet *dirs, char *cache_file)
|
FcCachePrintSet (FcFontSet *set, FcStrSet *dirs, char *base_name)
|
||||||
{
|
{
|
||||||
FcPattern *font;
|
FcPattern *font;
|
||||||
FcChar8 *name, *dir;
|
FcChar8 *name, *dir;
|
||||||
|
@ -300,7 +310,7 @@ FcCachePrintSet (FcFontSet *set, FcStrSet *dirs, char *cache_file)
|
||||||
|
|
||||||
while ((dir = FcStrListNext (list)))
|
while ((dir = FcStrListNext (list)))
|
||||||
{
|
{
|
||||||
base = FcFileBaseName (cache_file, dir);
|
base = FcFileBaseName (base_name, dir);
|
||||||
if (!FcCacheWriteStringOld (stdout, base))
|
if (!FcCacheWriteStringOld (stdout, base))
|
||||||
goto bail3;
|
goto bail3;
|
||||||
if (PUTC (' ', stdout) == EOF)
|
if (PUTC (' ', stdout) == EOF)
|
||||||
|
@ -320,7 +330,7 @@ FcCachePrintSet (FcFontSet *set, FcStrSet *dirs, char *cache_file)
|
||||||
font = set->fonts[n];
|
font = set->fonts[n];
|
||||||
if (FcPatternGetString (font, FC_FILE, 0, (FcChar8 **) &file) != FcResultMatch)
|
if (FcPatternGetString (font, FC_FILE, 0, (FcChar8 **) &file) != FcResultMatch)
|
||||||
goto bail3;
|
goto bail3;
|
||||||
base = FcFileBaseName (cache_file, file);
|
base = FcFileBaseName (base_name, file);
|
||||||
if (FcPatternGetInteger (font, FC_INDEX, 0, &id) != FcResultMatch)
|
if (FcPatternGetInteger (font, FC_INDEX, 0, &id) != FcResultMatch)
|
||||||
goto bail3;
|
goto bail3;
|
||||||
if (FcDebug () & FC_DBG_CACHEV)
|
if (FcDebug () & FC_DBG_CACHEV)
|
||||||
|
@ -362,6 +372,7 @@ main (int argc, char **argv)
|
||||||
int c;
|
int c;
|
||||||
FcFontSet *fs = FcFontSetCreate();
|
FcFontSet *fs = FcFontSetCreate();
|
||||||
FcStrSet *dirs = FcStrSetCreate();
|
FcStrSet *dirs = FcStrSetCreate();
|
||||||
|
char *name_buf;
|
||||||
|
|
||||||
#if HAVE_GETOPT_LONG
|
#if HAVE_GETOPT_LONG
|
||||||
while ((c = getopt_long (argc, argv, "fsVv?", longopts, NULL)) != -1)
|
while ((c = getopt_long (argc, argv, "fsVv?", longopts, NULL)) != -1)
|
||||||
|
@ -386,14 +397,13 @@ main (int argc, char **argv)
|
||||||
if (i >= argc)
|
if (i >= argc)
|
||||||
usage (argv[0]);
|
usage (argv[0]);
|
||||||
|
|
||||||
if (FcCacheFileRead (fs, dirs, dirname (strdup(argv[i])), argv[i]))
|
if (name_buf = FcCacheFileRead (fs, dirs, argv[i]))
|
||||||
FcCachePrintSet (fs, dirs, argv[i]);
|
FcCachePrintSet (fs, dirs, name_buf);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
FcStrSetDestroy (dirs);
|
FcStrSetDestroy (dirs);
|
||||||
dirs = FcStrSetCreate ();
|
dirs = FcStrSetCreate ();
|
||||||
if (FcCacheGlobalFileReadAndPrint (fs, dirs, dirname (strdup (argv[i])),
|
if (FcCacheGlobalFileReadAndPrint (fs, dirs, argv[i]))
|
||||||
argv[i]))
|
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -43,7 +43,7 @@ static char *
|
||||||
FcDirCacheHashName (char * cache_file, int collisions);
|
FcDirCacheHashName (char * cache_file, int collisions);
|
||||||
|
|
||||||
static off_t
|
static off_t
|
||||||
FcCacheSkipToArch (int fd, const char * arch, FcBool global);
|
FcCacheSkipToArch (int fd, const char * arch);
|
||||||
|
|
||||||
static FcBool
|
static FcBool
|
||||||
FcCacheCopyOld (int fd, int fd_orig, off_t start);
|
FcCacheCopyOld (int fd, int fd_orig, off_t start);
|
||||||
|
@ -219,9 +219,13 @@ FcGlobalCacheLoad (FcGlobalCache *cache,
|
||||||
|
|
||||||
cache->updated = FcFalse;
|
cache->updated = FcFalse;
|
||||||
|
|
||||||
|
FcCacheReadString (cache->fd, name_buf, sizeof (name_buf));
|
||||||
|
if (strcmp (name_buf, FC_GLOBAL_MAGIC_COOKIE) != 0)
|
||||||
|
return;
|
||||||
|
|
||||||
current_arch_machine_name = FcCacheMachineSignature ();
|
current_arch_machine_name = FcCacheMachineSignature ();
|
||||||
current_arch_start = FcCacheSkipToArch(cache->fd,
|
current_arch_start = FcCacheSkipToArch(cache->fd,
|
||||||
current_arch_machine_name, FcTrue);
|
current_arch_machine_name);
|
||||||
if (current_arch_start < 0)
|
if (current_arch_start < 0)
|
||||||
goto bail_and_destroy;
|
goto bail_and_destroy;
|
||||||
|
|
||||||
|
@ -325,9 +329,6 @@ FcGlobalCacheUpdate (FcGlobalCache *cache,
|
||||||
{
|
{
|
||||||
FcGlobalCacheDir * d;
|
FcGlobalCacheDir * d;
|
||||||
|
|
||||||
if (!set->nfont)
|
|
||||||
return FcTrue;
|
|
||||||
|
|
||||||
for (d = cache->dirs; d; d = d->next)
|
for (d = cache->dirs; d; d = d->next)
|
||||||
{
|
{
|
||||||
if (strcmp(d->name, name) == 0)
|
if (strcmp(d->name, name) == 0)
|
||||||
|
@ -388,8 +389,7 @@ FcGlobalCacheSave (FcGlobalCache *cache,
|
||||||
current_arch_start = 0;
|
current_arch_start = 0;
|
||||||
else
|
else
|
||||||
current_arch_start = FcCacheSkipToArch (fd_orig,
|
current_arch_start = FcCacheSkipToArch (fd_orig,
|
||||||
current_arch_machine_name,
|
current_arch_machine_name);
|
||||||
FcTrue);
|
|
||||||
|
|
||||||
if (current_arch_start < 0)
|
if (current_arch_start < 0)
|
||||||
current_arch_start = FcCacheNextOffset (lseek(fd_orig, 0, SEEK_END));
|
current_arch_start = FcCacheNextOffset (lseek(fd_orig, 0, SEEK_END));
|
||||||
|
@ -418,6 +418,7 @@ FcGlobalCacheSave (FcGlobalCache *cache,
|
||||||
}
|
}
|
||||||
truncate_to -= current_arch_start;
|
truncate_to -= current_arch_start;
|
||||||
|
|
||||||
|
FcCacheWriteString (fd, FC_GLOBAL_MAGIC_COOKIE);
|
||||||
sprintf (header, "%8x ", (int)truncate_to);
|
sprintf (header, "%8x ", (int)truncate_to);
|
||||||
strcat (header, current_arch_machine_name);
|
strcat (header, current_arch_machine_name);
|
||||||
if (!FcCacheWriteString (fd, header))
|
if (!FcCacheWriteString (fd, header))
|
||||||
|
@ -425,7 +426,7 @@ FcGlobalCacheSave (FcGlobalCache *cache,
|
||||||
|
|
||||||
for (dir = cache->dirs; dir; dir = dir->next)
|
for (dir = cache->dirs; dir; dir = dir->next)
|
||||||
{
|
{
|
||||||
if (dir->ent)
|
if (dir->name)
|
||||||
{
|
{
|
||||||
FcCacheWriteString (fd, dir->name);
|
FcCacheWriteString (fd, dir->name);
|
||||||
write (fd, &dir->metadata, sizeof(FcCache));
|
write (fd, &dir->metadata, sizeof(FcCache));
|
||||||
|
@ -483,15 +484,14 @@ FcCacheNextOffset(off_t w)
|
||||||
/* return the address of the segment for the provided arch,
|
/* return the address of the segment for the provided arch,
|
||||||
* or -1 if arch not found */
|
* or -1 if arch not found */
|
||||||
static off_t
|
static off_t
|
||||||
FcCacheSkipToArch (int fd, const char * arch, FcBool global)
|
FcCacheSkipToArch (int fd, const char * arch)
|
||||||
{
|
{
|
||||||
char candidate_arch_machine_name_count[MACHINE_SIGNATURE_SIZE + 9];
|
char candidate_arch_machine_name_count[MACHINE_SIGNATURE_SIZE + 9];
|
||||||
char * candidate_arch;
|
char * candidate_arch;
|
||||||
off_t current_arch_start = 0;
|
off_t current_arch_start = 0;
|
||||||
|
|
||||||
lseek (fd, 0, SEEK_SET);
|
lseek (fd, 0, SEEK_SET);
|
||||||
if (!global)
|
FcCacheSkipString (fd);
|
||||||
FcCacheSkipString (fd);
|
|
||||||
current_arch_start = lseek (fd, 0, SEEK_CUR);
|
current_arch_start = lseek (fd, 0, SEEK_CUR);
|
||||||
|
|
||||||
/* skip arches that are not the current arch */
|
/* skip arches that are not the current arch */
|
||||||
|
@ -652,8 +652,7 @@ FcDirCacheHasCurrentArch (const FcChar8 *dir)
|
||||||
goto bail;
|
goto bail;
|
||||||
|
|
||||||
current_arch_machine_name = FcCacheMachineSignature();
|
current_arch_machine_name = FcCacheMachineSignature();
|
||||||
current_arch_start = FcCacheSkipToArch(fd,
|
current_arch_start = FcCacheSkipToArch(fd, current_arch_machine_name);
|
||||||
current_arch_machine_name, FcFalse);
|
|
||||||
close (fd);
|
close (fd);
|
||||||
|
|
||||||
if (current_arch_start < 0)
|
if (current_arch_start < 0)
|
||||||
|
@ -929,8 +928,7 @@ FcDirCacheRead (FcFontSet * set, FcStrSet * dirs, const FcChar8 *dir)
|
||||||
|
|
||||||
current_arch_machine_name = FcCacheMachineSignature();
|
current_arch_machine_name = FcCacheMachineSignature();
|
||||||
current_arch_start = FcCacheSkipToArch(fd,
|
current_arch_start = FcCacheSkipToArch(fd,
|
||||||
current_arch_machine_name,
|
current_arch_machine_name);
|
||||||
FcFalse);
|
|
||||||
if (current_arch_start < 0)
|
if (current_arch_start < 0)
|
||||||
goto bail1;
|
goto bail1;
|
||||||
|
|
||||||
|
@ -973,6 +971,7 @@ FcDirCacheConsume (int fd, const char * dir, FcFontSet *set)
|
||||||
pos = FcCacheNextOffset (lseek(fd, 0, SEEK_CUR));
|
pos = FcCacheNextOffset (lseek(fd, 0, SEEK_CUR));
|
||||||
current_dir_block = mmap (0, metadata.count,
|
current_dir_block = mmap (0, metadata.count,
|
||||||
PROT_READ, MAP_SHARED, fd, pos);
|
PROT_READ, MAP_SHARED, fd, pos);
|
||||||
|
lseek (fd, pos+metadata.count, SEEK_SET);
|
||||||
if (current_dir_block == MAP_FAILED)
|
if (current_dir_block == MAP_FAILED)
|
||||||
return FcFalse;
|
return FcFalse;
|
||||||
|
|
||||||
|
@ -1122,7 +1121,7 @@ FcDirCacheWrite (FcFontSet *set, FcStrSet *dirs, const FcChar8 *dir)
|
||||||
|
|
||||||
if (fd_orig != -1)
|
if (fd_orig != -1)
|
||||||
current_arch_start =
|
current_arch_start =
|
||||||
FcCacheSkipToArch(fd_orig, current_arch_machine_name, FcFalse);
|
FcCacheSkipToArch(fd_orig, current_arch_machine_name);
|
||||||
|
|
||||||
if (current_arch_start < 0)
|
if (current_arch_start < 0)
|
||||||
current_arch_start = FcCacheNextOffset (lseek(fd_orig, 0, SEEK_END));
|
current_arch_start = FcCacheNextOffset (lseek(fd_orig, 0, SEEK_END));
|
||||||
|
|
|
@ -48,6 +48,7 @@
|
||||||
|
|
||||||
#define FC_FONT_FILE_INVALID ((FcChar8 *) ".")
|
#define FC_FONT_FILE_INVALID ((FcChar8 *) ".")
|
||||||
#define FC_FONT_FILE_DIR ((FcChar8 *) ".dir")
|
#define FC_FONT_FILE_DIR ((FcChar8 *) ".dir")
|
||||||
|
#define FC_GLOBAL_MAGIC_COOKIE "GLOBAL"
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
#define FC_SEARCH_PATH_SEPARATOR ';'
|
#define FC_SEARCH_PATH_SEPARATOR ';'
|
||||||
|
|
|
@ -2000,7 +2000,7 @@ FcStrUnserialize (FcCache * metadata, void *block_ptr)
|
||||||
/* we don't store these in the FcPattern itself because
|
/* we don't store these in the FcPattern itself because
|
||||||
* we don't want to serialize the directory names */
|
* we don't want to serialize the directory names */
|
||||||
|
|
||||||
/* I suppose this should be cleaned, too... */
|
/* I suppose this should be cleaned upon termination, too... */
|
||||||
typedef struct _FcPatternDirMapping {
|
typedef struct _FcPatternDirMapping {
|
||||||
const FcPattern *p;
|
const FcPattern *p;
|
||||||
const char *fname;
|
const char *fname;
|
||||||
|
|
Loading…
Reference in New Issue