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

📄 06-03-21 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)									
//描述  :
//参数  :源字符串
//返回  :2个字节的数据,1,或者12
//其他  :
********************************************************************************************************/
uint16 getKeywordNumber(uint8 *src)
{
	uint8 i;
	uint8 len;
	uint16 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 <<=8; 
				ret  |= *(src+i+1)+0x20;	
				//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,uint16 *ret)
{
	uint8	date_buf[8];
	uint8	src_buf[8];
	uint8	cmp_counter;	//要比较的长度
	uint8	counter;		//匹配的数目
	uint8 MaxCount;
	uint16	start_index;
	uint16	stop_index;	
	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);
	start_index=*(ret+1);	
	stop_index =*ret;

	
	for(i=0;i<5;i++)
		{
			*(ret+i)=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返回的是不匹配的字符串的位置
			{//比较相等
			
			ret[counter]=i;//保存索引,并且返回匹配的数目
			counter++;
			}
	}
		
	
	
return counter;	
}
/*******************************************************************************
//		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,uint16 keyword,uint16 *ret)
{
uint8 counter;	
uint8 TempBuffer[Tag_MAX_LEN];
uint8 kw[2];
uint8 MaxCount;
//uint8 directions;//查询方向
//uint8 cmpCounter;
uint16	requestindex;///请求第几条
uint16	StartIndex;	
uint16	StopIndex;
uint16	i;

kw[0]=keyword>>8;
kw[1]=keyword;

if(kw[0]==0x00)
	{
		//cmpCounter = 1;
		kw[0] = kw[1];
		kw[1] = 0x00;
		}//else
			//cmpCounter =2;
			

memset(TempBuffer,0,Tag_MAX_LEN);

//StartIndex=LastUpdateIndexTable[info_id];//从最新的开始查
MaxCount	= *(ret+2);//要求返回的数量
requestindex = *(ret+3);//
//directions = *(ret+4);//查询的方向


//StartIndex = *(ret+1);
//StopIndex = *ret;	
//MaxCount	= *(ret+2);
//清缓存表
	for(i=0;i<5;i++)
		{
			*(ret+i)=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条
		Get_Tag(info_id,i,TempBuffer);///读入日期		
		//////memcmp返回的是不匹配的字符串的位置
		if(strstr((char *)TempBuffer,(char *)kw)!=NULL)
			{//比较相等

				if((requestindex--)==1)
					{
						//requestindex=1;
							ret[counter]=i;//保存索引,并且返回匹配的数目
							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,uint16 *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);
StartIndex = *(ret+1);
StopIndex = *ret;	

//清缓存表
	for(i=0;i<5;i++)
		{
			*(ret+i)=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]=i;//保存索引,并且返回匹配的数目
			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,uint16 *ret)
{
uint8 counter;
uint8 type;
uint8 MaxCount;
uint8 infoid;
uint16 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;
				*(ret+1) = LastUpdateIndexTable[infoid]-Spara->STIndex+1;
				}else
					{//==1的情况 向上查询
						*ret = LastUpdateIndexTable[infoid]-Spara->STIndex;
						*(ret+1) =LastUpdateIndexTable[infoid];
						}
						
		*(ret+2)=MaxCount;
				
		*(ret+3)=Spara->STIndex;
		//*(ret+4)=type & QUEST_DIR_UP;

		
		switch(type & 0x03)
	{
		
		case 0x00:		//按0页关键字查询
			
			keywordnumber= 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;
		default:
			break;
	}	
return counter;	
}


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

//返回:该用户的第index条信息在个人信息类里的编号
//			如果没有找到就返回0xffff
*******************************************************************************/
uint16 SearchPersonalInfo(uint8 subid,uint16 index)
{
uint8 subID;
uint8 TempBuffer[Tag_MAX_LEN];
uint16	StartIndex;
uint16	StopIndex;
uint16	i;
uint16 infoindex;


subID = subid +'0';
infoindex =index;
memset(TempBuffer,0,Tag_MAX_LEN);

StartIndex=LastUpdateIndexTable[43];//从最新的开始查

StopIndex = 0;

	i=StartIndex;

	while((i--) > StopIndex )//可能有边界条件
	{
		
		Get_Tag(43,i,TempBuffer);///读入日期
		
		if(strchr((char *)TempBuffer,subID)!=NULL)
			{		
					if((infoindex--)==1)
						{
							return i;
						}
			}
	}

return 0xffff;
}

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

⌨️ 快捷键说明

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