?? 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 + -