/* * Implementaion of cpplist.h. */ #include "cpplist.h" List NewList() { return (List) calloc(sizeof(struct ListStruct), 1); } void DelList(l) List l; { ListItem item, item_to_free; if (not l) return; for (item = l->First; item; ) { free(item->Data); item_to_free = item; item = item->Next; free(item_to_free); } free(l); } void DelListNodesOnly(l) List l; { ListItem item, item_to_free; if (not l) return; for (item = l->First; item; ) { item_to_free = item; item = item->Next; free(item_to_free); } free(l); } void PutList(l, e) List l; ListElem e; { ListItem newi = (ListItem) calloc(sizeof(struct ListItemStruct), 1); newi->Data = e; newi->Prev = l->Last; if (l->Last) l->Last->Next = newi; l->Last = newi; if (! l->First) { l->First = newi; l->EnumState = l->First; } l->Size++; } ListElem PullList(l) List l; { ListItem item = l->First; ListElem data; if (l->Size == 0) return 0; if (l->First == l->Last) { l->First = l->Last = l->EnumState = 0; l->Size = 0; data = item->Data; free(item); return data; } l->First = l->EnumState = item->Next; l->First->Prev = 0; l->Size--; data = item->Data; free(item); return data; } void PushList(l, e) List l; ListElem e; { ListItem newi = (ListItem) calloc(sizeof(struct ListItemStruct), 1); newi->Data = e; newi->Next = l->First; if (l->First) l->First->Prev = newi; l->EnumState = l->First = newi; if (! l->Last) l->Last = newi; l->Size++; } ListElem PopList(l) List l; { ListItem item = l->Last; ListElem data; if (l->Size == 0) return 0; if (l->First == l->Last) { l->First = l->Last = l->EnumState = 0; l->Size = 0; data = item->Data; free(item); return data; } l->EnumState = l->First; l->Last = item->Prev; l->Last->Next = 0; l->Size--; data = item->Data; free(item); return data; } ListElem GetNthList(l, n) List l; int n; { int size = l->Size; ListItem item; if ((n < 1) || (n > size)) return 0; if (n < size/2) { item = l->First; while(--n) item = item->Next; } else { item = l->Last; while(++n <= size) item = item->Prev; } l->EnumState = l->First; return item->Data; } ListElem DelNthList(l, n) List l; int n; { int size; ListItem item, prev; ListElem data; if (!l) return 0; if (((size = l->Size) == 0) || (n < 1) || (n > size)) return 0; if (n == 1) return PullList(l); if (n == size) return PopList(l); if (n < size/2) { item = l->First; while(--n) item = item->Next; } else { item = l->Last; while(++n <= size) item = item->Prev; } item->Prev->Next = item->Next; item->Next->Prev = item->Prev; l->EnumState = l->First; l->Size--; data = item->Data; free(item); return data; } bool InList(l, e) List l; ListElem e; { ListItem item; for (item = l->First; item; item = item->Next) { if (streq(e, item->Data)) return true; } return false; } int ListLen(l) List l; { return l->Size; } ListElem EnumList(l) List l; { ListItem item; if (! l) return 0; if (item = l->EnumState) { l->EnumState = l->EnumState->Next; return item->Data; } else { l->EnumState = l->First; return 0; } } void ResetListEnum(l) List l; { l->EnumState = l->First; } void PrintList(l) List l; { ListItem item; for (item = l->First; item; item = item->Next) if (item->Next) printf("%s, ", item->Data); else printf("%s\n", item->Data); } AuxListElem NewAuxListElem(name, sym) char *name; struct Sym *sym; { AuxListElem e = (AuxListElem) malloc(sizeof(struct AuxListElemStruct)); e->Data = name; e->AuxData = sym; return e; }