#include <stdio.h> #define FIFO_SIZE (1024) typedef struct tagS_FIFO { unsigned int ulSize; unsigned int ulIn; unsigned int ulOut; char *pBuf; }S_FIFO; int FIFO_min(unsigned int ulFirstDat, unsigned int ulSndValue) { if (ulFirstDat <= ulSndValue) { return ulFirstDat; } else { return ulSndValue; } } int FIFO_init(S_FIFO *pFifo) { if (NULL == pFifo) { return -1; } pFifo->ulSize = FIFO_SIZE; pFifo->ulIn = 0; pFifo->ulOut = 0; pFifo->pBuf = malloc(FIFO_SIZE * sizeof(char)); if (NULL == pFifo->pBuf) { return -1; } return 0; } int FIFO_putData(S_FIFO *pFifo, char *pSrc, unsigned int ulLen) { unsigned int ulWrLen = 0; if ((NULL == pFifo) || (NULL == pSrc) || (ulLen <= 0)) { return -1; } /* 首先算出当前剩余空间,然后决定当前能写入的最大长度,其余长度丢弃 */ ulLen = FIFO_min(ulLen, pFifo->ulSize - pFifo->ulIn + pFifo->ulOut); /* 算出没有溢出时,能最大写入的长度,注意没有溢出时,可能需要两次写入 */ ulWrLen = FIFO_min(ulLen, pFifo->ulSize - (pFifo->ulIn & (pFifo->ulSize -1))); memcpy(pFifo->pBuf + (pFifo->ulIn & (pFifo->ulSize -1)), pSrc, ulWrLen); memcpy(pFifo->pBuf, pSrc + ulWrLen, ulLen - ulWrLen); pFifo->ulIn += ulLen; return ulLen; }
int FIFO_getData(S_FIFO *pFifo, char *pDst, unsigned int ulLen) { unsigned int ulRdLen = 0; if ((NULL == pFifo) || (NULL == pDst) || (ulLen <= 0)) { return -1; } /* 首先算出当前数据空间,然后决定当前能读取的最大长度,其余长度丢弃 */ ulLen = FIFO_min(ulLen, FIFO->ulIn - FIFO->ulOut); /* 算出没有溢出时,能最大读取的长度,注意溢出时,可能需要两次读取 */ ulRdLen = FIFO_min(ulLen, pFifo->ulSize - (pFifo->ulOut & (pFifo->ulSize -1))); memcpy(pDst, FIFO->pBuf + (pFifo-ulOut & (pFifo->ulSize - 1)), ulRdLen); memcpy(pDst + ulRdLen, pFifo->pBuf, ulLen - ulRdLen); pFifo->ulOut += ulLen; return ulLen; }