Skip to content

Commit

Permalink
Add self to AUTHORS list.
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
Patrick Lam authored and Patrick Lam committed Jan 5, 2006
1 parent 52ac91f commit c60ec7c
Show file tree
Hide file tree
Showing 6 changed files with 75 additions and 45 deletions.
2 changes: 2 additions & 0 deletions AUTHORS
@@ -1 +1,3 @@
Keith Packard <keithp@keithp.com>
Patrick Lam <plam@mit.edu>

18 changes: 18 additions & 0 deletions 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>
reviewed by: plam

Expand Down
66 changes: 38 additions & 28 deletions fc-cat/fc-cat.c
Expand Up @@ -79,7 +79,7 @@ extern int optind, opterr, optopt;
#endif

FcBool
FcCachePrintSet (FcFontSet *set, FcStrSet *dirs, char *cache_file);
FcCachePrintSet (FcFontSet *set, FcStrSet *dirs, char *base_name);

static FcBool
FcCacheWriteChars (FILE *f, const FcChar8 *chars)
Expand Down Expand Up @@ -168,7 +168,7 @@ usage (char *program)
}

static FcBool
FcCacheGlobalFileReadAndPrint (FcFontSet * set, FcStrSet *dirs, char * dir, char *cache_file)
FcCacheGlobalFileReadAndPrint (FcFontSet * set, FcStrSet *dirs, char *cache_file)
{
char name_buf[8192];
int fd;
Expand All @@ -184,8 +184,7 @@ FcCacheGlobalFileReadAndPrint (FcFontSet * set, FcStrSet *dirs, char * dir, char
if (fd == -1)
goto bail;

current_arch_start = FcCacheSkipToArch(fd, current_arch_machine_name,
FcTrue);
current_arch_start = FcCacheSkipToArch(fd, current_arch_machine_name);
if (current_arch_start < 0)
goto bail1;

Expand All @@ -196,16 +195,21 @@ FcCacheGlobalFileReadAndPrint (FcFontSet * set, FcStrSet *dirs, char * dir, char

while (1)
{
char * dir, * ls;
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);

if (!FcDirCacheConsume (fd, dir, set))
if (!FcDirCacheConsume (fd, name_buf, set))
goto bail1;

FcCachePrintSet (set, dirs, name_buf);
dir = strdup(name_buf);
strcat (dir, "/");

FcCachePrintSet (set, dirs, dir);
free (dir);

FcFontSetDestroy (set);
set = FcFontSetCreate();
Expand All @@ -218,15 +222,16 @@ FcCacheGlobalFileReadAndPrint (FcFontSet * set, FcStrSet *dirs, char * dir, char
}

/* read serialized state from the cache file */
static FcBool
FcCacheFileRead (FcFontSet * set, FcStrSet *dirs, char * dir, char *cache_file)
static char *
FcCacheFileRead (FcFontSet * set, FcStrSet *dirs, char *cache_file)
{
int fd;
char * current_arch_machine_name;
char candidate_arch_machine_name[9+MACHINE_SIGNATURE_SIZE];
off_t current_arch_start = 0;
char subdirName[FC_MAX_FILE_LEN + 1 + 12 + 1];
char name_buf[8192];
static char name_buf[8192], *dir;
FcChar8 * ls;

if (!cache_file)
goto bail;
Expand All @@ -239,32 +244,37 @@ FcCacheFileRead (FcFontSet * set, FcStrSet *dirs, char * dir, char *cache_file)
FcCacheReadString (fd, name_buf, sizeof (name_buf));
if (!strlen (name_buf))
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);

current_arch_start = FcCacheSkipToArch(fd, current_arch_machine_name,
FcFalse);
current_arch_start = FcCacheSkipToArch(fd, current_arch_machine_name);
if (current_arch_start < 0)
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)
FcStrSetAdd (dirs, (FcChar8 *)subdirName);

dir = strdup(name_buf);
ls = FcStrLastSlash ((FcChar8 *)dir);
if (ls)
*ls = 0;

if (!FcDirCacheConsume (fd, dir, set))
goto bail1;

goto bail2;
free (dir);

close(fd);
return FcTrue;
return name_buf;

bail2:
free (dir);

bail1:
close (fd);
bail:
return FcFalse;
return 0;
}

/*
Expand All @@ -284,7 +294,7 @@ FcFileBaseName (const char *cache, const FcChar8 *file)
}

FcBool
FcCachePrintSet (FcFontSet *set, FcStrSet *dirs, char *cache_file)
FcCachePrintSet (FcFontSet *set, FcStrSet *dirs, char *base_name)
{
FcPattern *font;
FcChar8 *name, *dir;
Expand All @@ -300,7 +310,7 @@ FcCachePrintSet (FcFontSet *set, FcStrSet *dirs, char *cache_file)

while ((dir = FcStrListNext (list)))
{
base = FcFileBaseName (cache_file, dir);
base = FcFileBaseName (base_name, dir);
if (!FcCacheWriteStringOld (stdout, base))
goto bail3;
if (PUTC (' ', stdout) == EOF)
Expand All @@ -320,7 +330,7 @@ FcCachePrintSet (FcFontSet *set, FcStrSet *dirs, char *cache_file)
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)
Expand Down Expand Up @@ -362,6 +372,7 @@ main (int argc, char **argv)
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)
Expand All @@ -386,14 +397,13 @@ main (int argc, char **argv)
if (i >= argc)
usage (argv[0]);

if (FcCacheFileRead (fs, dirs, dirname (strdup(argv[i])), argv[i]))
FcCachePrintSet (fs, dirs, argv[i]);
if (name_buf = FcCacheFileRead (fs, dirs, argv[i]))
FcCachePrintSet (fs, dirs, name_buf);
else
{
FcStrSetDestroy (dirs);
dirs = FcStrSetCreate ();
if (FcCacheGlobalFileReadAndPrint (fs, dirs, dirname (strdup (argv[i])),
argv[i]))
if (FcCacheGlobalFileReadAndPrint (fs, dirs, argv[i]))
;
}

Expand Down
31 changes: 15 additions & 16 deletions src/fccache.c
Expand Up @@ -43,7 +43,7 @@ static char *
FcDirCacheHashName (char * cache_file, int collisions);

static off_t
FcCacheSkipToArch (int fd, const char * arch, FcBool global);
FcCacheSkipToArch (int fd, const char * arch);

static FcBool
FcCacheCopyOld (int fd, int fd_orig, off_t start);
Expand Down Expand Up @@ -219,9 +219,13 @@ FcGlobalCacheLoad (FcGlobalCache *cache,

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_start = FcCacheSkipToArch(cache->fd,
current_arch_machine_name, FcTrue);
current_arch_machine_name);
if (current_arch_start < 0)
goto bail_and_destroy;

Expand Down Expand Up @@ -325,9 +329,6 @@ FcGlobalCacheUpdate (FcGlobalCache *cache,
{
FcGlobalCacheDir * d;

if (!set->nfont)
return FcTrue;

for (d = cache->dirs; d; d = d->next)
{
if (strcmp(d->name, name) == 0)
Expand Down Expand Up @@ -388,8 +389,7 @@ FcGlobalCacheSave (FcGlobalCache *cache,
current_arch_start = 0;
else
current_arch_start = FcCacheSkipToArch (fd_orig,
current_arch_machine_name,
FcTrue);
current_arch_machine_name);

if (current_arch_start < 0)
current_arch_start = FcCacheNextOffset (lseek(fd_orig, 0, SEEK_END));
Expand Down Expand Up @@ -418,14 +418,15 @@ FcGlobalCacheSave (FcGlobalCache *cache,
}
truncate_to -= current_arch_start;

FcCacheWriteString (fd, FC_GLOBAL_MAGIC_COOKIE);
sprintf (header, "%8x ", (int)truncate_to);
strcat (header, current_arch_machine_name);
if (!FcCacheWriteString (fd, header))
goto bail4;

for (dir = cache->dirs; dir; dir = dir->next)
{
if (dir->ent)
if (dir->name)
{
FcCacheWriteString (fd, dir->name);
write (fd, &dir->metadata, sizeof(FcCache));
Expand Down Expand Up @@ -483,15 +484,14 @@ FcCacheNextOffset(off_t w)
/* return the address of the segment for the provided arch,
* or -1 if arch not found */
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;
off_t current_arch_start = 0;

lseek (fd, 0, SEEK_SET);
if (!global)
FcCacheSkipString (fd);
FcCacheSkipString (fd);
current_arch_start = lseek (fd, 0, SEEK_CUR);

/* skip arches that are not the current arch */
Expand Down Expand Up @@ -652,8 +652,7 @@ FcDirCacheHasCurrentArch (const FcChar8 *dir)
goto bail;

current_arch_machine_name = FcCacheMachineSignature();
current_arch_start = FcCacheSkipToArch(fd,
current_arch_machine_name, FcFalse);
current_arch_start = FcCacheSkipToArch(fd, current_arch_machine_name);
close (fd);

if (current_arch_start < 0)
Expand Down Expand Up @@ -929,8 +928,7 @@ FcDirCacheRead (FcFontSet * set, FcStrSet * dirs, const FcChar8 *dir)

current_arch_machine_name = FcCacheMachineSignature();
current_arch_start = FcCacheSkipToArch(fd,
current_arch_machine_name,
FcFalse);
current_arch_machine_name);
if (current_arch_start < 0)
goto bail1;

Expand Down Expand Up @@ -973,6 +971,7 @@ FcDirCacheConsume (int fd, const char * dir, FcFontSet *set)
pos = FcCacheNextOffset (lseek(fd, 0, SEEK_CUR));
current_dir_block = mmap (0, metadata.count,
PROT_READ, MAP_SHARED, fd, pos);
lseek (fd, pos+metadata.count, SEEK_SET);
if (current_dir_block == MAP_FAILED)
return FcFalse;

Expand Down Expand Up @@ -1122,7 +1121,7 @@ FcDirCacheWrite (FcFontSet *set, FcStrSet *dirs, const FcChar8 *dir)

if (fd_orig != -1)
current_arch_start =
FcCacheSkipToArch(fd_orig, current_arch_machine_name, FcFalse);
FcCacheSkipToArch(fd_orig, current_arch_machine_name);

if (current_arch_start < 0)
current_arch_start = FcCacheNextOffset (lseek(fd_orig, 0, SEEK_END));
Expand Down
1 change: 1 addition & 0 deletions src/fcint.h
Expand Up @@ -48,6 +48,7 @@

#define FC_FONT_FILE_INVALID ((FcChar8 *) ".")
#define FC_FONT_FILE_DIR ((FcChar8 *) ".dir")
#define FC_GLOBAL_MAGIC_COOKIE "GLOBAL"

#ifdef _WIN32
#define FC_SEARCH_PATH_SEPARATOR ';'
Expand Down
2 changes: 1 addition & 1 deletion src/fcpat.c
Expand Up @@ -2000,7 +2000,7 @@ FcStrUnserialize (FcCache * metadata, void *block_ptr)
/* we don't store these in the FcPattern itself because
* 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 {
const FcPattern *p;
const char *fname;
Expand Down

0 comments on commit c60ec7c

Please sign in to comment.