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