FcDirCacheProduce (FcFontSet *set, FcCache * metadata);
static FcBool
-FcDirCacheConsume (int fd, FcFontSet *set);
+FcDirCacheConsume (int fd, const char * dir, FcFontSet *set);
FcBool
FcDirCacheRead (FcFontSet * set, FcStrSet * dirs, const FcChar8 *dir);
static FcBool
FcCacheHaveBank (int bank);
+static void
+FcCacheAddBankDir (int bank, const char * dir);
+
#define FC_DBG_CACHE_REF 1024
static char *
if (strncmp (d->name, dir, strlen(dir)) == 0)
{
lseek (cache->fd, d->offset, SEEK_SET);
- if (!FcDirCacheConsume (cache->fd, set))
+ if (!FcDirCacheConsume (cache->fd, dir, set))
return FcFalse;
if (strcmp (d->name, dir) == 0)
ret = FcTrue;
while (strlen(FcCacheReadString (fd, subdirName, sizeof (subdirName))) > 0)
FcStrSetAdd (dirs, (FcChar8 *)subdirName);
- if (!FcDirCacheConsume (fd, set))
+ if (!FcDirCacheConsume (fd, (const char *)dir, set))
goto bail1;
close(fd);
}
static FcBool
-FcDirCacheConsume (int fd, FcFontSet *set)
+FcDirCacheConsume (int fd, const char * dir, FcFontSet *set)
{
FcCache metadata;
void * current_dir_block;
if (!FcFontSetUnserialize (metadata, set, current_dir_block))
return FcFalse;
+ FcCacheAddBankDir (metadata.bank, dir);
+
return FcTrue;
}
static int banks_ptr = 0, banks_alloc = 0;
static int * bankId = 0, * bankIdx = 0;
+static const char ** bankDirs = 0;
static FcBool
FcCacheHaveBank (int bank)
if (banks_ptr >= banks_alloc)
{
int * b, * bidx;
+ const char ** bds;
+
b = realloc (bankId, (banks_alloc + 4) * sizeof(int));
if (!b)
return -1;
return -1;
bankIdx = bidx;
+ bds = realloc (bankDirs, (banks_alloc + 4) * sizeof (char *));
+ if (!bds)
+ return -1;
+ bankDirs = bds;
+
banks_alloc += 4;
}
bankIdx[i] = i;
return i;
}
+
+static void
+FcCacheAddBankDir (int bank, const char * dir)
+{
+ int bi = FcCacheBankToIndex (bank);
+
+ if (bi < 0)
+ return;
+
+ bankDirs[bi] = (const char *)FcStrCopy ((FcChar8 *)dir);
+}
+
+const char *
+FcCacheFindBankDir (int bank)
+{
+ int bi = FcCacheBankToIndex (bank);
+ return bankDirs[bi];
+}
+