⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 phdatabs.c

📁 基于东南大学开发的SEP3203的ARM7中的所有驱动
💻 C
📖 第 1 页 / 共 2 页
字号:
}
*/


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