#define TRUE 1 #define FALSE 0 typedef struct BufInfo { char* pBuffer; int nBufferSize; int nElemSize; int nElemCount; int nextReadIndex; //初始化为-1 int lastWriteIndex; //初始化为-1 } BufInfo; int Buf_InsertElem (BufInfo* pBufInfo, const void* pElem) { int tmpInsPos; if (pBufInfo->nextReadIndex == -1) { return Buffer_AddElem(pBufInfo, pElem); } tmpInsPos = (pBufInfo->nextReadIndex > 0) ? pBufInfo->nextReadIndex - 1 : pBufInfo->nElemCount - 1; if (tmpInsPos == pBufInfo->lastWriteIndex) { printf("BUFFER OVERFLOW/n"); return FALSE; } pBufInfo->nextReadIndex = tmpInsPos; memcpy(pBufInfo->pBuffer + (pBufInfo->nextReadIndex * pBufInfo->nElemSize), pElem, pBufInfo->nElemSize); return TRUE; } int Buf_AddElem (BufInfo* pBufInfo, const void* pElem) { int tmpAddPos; tmpAddPos = pBufInfo->lastWriteIndex + 1; if (tmpAddPos >= pBufInfo->nElemCount) tmpAddPos = 0; if (tmpAddPos == pBufInfo->nextReadIndex) { printf("BUFFER OVERFLOW/n"); return FALSE; } pBufInfo->lastWriteIndex = tmpAddPos; memcpy(pBufInfo->pBuffer + (pBufInfo->lastWriteIndex * pBufInfo->nElemSize), pElem, pBufInfo->nElemSize); if (-1 == pBufInfo->nextReadIndex) { pBufInfo->nextReadIndex = pBufInfo->lastWriteIndex; } return TRUE; } int Buf_GetHeadElem (BufInfo* pBufInfo, void* pElem, const int bRemove) { if (-1 == pBufInfo->nextReadIndex) return FALSE; memcpy(pElem, pBufInfo->pBuffer + (pBufInfo->nextReadIndex * pBufInfo->nElemSize), pBufInfo->nElemSize); if (FALSE == bRemove) return TRUE; if (pBufInfo->nextReadIndex == pBufInfo->lastWriteIndex) { pBufInfo->nextReadIndex = -1; } else { pBufInfo->nextReadIndex++; if (pBufInfo->nextReadIndex >= pBufInfo->nElemCount) { pBufInfo->nextReadIndex = 0; } } return TRUE; } int Buf_GetElemCount (const BufInfo* pBufInfo) { const int nIndexDiff = pBufInfo->lastWriteIndex - pBufInfo->nextReadIndex; if (-1 == pBufInfo->nextReadIndex) return 0; return (nIndexDiff >= 0) ? nIndexDiff + 1 : nIndexDiff + 1 + pBufInfo->nElemCount; }