#include #include #include "linklist.h" linkedlist_t* LinkedList_free(linkedlist_t *pObj) { linkedlist_t *pCurr; pCurr = LinkedList_find_first(pObj); while(pCurr) pCurr = LinkedList_del(pCurr); return pCurr; } linkedlist_t* LinkedList_append(linkedlist_t *pObj, UINT32 num, UINT32 size) { UINT32 i; linkedlist_t *pCurr, *pLast; char *pData = NULL; if (size) pData = (void*)malloc(num*size); pLast = pObj; if (pObj == NULL) { pCurr = (linkedlist_t*)malloc(num*sizeof(linkedlist_t)); } else { if (pObj->pNext) pLast = LinkedList_find_last(pObj); pCurr = (linkedlist_t*)malloc(num*sizeof(linkedlist_t)); } memset(pCurr, 0, num*sizeof(linkedlist_t)); pLast = pCurr; pLast->pPrev = pObj; if (pObj) pObj->pNext = pCurr; pLast->size = size; if (pData) pLast->pData = pData; pData += size; for(i=1; i < num; i++) { pLast->pNext = &pCurr[i]; pLast = pLast->pNext; pLast->pPrev = &pCurr[i-1]; pLast->size = size; if (pData) pLast->pData = pData; pData += size; } return pCurr; } /* linkedlist_t* LinkedList_append(linkedlist_t *pObj, UINT32 id, UINT32 size) { linkedlist_t *pCurr; if (pObj == NULL) { pCurr = (linkedlist_t*)malloc(sizeof(linkedlist_t)); } else { if (pObj->pNext) pObj = LinkedList_find_last(pObj); pObj->pNext = (linkedlist_t*)malloc(sizeof(linkedlist_t)); pCurr = pObj->pNext; } memset(pCurr, 0, sizeof(linkedlist_t)); if (size) { pCurr->pData = (void*)malloc(size); } pCurr->size = size; pCurr->id = id; pCurr->pPrev = pObj; return pCurr; } */ linkedlist_t* LinkedList_add(linkedlist_t *pObj, UINT32 num, void *pData, UINT32 size) { linkedlist_t *pCurr; pCurr = LinkedList_append(pObj, num, size); return LinkedList_put(pCurr, pData, size); } linkedlist_t* LinkedList_put(linkedlist_t *pObj, void *pData, UINT32 size) { linkedlist_t *pCurr; pCurr = pObj; if (size <= pCurr->size) { if (pData) memcpy(pCurr->pData, pData, size); pCurr->size = size; } return pCurr; } void* LinkedList_get(linkedlist_t *pObj) { return pObj->pData; } linkedlist_t* LinkedList_del(linkedlist_t *pObj) { linkedlist_t *pCurr; if (pObj == NULL) return NULL; if (pObj->pPrev) pObj->pPrev->pNext = pObj->pNext; if (pObj->pNext) pObj->pNext->pPrev = pObj->pPrev; pCurr = NULL; if (pObj->pNext) { pCurr = pObj->pNext; } else { pCurr = pObj->pPrev; } // if (pObj->pPrev) // { // if (pObj->pPrev != pCurr) // pObj->pPrev->pNext = pCurr; // else // pObj->pPrev->pNext = NULL; // } if (pObj->pData) free(pObj->pData); free(pObj); return pCurr; } linkedlist_t* LinkedList_ins(linkedlist_t *pObj, UINT32 num, void *pData, UINT32 size) { linkedlist_t *pCurr, *pNext; if (pObj == NULL) return NULL; pNext = pObj->pNext; pCurr = LinkedList_add(pObj, num, pData, size); pCurr->pNext = pObj; pCurr->pPrev = pObj->pPrev; pObj->pPrev->pNext = pCurr; pObj->pPrev = pCurr; pObj->pNext = pNext; return pCurr; } linkedlist_t* LinkedList_find_first(linkedlist_t *pObj) { linkedlist_t *pCurr; if (pObj == NULL) return NULL; pCurr = pObj; while(pCurr->pPrev) pCurr = pCurr->pPrev; return pCurr; } linkedlist_t* LinkedList_find_last(linkedlist_t *pObj) { linkedlist_t *pCurr; if (pObj == NULL) return NULL; pCurr = pObj; while(pCurr->pNext) pCurr = pCurr->pNext; return pCurr; } /* linkedlist_t* LinkedList_find_by_id(linkedlist_t *pObj, UINT32 id) { linkedlist_t *pCurr; if (pObj == NULL) return NULL; pCurr = LinkedList_find_first(pObj); do { if (pCurr->id == id) break; pCurr = pCurr->pNext; } while(pCurr->pNext); if (pCurr->id == id) return pCurr; return NULL; } */