#ident "$URL: svn://elmer/devel/SVN/SDDAS/trunk/libant/LinkList.c $ %D% SwRI" /* LinkList.c -- generalized link list routines uses malloc and free for storage management only ptr to data kept in node */ #include #include #include "LinkList.h" /* LinkCreate -- create a node */ LinkList LinkCreate(void *data) { LinkList NewNode; NewNode = (LinkList)malloc(sizeof(LinkNode)); NewNode->data = data; NewNode->next = 0; return NewNode; } /* LinkCreateNodes -- create n number of nodes */ LinkList LinkCreateNodes(int n) { LinkList NewNodes, N; NewNodes = (LinkList)calloc(n,sizeof(LinkNode)); for (N=NewNodes; N < NewNodes + n - 1; N++) N->next = N+1; return NewNodes; } /* LinkAssignData -- assigns data pointer */ int LinkAssignData(LinkList N,void *data) { N->data = data; return 0; } /* LinkCompareData -- compares data pointers in two nodes return 0 if pointers match, 1 otherwise */ int LinkCompareData(void *data1,void *data2) { return !(data1 == data2); } /* FindLink -- find data in linked list using compare function return link list pointer */ LinkList FindLink(LinkList list,void *data,LinkFun compare) { int result; for (; list; list=list->next) if ((result = (*compare)(data,list->data)) == 0) return list; return 0; } /* LinkFind -- find data in linked list using compare function */ void *LinkFind(LinkList list,void *data,LinkFun compare) { int result; for (; list; list=list->next) if ((result = (*compare)(data,list->data)) == 0) return list->data; return 0; } /* LinkFindData -- find data in linked list by comparing LinkData ptrs */ void *LinkFindData(LinkList list,void *data) { for (; list; list=list->next) if (data == LinkData(list)) return LinkData(list); return 0; } /* LinkListDup -- create duplicate list DOES NOT OWN ITS DATA */ LinkList LinkListDup(LinkList oldlist) { LinkList newlist; for (newlist=0; oldlist; oldlist = oldlist->next) newlist = LinkAppend(newlist,LinkData(oldlist)); return newlist; } /* LinkListCp -- create duplicate list DOES NOT OWN ITS DATA */ LinkList LinkListCp(LinkList oldlist, unsigned long size) { LinkList newlist; void *data; for (newlist=0; oldlist; oldlist = oldlist->next) { data = malloc(size); memcpy(data,LinkData(oldlist),size); newlist = LinkAppend(newlist,data); } return newlist; } /* LinkListFree -- free all nodes in link list */ void LinkListFree(LinkList list) { LinkNode *old; while (list) { old = list; list = list->next; free((char*)old); } } /* LinkListFreeMucho -- free all link list nodes and their data */ void LinkListFreeMucho(LinkList list,LinkFreeFunc freer) { LinkNode *old; while (list) { /* remove first node from list */ old = list; list = list->next; /* free old node and its data */ if (old->data) { if (freer) (*freer)(old->data); else free(old->data); } free((char*)old); } }