You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
175 lines
3.3 KiB
C++
175 lines
3.3 KiB
C++
//***************************************************************
|
|
//* chainlist.cpp *
|
|
//* aaawen 2005.05.27 *
|
|
//***************************************************************
|
|
//#ifdef OS_WINDOWS
|
|
#include <stdio.h>
|
|
#include <process.h>
|
|
//#endif
|
|
#include <memory.h>
|
|
#include <stdlib.h>
|
|
#include "chainlist.h"
|
|
#include "basefunc.h"
|
|
#include "os_heap.h"
|
|
|
|
// SingleList
|
|
void SingleListInit(SINGLELIST *psSingleList, int iMaxNum)
|
|
{
|
|
psSingleList->iDevId = 0;
|
|
psSingleList->iMaxNum = iMaxNum;
|
|
psSingleList->iNum = 0;
|
|
psSingleList->pHead = NULL;
|
|
psSingleList->pTail = NULL;
|
|
}
|
|
|
|
void SingleListInitEx(SINGLELIST *psSingleList, int iMaxNum, int iDevId)
|
|
{
|
|
psSingleList->iDevId = iDevId;
|
|
psSingleList->iMaxNum = iMaxNum;
|
|
psSingleList->iNum = 0;
|
|
psSingleList->pHead = NULL;
|
|
psSingleList->pTail = NULL;
|
|
}
|
|
|
|
int SingleListHaveData(SINGLELIST *psSingleList)
|
|
{
|
|
return psSingleList->iNum;
|
|
}
|
|
|
|
BOOL SingleListAddData(SINGLELIST *psSingleList, BYTE *pu8Data, int iDataLen)
|
|
{
|
|
char szDbg[128];
|
|
SINGLELISTUNIT *pUnit;
|
|
|
|
if(psSingleList->iNum >= psSingleList->iMaxNum)
|
|
{
|
|
sprintf(szDbg, "WARN(%04d): DevId=%08x SingleListAddData is Overflow.\n",
|
|
_getpid(), psSingleList->iDevId);
|
|
DebugPrint(szDbg);
|
|
return FALSE;
|
|
}
|
|
|
|
pUnit = (SINGLELISTUNIT *)HEAP_MALLOC(sizeof(SINGLELISTUNIT));
|
|
if(pUnit == NULL)
|
|
{
|
|
sprintf(szDbg, "WARN(%04d): DevId=%08x SingleListAddData malloc(%d) is failed in unit.\n",
|
|
_getpid(), psSingleList->iDevId, sizeof(SINGLELISTUNIT));
|
|
DebugPrint(szDbg);
|
|
return FALSE;
|
|
}
|
|
|
|
pUnit->pNext = NULL;
|
|
pUnit->pBuf = (BYTE *)HEAP_MALLOC(iDataLen+1);
|
|
if(pUnit->pBuf == NULL)
|
|
{
|
|
HEAP_FREE(pUnit);
|
|
sprintf(szDbg, "WARN(%04d): DevId=%08x SingleListAddData malloc(%d) is failed in content.\n",
|
|
_getpid(), psSingleList->iDevId, iDataLen+1);
|
|
DebugPrint(szDbg);
|
|
return FALSE;
|
|
}
|
|
pUnit->iLen = iDataLen;
|
|
memcpy(pUnit->pBuf, pu8Data, iDataLen);
|
|
|
|
if(psSingleList->pTail == NULL)
|
|
{
|
|
psSingleList->pTail = pUnit;
|
|
}
|
|
else
|
|
{
|
|
psSingleList->pTail->pNext = pUnit;
|
|
psSingleList->pTail = pUnit;
|
|
}
|
|
|
|
if(psSingleList->pHead == NULL)
|
|
{
|
|
psSingleList->pHead = pUnit;
|
|
}
|
|
|
|
psSingleList->iNum++;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
int SingleListGetAndDelData(SINGLELIST *psSingleList, BYTE *pu8Data, int iMaxLen)
|
|
{
|
|
int iDataLen;
|
|
SINGLELISTUNIT *pUnit;
|
|
|
|
if(psSingleList->pHead == NULL)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
pUnit = psSingleList->pHead;
|
|
|
|
psSingleList->iNum--;
|
|
if(psSingleList->iNum <= 0)
|
|
{
|
|
psSingleList->iNum = 0;
|
|
psSingleList->pHead = NULL;
|
|
psSingleList->pTail = NULL;
|
|
}
|
|
else
|
|
{
|
|
psSingleList->pHead = pUnit->pNext;
|
|
}
|
|
|
|
if(pUnit->iLen > iMaxLen)
|
|
{
|
|
iDataLen = iMaxLen;
|
|
}
|
|
else
|
|
{
|
|
iDataLen = pUnit->iLen;
|
|
}
|
|
memcpy(pu8Data, pUnit->pBuf, iDataLen);
|
|
|
|
HEAP_FREE(pUnit->pBuf);
|
|
HEAP_FREE(pUnit);
|
|
|
|
return iDataLen;
|
|
}
|
|
|
|
BOOL SingleListDelData(SINGLELIST *psSingleList)
|
|
{
|
|
SINGLELISTUNIT *pUnit;
|
|
|
|
if(psSingleList->pHead == NULL)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
pUnit = psSingleList->pHead;
|
|
|
|
psSingleList->iNum--;
|
|
if(psSingleList->iNum <= 0)
|
|
{
|
|
psSingleList->iNum = 0;
|
|
psSingleList->pHead = NULL;
|
|
psSingleList->pTail = NULL;
|
|
}
|
|
else
|
|
{
|
|
psSingleList->pHead = pUnit->pNext;
|
|
}
|
|
|
|
HEAP_FREE(pUnit->pBuf);
|
|
HEAP_FREE(pUnit);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL SingleListDelAllData(SINGLELIST *psSingleList)
|
|
{
|
|
while(1)
|
|
{
|
|
if(SingleListDelData(psSingleList) == FALSE)
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|