#include "xsm.h"
List *
ListInit()
{
List *l;
l = (List *)XtMalloc(sizeof *l);
if(!l) return l;
l->next = l;
l->prev = l;
l->thing = NULL;
return l;
}
List *
ListFirst(l)
List *l;
{
if(l->next->thing) return l->next;
else return NULL;
}
List *
ListNext(l)
List *l;
{
if(l->next->thing) return l->next;
else return NULL;
}
void
ListFreeAll(l)
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(l)
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(l, v)
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(l, v)
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(e)
List *e;
{
e->next->prev = e->prev;
e->prev->next = e->next;
XtFree((char *)e);
}
Status
ListSearchAndFreeOne(l,thing)
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(l)
List *l;
{
int i;
List *e;
i = 0;
for(e = ListFirst(l); e; e = ListNext(e)) i++;
return i;
}