fcptrlist.c revision a32e9e42
1a32e9e42Smrg/* 2a32e9e42Smrg * fontconfig/src/fcptrlist.c 3a32e9e42Smrg * 4a32e9e42Smrg * Copyright © 2000 Keith Packard 5a32e9e42Smrg * 6a32e9e42Smrg * Permission to use, copy, modify, distribute, and sell this software and its 7a32e9e42Smrg * documentation for any purpose is hereby granted without fee, provided that 8a32e9e42Smrg * the above copyright notice appear in all copies and that both that 9a32e9e42Smrg * copyright notice and this permission notice appear in supporting 10a32e9e42Smrg * documentation, and that the name of the author(s) not be used in 11a32e9e42Smrg * advertising or publicity pertaining to distribution of the software without 12a32e9e42Smrg * specific, written prior permission. The authors make no 13a32e9e42Smrg * representations about the suitability of this software for any purpose. It 14a32e9e42Smrg * is provided "as is" without express or implied warranty. 15a32e9e42Smrg * 16a32e9e42Smrg * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, 17a32e9e42Smrg * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO 18a32e9e42Smrg * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR 19a32e9e42Smrg * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 20a32e9e42Smrg * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 21a32e9e42Smrg * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 22a32e9e42Smrg * PERFORMANCE OF THIS SOFTWARE. 23a32e9e42Smrg */ 24a32e9e42Smrg 25a32e9e42Smrg#include "fcint.h" 26a32e9e42Smrg 27a32e9e42Smrgtypedef struct _FcPtrListEntry { 28a32e9e42Smrg struct _FcPtrListEntry *next; 29a32e9e42Smrg void *data; 30a32e9e42Smrg} FcPtrListEntry; 31a32e9e42Smrgstruct _FcPtrList { 32a32e9e42Smrg FcDestroyFunc destroy_func; 33a32e9e42Smrg FcPtrListEntry *list; 34a32e9e42Smrg}; 35a32e9e42Smrgtypedef struct _FcPtrListIterPrivate { 36a32e9e42Smrg const FcPtrList *list; 37a32e9e42Smrg FcPtrListEntry *entry; 38a32e9e42Smrg FcPtrListEntry *prev; 39a32e9e42Smrg} FcPtrListIterPrivate; 40a32e9e42Smrg 41a32e9e42SmrgFcPtrList * 42a32e9e42SmrgFcPtrListCreate (FcDestroyFunc func) 43a32e9e42Smrg{ 44a32e9e42Smrg FcPtrList *ret = (FcPtrList *) malloc (sizeof (FcPtrList)); 45a32e9e42Smrg 46a32e9e42Smrg if (ret) 47a32e9e42Smrg { 48a32e9e42Smrg ret->destroy_func = func; 49a32e9e42Smrg ret->list = NULL; 50a32e9e42Smrg } 51a32e9e42Smrg 52a32e9e42Smrg return ret; 53a32e9e42Smrg} 54a32e9e42Smrg 55a32e9e42Smrgvoid 56a32e9e42SmrgFcPtrListDestroy (FcPtrList *list) 57a32e9e42Smrg{ 58a32e9e42Smrg FcPtrListIter iter; 59a32e9e42Smrg 60a32e9e42Smrg FcPtrListIterInit (list, &iter); 61a32e9e42Smrg do 62a32e9e42Smrg { 63a32e9e42Smrg if (FcPtrListIterGetValue (list, &iter)) 64a32e9e42Smrg list->destroy_func (FcPtrListIterGetValue (list, &iter)); 65a32e9e42Smrg FcPtrListIterRemove (list, &iter); 66a32e9e42Smrg } while (FcPtrListIterIsValid (list, &iter)); 67a32e9e42Smrg 68a32e9e42Smrg free (list); 69a32e9e42Smrg} 70a32e9e42Smrg 71a32e9e42Smrgvoid 72a32e9e42SmrgFcPtrListIterInit (const FcPtrList *list, 73a32e9e42Smrg FcPtrListIter *iter) 74a32e9e42Smrg{ 75a32e9e42Smrg FcPtrListIterPrivate *priv = (FcPtrListIterPrivate *) iter; 76a32e9e42Smrg 77a32e9e42Smrg priv->list = list; 78a32e9e42Smrg priv->entry = list->list; 79a32e9e42Smrg priv->prev = NULL; 80a32e9e42Smrg} 81a32e9e42Smrg 82a32e9e42Smrgvoid 83a32e9e42SmrgFcPtrListIterInitAtLast (FcPtrList *list, 84a32e9e42Smrg FcPtrListIter *iter) 85a32e9e42Smrg{ 86a32e9e42Smrg FcPtrListIterPrivate *priv = (FcPtrListIterPrivate *) iter; 87a32e9e42Smrg FcPtrListEntry **e, **p; 88a32e9e42Smrg 89a32e9e42Smrg e = &list->list; 90a32e9e42Smrg p = e; 91a32e9e42Smrg for (; *e; p = e, e = &(*e)->next); 92a32e9e42Smrg 93a32e9e42Smrg priv->list = list; 94a32e9e42Smrg priv->entry = *e; 95a32e9e42Smrg priv->prev = *p; 96a32e9e42Smrg} 97a32e9e42Smrg 98a32e9e42SmrgFcBool 99a32e9e42SmrgFcPtrListIterNext (const FcPtrList *list, 100a32e9e42Smrg FcPtrListIter *iter) 101a32e9e42Smrg{ 102a32e9e42Smrg FcPtrListIterPrivate *priv = (FcPtrListIterPrivate *) iter; 103a32e9e42Smrg 104a32e9e42Smrg if (list != priv->list) 105a32e9e42Smrg return FcFalse; 106a32e9e42Smrg priv->prev = priv->entry; 107a32e9e42Smrg priv->entry = priv->entry->next; 108a32e9e42Smrg 109a32e9e42Smrg return priv->entry != NULL; 110a32e9e42Smrg} 111a32e9e42Smrg 112a32e9e42SmrgFcBool 113a32e9e42SmrgFcPtrListIterIsValid (const FcPtrList *list, 114a32e9e42Smrg const FcPtrListIter *iter) 115a32e9e42Smrg{ 116a32e9e42Smrg FcPtrListIterPrivate *priv = (FcPtrListIterPrivate *) iter; 117a32e9e42Smrg 118a32e9e42Smrg return list == priv->list && priv->entry; 119a32e9e42Smrg} 120a32e9e42Smrg 121a32e9e42Smrgvoid * 122a32e9e42SmrgFcPtrListIterGetValue (const FcPtrList *list, 123a32e9e42Smrg const FcPtrListIter *iter) 124a32e9e42Smrg{ 125a32e9e42Smrg FcPtrListIterPrivate *priv = (FcPtrListIterPrivate *) iter; 126a32e9e42Smrg 127a32e9e42Smrg if (list != priv->list || 128a32e9e42Smrg !priv->entry) 129a32e9e42Smrg return NULL; 130a32e9e42Smrg 131a32e9e42Smrg return priv->entry->data; 132a32e9e42Smrg} 133a32e9e42Smrg 134a32e9e42SmrgFcBool 135a32e9e42SmrgFcPtrListIterAdd (FcPtrList *list, 136a32e9e42Smrg FcPtrListIter *iter, 137a32e9e42Smrg void *data) 138a32e9e42Smrg{ 139a32e9e42Smrg FcPtrListEntry *e; 140a32e9e42Smrg FcPtrListIterPrivate *priv = (FcPtrListIterPrivate *) iter; 141a32e9e42Smrg 142a32e9e42Smrg if (list != priv->list) 143a32e9e42Smrg return FcFalse; 144a32e9e42Smrg 145a32e9e42Smrg e = (FcPtrListEntry *) malloc (sizeof (FcPtrListEntry)); 146a32e9e42Smrg if (!e) 147a32e9e42Smrg return FcFalse; 148a32e9e42Smrg e->data = data; 149a32e9e42Smrg 150a32e9e42Smrg if (priv->entry) 151a32e9e42Smrg { 152a32e9e42Smrg e->next = priv->entry->next; 153a32e9e42Smrg priv->entry->next = e; 154a32e9e42Smrg } 155a32e9e42Smrg else 156a32e9e42Smrg { 157a32e9e42Smrg e->next = NULL; 158a32e9e42Smrg if (priv->prev) 159a32e9e42Smrg { 160a32e9e42Smrg priv->prev->next = e; 161a32e9e42Smrg priv->entry = priv->prev; 162a32e9e42Smrg } 163a32e9e42Smrg else 164a32e9e42Smrg { 165a32e9e42Smrg list->list = e; 166a32e9e42Smrg priv->entry = e; 167a32e9e42Smrg 168a32e9e42Smrg return FcTrue; 169a32e9e42Smrg } 170a32e9e42Smrg } 171a32e9e42Smrg 172a32e9e42Smrg return FcPtrListIterNext (list, iter); 173a32e9e42Smrg} 174a32e9e42Smrg 175a32e9e42SmrgFcBool 176a32e9e42SmrgFcPtrListIterRemove (FcPtrList *list, 177a32e9e42Smrg FcPtrListIter *iter) 178a32e9e42Smrg{ 179a32e9e42Smrg FcPtrListIterPrivate *priv = (FcPtrListIterPrivate *) iter; 180a32e9e42Smrg FcPtrListEntry *e; 181a32e9e42Smrg 182a32e9e42Smrg if (list != priv->list) 183a32e9e42Smrg return FcFalse; 184a32e9e42Smrg if (!priv->entry) 185a32e9e42Smrg return FcTrue; 186a32e9e42Smrg 187a32e9e42Smrg if (list->list == priv->entry) 188a32e9e42Smrg list->list = list->list->next; 189a32e9e42Smrg e = priv->entry; 190a32e9e42Smrg if (priv->prev) 191a32e9e42Smrg priv->prev->next = priv->entry->next; 192a32e9e42Smrg priv->entry = priv->entry->next; 193a32e9e42Smrg free (e); 194a32e9e42Smrg 195a32e9e42Smrg return FcTrue; 196a32e9e42Smrg} 197a32e9e42Smrg 198a32e9e42Smrg#define __fcplist__ 199a32e9e42Smrg#include "fcaliastail.h" 200a32e9e42Smrg#undef __fcplist__ 201