一个读写缓冲模块

来源:互联网 发布:日本知福山图书馆 编辑:程序博客网 时间:2024/05/05 01:46
<pre name="code" class="cpp">#include <stdio.h>#include <stdlib.h>#include <string.h>#include <assert.h>#define ARG_IS_VALID(exr, ret) do\{\    if (!(exr))\    {\        printf("invalid argument: failed to jugde %s\n", #exr);\        return ret;\    }\}while(0)#define SUCCESS 0#define FAILURE -1#define _Free(arg) __Free((void**)arg)typedef struct TAG_READ_BUFF_T{    int ReadPosition;    int WritePosition;    int BuffSize;    void* Begin;}READ_BUFF_T;void* _Malloc(int bytes){    ARG_IS_VALID(bytes > 0, NULL);    int AlignSize = _Align(bytes);    void* ret = malloc(AlignSize);    if (NULL != ret)    {        memset(ret, 0, AlignSize);    }else    {        printf("malloc error.size: %d\n", AlignSize);    }    return ret;}int __Free(void** ptr){    ARG_IS_VALID(NULL != ptr, FAILURE);    ARG_IS_VALID(NULL != (*ptr), FAILURE);    free(*ptr);    *ptr = NULL;    return SUCCESS;}static int __GetBufWritable(READ_BUFF_T* pReadBuf, void** Begin, int* Len){    ARG_IS_VALID(NULL != pReadBuf, FALURE);    ARG_IS_VALID(NULL != Begin, FALURE);    ARG_IS_VALID(NULL != Len, FALURE);    *Begin = pReadBuf->Begin + pReadBuf->WritePosition;    *Len = pReadBuf->BuffSize - pReadBuf->WritePosition;    printf("buffer has %d blank space.\n", *Len);    return SUCCESS;}static int __GetBufReadable(READ_BUFF_T* pReadBuf, void** Begin, int* Len){    ARG_IS_VALID(NULL != pReadBuf, FALURE);    ARG_IS_VALID(NULL != Begin, FALURE);    ARG_IS_VALID(NULL != Len, FALURE);    *Begin = pReadBuf->Begin + pReadBuf->ReadPosition;    *Len = pReadBuf->WritePosition - pReadBuf->ReadPosition;    printf("buffer has %d bytes space need to read.\n", *Len);    return SUCCESS;}static int __ResetWritablePosition(READ_BUFF_T* pReadBuf, int length){    ARG_IS_VALID(NULL != pReadBuf, FALURE);    ARG_IS_VALID(length <= pReadBuf->BuffSize - pReadBuf->WritePosition, FALURE);    pReadBuf->WritePosition += length;    return SUCCESS;}static int __ResetReadablePosition(READ_BUFF_T* pReadBuf, int length){    ARG_IS_VALID(NULL != pReadBuf, FALURE);    ARG_IS_VALID(length <= pReadBuf->WritePosition - pReadBuf->ReadPosition, FALURE);    pReadBuf->ReadPosition += length;    return SUCCESS;}static int __ReserveBuff(READ_BUFF_T* pReadBuf, int length){    ARG_IS_VALID(NULL != pReadBuf, FALURE);    ARG_IS_VALID(length <= pReadBuf->BuffSize, FALURE);    if (pReadBuf->BuffSize - pReadBuf->WritePosition >= length)    {    }    else if (pReadBuf->BuffSize - pReadBuf->WritePosition + pReadBuf->ReadPosition >= length)    {        memmove(pReadBuf->Begin, pReadBuf->Begin+ pReadBuf->ReadPosition, pReadBuf->WritePosition - pReadBuf->ReadPosition);        pReadBuf->WritePosition -= pReadBuf->ReadPosition;        pReadBuf->ReadPosition = 0;    }else    {        printf("no enough reserve buffer[%d bytes]\n", length);        return FALURE;    }    return SUCCESS;}static READ_BUFF_T* READ_BUFF_Init(int BuffSize){    ARG_IS_VALID(BuffSize > 0, NULL);    READ_BUFF_T* pstReadBuff = (READ_BUFF_T*)AJB_Malloc(sizeof(READ_BUFF_T) + BuffSize);    EX_ASSERT(NULL != pstReadBuff);    pstReadBuff->BuffSize = BuffSize;    pstReadBuff->ReadPosition = 0;    pstReadBuff->WritePosition = 0;    pstReadBuff->Begin = (void*)(pstReadBuff+1);    printf("read buffer init completed.size: %d\n", BuffSize);    return pstReadBuff;}static int READ_BUFF_Destroy(READ_BUFF_T** pstReadBuff){    ARG_IS_VALID(NULL != pstReadBuff, FALURE);    ARG_IS_VALID(NULL != *pstReadBuff, FALURE);    AJB_Free(pstReadBuff);    printf("destroy read buff completed.pstReadBuff: 0x%p\n", *pstReadBuff);    return SUCCESS;}


                                             
0 0