//*************************************************************** //* chainlist.cpp * //* aaawen 2005.05.27 * //*************************************************************** //#ifdef OS_WINDOWS #include #include //#endif #include #include #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; }