99 lines
1.5 KiB
C
99 lines
1.5 KiB
C
#include <stdlib.h>
|
|
#include <string.h>
|
|
#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;
|
|
}
|
|
|