📄 06-03-21 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)
//描述 :
//参数 :源字符串
//返回 :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 + -