/* * Implementation of cpplist.h. */ #include "cpplist.h" #include #include CppList NewCppList() { return (CppList) calloc(sizeof(struct CppListStruct), 1); } void DelCppList(l) CppList l; { CppListItem 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 DelCppListNodesOnly(l) CppList l; { CppListItem 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 PutCppList(l, e) CppList l; CppListElem e; { CppListItem newi = (CppListItem) calloc(sizeof(struct CppListItemStruct), 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++; } CppListElem PullCppList(l) CppList l; { CppListItem item = l->First; CppListElem 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 PushCppList(l, e) CppList l; CppListElem e; { CppListItem newi = (CppListItem) calloc(sizeof(struct CppListItemStruct), 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++; } CppListElem PopCppList(l) CppList l; { CppListItem item = l->Last; CppListElem 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; } CppListElem GetNthCppList(l, n) CppList l; int n; { int size = l->Size; CppListItem 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; } CppListElem DelNthCppList(l, n) CppList l; int n; { int size; CppListItem item, prev; CppListElem data; if (!l) return 0; if (((size = l->Size) == 0) || (n < 1) || (n > size)) return 0; if (n == 1) return PullCppList(l); if (n == size) return PopCppList(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 InCppList(l, e) CppList l; CppListElem e; { CppListItem item; for (item = l->First; item; item = item->Next) { if (streq(e, item->Data)) return true; } return false; } int CppListLen(l) CppList l; { return l->Size; } CppListElem EnumCppList(l) CppList l; { CppListItem 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 ResetCppListEnum(l) CppList l; { l->EnumState = l->First; } void PrintCppList(l) CppList l; { CppListItem item; for (item = l->First; item; item = item->Next) if (item->Next) printf("%s, ", item->Data); else printf("%s\n", item->Data); } AuxCppListElem NewAuxCppListElem(name, sym) char *name; struct Sym *sym; { AuxCppListElem e = (AuxCppListElem) malloc(sizeof(struct AuxCppListElemStruct)); e->Data = name; e->AuxData = sym; return e; }