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

📄 fat.c

📁 针对以arm处理器为核心的嵌入式平台的fat文件系统
💻 C
📖 第 1 页 / 共 5 页
字号:
/*************************************Seekfor FAT System v1.2**************************************************************************
                  *********************       *********************************                  *********************         v1.2              
              *******        **********           *******              ********              *******       ***********                       
           *******              *******           *******                  *******       ********              *******                       
           *******                                *******           *******              ********                                            
           *******                                *******           *******              ********                                            
           *******                                *******           *******              ********                                            
              ***********                         *************************                  ***********                                     
                     ***********                  *******           *******                         ***********                              
                             *******              *******           *******                                *******                           
                                *******           *******                                                      *******                       
           *******              *******           *******                                ********              *******                       
           *******              *******           *******                                ********              *******                       
           *******              *******           *******                                ********              *******                       
           **********        *******              *******                                ***********       *******                           
           *********************              ***************                            **********************     
Seekfor FAT system v1.2是移植性非常强的一个嵌入式FAT16/FAT32文件系统软件包,支持多个物理驱动器,完全兼容DOS下的文件系统,支持多任务下的文件操作.
<1>和SFS v1.0比较,SFS v1.2增加以下特性:
	1.增强了错误处理功能
	2.增加了FAT_format()功能
	3.开始支持扩展分区
	4.开始支持长文件的显示(暂不支持用长文件名访问文件),Windows下建立的长文件名可以正常显示
	5.取消v1.0中的物理驱动器概念,所有驱动器都看做逻辑驱动器
	5.修正v1.0中扇区计算不对不兼容Windows的bug
	6.修正FAT32根目录起始位置固定的bug
<2>更新软件请联系:
	QQ:82054357
	MSN:sfrad32@hotmail.com
	Mail:Seek_for@163.com
<3>本文件说明
	a.文件名:fat.c
	b.功能:FAT系统API,用户一般不要随意更改这里的代码
**************************************************************************************************************************************/
#ifndef __FAT_C__
#define __FAT_C__
#include "..\\include\\fat.h"

#define PARSE_FOPEN		0
#define PARSE_CHDIR		1
#define PARSE_MKDIR		2
#define PARSE_RMDIR		3

/*获取目录信息宏*/
#define DIR_ATTR(dir)					(dir[11])
#define DIR_FIRSTCLUSTER(dir)			((dir[26])|(DWORD)dir[27]<<8)|((DWORD)dir[20]<<16)|((DWORD)dir[21]<<24)
#define DIR_FILELENGTH(dir)				((dir[28])|((DWORD)dir[29]<<8)|((DWORD)dir[30]<<16)|((DWORD)dir[31]<<24))
#define GETDWORD(info) (info+=4,((DWORD)(*(info-4)))|(((DWORD)(*(info-3))<<8))|(((DWORD)(*(info-2))<<16))|(((DWORD)(*(info-1))<<24)))
#define GETWORD(info) (info+=2,((WORD)(*(info-2)))|(((WORD)(*(info-1))<<8)))

#define SETDWORD(ptr,val)\
{\
	*ptr++=(BYTE)val;\
	*ptr++=(BYTE)(val>>8);\
	*ptr++=(BYTE)(val>>16);\
	*ptr++=(BYTE)(val>>24);\
}\

#define SETWORD(ptr,val)\
{\
	*ptr++=(BYTE)val;\
	*ptr++=(BYTE)(val>>8);\
}\

/*全局结构指针*/
DRIVER_INFO*drivers[MAX_DRIVERS_NUMBER];
DRIVER_INFO*thisDriver=(DRIVER_INFO*)0;
#if(SUPPORT_LONG_NAME==1)
static BYTE lpszLongName[256];
#endif
static BOOL get_fat_entry(DRIVER_INFO*driver,DWORD dwCluster,DWORD *dwSector,DWORD *dwOffset);
static BOOL get_free_fat_entry(DRIVER_INFO*driver,DWORD*dwSector,DWORD*dwOffset);
static BOOL update_fat_entry(DRIVER_INFO*driver,DWORD dwCurrentCluster,DWORD dwNextCluster);
static BOOL erase_cluster(DRIVER_INFO*driver,DWORD dwCluster,DWORD dwParent);


/**static void* SYS_memset(void*ptr,BYTE val,DWORD size)*************
功能:
	缓冲区设置初值
入口:
	void*ptr:缓冲区指针
	BYTE val:要设置的值
	DWORD size:缓冲区大小
出口:
	返回缓冲区指针
调用者:
	内部任意
备注:
******************************************************************/
static void* SYS_memset(void*ptr,BYTE val,DWORD size)
{
	BYTE*buff=(BYTE*)ptr;
	if(!ptr) return (BYTE*)0;
	while(size--) *buff++=val;
	return ptr;
}

/**static char* SYS_strcpy(char*dest,char*source)*********************
功能:
	字串拷贝
入口:
	char*dest:目标指针
	char*source:源指针
出口:
	返回缓冲区指针
调用者:
	内部任意
备注:
******************************************************************/
static char*SYS_strcpy(BYTE*dest,BYTE*source)
{
	BYTE*ptr=dest;
	if(!dest||!source) return (BYTE*)0;
	while(*source) *ptr++=*source++;
	*ptr=0;
	return dest;
}


/**static int SYS_strlen(char*dest)************************************
功能:
	计算字串长度
入口:
	char*dest:目标指针
出口:
	返回长度
调用者:
	内部任意
备注:
******************************************************************/
static int SYS_strlen(BYTE*dest)
{
	int i=0;
	if(!dest) return 0;
	while(*dest++) i++;
	return i;
}

/**static char* SYS_strcat(char*dest,char*source)*********************
功能:
	字串尾部添加拷贝
入口:
	char*dest:目标指针
	char*source:源指针
出口:
	返回缓冲区指针
调用者:
	内部任意
备注:
******************************************************************/
static char *SYS_strcat(BYTE*dest,BYTE*source)
{
	DWORD i;
	BYTE* ptr;
	if(!dest||!source) return (BYTE*)0;
	i=SYS_strlen(dest);
	ptr=(BYTE*)&dest[i];
	while(*source) *ptr++=*source++;
	*ptr=0;
	return dest;
}

/**static BYTE SYS_strcmp(char*dest,char*source)*********************
功能:
	字串比较
入口:
	char*dest:目标指针
	char*source:源指针
出口:
	如果两串完全相同,则返回0
	否则返回第一个不匹配字符的差
调用者:
	内部任意
备注:
******************************************************************/
static BYTE SYS_strcmp(BYTE*dst,BYTE*src)
{
	if(!dst||!src) return 0;
	if(SYS_strlen(dst)!=SYS_strlen(src)) return 1;
	while(*dst)
	{
		if(*dst!=*src) return *dst-*src; 
		dst++;
		src++;
	}
	return 0;
}


/**static BOOL is_upper(char c)**************
功能:
	检测是否大写字母
入口:
	char c:字符
出口:
	如果是大写字母,返回1,否则返回0
调用者:
	任意
备注:
*********************************************/
static BOOL is_upper(char c)
{
	return c>='A'&&c<='Z';
}

/**static BOOL is_lower(char c)**************
功能:
	检测是否小写字母
入口:
	char c:字符
出口:
	如果是小写字母,返回1,否则返回0
调用者:
	任意
备注:
*********************************************/
static BOOL is_lower(char c)
{
	return c>='a'&&c<='z';
}

/**static BYTE to_upper(BYTE chars)************************************
功能:
	小写字母转成大小字母
入口:
	BYTE  chars:要转换的字符
出口:
	返回转换后的字符
调用者:
	内部任意
备注:
*********************************************************************/
static BYTE to_upper(BYTE chars)
{
	if(chars>='a'&&chars<='z') return chars-0x20;
	return chars;
}


/**static BYTE to_lower(BYTE chars)************************************
功能:
	大写字母转成小写字母
入口:
	BYTE  chars:要转换的字符
出口:
	返回转换后的字符
调用者:
	内部任意
备注:
*********************************************************************/
static BYTE to_lower(BYTE chars)
{
	if(chars>='A'&&chars<='Z') return chars+0x20;
	return chars;
}


#if (SUPPORT_LONG_NAME==1)
DWORD get_long_name_len(BYTE*dir)
{
	BYTE i;
	BYTE len=0;
	WORD item;
	dir++;
	for(i=0;i<10;i+=2)
	{
		item=GETWORD(dir);
		if(item==0xffff||item==0x0000)
		{
			len+=2;
			return len;
		}
		else
		{
			len+=2;
		}
	}
	dir+=3;
	for(i=0;i<12;i+=2)
	{
		item=GETWORD(dir);
		if(item==0xffff||item==0x0000)
		{
			len+=2;
			return len;
		}
		else
		{
			len+=2;
		}
	}
	dir+=2;
	for(i=0;i<4;i+=2)
	{
		item=GETWORD(dir);
		if(item==0xffff||item==0x0000)
		{
			len+=2;
			return len;
		}
		else
		{
			len+=2;
		}
	}
	return len;
}
/**static DWORD extract_long_name(BYTE*buff,BYTE*dir)*********
功能:
	获取长文件名
入口:
	BYTE*buff:缓冲区指针
	BYTE*dir:目录项
出口:
	返回本项的名称长度
调用者:
	内部任意
备注:
*************************************************************/
static DWORD extract_long_name(BYTE*buff,BYTE*dir)
{
	BYTE i;
	BYTE len=0;
	WORD item;
	dir++;
	for(i=1;i<11;i+=2)
	{
		item=GETWORD(dir);
		if(item==0xffff||item==0x0000)
		{
			*buff++=0;
			*buff++=0;
			return len;
		}
		else
		{
			*buff++=item&0xff;
			*buff++=item>>8;
			len+=2;
		}
	}
	dir+=3;
	for(i=1;i<13;i+=2)
	{
		item=GETWORD(dir);
		if(item==0xffff||item==0x0000)
		{
			*buff++=0;
			*buff++=0;
			return len;
		}
		else
		{
			*buff++=(BYTE)(item&0xff);
			*buff++=(BYTE)(item>>8);
			len+=2;
		}
	}
	dir+=2;
	for(i=1;i<5;i+=2)
	{
		item=GETWORD(dir);
		if(item==0xffff||item==0x0000)
		{
			*buff++=0;
			*buff++=0;
			return len;
		}
		else
		{
			*buff++=(BYTE)(item&0xff);
			*buff++=(BYTE)(item>>8);
			len+=2;
		}
	}
	return len;
}
#endif

/**static BYTE get_free_name()*********************
功能:
	获取未占用的磁盘名
入口:
出口:
	返回对应的磁盘名
调用者:
	FAT_install()
备注:
****************************************************/
static BYTE get_free_name()
{
	BYTE i;
	for(i=0;i<MAX_DRIVERS_NUMBER;i++)
	{
		if(!drivers[i]) return i+START_DRIVER_LABLE;
	}
	return START_DRIVER_LABLE;
}


/**static BOOL macro_match(BYTE*name,BYTE*macro1,BYTE*macro2)*************
功能:
	检测FAT文件名和通配符是否匹配
入口:
	BYTE*name:FAT表中的文件名
	BYTE*macro1:主文件名的通配符
	BYTE*macro2:扩展名的通配符
出口:
	如果匹配返回1,否则返回0
调用者:
	内部任意
备注:
*****************************************************************/
#define EQU(a,b) ((a==b)||(a+0x20==b)||(b+0x20==a))
static BOOL macro_match(BYTE*name,BYTE*macro1,BYTE*macro2)
{
	BYTE i,next;
	BYTE *src,*mac;
	src=name;
	mac=macro1;
	for(i=0;i<8;i++)
	{
		if(*mac=='*')
		{
			next=*(mac+1);
			switch(next)
			{
			case 0:
			case 0x20:
				src+=8-i;
				i=9;
				continue;
			default:
				for(;i<8;i++)
				{
					if(EQU(*src,next))
					{
						mac+=2;
						src++;
						next=0;
						break;
					}
					src++;
				}
				if(next)
				{
					return 0;	
				}
				continue;
			}
		}
		else if(*mac=='?')
		{
			if(*src==0x20) return 0;
		}
		else
		{
			if(!EQU(*src,*mac)) return 0;
		}
		src++;
		mac++;
	}

	
	mac=macro2;
	for(i=0;i<3;i++)
	{
		if(*mac=='*')
		{
			next=*(mac+1);
			switch(next)
			{
			case 0:
			case 0x20:
				i=3;
				continue;
			default:
				for(;i<3;i++)
				{
					if(*src==next)
					{
						mac+=2;
						src++;
						next=0;
						break;
					}

⌨️ 快捷键说明

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