📄 phdatabs.c
字号:
}
*/
void AddRecordToDB(PHONEBOOK *thisptr,SAVEMODE mode,DBLACB *phbooklacb)
{
U8 count;
U8 alllen = 0;
U8 *dataptr;
U8 *tmpptr;
U16 lastpos,lastlen;
U32 id;
U8 tmprel; //转换关系到ASCII码
U8 tmplen;//用于计算拷贝字符串到数据块的长度
//RecordStrLens lens;
if(thisptr ==NULL) return;//asix_error
//***********************************
alllen = 12*sizeof(U16); //所有字符串的索引指针的占用的地址空间
thisptr->namelen = (U8)strlen(thisptr->namebuf)+1;//首先计算各字符串的长度
thisptr->namepos = 12*sizeof(U16);
alllen += thisptr->namelen;
lastpos = thisptr->namepos;
lastlen = thisptr->namelen;
for(count=0;count<MAXMOBNUM;count++)
{
if((void*)(*(thisptr->mobile[count]))!= NULL)
{
thisptr->moblen[count]=(U8)strlen(thisptr->mobbuf[count])+1+sizeof(U16);
alllen +=thisptr->moblen[count];
thisptr->mobpos[count] = lastpos +lastlen;
lastpos = thisptr->mobpos[count];
lastlen = thisptr->moblen[count];
}
}
for(count=0;count<MAXTELNUM;count++)
{
if((void*)(*(thisptr->tel[count]))!=NULL)
{
thisptr->tellen[count] = (U8)strlen(thisptr->telbuf[count])+1+sizeof(U16);//包括了一个偏移的长度
thisptr->telpos[count] = lastpos+lastlen;
alllen += thisptr->tellen[count]; //添加一个偏移的长度
lastpos = thisptr->telpos[count];
lastlen = thisptr->tellen[count];
}
}
thisptr->rellen = (U8)strlen("0")+1;
thisptr->relpos = lastpos + lastlen;
alllen += thisptr->rellen;
lastpos = thisptr->relpos;
lastlen = 2;
for(count=0;count<MAXBPNUM;count++)
{
if((void*)(*(thisptr->bp[count]))!=NULL)
{
thisptr->bplen[count] = (U8)strlen(thisptr->bpbuf[count])+1+sizeof(U16);
alllen +=(thisptr->bplen[count]+sizeof(U16));
thisptr->bppos[count] = lastpos+lastlen;
lastpos =thisptr->bppos[count];
lastlen = thisptr->bplen[count];
}
}
//*************************************
dataptr = (U8 *)Lmalloc( alllen); //给数据块留余量
if( dataptr == NULL )
return; //ASIX_ERROR;
memset(dataptr,0x0,alllen);
tmpptr = dataptr;
memcpy( tmpptr, &(thisptr->namepos), sizeof(U16)); //下面开始存储数据块
tmpptr = dataptr + thisptr->namepos;
tmplen = (U8)strlen(thisptr->name)+1;//包括字符/0,计算字符 串的长度
memcpy(tmpptr,thisptr->name,tmplen);
tmpptr = dataptr +sizeof(U16);
for(count=0;count<MAXMOBNUM; count++)
{
if((*(thisptr->mobile[count]))==0)
{
memset(tmpptr,0x0,sizeof(U16));
//break;
goto out1;
}else{ //如果数据不为空,则存储数据,但是下一个偏移量等下次判断
memcpy(tmpptr,&(thisptr->mobpos[count]),sizeof(U16));
tmplen = (U8)strlen(thisptr->mobile[count])+1;//计算字符串长度
memcpy(dataptr+thisptr->mobpos[count]+sizeof(U16),thisptr->mobile[count],tmplen);
tmpptr =dataptr+thisptr->mobpos[count];
}
if(count == MAXMOBNUM - 1)//如果已经存储满了数据,则在最后一个数据的偏移值复制0
{
memset(dataptr+thisptr->mobpos[count],0x0,sizeof(U16));
}
}
out1:
tmpptr = dataptr + 2*sizeof(U16);
for(count=0;count<MAXTELNUM; count++)
{
if((*(thisptr->tel[count]))==0)
{
memset(tmpptr,0x0,sizeof(U16));
goto out2;
//break;
}else{ //如果数据不为空,则存储数据,但是下一个偏移量等下次判断
memcpy(tmpptr,&(thisptr->telpos[count]),sizeof(U16));
tmplen = (U8)strlen(thisptr->tel[count])+1;
memcpy(dataptr+thisptr->telpos[count]+sizeof(U16),thisptr->tel[count],tmplen);
tmpptr =dataptr+thisptr->telpos[count];
}
if(count == MAXTELNUM- 1)//如果已经存储满了数据,则在最后一个数据的偏移值复制0
{
memset(dataptr+thisptr->telpos[count],0x0,sizeof(U16));
}
}
out2:
tmprel = (U8)(thisptr->relation)+0x30;//转换成ASCII码
tmpptr = dataptr + 3*sizeof(U16);
memcpy( tmpptr, &(thisptr->relpos), sizeof(U16)); //下面开始存储数据块
tmpptr = dataptr + thisptr->relpos;
memcpy(tmpptr,&tmprel,1);
tmpptr = dataptr+4*sizeof(U16);
for(count=0;count<MAXBPNUM; count++)
{
if((*(thisptr->bp[count]))==0)
{
memset(tmpptr,0x0,sizeof(U16));
goto out3;
//break;
}else{ //如果数据不为空,则存储数据,但是下一个偏移量等下次判断
memcpy(tmpptr,&(thisptr->bppos[count]),sizeof(U16));
tmplen =(U8) strlen(thisptr->bp[count])+1;
memcpy(dataptr+thisptr->bppos[count]+sizeof(U16),thisptr->bp[count],tmplen);
tmpptr =dataptr+thisptr->bppos[count];
}
if(count == MAXBPNUM - 1)//如果已经存储满了数据,则在最后一个数据的偏移值复制0
{
memset(dataptr+thisptr->telpos[count],0x0,sizeof(U16));
}
}
out3:
if(mode==SAVE_INNEW)
{
id = LocalAddRecord(phbooklacb,dataptr,alllen);
} else
if(mode ==SAVE_INEDIT)
{
id = LocalModifyRecord( phbooklacb,thisptr->ID, dataptr, alllen);
}
Lfree(dataptr);//保存数据完毕,释放数据块
}
void GetRecordItemNum(PHONEBOOK *recordinf,P_U8 ctelptr,P_U8 cmobptr,P_U8 cbpptr)
{
U8 count;
U8 countctel,countcmob,countcbp;
for (count =0;count<(MAXTELNUM);count++)//modified on 0920 XXXXXX
{
if((*(recordinf->tel[count]))!= 0)//modified on 0920
{
countctel++;
}
}
*ctelptr = countctel;
for (count =0;count<(MAXMOBNUM);count++)
{
if((*(recordinf->mobile[count]))!= 0)//modified on 0920 因为是指向内存区域,但是不为空
{
countcmob++;
}
}
*cmobptr = countcmob;
for (count =0;count<(MAXBPNUM);count++)
{
if((*(recordinf->bp[count]))!= 0)
{
countcbp++;
}
}
*cbpptr = countcbp;
}
//比较暂时存储的数据与原始数据比较,如果不同,则表示
void CompareModAndSrc(PHONEBOOK *thisptr,P_S8 *recordinf,U8 ctel,U8 cmob,U8 cbp,P_U8 ismodfptr)
{
U8 count;
U8 compare;
U8 oldctel,oldcmob,oldcbp;
//如果项目的数目不一样,也是认为不同
GetRecordItemNum(thisptr,&oldctel,&oldcmob,&oldcbp);
if((oldctel !=ctel)||(oldcmob!=cmob)||(oldcbp!=cbp))
{
*ismodfptr = 1;
return ;
}
compare = strcmp(thisptr->name,recordinf[0]);
if(compare != 0)
{
*ismodfptr = 1;
return ;
}
if(thisptr->relation != *(recordinf[1]))
{
*ismodfptr = 1;
return ;
}
for(count=0;count<ctel;count++)
{
compare = strcmp(recordinf[2+count],thisptr->tel[count]);
if(compare != 0)
{
*ismodfptr = 1;
return ;
}
}
for(count=0;count<cmob;count++)
{
compare = strcmp(recordinf[2+count+ctel],thisptr->mobile[count]);
if(compare != 0)
{
*ismodfptr = 1;
return ;
}
}
for(count=0;count<cbp;count++)
{
compare = strcmp(recordinf[2+count+ctel+cmob],thisptr->bp[count]);
if(compare != 0)
{
*ismodfptr = 1;
return ;
}
}
*ismodfptr = 0;
}
//必须确定ctel和cmob和cbp是正确的,因为是有许多地方会修改
STATUS SaveModfToSrc(PHONEBOOK *thisptr,P_S8 * recordinf,U8 ctel,U8 cmob,U8 cbp)
{
U8 count;
if((recordinf[0])==NULL)
{
return ASIX_ERROR;
}else{
//thisptr->name = recordinf[0];
strcpy(thisptr->name,recordinf[0]);
}
thisptr->relation = *(recordinf[1]);//因为由于是格式需要,关系也是呈指针的形式
if(ctel >MAXTELNUM) return ASIX_ERROR;//首先是参数判断
if(cmob>MAXMOBNUM) return ASIX_ERROR;
if(cbp>MAXBPNUM) return ASIX_ERROR;
for (count =0;count<(ctel);count++)
{
if((void*)(*(recordinf[2+count])) != NULL)
strcpy(thisptr->tel[count],recordinf[2+count]);
// thisptr->tel[count] = recordinf[2+count];
}
for(count=ctel;count<MAXTELNUM;count++)//对剩下的数据赋零操作
{
memset(thisptr->telbuf[count],0x0,MAXTELLEN);
}
for (count =0;count<(cmob);count++)
{
if(((void*)(*recordinf[2+ctel+count])) != NULL)
strcpy(thisptr->mobile[count],recordinf[2+count+ctel]);
}
for(count=cmob;count<MAXMOBNUM;count++)//对剩下的数据赋零操作
{
memset(thisptr->mobbuf[count],0x0,MAXMOBLEN);
}
for (count =0;count<(cbp);count++)
{
if((void*)(*recordinf[2+count+ctel+cmob])!= NULL)
strcpy(thisptr->bp[count],recordinf[2+count+ctel+cmob]);
}
for(count=cbp;count<MAXBPNUM;count++)//对剩下的数据赋零操作
{
memset(thisptr->bpbuf[count],0x0,MAXBPLEN);
}
return ASIX_OK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -