📄 circlebuf.c
字号:
//************************************************
//版权信息
//文件名: CircleBuf.c
//说明: 环缓存
//历史信息: 2006/09/26 创建
//最后修改日期 完成人 说明
//---------------------------------
//2006/09/26 程睿远 ver1.00
//---------------------------------
//************************************************
#include <stdio.h>
#include "CircleBuf.h"
const unsigned short IDX_MASK = 0xFFFF >> (16-BUF_POWER);
char CircleBuf[BUF_SIZE]; //环缓存
unsigned short wHeadIdx = 0; //环缓存的头索引
unsigned short wTailIdx = 0; //环缓存的尾索引
//#define _INLINE_
//**********************************************************************
//过程名 : CBuf_IsEmpty
//说明 : 判断环缓存是否为空
//参数 :
//返回值 : 0: 为空
// 非零值: 不为空
//**********************************************************************
#ifdef _INLINE_
inline
#endif
char CBuf_IsEmpty()
{
return (wHeadIdx == wTailIdx);
}
//**********************************************************************
//过程名 : CBuf_WillBeOverFlow
//说明 : 判断环缓存是否没有空间容纳要放入的Object
//参数 : wSizeOfByte:要放入的Object的Size Of Bytes
//返回值 : 0: 无空间
// 非零值: 有空间
//**********************************************************************
#ifdef _INLINE_
inline
#endif
char CBuf_WillBeOverFlow( unsigned short wSizeOfByte )
{
return ((wHeadIdx - wTailIdx + wSizeOfByte) > (BUF_SIZE));
}
//**********************************************************************
//过程名 : CBuf_WillBeDataLack
//说明 : 判断环缓存中已有的数据长度对要取出的Object来说是否太少
//参数 : wSizeOfByte:要取出的Object的Size Of Bytes
//返回值 : 0: 数据长度不足
// 非零值: 数据长度足够
//**********************************************************************
#ifdef _INLINE_
inline
#endif
char CBuf_WillBeDataLack( unsigned short wSizeOfByte )
{
return ( wSizeOfByte > (wHeadIdx - wTailIdx));
}
//**********************************************************************
//过程名 : CBuf_PutObject
//说明 : 在缓存区中放入Object
//参数 : const char* pObject:要放入的Object的指针
// unsigned short wSizeOfByte: 要放入的Object的Size Of Bytes
//返回值 : 写入的字节数
//**********************************************************************
unsigned short CBuf_PutObject( const char* pObject, unsigned short wSizeOfByte )
{
//计算缓存底部空余空间的大小
unsigned short BufSizeOfBottom = BUF_SIZE - (wHeadIdx & IDX_MASK);
//判断是否会溢出,是则退出并返回0
if (CBuf_WillBeOverFlow( wSizeOfByte ))
{
return 0;
}
//
if (BufSizeOfBottom < wSizeOfByte)
{
//如果底部的空余空间不足以放入整个对象,则需要分割存放于底部和顶部两处
memcpy( &CircleBuf[wHeadIdx & IDX_MASK], pObject, BufSizeOfBottom );
memcpy( &CircleBuf[0], ((char*)pObject)+BufSizeOfBottom, wSizeOfByte-BufSizeOfBottom );
}
else
{
memcpy( &CircleBuf[wHeadIdx & IDX_MASK], pObject, wSizeOfByte );
}
wHeadIdx += wSizeOfByte; //增加头索引
return wSizeOfByte; //返回放入的字节数
}
//**********************************************************************
//过程名 : CBuf_GetObject
//说明 : 从缓存区中取出Object
//参数 : char* pObject:要取出的Object的指针
// unsigned short wSizeOfByte: 要取出的Object的Size Of Bytes
//返回值 : 取出的字节数
//**********************************************************************
unsigned short CBuf_GetObject( char* pObject, unsigned short wSizeOfByte )
{
//计算缓存底部非空余空间的大小
unsigned short BufSizeOfBottom = BUF_SIZE - (wTailIdx & IDX_MASK);
//判断是否数据不足,是则退出并返回0
if (CBuf_WillBeDataLack( wSizeOfByte ))
{
return 0;
}
//
if (BufSizeOfBottom < wSizeOfByte)
{
//如果底部的数据长度不足以提供所有的数据,则需要分别取存放于底部和顶部两处的数据
memcpy( pObject, &CircleBuf[wTailIdx & IDX_MASK], BufSizeOfBottom );
memcpy( ((char*)pObject)+BufSizeOfBottom, &CircleBuf[0], wSizeOfByte-BufSizeOfBottom );
}
else
{
memcpy( pObject, &CircleBuf[wTailIdx & IDX_MASK], wSizeOfByte );
}
wTailIdx += wSizeOfByte; //增加尾索引
return wSizeOfByte; //返回取出的字节数
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -