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

📄 mem-ffs.c

📁 mmc_sd_memory_card_driver_sample_project_files.zip spi接口的sd card driver 示例
💻 C
📖 第 1 页 / 共 5 页
字号:

	## (################# == #)
	{
		//-------------------------------------------------
		//----- OFFSET IS ZERO - SET TO START OF FILE -----
		//-------------------------------------------------
		#############>############### = ######################(############);
		#############>############## = #;
		#############>############ = #;
		#############>######################## = #;

	}
	####
	{
		//----- NON-ZERO VALUE -----

		//--------------------------------------------------------------------------------------------------------------------------------------------
		//----- IF NEW LOCATION IS WITHIN CURRENT CLUSTER THEN DO ADJUSTMENT AVOIDING HAVING TO READ EVERY FAT CLUSTER ENTRY FROM THE FILE START -----
		//--------------------------------------------------------------------------------------------------------------------------------------------

		## (################# == #############>########################)
		{
			//----- NEW POSITION IS SAME AS EXISTING POSITION -----
			################## = #;
		}
		#### ## (################# < #############>########################)
		{
			//----- NEW POSITION IS BEFORE CURRENT POSITION -----
			## (
				(#############>######################## # #################) <
				(#############>############ + (#############>############## * ####################))
				)
			{
				//IN SAME CLUSTER

				################## = #;
				//file_pointer->current_cluster = file_pointer->current_cluster;			//Stays the same
				
				####### = #################;
				################# = (#############>######################## # #################);
				#############>######################## = #######;

				##### (################# >= ####################)
				{
					################# #= ####################;
					## (#############>##############)
						#############>################;
					####
						################## = #;				//Error!
				}


				#############>############ #= (####)#################;
				## (#############>############ >= ####################)		//Check for overflow into previous sector
				{
					#############>############ += ####################;		//(Yes the '+' is correct!)
					## (#############>##############)
						#############>################;
					####
						################## = #;				//Error!
				}
			}
			####
			{
				//IN DIFFERENT CLUSTER
				################## = #;
			}
		}
		####
		{
			//----- NEW POSITION IS AFTER CURRENT POSITION -----
			## (
				(################# # #############>########################) <
				(################# # (#############>############ + (#############>############## * ####################)))
				)
			{
				//IN SAME CLUSTER

				################## = #;
				//file_pointer->current_cluster = file_pointer->current_cluster;			//Stays the same

				####### = #################;
				################# = (################# # #############>########################);
				#############>######################## = #######;

				##### (################# >= ####################)
				{
					################# #= ####################;
					## (#############>############## < ###################)
						#############>##############++;
					####
						################## = #;				//Error!
				}

				#############>############ += (####)#################;
				## (#############>############ >= ####################)
				{
					#############>############ #= ####################;
					## (#############>############## < ###################)
						#############>##############++;
					####
						################## = #;				//Error!
				}
			}
			####
			{
				//IN DIFFERENT CLUSTER
				################## = #;
			}
		}
		


		## (##################)
		{
			//-------------------------------------------------------------------------------------------
			//----- NEW LOCATION IS NOT IN THE CURRENT CLUSTER - FIND IT FROM THE START OF THE FILE -----
			//-------------------------------------------------------------------------------------------
			#############>############### = ######################(############);
			#############>############## = #;
			#############>######################## = #################;
	
			//KEEP MOVING TO NEXT CLUSTER UNTIL WE'RE IN THE REQURIED CLUSTER
			##### (################# >= #################)
			{
				################# #= #################;
				#############>############### = #######################(#############>###############);
			}
			//KEEP MOVING TO NEXT SECTOR UNTIL WE'RE IN THE REQURIED SECTOR (OF THE ALREADY FOUND CLUSTER)
	
			##### (################# >= ####################)
			{
				################# #= ####################;
				#############>##############++;
			}
			//STORE THE CURRENT BYTE NUMBER
			#############>############ = (####)#################;
		}
	}

	#############>#####.####.########### = #;			//The EOF flag is cleared when this function sucessfully is called
	######(#);


}



//************************************************
//************************************************
//********** MOVE THE FILE BYTE POINTER **********
//************************************************
//************************************************
//(The value returned by ffs_getpos intended to be file system specific and to be used with this function.  However as the position type is recomended
//to be a long we just use the ffs_ftell function as a long doesn't give us enough space to store everything we need for the low level position)
//Returns
//	0 if successful, 1 otherwise
int ffs_fsetpos (FFS_FILE *file_pointer, long *position)
{
	//----- EXIT IF THIS FILE ISN'T ACTUALLY OPEN -----
	## (#############>#####.####.############ == #)
		######(#);

	#############>#####.####.########### = #;			//Clear the end of file flag

	######(#########(############, *########, ############));
}



//******************************************************
//******************************************************
//********** GET THE CURRENT POSITION IN FILE **********
//******************************************************
//******************************************************
//Get the current file position.
long ffs_ftell (FFS_FILE *file_pointer)
{

	//----- EXIT IF THIS FILE ISN'T ACTUALLY OPEN -----
	## (#############>#####.####.############ == #)
		######(#);

	//----- RETURN THE CURRENT POSITION -----
	## (#############>#####.####.#######################)
		######((####)#############>######################## + #);
	####
		######((####)#############>########################);
}



//******************************************************
//******************************************************
//********** GET THE CURRENT POSITION IN FILE **********
//******************************************************
//******************************************************
//(The value returned is intended to be file system specific and only to be used with fsetpos.  However as the position type is recomended
//to be a long we just use the ffs_ftell function as a long doesn't give us enough space to store everything we need for the low level position)
//Returns
//	0 if successful, 1 otherwise
int ffs_fgetpos (FFS_FILE *file_pointer, long *position)
{


	//----- EXIT IF THIS FILE ISN'T ACTUALLY OPEN -----
	## (#############>#####.####.############ == #)
		######(#);

	//----- RETURN THE CURRENT POSITION -----
	*######## = #########(############);
	######(#);

}




//***********************************************************************
//***********************************************************************
//********** SET POSITION TO BEGINNING OF FILE AND CLEAR FLAGS **********
//***********************************************************************
//***********************************************************************
void ffs_rewind (FFS_FILE *file_pointer)
{

	######### (############, #, ############);

	#############>#####.####.############ = #;
}





//****************************************
//****************************************
//********** WRITE BYTE TO FILE **********
//****************************************
//****************************************
//Data is converted to a byte before writing (int type is specified by ANSI-C)
//If there are no errors the written character is returned. If an error occurs, EOF is returned.

//#define	ffs_putc(data, file_pointer)	ffs_fputc(data, file_pointer)			//Defined in header file - these 2 functions are equivalent

int ffs_fputc (int data, FFS_FILE *file_pointer)
{
	##### #######;
	#### *##############;

	//-------------------------------------------------
	//----- EXIT IF THIS FILE ISN'T ACTUALLY OPEN -----
	//-------------------------------------------------
	## (#############>#####.####.############ == #)
		######(#######);


	//---------------------------------------------------------------------------------------------------------------------------
	//----- CHECK THAT WRITING IN THIS POSITION IS PERMITTED FOR THE FOPEN MODE THAT WAS SPECIFIED WHEN THE FILE WAS OPENED -----
	//---------------------------------------------------------------------------------------------------------------------------
	## (#############>#####.####.############### == #)
	{
		//----- WRITING IS NOT PERMITTED -----
		#############>#####.####.############ = #;
		######(#######);
	}
	## (#############>#####.####.#################)
	{
		//----- APPEND MODE - WRITING MAY ONLY OCCUR AS NEW BYTES AT THE END OF THE FILE -----
		####### = #############>########################;
		## (#############>#####.####.#######################)
		{
			#######++;
		}

		## (####### < #############>#########)
		{
			//CURRENTLY POINTING TO WITHIN FILE - SET TO END OF FILE
			#########(############, #, ############);
		}
	}


	//-----------------------------------------------------------------------
	//----- CHECK FOR NEED TO MOVE TO NEXT BYTE POSITION BEFORE WRITING -----
	//-----------------------------------------------------------------------
	## (#############>#####.####.#######################)
	{
		//----- INCREMENT BYTE COUNT -----
		#############>########################++;

		#############>############++;
		
		## (#############>############ >= ####################)
		{
			//----- MOVE TO NEXT SECTOR -----
			#############>############ = #;

			#############>##############++;

			## (#############>############## >= ###################)
			{
				//----- MOVE TO NEXT CLUSTER -----
				#############>############## = #;

				####### = #########################();
				## (####### == ##########)			//0xffffffff = no empty cluster found
				{
					//NOT ENOUGH SPACE FOR ANY MORE OF FILE
					###### = #;
					#############>#####.####.########### = #;
					######(#######);
				}

				//UPDATE THE CURRENT CLUSTER TO LINK TO THE NEXT CLUSTER
				############################### (#############>###############, #######);

				//UPDATE THE NEXT CLUSTER WITH THE END OF FILE MARKER
				############################### (#######, ##########);

				#############>############### = #######;
			}
		}

		#############>#####.####.####################### = #;
	}

	
	//-------------------------------------------------------------
	//----- CHECK FOR NEED TO LOAD CURRENT SECTOR INTO BUFFER -----
	//-------------------------------------------------------------
	####### = (
				((#############>############### # #) * ###################) +
				(#####)#############>############## +
				######################
				);
	## (####################### != #######)
	{
		#########################(#######);
	}


	//--------------------------
	//----- WRITE THE BYTE -----
	//--------------------------
	############## = &##############################[#] + #############>############;
	*############## = (####)(#### & ######);


	//---------------------------------------------------------------------------
	//----- ADJUST FILE SIZE IF WE HAVE JUST WRITTEN TO THE END OF THE FILE -----
	//---------------------------------------------------------------------------
	## (#############>######################## >= #############>#########)
	{
		#############>#########++;
		#############>#####.####.##################### = #;
	}


	//------------------------------------------------------------------------
	//----- FLAG THAT WE NEED TO MOVE ON 1 BYTE NEXT TIME ACCESS IS MADE -----
	//------------------------------------------------------------------------
	//(we do this instead of incrementing now in case we have just done the last byte of the file)
	#############>#####.####.####################### = #;

	//----------------------------------------------------------
	//----- FLAG THAT THE BUFFER NEEDS WRITING TO THE CARD -----
	//----------------------------------------------------------
	################################ = #;

	//-----------------------------------------------
	//----- EXIT WITH THE BYTE THAT WAS WRITTEN -----
	//-----------------------------------------------
	######(####);
}




//**********************************************
//**********************************************
//********** READ NEXT BYTE FROM FILE **********
//**********************************************
//**********************************************
//The byte read is returned as an int value (int type is specified by ANSI-C)
//If the End Of File has been reached or there has been an error reading, the function returns EOF.

//#define ffs_getc(file_pointer)		ffs_fgetc(file_pointer)			//Defined in header file - these 2 functions are equivalent

int ffs_fgetc (FFS_FILE *file_pointer)
{
	#### ####;
	##### #######;
	#### *##############;

	//-------------------------------------------------
	//----- EXIT IF THIS FILE ISN'T ACTUALLY OPEN -----
	//-------------------------------------------------
	## (#############>#####.####.############ == #)
		######(#######);

	//---------------------------------------------------------------------------------------------------------------------------
	//----- CHECK THAT READING IN THIS POSITION IS PERMITTED FOR THE FOPEN MODE THAT WAS SPECIFIED WHEN THE FILE WAS OPENED -----

⌨️ 快捷键说明

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