]> git.wh0rd.org - fontconfig.git/commitdiff
Add self to AUTHORS list.
authorPatrick Lam <plam@MIT.EDU>
Thu, 5 Jan 2006 15:12:22 +0000 (15:12 +0000)
committerPatrick Lam <plam@MIT.EDU>
Thu, 5 Jan 2006 15:12:22 +0000 (15:12 +0000)
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.

AUTHORS
ChangeLog
fc-cat/fc-cat.c
src/fccache.c
src/fcint.h
src/fcpat.c

diff --git a/AUTHORS b/AUTHORS
index 9cee03732071f0099072cf9dd80f01d0e7de84b6..5ef8885483d83759594f52a7e711a90d54b6b570 100644 (file)
--- a/AUTHORS
+++ b/AUTHORS
@@ -1 +1,3 @@
 Keith Packard <keithp@keithp.com>
+Patrick Lam <plam@mit.edu>
+
index ee3fb89788b85d8d7272b3460cfd70ff708d59a7..645cb83b529b7f06584ea67eca5726954a053f59 100644 (file)
--- a/ChangeLog
+++ b/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
        
index f088e4585a9220ff2003f190f02014b0b8e4fe11..14e5c164f8eb0ec86ce8fd74c48925ef63fc2981 100644 (file)
@@ -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)
@@ -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;
@@ -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;
 
@@ -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();
@@ -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;
@@ -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;
 }
 
 /*
@@ -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;
@@ -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)
@@ -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)
@@ -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)
@@ -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]))
             ;
     }
 
index 98f6d006bb2a66b0f490b5bd3cdeea11192c36eb..50dc4d1558569125a7846732890b6dc164d9d0f7 100644 (file)
@@ -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);
@@ -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;
 
@@ -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)
@@ -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));
@@ -418,6 +418,7 @@ 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))
@@ -425,7 +426,7 @@ FcGlobalCacheSave (FcGlobalCache    *cache,
 
     for (dir = cache->dirs; dir; dir = dir->next)
     {
-        if (dir->ent)
+        if (dir->name)
         {
             FcCacheWriteString (fd, dir->name);
             write (fd, &dir->metadata, sizeof(FcCache));
@@ -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 */
@@ -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)
@@ -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;
 
@@ -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;
 
@@ -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));
index c3430ae73faf0828274bc3cf2696d6f162426957..435af824145ef1129aef4460e0f8310299afd41b 100644 (file)
@@ -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 ';'
index 9a33e1caabf370332bfe0dccd9a59dfa6fc5babe..f1506140651cfa142325c5be8bdfcf94e7e61310 100644 (file)
@@ -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;