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.

181 lines
3.4 KiB
C++

//***************************************************************
//* chainlist.cpp *
//* aaawen 2005.05.27 *
//***************************************************************
//#ifdef OS_WINDOWS
#include <stdio.h>
#ifdef _WIN32
#include <process.h>
#else
#include <sys/types.h>
#include <unistd.h>
#endif
//#endif
#include <memory.h>
#include <stdlib.h>
#include "chainlist.h"
#include "common.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;
}