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

📄 find.c

📁 用与信息化的主机程序
💻 C
字号:
/*****************************************************************************************************
//						广东省科学院自动化研制中心重点实验室电子组
//									
//文件名:			find.c								
//版本	:			V0.0
//作者  :
//日期  :
//
//其他  :
//www.autocenter.gd.cn
//																		gdpiao@autocenter.gd.cn
********************************************************************************************************/


#define	IN_FIND_FILE
#include	"config.h"

/*****************************************************************************************************
//函数名:		uint16 getKeywordNumber(uint8 *src)									
//描述  :
//参数  :源字符串
//返回  :BCD码
//其他  :
********************************************************************************************************/
uint8 getKeywordNumber(uint8 *src)
{
	uint8 i;
	uint8 len;
	uint8 ret;
	//uint16 result;
	ret=0;
	len=strlen((char *)src);
	for(i=0;i<len;i+=2)
	{
		if(*(src+i)==0x03 && *(src+i+1)!=0x0d)
			{
				//ret |=result<<8;
				ret <<=4; 
				ret  |= (*(src+i+1)-0x10)&0x0f;	
				//result =ret;			 
				}else if(*(src+i)==0x03 && *(src+i+1)==0x0d)
					{
						return ret;
						}
					
		
		}
	return ret;
	}


/*******************************************************************************
//					uint16 find_date(uint8 id_index,DATE *date)	
//
//参数:uint8 id_index	分类ID号
//		DATE *date		指向要查询的日期的指针
//		uint16 *ret		2个字节的数组,用于保存匹配的索引号
//
//返回:uint8 返回匹配的信息数目,不大于5
//	
//	gdpiao@autocenter.gd.cn
*******************************************************************************/

uint8 find_date(uint8 id_index,DATE *date,IDnode *ret)
{
	uint8	date_buf[8];
	uint8	src_buf[8];
	uint8	cmp_counter;	//要比较的长度
	uint8	counter;		//匹配的数目
	uint8 MaxCount;
	uint16	start_index;
	uint16	stop_index;	
	uint16  requestindex;
	uint16	i;
	
	
	
	CLR_buffer(date_buf,8);
	CLR_buffer(src_buf,8);
	src_buf[0]=HEX_TO_BCD(date->year);
	src_buf[1]=HEX_TO_BCD(date->month);
	src_buf[2]=HEX_TO_BCD(date->day);
//	src_buf[3]=HEX_TO_BCD(date->hour);
//	src_buf[4]=HEX_TO_BCD(date->min);
	///检查有多少个条件,年,月,日,时,分
/*	for(i=0;i<5;i++)
	{
		if(src_buf[i]!=0 | )
			{
			cmp_counter=i+1;
			}else break;
		
		}
	*/
	cmp_counter = 3;
	start_index=LastUpdateIndexTable[id_index];//从最新的开始查
	MaxCount =ret[2].Index;
	requestindex = ret[3].Index;
	
	//start_index=*(ret+1);	
	//stop_index =*ret;
 	stop_index = 0;
	
	for(i=0;i<5;i++)
		{
			ret[i].Index=0xffff;
			}
	i=start_index;
	counter=0;
	//for(i=0;i<start_index;i++)
	while((i--)>stop_index)//可能有边界条件
	{
		if(counter==MaxCount)break;///最大可以返回5条
		Get_Date(id_index,i,date_buf);///读入日期
		if(memcmp(src_buf,date_buf,cmp_counter)==0)////memcmp返回的是不匹配的字符串的位置
			{//比较相等
			if((requestindex--)==1) 
				{
				ret[counter].Index=i;//保存索引,并且返回匹配的数目
				ret[counter].Id=id_index;
				counter++;
				requestindex = 1;
				}
			}
	}
		
	
	
return counter;	
}
/*****************************************************************************************************
//函数名:uint16 getnewInfobyDate(uint8 id_index,DATE *date)
//描述  :
//参数  :
//返回  :
//其他  :
********************************************************************************************************/
uint16 getnewInfobyDate(uint8 id_index,DATE *date)
{
	uint16 index;
	uint16 maxindex;
	uint8	date_buf[8];
	uint8	src_buf[8];

	src_buf[0]=HEX_TO_BCD(date->year-2000);
	src_buf[1]=HEX_TO_BCD(date->month);
	src_buf[2]=HEX_TO_BCD(date->day);

	maxindex = LastUpdateIndexTable[id_index];//从最新的开始查
	index = maxindex;
	//if(id_index)
	if(maxindex==0)return 0; //没有一条信息
		
	while((index--)>0)//可能有边界条件
	{
		memset(date_buf,0,8);
		Get_Date(id_index,index,date_buf);///读入日期
		if(memcmp(src_buf,date_buf,3)!=0)////memcmp返回的是不匹配的字符串的位置
			{
				return (maxindex-index-1);
				}
			}
	return maxindex;
	}
	

/*******************************************************************************
//		uint8  SearchKeyword(uint8 info_id,uint8 keyword,uint16 *ret);
//
//参数:uint8 id_index	分类ID号
//		uint8 keyword		关键字ID
//		uint16 *ret		2个字节的数组,用于保存匹配的索引号
//
//返回:uint8 返回匹配的信息数目,不大于5
//	
//	gdpiao@autocenter.gd.cn
*******************************************************************************/
uint8 SearchKeyword(uint8 info_id,uint8 keyword,IDnode *ret)
{
uint8 counter;	
uint8 TempBuffer[Tag_MAX_LEN];
uint8 kwnumber;
uint8 MaxCount;
uint16	requestindex;///请求第几条
uint16	StartIndex;	
uint16	StopIndex;
uint16	i;


kwnumber = keyword;
if(kwnumber==0 |kwnumber==0xff)
return 0;

memset(TempBuffer,0xff,Tag_MAX_LEN);

//StartIndex=LastUpdateIndexTable[info_id];//从最新的开始查
MaxCount	=ret[2].Index;//要求返回的数量
requestindex = ret[3].Index;//

	for(i=0;i<5;i++)
		{
			ret[i].Index=0xffff;
			}
StartIndex=LastUpdateIndexTable[info_id];//从最新的开始查
StopIndex = 0;
	i=StartIndex;
	counter=0;
	//for(i=0;i<start_index;i++)
	while((i--) > StopIndex )//可能有边界条件
	{
		if(counter==MaxCount)break;///最大可以返回5条
		memset(TempBuffer,0xff,Tag_MAX_LEN);
		Get_Tag(info_id,i,TempBuffer);///读入日期	
		//if(strstr((char *)TempBuffer,(char *)kw)!=NULL)
		if(strchr((char *)TempBuffer,kwnumber)!=NULL | //查找匹配
			((info_id>MIN_PERSONAL_ID && info_id <MAX_PERSONAL_ID) && TempBuffer[0]==0)//个人广播信息2006-4-9 14:54
			)
			{//比较相等

				if((requestindex--)==1)
					{
							ret[counter].Index=i;//保存索引,并且返回匹配的数目
							ret[counter].Id=info_id;
							counter++;
							requestindex=1;
							}
					
			}
	}

return counter;	
}


/*******************************************************************************
//		uint8  Search(uint8 info_id,uint8 keyword,uint16 *ret);
//
//参数:uint8 id_index	分类ID号
//		uint8 *keyword	要匹配的内容
//		uint16 *ret		2个字节的数组,用于保存匹配的索引号
//
//返回:uint8 返回匹配的信息数目,不大于5
//	
//	gdpiao@autocenter.gd.cn
*******************************************************************************/
uint8 SearchKeys(uint8 info_id,uint8 *keyword,IDnode *ret)
{
uint8 counter;	
uint8 MaxCount;
//uint8 TempBuffer[Tag_MAX_LEN];
uint16	StartIndex;
uint16	StopIndex;	
uint16	i;
uint16	KeywordLen;
uint16	ContentLen;
extern uint8 PublicBuffer[4096];

KeywordLen = strlen((char *)keyword);
memset(PublicBuffer,0,4096);


//StartIndex=LastUpdateIndexTable[info_id];//从最新的开始查
MaxCount =ret[2].Index;
StartIndex = ret[1].Index;
StopIndex = ret[0].Index;	

//清缓存表
	for(i=0;i<5;i++)
		{
			ret[i].Index=0xffff;
			}
			
	i=StartIndex;
	counter=0;
	//for(i=0;i<start_index;i++)
	while((i--) > StopIndex )//可能有边界条件
	{
		if(counter==MaxCount)break;///最大可以返回5条
		ContentLen=Get_News(info_id,i,PublicBuffer);///读入日期	
		if(KeywordLen>ContentLen)
			continue;//	
		if((strstr((char *)PublicBuffer,(char *)keyword))!=NULL)
			{//比较相等			
			ret[counter].Index=i;//保存索引,并且返回匹配的数目
			ret[counter].Id=info_id;
			counter++;
			}
	}

return counter;	
}

/*******************************************************************************
//		uint8  Search(uint8 info_id,uint8 keyword,uint16 *ret);
//
//参数:uint8 id_index	分类ID号
//		uint8 *keyword	要匹配的内容
//		uint16 *ret		2个字节的数组,用于保存匹配的索引号
//
//返回:uint8 返回匹配的信息数目,不大于5
//	
//	gdpiao@autocenter.gd.cn
*******************************************************************************/
uint8 Search(SEARCH *Spara,IDnode *ret)
{
uint8 counter;
uint8 type;
uint8 MaxCount;
uint8 infoid;
uint8 keywordnumber;
DATE  tempdate;
		type = Spara->Type;
		infoid = Spara ->InfoID;
		MaxCount = Spara ->Count;
		counter = 0;
		if( (type & QUEST_DIR_UP) != QUEST_DIR_UP) //bit5  为1,向上查询,否则向下查询
			{//==0 的情况 向下查询
				ret[0].Index = 0;
				ret[1].Index= LastUpdateIndexTable[infoid]-Spara->STIndex+1;
				}else
					{//==1的情况 向上查询
						ret[0].Index = LastUpdateIndexTable[infoid]-Spara->STIndex;
						ret[1].Index =LastUpdateIndexTable[infoid];
						}
						
		ret[2].Index=MaxCount;
				
		ret[3].Index=Spara->STIndex;
		//*(ret+4)=type & QUEST_DIR_UP;

		
		switch(type & 0x03)
	{
		
		case 0x00:		//按0页关键字查询
			
			keywordnumber = BCD_TO_HEX(getKeywordNumber(Spara->Text));
			counter=SearchKeyword(infoid,keywordnumber,ret);
			break;
			
		case 0x01:		//按时间查询
			tempdate.year=BCD_TO_HEX(Spara->Text[0]);
			tempdate.month=BCD_TO_HEX(Spara->Text[1]);
			tempdate.day=BCD_TO_HEX(Spara->Text[2]);
			counter =	find_date(infoid,&tempdate,ret);
			break;

				
		case 0x02:		//按任意关键字查询
			SearchKeys(infoid,Spara->Text,ret);
				break;
		case 0x03:
			
			//counter =	find_date(infoid,&tempdate,ret);
			break;		
		default:
			break;
	}	
return counter;	
}


/*******************************************************************************
//		uint16 SearchPersonalInfo(uint8 subid,uint16 index)
//参数:subid --终端的地址 十六进制
//			index --对应的第几条信息

//返回:该用户的第index条信息在个人信息类里的编号
//			如果没有找到就返回0xffff

//note:
//		2006-3-21 16:45 修改
//		增加多个类的个性化信息
*******************************************************************************/
//uint16 SearchPersonalInfo(uint8 subid,uint16 index)
uint16 SearchPersonalInfo(uint8 subid,uint8 infoid,uint16 index)
{

uint8 subID;
uint8	personalID;
uint8 TempBuffer[Tag_MAX_LEN];
uint16	StartIndex;
uint16	StopIndex;
uint16	i;
uint16 infoindex;


personalID = infoid;

subID = subid;

infoindex =index;

memset(TempBuffer,0,Tag_MAX_LEN);

StartIndex=LastUpdateIndexTable[personalID];//从最新的开始查
StopIndex = 0;

	i=StartIndex;

	while((i--) > StopIndex )//可能有边界条件
	{
		
		//Get_Tag(43,i,TempBuffer);///,原来只是一个类别 43
		Get_Tag(personalID,i,TempBuffer);
		if(strchr((char *)TempBuffer,subID)!=NULL | TempBuffer[0]==0x00) //2006-4-9 14:51 如果tag里是空,说明是共用的
		//if(strstr((char *)TempBuffer,(char *)subidkeyword)!=NULL)
			{
					if((infoindex--)==1)
						{
							return i;
						}
			}
	}

return 0xffff;
}
/*****************************************************************************************************
//函数名:		
//描述  :
//参数  :
//返回  :
//其他  :
********************************************************************************************************/
/*uint8 findPersonalInfo(uint8 subaddress,uint8 subid,uint8 *ret)
{
	uint8 subaddr;
	uint8 keyword[2];
	uint8 counter;
	uint16 i;
	
	subaddr = HEX_TO_BCD(subaddress);
	keyword[0]=((subID & 0xf0)>>4 ) +'0';
	keyword[1]=(subID & 0x0f) +'0';
	
	StartIndex=LastUpdateIndexTable[subid];//从最新的开始查
	StopIndex = 0;
	
	i=StartIndex;
	while((i--) > StopIndex )//可能有边界条件
	{
		
		Get_Tag(personalID,i,TempBuffer);
		//if(strchr((char *)TempBuffer,subID)!=NULL) 2006-4-3 18:20
		if(strstr((char *)TempBuffer,(char *)subidkeyword)!=NULL)
			{		
					if((infoindex--)==1)
						{
							return i;
						}
		
		}
	
	}
*/

/*****************************************************************************************************
//函数名:	uint8 getPersonalMaxCount(uint8 subid)										
//描述  :
//参数  :subid 终端用户的地址
//返回  :该地址所拥有的信息总数
//其他  :返回的最大值是PERSONAL_MAX_COUNTER;
********************************************************************************************************/
//uint8 getPersonalMaxCount(uint8 subid);
uint8 getPersonalMaxCount(uint8 subid,uint8 infoid)
{
	uint8 counter;
	counter = 0;
		//查询该终端的所有的信息,如果
	while( ( SearchPersonalInfo(subid,infoid,counter+1)!=0xffff ) && ( counter< PERSONAL_MAX_COUNTER ) )
		{
			counter++;
			}
		
	
	return counter;
 	}



/*****************************************************************************************************
//函数名:											
//描述  :
//参数  :
//返回  :
//其他  :
********************************************************************************************************/
uint8 SearchUID(uint8 info_id,uint8 *keyword,IDnode *ret)
{
uint8 counter;
uint8 MaxCount;
//uint8 TempBuffer[UID_MAX_LEN];
uint16	StartIndex;
uint16	StopIndex;
uint16	i;
uint16	KeywordLen;
uint16	ContentLen;
//extern uint8 PublicBuffer[4096];

KeywordLen = strlen((char *)keyword);
memset(PublicBuffer,0,256);


StartIndex=LastUpdateIndexTable[info_id];//从最新的开始查
MaxCount =1;
StopIndex = 0;

			
	i=StartIndex;
	counter=0;
	
	while((i--) > StopIndex )//可能有边界条件
	{
		if(counter==MaxCount)break;///最大可以返回5条
		ContentLen=Get_UID(info_id,i,PublicBuffer);
		if(KeywordLen!=ContentLen)
			continue;//	
		if((strstr((char *)PublicBuffer,(char *)keyword))!=NULL)
			{//比较相等			
			ret[counter].Index=i;//保存索引,并且返回匹配的数目
			//ret[counter].Id=info_id;
			counter++;
			}
	}

return counter;	
}

	
/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

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