📄 fat.c
字号:
/*************************************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 + -