/* HTList.c
** MANAGEMENT OF LINKED LISTS
**
** (c) COPYRIGHT MIT 1995.
** Please first read the full copyright statement in the file COPYRIGH.
**
** A list is represented as a sequence of linked nodes of type HTList.
** The first node is a header which contains no object.
** New nodes are inserted between the header and the rest of the list.
*/
/* Library include files */
#include "tcp.h"
#include "HTUtils.h"
#include "HTList.h"
PUBLIC HTList * HTList_new (void)
{
HTList *newList = (HTList *) calloc(1, sizeof (HTList));
if (newList == NULL) outofmem(__FILE__, "HTList_new");
newList->object = NULL;
newList->next = NULL;
return newList;
}
PUBLIC BOOL HTList_delete (HTList * me)
{
if (me) {
HTList *current;
while ((current = me)) {
me = me->next;
free (current);
}
return YES;
}
return NO;
}
PUBLIC BOOL HTList_addObject (HTList * me, void * newObject)
{
if (me) {
HTList *newNode = (HTList *) calloc (1, sizeof(HTList));
if (newNode == NULL) outofmem(__FILE__, "HTList_addObject");
newNode->object = newObject;
newNode->next = me->next;
me->next = newNode;
return YES;
} else {
if (WWWTRACE)
TTYPrint(TDEST,
"HTList...... Can not add object %p to nonexisting list\n",
newObject);
}
return NO;
}
PUBLIC BOOL HTList_appendObject (HTList * me, void * newObject)
{
if (me) {
while (me->next) me = me->next;
return HTList_addObject(me, newObject);
}
return NO;
}
PUBLIC BOOL HTList_removeObject (HTList * me, void * oldObject)
{
if (me) {
HTList *previous;
while (me->next) {
previous = me;
me = me->next;
if (me->object == oldObject) {
previous->next = me->next;
FREE(me);
return YES; /* Success */
}
}
}
return NO; /* object not found or NULL list */
}
PUBLIC void * HTList_removeLastObject (HTList * me)
{
if (me && me->next) {
HTList *lastNode = me->next;
void * lastObject = lastNode->object;
me->next = lastNode->next;
free (lastNode);
return lastObject;
} else /* Empty list */
return NULL;
}
PUBLIC void * HTList_removeFirstObject (HTList * me)
{
if (me && me->next) {
HTList * prevNode;
void *firstObject;
while (me->next) {
prevNode = me;
me = me->next;
}
firstObject = me->object;
prevNode->next = NULL;
free (me);
return firstObject;
} else /* Empty list */
return NULL;
}
PUBLIC int HTList_count (HTList * me)
{
int count = 0;
if (me)
while ((me = me->next))
count++;
return count;
}
PUBLIC int HTList_indexOf (HTList * me, void * object)
{
if (me) {
int position = 0;
while ((me = me->next)) {
if (me->object == object)
return position;
position++;
}
}
return -1;
}
PUBLIC void * HTList_objectAt (HTList * me, int position)
{
if (position < 0)
return NULL;
if (me) {
while ((me = me->next)) {
if (position == 0)
return me->object;
position--;
}
}
return NULL; /* Reached the end of the list */
}
PUBLIC void * HTList_removeObjectAt (HTList * me, int position)
{
if (position < 0)
return NULL;
if (me) {
HTList * prevNode;
prevNode = me;
while ((me = me->next)) {
if (position == 0) {
prevNode->next = me->next;
return me->object;
}
prevNode = me;
position--;
}
}
return NULL; /* Reached the end of the list */
}
Webmaster