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

📄 filesys20.c

📁 一个线性定地址的文件系统
💻 C
📖 第 1 页 / 共 5 页
字号:
							{
								return(ERR_IS_ERR_RCD);
							}
						}
						if (rfP->FileType == NORMAL_TYPE)//不循环时范围
						{
							if ((Index<fhP->RecordBgNo) || (Index>fhP->RecordEndNo))
							{
								return(ERR_INDEX);
							}
						}
						else//循环时范围
						{
							if (fhP->ValidRecordSum < rfP->MaxRecordSum)// 第一轮时
							{
								if ((Index<fhP->RecordBgNo) || (Index>fhP->RecordEndNo))
								{
									return(ERR_INDEX);
								}
							}
						}
						fhP->CurRecordNo=Index;//将Index写入当前读记录号
					}
					break;

		case SET_FIRST://指针指向第一条记录
					{
						fhP->CurRecordNo=fhP->RecordBgNo;
					}
					break;

		case SET_LAST://指针指向最后一条记录
					{
						fhP->CurRecordNo=fhP->RecordEndNo;
					}
					break;

		case SET_NEXT://指针指向下一条记录
					{
						if (fhP->CurRecordNo == fhP->RecordEndNo)//已经是最后一条记录了
						{
                			return(ERR_EOF);
                		}
                		else
                		{
                			if ((rfP->FileType==NORMAL_TYPE) || (rfP->FileType == FIFO_TYPE))
                			{
                				fhP->CurRecordNo=fhP->CurRecordNo+1;//当前读记录加一
                			}
                			else if (rfP->FileType == CYCLE_TYPE)
                			{
                				if ((rfP->ErrRecordMemType!=0) && (erP->Sum!=0))//有错误记录区时
                				{
									unsigned char i;
									for(i=0; i<erP->Sum; i++)
									{
 										if (fhP->CurRecordNo != rfP->MaxRecordSum-1)
										{
											fhP->CurRecordNo=fhP->CurRecordNo+1;
										}
										else
										{
											fhP->CurRecordNo=0;
										}
										if (Is_ErrRecordNo(fhP->CurRecordNo, erP) == HH_OK)
										{
											break;
										}
										if (fhP->CurRecordNo == fhP->RecordEndNo)
										{
											return(ERR_EOF);
										}
									}
                				}
                				else		//normal cycle
                				{
  									if (fhP->CurRecordNo != rfP->MaxRecordSum-1)
									{
										fhP->CurRecordNo=fhP->CurRecordNo+1;
									}
									else
									{
										fhP->CurRecordNo=0;
									}
                				}
                			}
                		}
                	}
					break;

		case DELETE_RECORD://删除初始记录
					if (rfP->FileType == FIFO_TYPE)
					{
						if (fhP->ValidRecordSum == 0)//无记录
						{
							return(ERR_LEN_SUM);
						}
						if(fhP->RecordBgNo == rfP->MaxRecordSum-1)
						{
							fhP->RecordBgNo=0;
						}
			          	else
		          		{
		          			fhP->RecordBgNo=fhP->RecordBgNo+1;
		          		}
		          		fhP->ValidRecordSum=fhP->ValidRecordSum-1;
					}
					break;

		case WRITE_NEXT://写下一条记录
					{
						if (fhP->ValidRecordSum == 0)//首条记录添加操作
                		{
 							if ((rfP->FileType==NORMAL_TYPE) || (rfP->FileType == FIFO_TYPE))
            				{  //不循环和先进先出时记录总数是rfP->MaxRecordSum。
                				fhP->ValidRecordSum=1;
                				fhP->RecordBgNo=0;//记录开始序号0
                				fhP->RecordEndNo=0;
                				fhP->CurRecordNo=0;
                			}
                			else if (rfP->FileType == CYCLE_TYPE)
             				{  // 循环时第一轮记录总数是rfP->MaxRecordSum-1;之后才填充为rfP->MaxRecordSum
                				fhP->ValidRecordSum=1;
                				fhP->RecordBgNo=1;//记录开始序号1
                				fhP->RecordEndNo=1;
                				fhP->CurRecordNo=1;
                			}
                		}
               			else
                		{
            				if (fhP->ValidRecordSum == rfP->MaxRecordSum)//实际总数超过最大存储记录数
            				{
            					if ((rfP->FileType==NORMAL_TYPE) || (rfP->FileType == FIFO_TYPE))
            					{	//不循环和先进先出时,记录总数不能大于最大存储记录数
            						return(ERR_LEN_SUM);
            					}
		          				else if (rfP->FileType == CYCLE_TYPE)
		          				{	//在循环读写时
									unsigned char i;
									if ((rfP->ErrRecordMemType!=0) && (erP->Sum!=0))//有错误记录区时
									{
										for(i=0; i<erP->Sum; i++)
										{
											if (fhP->RecordBgNo != rfP->MaxRecordSum-1)
											{
												fhP->RecordBgNo=fhP->RecordBgNo+1;
											}
											else
											{//在最后一条加记录记录起始序号归0
												fhP->RecordBgNo=0;
											}
											if (Is_ErrRecordNo(fhP->RecordBgNo, erP) == HH_OK)
											{
												break;
											}
										}
									}
									else
									{
										if (fhP->RecordBgNo != rfP->MaxRecordSum-1)
										{
											fhP->RecordBgNo=fhP->RecordBgNo+1;
										}
										else
										{//在最后一条加记录记录起始序号归0
											fhP->RecordBgNo=0;
										}
									}
		          				}
		        			}

		        			{
		        				unsigned char i;
		        				if ((rfP->ErrRecordMemType!=0) && (erP->Sum!=0))//有错误记录区时
		        				{
        							for(i=0; i<erP->Sum; i++)
		        					{
		        						if (fhP->RecordEndNo == rfP->MaxRecordSum-1)//在最后一条加记录序号归0
		        						{
                							fhP->RecordEndNo=0;				//在循环读写和先进先出时有效
                						}
                						else
                						{
                							fhP->RecordEndNo=fhP->RecordEndNo+1;//记录终止序号加一
                						}
                						if (Is_ErrRecordNo(fhP->RecordEndNo, erP) == HH_OK)
										{
											break;
										}
									}
                				}
                				else
                				{
		        					if (fhP->RecordEndNo == rfP->MaxRecordSum-1)//在最后一条加记录序号归0
		        					{
                						fhP->RecordEndNo=0;				//在循环读写和先进先出时有效
                					}
                					else
                					{
                						fhP->RecordEndNo=fhP->RecordEndNo+1;//记录终止序号加一
                					}
								}
                			}

                			if (fhP->ValidRecordSum < rfP->MaxRecordSum)
                			{
            					fhP->ValidRecordSum=fhP->ValidRecordSum+1;//有效记录总数加一
            				}
            				fhP->CurRecordNo=fhP->RecordEndNo;
            			}
            		}
					break;

		default:
					return(ERR_OPER_TYPE);//返回错误的操作类型
					break;
	}

#if	(DEBUG_FILESYS==1)
PrintStr("\n Sum=");PrintByte(fhP->ValidRecordSum);
PrintStr("\n Bg=");PrintByte(fhP->RecordBgNo);
PrintStr("\n End=");PrintByte(fhP->RecordEndNo);
PrintStr("\n Cur=");PrintByte(fhP->CurRecordNo);
#endif
#if	(DEBUG_FILEHEAD==1)
	PrintStr("\n Oper_FileHead End!\n ");
#endif

	return(HH_OK);
}

/*
****************************************************************************************
函数名称:Read_Record
入口参数:*rfP:记录文件指针,*fhP:文件头指针,*Ptr:指向读取的记录文件数据的指针
返回  值:
功能描述:读取记录文件(内部使用)
算法描述:
建立时间:2003/12/24
作    者:
当前版本:V2.0
-----------------------------------
修改时间:2004/11/26
V2.0版修改说明:
增加InsideRead()/InsideWrite()作为中间读写层,使读写结构融合为一种,使程序容易维护,
在InsideWrite()中对写入的结果读出后比较,确保写入数据正确
****************************************************************************************
*/

unsigned char Read_Record(_RecordFile *rfP,_FileHead *fhP,unsigned char *Ptr)
{

	unsigned char ErrType;
	xdata unsigned char tmpData[MAX_RECORD_LEN+1];
	_BinaryFile nowFile;
#if	(DEBUG_RCDFILE==1)
	PrintStr("\n Rd_Rcd Begin!\n ");
#endif	
    nowFile.BakFlag   = rfP->BakFlag;
    nowFile.MemType   = rfP->BodyMemType;
    nowFile.FirstAddr = rfP->BodyFirstAddr+(unsigned long)(fhP->CurRecordNo)*(rfP->MaxRecordLen+1);
    nowFile.MaxLen    = rfP->MaxRecordLen; 
    
    ErrType = InsideRead(&nowFile,tmpData,XOR_CHECK);  
    memcpy(Ptr, tmpData, rfP->MaxRecordLen);
#if	(DEBUG_RCDFILE==1)
	PrintStr("\n Rd_Rcd End!\n ");
#endif	
	return(ErrType);
}

/*
****************************************************************************************
函数名称:Write_Record
入口参数:*rfP:记录文件指针,*fhP:文件头指针,*Ptr:指向要写入的记录文件数据的指针
返回  值:
功能描述:写记录文件(内部使用)
算法描述:
建立时间:2003/12/24
作    者:
当前版本:V2.0
-----------------------------------
修改时间:2004/11/26
V2.0版修改说明:
增加InsideRead()/InsideWrite()作为中间读写层,使读写结构融合为一种,使程序容易维护,
在InsideWrite()中对写入的结果读出后比较,确保写入数据正确
****************************************************************************************
*/

unsigned char Write_Record(_RecordFile *rfP,_FileHead *fhP,unsigned char *Ptr)
{

	unsigned char ErrType;
	xdata unsigned char tmpData[MAX_RECORD_LEN+1];
	_BinaryFile nowFile;
#if	(DEBUG_RCDFILE==1)
	PrintStr("\n Wr_Rcd Begin!\n ");
#endif	
    nowFile.BakFlag   = rfP->BakFlag;
    nowFile.MemType   = rfP->BodyMemType;
    nowFile.FirstAddr = rfP->BodyFirstAddr+(unsigned long)(fhP->CurRecordNo)*(rfP->MaxRecordLen+1);
    nowFile.MaxLen    = rfP->MaxRecordLen; 
    
    memcpy(tmpData, Ptr, rfP->MaxRecordLen); 
    ErrType = InsideWrite(&nowFile,tmpData,XOR_CHECK);  
#if	(DEBUG_RCDFILE==1)
	PrintStr("\n Wr_Rcd End!\n ");
#endif    	
	return(ErrType);
}

/*
****************************************************************************************
函数名称:Oper_Record
入口参数:FileID:文件标识符,Index:记录文件序号,
		  *Ptr:指向记录文件数据,OperType:操作类型
返回  值:
功能描述:操作记录文件(内部使用)
算法描述:
建立时间:2003/12/24
作    者:
当前版本:V1.0
****************************************************************************************
*/

unsigned char Oper_Record(unsigned char FileID,unsigned int Index,unsigned char *Ptr,unsigned char OperType)
{

	unsigned char ErrType;
	unsigned char ErrType2;
	xdata unsigned char tmpHeadData[FILE_HEAD_MAX_LEN+1];
	xdata unsigned char tmpErrData[ERR_RECORD_MAX_LEN+1];
	_RecordFile *rfP;
	_FileHead *fhP;
	_ErrRecord *erP;

	if ((OperType==CHECK_RECORD)||(OperType==COUNT_RECORD)||(OperType==START_INIT))
	{
		return(ERR_OPER_TYPE);
	}

	if (FileID > RECORD_FILE_SUM-1)return(ERR_ID);
	rfP = &RecordFile[FileID];

	ErrType=Read_FileHead(rfP,tmpHeadData);				//读文件头
	if (ErrType != HH_OK)
	{
		return(ErrType);
	}
	fhP=(_FileHead *)tmpHeadData;

	if (rfP->ErrRecordMemType != 0)						//有错误记录的才读
	{
		ErrType=Read_ErrRecord(rfP,tmpErrData);			//读错误记录文件区
		if (ErrType != HH_OK)
		{
			return(ErrType);
		}
		erP=(_ErrRecord *)tmpErrData;
	}
	else
	{
		erP=NULL;
	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -