#include #include #include "stack.h" stack_t* Stack_free_top(stack_t *pObj) { stack_t *pCurr, *pNext; if (pObj == NULL) return pObj; pCurr = pObj->pNext; while(pCurr) { if (pCurr->pData) jfree(pCurr->pData); pNext = pCurr->pNext; jfree(pCurr); pCurr = pNext; } return pObj; } stack_t* Stack_free(stack_t *pObj) { stack_t *pCurr; if (pObj == NULL) return pObj; while(pObj->pNext) pObj = pObj->pNext; while(pObj) { pCurr = pObj->pPrev; if (pObj->pData) jfree(pObj->pData); jfree(pObj); pObj = pCurr; } return pObj; } stack_t* Stack_push(stack_t *pObj, void **ppData, uint32_t size) { stack_t *pCurr; if (!pObj) { pCurr = (stack_t*)jmalloc(sizeof(stack_t)); memset(pCurr, 0, sizeof(stack_t)); } else { pCurr = pObj->pNext; if (!pCurr) { pCurr = (stack_t*)jmalloc(sizeof(stack_t)); memset(pCurr, 0, sizeof(stack_t)); } } pCurr->pPrev = pObj; if (size) { if (!pCurr->pData) pCurr->pData = (void*)jmalloc(size); if (pCurr->pPrev) { if (pCurr->pPrev->size == size) memcpy(pCurr->pData, pCurr->pPrev->pData, size); } else memset(pCurr->pData, 0, size); } pCurr->size = size; *ppData = pCurr->pData; return pCurr; } stack_t* Stack_pop(stack_t *pObj, void **ppData) { stack_t *pCurr; if (pObj == NULL) return pObj; if (pObj->pPrev == NULL) return pObj->pPrev; pCurr = pObj->pPrev; *ppData = pCurr->pData; return pCurr; }