diff options
Diffstat (limited to 'src/fcstr.c')
-rw-r--r-- | src/fcstr.c | 168 |
1 files changed, 53 insertions, 115 deletions
diff --git a/src/fcstr.c b/src/fcstr.c index b65492d8..8c64ac93 100644 --- a/src/fcstr.c +++ b/src/fcstr.c @@ -880,7 +880,7 @@ FcStrBuildFilename (const FcChar8 *path, if (!path) return NULL; - sset = FcStrSetCreateEx (FCSS_ALLOW_DUPLICATES | FCSS_GROW_BY_64); + sset = FcStrSetCreateEx (FC_SET_ALLOW_DUPLICATES | FC_SET_GROW_BY_64); if (!sset) return NULL; @@ -901,7 +901,7 @@ FcStrBuildFilename (const FcChar8 *path, { len += strlen ((const char *)s) + 1; } - list->n = 0; + FcStrListFirst (list); ret = malloc (sizeof (FcChar8) * (len + 1)); if (!ret) goto bail2; @@ -1130,96 +1130,56 @@ FcStrCanonFilename (const FcChar8 *s) FcStrSet * FcStrSetCreate (void) { - return FcStrSetCreateEx (FCSS_DEFAULT); + return FcStrSetCreateEx (FC_SET_DEFAULT); } FcStrSet * FcStrSetCreateEx (unsigned int control) { - FcStrSet *set = malloc (sizeof (FcStrSet)); - if (!set) - return 0; - FcRefInit (&set->ref, 1); - set->num = 0; - set->size = 0; - set->strs = 0; - set->control = control; - return set; + FcStrSet *set = malloc (sizeof (FcStrSet)); + + return (FcStrSet *) FcPtrSetInit (&set->ptrset, control, + (FcPtrSetDestroyFunc)FcStrFree, + (FcPtrSetCompareFunc)FcStrCmp); } -static FcBool -_FcStrSetGrow (FcStrSet *set, int growElements) +int +FcStrSetGetSize (const FcStrSet *set) { - /* accommodate an additional NULL entry at the end of the array */ - FcChar8 **strs = malloc ((set->size + growElements + 1) * sizeof (FcChar8 *)); - if (!strs) - return FcFalse; - if (set->num) - memcpy (strs, set->strs, set->num * sizeof (FcChar8 *)); - if (set->strs) - free (set->strs); - set->size = set->size + growElements; - set->strs = strs; - return FcTrue; + return FcPtrSetGetSize (&set->ptrset); } -static FcBool -_FcStrSetAppend (FcStrSet *set, FcChar8 *s) +int +FcStrSetGetAllocatedSize (const FcStrSet *set) { - if (!FcStrSetHasControlBit (set, FCSS_ALLOW_DUPLICATES)) - { - if (FcStrSetMember (set, s)) - { - FcStrFree (s); - return FcTrue; - } - } - if (set->num == set->size) - { - int growElements = FcStrSetHasControlBit (set, FCSS_GROW_BY_64) ? 64 : 1; - if (!_FcStrSetGrow(set, growElements)) - return FcFalse; - } - set->strs[set->num++] = s; - set->strs[set->num] = 0; - return FcTrue; + return FcPtrSetGetAllocatedSize (&set->ptrset); +} + +const FcChar8 * +FcStrSetIndex (const FcStrSet *set, + int idx) +{ + return FcPtrSetIndex (&set->ptrset, idx); } FcBool FcStrSetMember (FcStrSet *set, const FcChar8 *s) { - int i; - - for (i = 0; i < set->num; i++) - if (!FcStrCmp (set->strs[i], s)) - return FcTrue; - return FcFalse; + return FcPtrSetMember (&set->ptrset, s); } FcBool FcStrSetEqual (FcStrSet *sa, FcStrSet *sb) { - int i; - if (sa->num != sb->num) - return FcFalse; - for (i = 0; i < sa->num; i++) - if (!FcStrSetMember (sb, sa->strs[i])) - return FcFalse; - return FcTrue; + return FcPtrSetEqual (&sa->ptrset, &sb->ptrset); } FcBool FcStrSetAdd (FcStrSet *set, const FcChar8 *s) { FcChar8 *new = FcStrCopy (s); - if (!new) - return FcFalse; - if (!_FcStrSetAppend (set, new)) - { - FcStrFree (new); - return FcFalse; - } - return FcTrue; + + return FcPtrSetAdd (&set->ptrset, new); } FcBool @@ -1228,12 +1188,8 @@ FcStrSetAddFilename (FcStrSet *set, const FcChar8 *s) FcChar8 *new = FcStrCopyFilename (s); if (!new) return FcFalse; - if (!_FcStrSetAppend (set, new)) - { - FcStrFree (new); - return FcFalse; - } - return FcTrue; + + return FcPtrSetAdd (&set->ptrset, new); } FcBool @@ -1283,52 +1239,40 @@ FcStrSetAddLangs (FcStrSet *strs, const char *languages) FcBool FcStrSetDel (FcStrSet *set, const FcChar8 *s) { - int i; - - for (i = 0; i < set->num; i++) - if (!FcStrCmp (set->strs[i], s)) - { - FcStrFree (set->strs[i]); - /* - * copy remaining string pointers and trailing - * NULL - */ - memmove (&set->strs[i], &set->strs[i+1], - (set->num - i) * sizeof (FcChar8 *)); - set->num--; - return FcTrue; - } - return FcFalse; + return FcPtrSetDel (&set->ptrset, s); } /* TODO Make public */ static FcStrSet * FcStrSetReference (FcStrSet *set) { - if (FcRefIsConst (&set->ref)) - return set; - - FcRefInc (&set->ref); - return set; + return (FcStrSet *) FcPtrSetReference (&set->ptrset); } void -FcStrSetDestroy (FcStrSet *set) +FcStrSetConst (FcStrSet *set) { - int i; + FcPtrSetConst (&set->ptrset); +} - /* We rely on this in FcGetDefaultLangs for caching. */ - if (FcRefIsConst (&set->ref)) - return; +void +FcStrSetRefReset (FcStrSet *set) +{ + FcPtrSetRefReset (&set->ptrset); +} - if (FcRefDec (&set->ref) != 1) - return; +void +FcStrSetDestroy (FcStrSet *set) +{ + if (FcPtrSetFini (&set->ptrset)) + free (set); +} - for (i = 0; i < set->num; i++) - FcStrFree (set->strs[i]); - if (set->strs) - free (set->strs); - free (set); +void +FcStrSetSort (FcStrSet *set, + FcPtrSetCompareFunc func) +{ + FcPtrSetSort (&set->ptrset, func); } FcStrList * @@ -1337,32 +1281,26 @@ FcStrListCreate (FcStrSet *set) FcStrList *list; list = malloc (sizeof (FcStrList)); - if (!list) - return 0; - list->set = set; - FcStrSetReference (set); - list->n = 0; - return list; + + return (FcStrList *) FcPtrListInit (&list->ptrlist, &set->ptrset); } void FcStrListFirst (FcStrList *list) { - list->n = 0; + FcPtrListFirst (&list->ptrlist); } FcChar8 * FcStrListNext (FcStrList *list) { - if (list->n >= list->set->num) - return 0; - return list->set->strs[list->n++]; + return FcPtrListNext (&list->ptrlist); } void FcStrListDone (FcStrList *list) { - FcStrSetDestroy (list->set); + FcPtrListFini (&list->ptrlist); free (list); } |