201 lines
4.4 KiB
C
201 lines
4.4 KiB
C
/*
|
|
* fontconfig/src/fcptrlist.c
|
|
*
|
|
* Copyright © 2000 Keith Packard
|
|
*
|
|
* Permission to use, copy, modify, distribute, and sell this software and its
|
|
* documentation for any purpose is hereby granted without fee, provided that
|
|
* the above copyright notice appear in all copies and that both that
|
|
* copyright notice and this permission notice appear in supporting
|
|
* documentation, and that the name of the author(s) not be used in
|
|
* advertising or publicity pertaining to distribution of the software without
|
|
* specific, written prior permission. The authors make no
|
|
* representations about the suitability of this software for any purpose. It
|
|
* is provided "as is" without express or implied warranty.
|
|
*
|
|
* THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
|
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
|
|
* EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR
|
|
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
|
|
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
|
|
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
* PERFORMANCE OF THIS SOFTWARE.
|
|
*/
|
|
|
|
#include "fcint.h"
|
|
|
|
typedef struct _FcPtrListEntry {
|
|
struct _FcPtrListEntry *next;
|
|
void *data;
|
|
} FcPtrListEntry;
|
|
struct _FcPtrList {
|
|
FcDestroyFunc destroy_func;
|
|
FcPtrListEntry *list;
|
|
};
|
|
typedef struct _FcPtrListIterPrivate {
|
|
const FcPtrList *list;
|
|
FcPtrListEntry *entry;
|
|
FcPtrListEntry *prev;
|
|
} FcPtrListIterPrivate;
|
|
|
|
FcPtrList *
|
|
FcPtrListCreate (FcDestroyFunc func)
|
|
{
|
|
FcPtrList *ret = (FcPtrList *) malloc (sizeof (FcPtrList));
|
|
|
|
if (ret)
|
|
{
|
|
ret->destroy_func = func;
|
|
ret->list = NULL;
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
void
|
|
FcPtrListDestroy (FcPtrList *list)
|
|
{
|
|
FcPtrListIter iter;
|
|
|
|
FcPtrListIterInit (list, &iter);
|
|
do
|
|
{
|
|
if (FcPtrListIterGetValue (list, &iter))
|
|
list->destroy_func (FcPtrListIterGetValue (list, &iter));
|
|
FcPtrListIterRemove (list, &iter);
|
|
} while (FcPtrListIterIsValid (list, &iter));
|
|
|
|
free (list);
|
|
}
|
|
|
|
void
|
|
FcPtrListIterInit (const FcPtrList *list,
|
|
FcPtrListIter *iter)
|
|
{
|
|
FcPtrListIterPrivate *priv = (FcPtrListIterPrivate *) iter;
|
|
|
|
priv->list = list;
|
|
priv->entry = list->list;
|
|
priv->prev = NULL;
|
|
}
|
|
|
|
void
|
|
FcPtrListIterInitAtLast (FcPtrList *list,
|
|
FcPtrListIter *iter)
|
|
{
|
|
FcPtrListIterPrivate *priv = (FcPtrListIterPrivate *) iter;
|
|
FcPtrListEntry **e, **p;
|
|
|
|
e = &list->list;
|
|
p = e;
|
|
for (; *e; p = e, e = &(*e)->next);
|
|
|
|
priv->list = list;
|
|
priv->entry = *e;
|
|
priv->prev = *p;
|
|
}
|
|
|
|
FcBool
|
|
FcPtrListIterNext (const FcPtrList *list,
|
|
FcPtrListIter *iter)
|
|
{
|
|
FcPtrListIterPrivate *priv = (FcPtrListIterPrivate *) iter;
|
|
|
|
if (list != priv->list)
|
|
return FcFalse;
|
|
priv->prev = priv->entry;
|
|
priv->entry = priv->entry->next;
|
|
|
|
return priv->entry != NULL;
|
|
}
|
|
|
|
FcBool
|
|
FcPtrListIterIsValid (const FcPtrList *list,
|
|
const FcPtrListIter *iter)
|
|
{
|
|
FcPtrListIterPrivate *priv = (FcPtrListIterPrivate *) iter;
|
|
|
|
return list == priv->list && priv->entry;
|
|
}
|
|
|
|
void *
|
|
FcPtrListIterGetValue (const FcPtrList *list,
|
|
const FcPtrListIter *iter)
|
|
{
|
|
FcPtrListIterPrivate *priv = (FcPtrListIterPrivate *) iter;
|
|
|
|
if (list != priv->list ||
|
|
!priv->entry)
|
|
return NULL;
|
|
|
|
return priv->entry->data;
|
|
}
|
|
|
|
FcBool
|
|
FcPtrListIterAdd (FcPtrList *list,
|
|
FcPtrListIter *iter,
|
|
void *data)
|
|
{
|
|
FcPtrListEntry *e;
|
|
FcPtrListIterPrivate *priv = (FcPtrListIterPrivate *) iter;
|
|
|
|
if (list != priv->list)
|
|
return FcFalse;
|
|
|
|
e = (FcPtrListEntry *) malloc (sizeof (FcPtrListEntry));
|
|
if (!e)
|
|
return FcFalse;
|
|
e->data = data;
|
|
|
|
if (priv->entry)
|
|
{
|
|
e->next = priv->entry->next;
|
|
priv->entry->next = e;
|
|
}
|
|
else
|
|
{
|
|
e->next = NULL;
|
|
if (priv->prev)
|
|
{
|
|
priv->prev->next = e;
|
|
priv->entry = priv->prev;
|
|
}
|
|
else
|
|
{
|
|
list->list = e;
|
|
priv->entry = e;
|
|
|
|
return FcTrue;
|
|
}
|
|
}
|
|
|
|
return FcPtrListIterNext (list, iter);
|
|
}
|
|
|
|
FcBool
|
|
FcPtrListIterRemove (FcPtrList *list,
|
|
FcPtrListIter *iter)
|
|
{
|
|
FcPtrListIterPrivate *priv = (FcPtrListIterPrivate *) iter;
|
|
FcPtrListEntry *e;
|
|
|
|
if (list != priv->list)
|
|
return FcFalse;
|
|
if (!priv->entry)
|
|
return FcTrue;
|
|
|
|
if (list->list == priv->entry)
|
|
list->list = list->list->next;
|
|
e = priv->entry;
|
|
if (priv->prev)
|
|
priv->prev->next = priv->entry->next;
|
|
priv->entry = priv->entry->next;
|
|
free (e);
|
|
|
|
return FcTrue;
|
|
}
|
|
|
|
#define __fcplist__
|
|
#include "fcaliastail.h"
|
|
#undef __fcplist__
|