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

📄 search.c

📁 《嵌入式网络系统设计-基于Atmel ARM7 系列》这个本书的光盘资料
💻 C
字号:
//*----------------------------------------------------------------------------
//* 文件名			   : search.c
//* 功能描述		   : 提供特殊功能的内存查找函数
//* 作者    		   : 龙一
//* 版本			   : 1.0
//* 建立日期、时间	   : 2004/07/17 09:48
//* 最近修改日期、时间 : 
//* 修改原因		   : 
//*----------------------------------------------------------------------------

//*------------------------------ include file --------------------------------
#include	"/uCOS-II/ucos_ii.h"
#include	"search.h"
//*--------------------- Constants & Variable definition ----------------------
//*----------------------------------------------------------------------------
//* 函数名称 : MemSearch
//* 功能描述 : 在指定大小的内存区域查找数据,该函数可以查找任意类型的数据
//* 入口参数 :       <pvMem>[in] 指向指定的内存区域指针
//*			 :  <u32MemSize>[in] 被检索内存区域的大小
//*			 :     <u32Data>[in] 被检索的数据
//*			 : <u32DataSize>[in] 被检索的数据大小(BYTE)
//* 出口参数 : 找到则返回位置指针,否则返回值为NULL
//*----------------------------------------------------------------------------
void *MemSearch(void *pvMem, INT32U u32MemSize, INT32U u32Data, INT32U u32DataSize)
{
	const INT8U		*__pubAddr = pvMem;	
	INT8S 			*__pbData = (INT8S *)&u32Data;
	INT32S 			i;
	BOOLEAN			__blIsMatch;
	
	do{
		__pubAddr = (INT8U*)MemChr((INT8S*)__pubAddr, *__pbData, ((INT8U *)pvMem + u32MemSize) - __pubAddr);
		if(__pubAddr != NULL)
		{
			__blIsMatch = OS_TRUE;
			for(i=1; i<u32DataSize; i++)
			{
				if(*(__pubAddr + i) != *(__pbData + i))
				{
					__blIsMatch = OS_FALSE;
					break;
				}
			}
		
			if(__blIsMatch)
				return (void *)__pubAddr;
		
			__pubAddr++;	
		}
		else
			break;		
	}while(OS_TRUE);
	
	return NULL;
}

//*----------------------------------------------------------------------------
//* 函数名称 : MemChr
//* 功能描述 : 在指定的内存区域查找字符
//* 入口参数 :      <pbMem>[in] 指向指定的内存区域指针
//*			 :      <bBYTE>[in] 被检索的字符
//*			 : <u32MemSize>[in] 内存大小
//* 出口参数 : 返回找到的实际位置
//*----------------------------------------------------------------------------
INT8S *MemChr(INT8S *pbMem, INT8S bBYTE, INT32U u32MemSize)
{
	INT8S		*__pbNext = pbMem;
	INT32S		i;

	for(i=0; i<u32MemSize; i++)
	{
		if(*(__pbNext+i) == bBYTE)
			return (__pbNext + i);
	}
	
	return NULL;
}

//*----------------------------------------------------------------------------
//* 函数名称 : memstr
//* 功能描述 : 在指定的内存区域查找字符串
//* 入口参数 :     <pbMem>[in] 指向指定的内存区域指针
//*			 :     <pbStr>[in] 被检索的字符串
//*			 : <ulStrSize>[in] 被检索的字符串大小
//*			 : <ulMemSize>[in] 内存大小
//* 出口参数 : 找到则返回TRUE,否则返回FALSE
//*----------------------------------------------------------------------------
BOOLEAN memstr(INT8S *pbMem, INT8S *pbStr, INT32U u32StrSize, INT32U u32MemSize)
{
	INT8S *__pbNext = pbMem;
	
	__pbNext = MemChr(__pbNext, (INT8S)pbStr[0], u32MemSize);
	while(__pbNext != NULL)
	{
		if(__pbNext != NULL)
		{
			if(strncmp(__pbNext, pbStr, u32StrSize) == 0)
				return OS_TRUE;
			
			__pbNext += 1;
			__pbNext = MemChr(__pbNext, (INT8S)pbStr[0], (pbMem + u32MemSize) - __pbNext);
		}
	}
		
	return OS_FALSE;
}

//*----------------------------------------------------------------------------
//* 函数名称 : memstrExt
//* 功能描述 : 在指定的内存区域查找字符串
//* 入口参数 :     <pbMem>[in] 指向指定的内存区域指针
//*			 :     <pbStr>[in] 被检索的字符串
//*			 : <ulStrSize>[in] 被检索的字符串大小
//*			 : <ulMemSize>[in] 内存大小
//* 出口参数 : 找到返回字符串所在的位置指针,否则返回NULL
//*----------------------------------------------------------------------------
INT8S *memstrExt(INT8S *pbMem, INT8S *pbStr, INT32U u32StrSize, INT32U u32MemSize)
{
	INT8S *__pbNext = pbMem;
	
	__pbNext = MemChr(__pbNext, (INT8S)pbStr[0], u32MemSize);
	while(__pbNext != NULL)
	{
		if(__pbNext != NULL)
		{
			if(strncmp(__pbNext, pbStr, u32StrSize) == 0)
				return __pbNext;
			
			__pbNext += 1;
			__pbNext = MemChr(__pbNext, (INT8S)pbStr[0], (pbMem + u32MemSize) - __pbNext);
		}
	}
		
	return NULL;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -