📄 phonebook_drv.c
字号:
//======================================================
// 文件名称: PhoneBook_Drv.c
// 功能描述: 通讯录数据结构操作函数集,用于插入、删除、修改通讯录条目
// 维护记录: 2006-09-20 v1.0
//======================================================
#include "..\include\Flash.h"
#include "..\include\PhoneBook.h"
#include "..\include\CommonFunc.h"
PHONEBOOK_IDX *p_PB_Idx = (PHONEBOOK_IDX *)PB_IDX_SA; // 通讯录索引指针
//========================================================================
// 语法格式: PHONEBOOK *PB_GetInsertPos(PHONEBOOK *p_PB_Item)
// 实现功能: 获取当前条目应插入到链表中的位置(私有函数),使所有条目按姓名排序
// 参数: p_PB_Item 准备插入的条目指针
// 返回值: 新条目将插入到某个已知条目前,函数返回这个已知条目的指针
// 如果未找到(新条目将插到链表尾部)则返回NULL
//========================================================================
PHONEBOOK *PB_GetInsertPos(PHONEBOOK *p_PB_Item)
{
PHONEBOOK *p_PB_Temp;
unsigned char *p_Char1, *p_Char2, Temp1, Temp2;
unsigned char Flag_Temp;
p_PB_Temp = p_PB_Idx->FirstItem;
Flag_Temp = 0;
while(p_PB_Temp->Flag_Del != 0xffff)
{
p_Char1 = p_PB_Item->Name;
p_Char2 = p_PB_Temp->Name;
while(*p_Char2 != '\0') // 字符串比较
{
Temp1 = (*p_Char1<<8)|(*p_Char1>>8);
Temp2 = (*p_Char2<<8)|(*p_Char2>>8);
if(Temp1 < Temp2)
{
Flag_Temp = 1; // 找到了应插入的位置
break;
}
else if(Temp1 == Temp2)
{
p_Char1++;
p_Char2++;
}
else
break;
}
if(Flag_Temp)break; // 若找到位置则退出
p_PB_Temp = p_PB_Temp->NextItem; // 与下一条目比较
}
if(p_PB_Temp->Flag_Del != 0xffff)
return p_PB_Temp; // 新条目应插入到p_PB_Temp之前
else
return NULL; // 新条目应插入到链表末尾
}
//========================================================================
// 语法格式: PHONEBOOK *PB_GetEmptyPos(unsigned int Pos)
// 实现功能: 获取一块可用存储空间,用来保存通讯录条目(私有函数)
// 参数: Pos 获取第Pos块可用空间(从低地址向高地址搜索)
// 返回值: 找到的可用空间首地址,若未找到则返回NULL
//========================================================================
PHONEBOOK *PB_GetEmptyPos(unsigned int Pos)
{
PHONEBOOK *p_PB_Temp;
p_PB_Temp = (PHONEBOOK*)PB_ITEM_SA; // 从条目存储空间的最低地址开始查找
while(Pos>0)
{
if(p_PB_Temp < (PHONEBOOK*)PB_ITEM_SA + PB_MAX_ITEM)
{
while(p_PB_Temp->Flag_Del!=0xffff)
p_PB_Temp++;
}
else
{
return NULL;
}
Pos--;
p_PB_Temp++;
}
return p_PB_Temp-1;
}
//========================================================================
// 语法格式: PHONEBOOK *PB_Item_Insert(PHONEBOOK *p_PB_Item)
// 实现功能: 向链表中插入一个条目
// 参数: p_PB_Item 待插入条目的指针
// 返回值: 条目插入链表后的存储地址
//========================================================================
PHONEBOOK *PB_Item_Insert(PHONEBOOK *p_PB_Item)
{
PHONEBOOK_IDX PB_Idx;
PHONEBOOK *p_PB_Temp, *p_PB_Cur;
unsigned int i;
p_PB_Cur = p_PB_Item;
p_PB_Temp = PB_GetInsertPos(p_PB_Cur);
if(p_PB_Temp == NULL) // 插入到链表末尾
{
if(p_PB_Idx->ItemNum==0)
p_PB_Cur->PreItem = PB_GetEmptyPos(2);
else
p_PB_Cur->PreItem = p_PB_Idx->LastItem;
p_PB_Cur->NextItem = PB_GetEmptyPos(2);
PB_Idx.FirstItem = p_PB_Idx->FirstItem;
PB_Idx.LastItem = PB_GetEmptyPos(1);
}
else // 插入到链表中
{
if(p_PB_Temp->PreItem->Flag_Del == 0xffff) // 链表头部
{
p_PB_Cur->PreItem = PB_GetEmptyPos(2);
PB_Idx.FirstItem = PB_GetEmptyPos(1);
}
else
{
p_PB_Cur->PreItem = p_PB_Temp->PreItem; // 链表中部
PB_Idx.FirstItem = p_PB_Idx->FirstItem;
}
p_PB_Cur->NextItem = p_PB_Temp;
PB_Idx.LastItem = p_PB_Idx->LastItem;
}
p_PB_Cur = PB_GetEmptyPos(1);
Flash_Modify((unsigned int)p_PB_Cur, (unsigned int*)p_PB_Item, sizeof(PHONEBOOK));
p_PB_Item = p_PB_Cur;
/// 保存通讯录索引
PB_Idx.ItemNum = p_PB_Idx->ItemNum + 1;
if(p_PB_Cur->VoiceIdx!=0xffff)
PB_Idx.Voice_Num = p_PB_Idx->Voice_Num + 1;
else
PB_Idx.Voice_Num = p_PB_Idx->Voice_Num;
for(i=0;i<PB_MAX_VOICE;i++)
PB_Idx.Voice_PBAddr[i] = p_PB_Idx->Voice_PBAddr[i];
if(p_PB_Cur->VoiceIdx != 0xffff)
PB_Idx.Voice_PBAddr[p_PB_Cur->VoiceIdx] = p_PB_Cur;
Flash_Modify(PB_IDX_SA, (unsigned int*)&PB_Idx, sizeof(PHONEBOOK_IDX));
/// 更新相关链表项
if(p_PB_Cur->PreItem->Flag_Del!=0xffff)
{
p_PB_Temp = p_PB_Cur->PreItem;
Flash_Modify((unsigned int)&(p_PB_Temp->NextItem), (unsigned int*)&p_PB_Cur, sizeof(PHONEBOOK *));
}
if(p_PB_Cur->NextItem->Flag_Del!=0xffff)
{
p_PB_Temp = p_PB_Cur->NextItem;
Flash_Modify((unsigned int)&(p_PB_Temp->PreItem), (unsigned int*)&p_PB_Cur, sizeof(PHONEBOOK *));
}
p_PB_Temp = PB_GetEmptyPos(1);
p_PB_Cur = p_PB_Idx->FirstItem;
Flash_Modify((unsigned int)&(p_PB_Cur->PreItem), (unsigned int*)&p_PB_Temp, sizeof(PHONEBOOK *));
p_PB_Cur = p_PB_Idx->LastItem;
Flash_Modify((unsigned int)&(p_PB_Cur->NextItem), (unsigned int*)&p_PB_Temp, sizeof(PHONEBOOK *));
return p_PB_Item;
}
//========================================================================
// 语法格式: PHONEBOOK *PB_Item_Del(PHONEBOOK *p_PB_Item)
// 实现功能: 从链表中删除一个条目
// 参数: p_PB_Item 待删除条目的指针
// 返回值: 删除的条目所在地址
//========================================================================
PHONEBOOK *PB_Item_Del(PHONEBOOK *p_PB_Item)
{
PHONEBOOK_IDX PB_Idx;
PHONEBOOK *p_PB_Temp, *p_PB_Cur;
unsigned int i;
p_PB_Cur = p_PB_Item;
i = 0xffff;
Flash_Modify((unsigned int)&p_PB_Cur->Flag_Del, &i, sizeof(unsigned int));
/// 保存通讯录索引
PB_Idx.ItemNum = p_PB_Idx->ItemNum - 1;
if(PB_Idx.ItemNum==0)
{
PB_Idx.FirstItem = (PHONEBOOK *)PB_ITEM_SA;
PB_Idx.LastItem = (PHONEBOOK *)PB_ITEM_SA;
}
else
{
if(p_PB_Cur==p_PB_Idx->FirstItem)
PB_Idx.FirstItem = p_PB_Cur->NextItem;
else
PB_Idx.FirstItem = p_PB_Idx->FirstItem;
if(p_PB_Cur==p_PB_Idx->LastItem)
PB_Idx.LastItem = p_PB_Cur->PreItem;
else
PB_Idx.LastItem = p_PB_Idx->LastItem;
}
if(p_PB_Cur->VoiceIdx!=0xffff)
PB_Idx.Voice_Num = p_PB_Idx->Voice_Num - 1;
else
PB_Idx.Voice_Num = p_PB_Idx->Voice_Num;
for(i=0;i<PB_MAX_VOICE;i++)
PB_Idx.Voice_PBAddr[i] = p_PB_Idx->Voice_PBAddr[i];
if(p_PB_Cur->VoiceIdx != 0xffff)
PB_Idx.Voice_PBAddr[p_PB_Cur->VoiceIdx] = NULL;
Flash_Modify(PB_IDX_SA, (unsigned int*)&PB_Idx, sizeof(PHONEBOOK_IDX));
/// 更新相关链表项
if(p_PB_Cur->PreItem->Flag_Del!=0xffff)
{
p_PB_Temp = p_PB_Cur->PreItem;
Flash_Modify((unsigned int)&(p_PB_Temp->NextItem), (unsigned int*)&p_PB_Cur->NextItem, sizeof(PHONEBOOK *));
}
if(p_PB_Cur->NextItem->Flag_Del!=0xffff)
{
p_PB_Temp = p_PB_Cur->NextItem;
Flash_Modify((unsigned int)&(p_PB_Temp->PreItem), (unsigned int*)&p_PB_Cur->PreItem, sizeof(PHONEBOOK *));
}
p_PB_Temp = PB_GetEmptyPos(1);
p_PB_Cur = p_PB_Idx->FirstItem;
if(p_PB_Cur->Flag_Del!=0xffff)
Flash_Modify((unsigned int)&(p_PB_Cur->PreItem), (unsigned int*)&p_PB_Temp, sizeof(PHONEBOOK *));
p_PB_Cur = p_PB_Idx->LastItem;
if(p_PB_Cur->Flag_Del!=0xffff)
Flash_Modify((unsigned int)&(p_PB_Cur->NextItem), (unsigned int*)&p_PB_Temp, sizeof(PHONEBOOK *));
return p_PB_Item;
}
//========================================================================
// 语法格式: PHONEBOOK *PB_Item_Search(unsigned char *KeyWord, PHONEBOOK *p_PB_Start, unsigned int Direction)
// 实现功能: 搜索一个以指定关键字开头的条目
// 参数: KeyWord 搜索的关键字
// p_PB_Start 从哪个条目开始搜索
// Direction 搜索方向,0-向前搜索,1-向后搜索
// 返回值: 搜索到的条目指针,若未找到匹配条目则返回NULL
//========================================================================
PHONEBOOK *PB_Item_Search(unsigned char *KeyWord, PHONEBOOK *p_PB_Start, unsigned int Direction)
{
PHONEBOOK *p_PB_Item, *p_PB_Result;
unsigned char *p_Char1, *p_Char2;
p_PB_Item = p_PB_Start;
p_PB_Result = NULL;
while(p_PB_Item->Flag_Del==0)
{
p_Char1 = KeyWord;
p_Char2 = p_PB_Item->Name;
while(*p_Char2!='\0') // 逐字比较
{
if(*p_Char1!=*p_Char2)break;
p_Char1++;
p_Char2++;
}
if(*p_Char1=='\0') // 找到了匹配的条目
{
p_PB_Result = p_PB_Item;
break;
}
else // 若未找到则与下一条目比较
p_PB_Item = (Direction==0) ? p_PB_Item->PreItem : p_PB_Item->NextItem;
}
return p_PB_Result;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -