⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 circlebuf.c

📁 简单的环缓存演示代码, 演示了环缓存在C语言下的实现方式.
💻 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 + -