📄 find.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 + -