#include "xsm.h"
List *
ListInit(void)
{
List *l;
l = (List *)XtMalloc(sizeof *l);
if(!l) return l;
l->next = l;
l->prev = l;
l->thing = NULL;
return l;
}
List *
ListFirst(List *l)
{
if(l->next->thing) return l->next;
else return NULL;
}
List *
ListNext(List *l)
{
if(l->next->thing) return l->next;
else return NULL;
}
void
ListFreeAll(List *l)
{
char *thing;
List *next;
next = l->next;
do {
l = next;
next = l->next;
thing = l->thing;
XtFree((char *)l);
} while(thing);
}
void
ListFreeAllButHead(List *l)
{
List *p, *next;
p = ListFirst(l);
while (p)
{
next = ListNext (p);
XtFree((char *) p);
p = next;
}
l->next = l;
l->prev = l;
}
List *
ListAddFirst(List *l, char *v)
{
List *e;
e = (List *)XtMalloc(sizeof *e);
if(!e) return NULL;
e->thing = v;
e->prev = l;
e->next = e->prev->next;
e->prev->next = e;
e->next->prev = e;
return e;
}
List *
ListAddLast(List *l, char *v)
{
List *e;
e = (List *)XtMalloc(sizeof *e);
if(!e) return NULL;
e->thing = v;
e->next = l;
e->prev = e->next->prev;
e->prev->next = e;
e->next->prev = e;
return e;
}
void
ListFreeOne(List *e)
{
e->next->prev = e->prev;
e->prev->next = e->next;
XtFree((char *)e);
}
Status
ListSearchAndFreeOne(List *l, char *thing)
{
List *p;
for (p = ListFirst (l); p; p = ListNext (p))
if (((char *) p->thing) == (char *) thing)
{
ListFreeOne (p);
return (1);
}
return (0);
}
int
ListCount(List *l)
{
int i;
List *e;
i = 0;
for(e = ListFirst(l); e; e = ListNext(e)) i++;
return i;
}