-static int _FcStrSetSort_helper (const void * a, const void * b)
-{
- return FcStrCmp (&strset_buf[(int)a],
- &strset_buf[(int)b]);
-}
-
-void
-FcStrSetSort (FcStrSet * set)
-{
- switch (set->storage)
- {
- case FcStorageDynamic:
- qsort (set->u.strs, set->num, sizeof (FcChar8 *),
- (int (*)(const void *, const void *)) FcStrCmp);
- break;
- case FcStorageStatic:
- qsort (strset_idx+set->u.stridx_offset, set->num, sizeof (int),
- _FcStrSetSort_helper);
- break;
- default:
- break;
- }
-}
-
-FcBool
-FcStrSetPrepareSerialize (const FcStrSet *set)
-{
- int i;
-
- if (!set)
- return FcTrue;
-
- strset_count ++;
- strset_idx_count += set->num;
- for (i = 0; i < set->num; i++)
- {
- if (FcStrSetGet(set, i))
- strset_buf_count += strlen(FcStrSetGet(set, i));
- }
-
- return FcTrue;
-}
-
-FcStrSetPtr
-FcStrSetSerialize (FcStrSet *set)
-{
- FcStrSet * new;
- FcStrSetPtr newp;
- int i;
-
- if (!strsets)
- {
- strsets = malloc (strset_count * sizeof(FcStrSet));
- if (!strsets) goto bail1;
- strset_idx = malloc (strset_idx_count * sizeof(int));
- if (!strset_idx) goto bail2;
- strset_buf = malloc (strset_buf_count * sizeof (FcChar8));
- if (!strset_buf) goto bail3;
- }
-
- if (!set)
- return FcStrSetPtrCreateDynamic(0);
-
- newp.storage = FcStorageStatic;
- newp.u.stat = strset_ptr;
-
- new = &strsets[strset_ptr++];
- new->ref = set->ref;
- new->num = set->num;
- new->size = set->num;
- new->storage = FcStorageStatic;
- new->u.stridx_offset = strset_idx_ptr;
- for (i = 0; i < set->num; i++)
- {
- FcChar8 * s = FcStrSetGet(set, i);
-
- if (s)
- {
- memcpy(strset_buf+strset_buf_ptr, s,
- strlen((char *)s));
- strset_idx[strset_idx_ptr++] = strset_buf_ptr;
- strset_buf_ptr += strlen((char *)s)+1;
- }
- else
- strset_idx[strset_idx_ptr++] = -1;
- }
-
- if (strset_ptr > strset_count || strset_idx_ptr > strset_idx_count)
- return FcStrSetPtrCreateDynamic(0);
-
- // problem with multiple ptrs to the same StrSet.
- // should hash StrSets or something.
- // FcStrSetDestroy (set);
-
- return newp;
-
- bail3:
- free (strset_idx);
- bail2:
- free (strsets);
- bail1:
- return FcStrSetPtrCreateDynamic(0);
-}
-
-FcBool
-FcStrSetRead (int fd, FcCache metadata)
-{
- strsets = mmap(NULL,
- metadata.strsets_length * sizeof (FcStrSet),
- PROT_READ,
- MAP_SHARED, fd, metadata.strsets_offset);
- if (strsets == MAP_FAILED)
- goto bail;
- strset_count = strset_ptr = metadata.strsets_length;
-
- strset_idx = mmap(NULL,
- metadata.strsets_idx_length * sizeof (int),
- PROT_READ,
- MAP_SHARED, fd, metadata.strsets_idx_offset);
- if (strset_idx == MAP_FAILED)
- goto bail1;
- strset_idx_count = strset_idx_ptr = metadata.strsets_length;
-
- strset_buf = mmap(NULL,
- metadata.strset_buf_length * sizeof (char),
- PROT_READ,
- MAP_SHARED, fd, metadata.strset_buf_offset);
- if (strset_buf == MAP_FAILED)
- goto bail2;
- strset_buf_count = strset_buf_ptr = metadata.strset_buf_length;
-
- return FcTrue;
-
- bail2:
- munmap (strset_idx, metadata.strsets_idx_length * sizeof (int));
- bail1:
- munmap (strsets, metadata.strsets_length * sizeof (FcStrSet));
- bail:
- return FcFalse;
-}
-
-FcBool
-FcStrSetWrite (int fd, FcCache *metadata)
-{
- metadata->strsets_length = strset_ptr;
- metadata->strsets_offset = FcCacheNextOffset(fd);
- if (strset_ptr > 0)
- {
- lseek (fd, metadata->strsets_offset, SEEK_SET);
- if (write (fd, strsets, strset_ptr * sizeof(FcStrSet)) == -1)
- return FcFalse;
- }
-
- metadata->strsets_idx_length = strset_idx_ptr;
- metadata->strsets_idx_offset = FcCacheNextOffset(fd);
- if (strset_idx_ptr > 0)
- {
- lseek (fd, metadata->strsets_idx_offset, SEEK_SET);
- if (write (fd, strset_idx, strset_idx_ptr * sizeof (int)) == -1)
- return FcFalse;
- }
-
- metadata->strset_buf_offset = FcCacheNextOffset(fd);
- metadata->strset_buf_length = strset_buf_ptr;
- if (strset_buf_ptr > 0)
- {
- lseek (fd, metadata->strset_buf_offset, SEEK_SET);
- if (write (fd, strset_buf,
- metadata->strset_buf_length * sizeof (char)) == -1)
- return FcFalse;
- }
-
- return FcTrue;
-}
-