简易版缓冲区
typedef void* FIFOBUFFERHANDELE;
typedef char uint8;
#ifndef _min
#define _min(a, b) a > b ? b : a
#endif
//缓冲区结构体
typedef struct _fifobuf{
char *buff;
char *read;
char *write;
char *end;
} Fifobuffer,*PFifobuffer;
//创建缓冲区
FIFOBUFFERHANDELE FifoBufferCreate(int s32size)
{
PFifobuffer ptFifobuffer;
ptFifobuffer = (PFifobuffer)malloc(sizeof(Fifobuffer));
if (ptFifobuffer == NULL)
{
return (FIFOBUFFERHANDELE)0;
}
memset(ptFifobuffer, 0, sizeof(Fifobuffer));
ptFifobuffer->buff = (char *)malloc(s32size);
if (ptFifobuffer->buff == NULL)
{
return (FIFOBUFFERHANDELE)0;
}
memset(ptFifobuffer->buff, 0, s32size);
ptFifobuffer->write = ptFifobuffer->read = ptFifobuffer->buff;
ptFifobuffer->end = ptFifobuffer->buff + s32size;
return (FIFOBUFFERHANDELE)ptFifobuffer;
}
//销毁缓冲区
void FifoBufferDestroy(FIFOBUFFERHANDELE pHandler)
{
PFifobuffer ptFifobuffer = (PFifobuffer)pHandler;
if (ptFifobuffer == NULL)
{
return;
}
if (ptFifobuffer->buff == NULL)
{
return;
}
free(ptFifobuffer->buff);
ptFifobuffer->buff = NULL;
free(ptFifobuffer);
ptFifobuffer = NULL;
}
//重设缓冲区
void FifoBufferReset(FIFOBUFFERHANDELE pHandler)
{
PFifobuffer ptFifobuffer = (PFifobuffer)pHandler;
if (ptFifobuffer != NULL)
{
ptFifobuffer->write = ptFifobuffer->read = ptFifobuffer->buff;
}
}
//返回缓冲区的大小
int FifoBufferSize(FIFOBUFFERHANDELE pHandler)
{
int s32size = 0;
PFifobuffer ptFifobuffer = (PFifobuffer)pHandler;
if (ptFifobuffer != NULL)
{
s32size = ptFifobuffer->write - ptFifobuffer->read;
if (s32size < 0)
{
s32size += ptFifobuffer->end - ptFifobuffer->buff;
}
}
return s32size;
}
//往缓冲区中写数据,参数为缓冲区,要写的内容,写多少
int FifoBufferWrite(FIFOBUFFERHANDELE pHandler, uint8 *buffer, int s32size)
{
int s32Length = 0;
PFifobuffer ptFifobuffer = (PFifobuffer)pHandler;
if (ptFifobuffer == NULL)
{
return 0;
}
do{
s32Length = _min(ptFifobuffer->end - ptFifobuffer->buff, s32size);
memcpy(ptFifobuffer->write, buffer, s32Length);
buffer += s32Length;
ptFifobuffer->write += s32Length;
if (ptFifobuffer->write >= ptFifobuffer->end)
{
ptFifobuffer->write = ptFifobuffer->buff;
}
s32size -= s32Length;
}
return 1;
}
//读缓冲区中的数据
int FifoBufferRead(FIFOBUFFERHANDELE pHandler, uint8 *buffer, int *ps32size)
{
int s32Length = 0;
int tmpsize = *ps32size;
PFifobuffer ptFifobuffer = (PFifobuffer)pHandler;
if(NULL == ptFifobuffer || NULL == buffer || 0 > tmpsize)
{
return 0;
}
if(0 == tmpsize)
{
(*ps32size) = 0;
return 1;
}
(*ps32size) = 0;
do
{
s32Length = _min(FifoBufferSize(pHandler), tmpsize);
s32Length = _min(ptFifobuffer->end - ptFifobuffer->read, s32Length);
if(0 == s32Length)
{
break;
}
memcpy(buffer, ptFifobuffer->read, s32Length);
buffer += s32Length;
ptFifobuffer->read += s32Length;
if(ptFifobuffer->read >= ptFifobuffer->end)
{
ptFifobuffer->read = ptFifobuffer->buff;
}
tmpsize -= s32Length;
(*ps32size) += s32Length;
}while(tmpsize > 0);
return 1;
}