/**************************************************************
author:szhy
create time:080513
description:内存文件系统
**************************************************************/
/**************************************************************
头文件
**************************************************************/
#include "malloc.h"
#include "string.h"
#include "mfs_api.h"
#define __MFS_VER_
#ifdef __MFS_VER_
/**************************************************************
内存文件系统的版本号
**************************************************************/
static char * MFS_VER = "0.51";
/**************************************************************
获取内存文件系统的版本号
**************************************************************/
char * MFS_API_GetVersion(void)
{
return MFS_VER;
}
#endif
#define __MFS_INTERFACE_
#ifdef __MFS_INTERFACE_
/**************************************************************
定义内存文件系统的移植接口变量
**************************************************************/
MFS_Interface_sp MFS_pInterface = 0;
/**************************************************************
注册内存文件系统的移植接口
**************************************************************/
void MFS_API_RegisterInterface(MFS_Interface_sp pInterface)
{
MFS_pInterface = pInterface;
}
#endif
#define __MFS_FAT_
#ifdef __MFS_FAT_
/**************************************************************
文件分区表类型定义
**************************************************************/
#define MFS_FAT_FILENAME_MAXLEN 20
typedef struct _tagMFS_FAT_s
{
char fileName[MFS_FAT_FILENAME_MAXLEN+1]; /* 文件名,不能超过20个字节 */
signed int fileSize; /* 文件大小 */
signed int filePos; /* 文件指针当前位置 */
signed int fileIndex; /* 文件数据所在第一分区的索引 */
unsigned int used; /* 是否被占用 */
signed int open; /* 文件是否被打开 */
} MFS_FAT_s;
typedef MFS_FAT_s * MFS_FAT_sp;
/**************************************************************
文件分区表变量定义
**************************************************************/
#define MFS_FAT_MAXITEM 64
MFS_FAT_s mfsFat[MFS_FAT_MAXITEM]; /* 最多可以创建64个文件 */
#define MFS_FAT_HEAD &mfsFat[0] /* 定义文件分区表的首址 */
/**************************************************************
获取文件分区表的空项
**************************************************************/
int MFS_FAT_GetFreeItem(void)
{
int index;
MFS_FAT_sp pMfsFat;
pMfsFat = MFS_FAT_HEAD;
for(index = 0;index < MFS_FAT_MAXITEM;index++)
{
if(0 == pMfsFat[index].used)
{
break;
}
}
if(index < MFS_FAT_MAXITEM)
{
return index;
}
else
{
/* 已经创建64个文件 */
return -1;
}
}
/**************************************************************
初始化文件分区表
**************************************************************/
int MFS_FAT_Init(void)
{
int index;
MFS_FAT_sp pMfsFat;
pMfsFat = MFS_FAT_HEAD;
for(index = 0; index < MFS_FAT_MAXITEM;index++)
{
memset(pMfsFat[index].fileName,0,MFS_FAT_FILENAME_MAXLEN+1);
pMfsFat[index].fileSize = 0;
pMfsFat[index].filePos = 0;
pMfsFat[index].fileIndex = -1;
pMfsFat[index].used = 0;
pMfsFat[index].open = 0;
}
return 1;
}
/**************************************************************
清除文件分区表项
**************************************************************/
int MFS_FAT_Clear(signed int index)
{
MFS_FAT_sp pMfsFat;
pMfsFat = MFS_FAT_HEAD;
memset(pMfsFat[index].fileName,0,MFS_FAT_FILENAME_MAXLEN+1);
pMfsFat[index].fileSize = 0;
pMfsFat[index].filePos = 0;
pMfsFat[index].fileIndex = -1;
pMfsFat[index].used = 0;
pMfsFat[index].open = 0;
return 1;
}
/**************************************************************
在文件分区表中建立新项,被MFS_API_Open函数调用,index必须为有效值
**************************************************************/
int MFS_FAT_Add(unsigned int index,const char * pFileName)
{
MFS_FAT_sp pMfsFat;
pMfsFat = MFS_FAT_HEAD;
memcpy(pMfsFat[index].fileName,pFileName,MFS_FAT_FILENAME_MAXLEN);
pMfsFat[index].fileName[MFS_FAT_FILENAME_MAXLEN] = 0;
pMfsFat[index].fileSize = 0;
pMfsFat[index].filePos = 0;
pMfsFat[index].fileIndex = -1;
pMfsFat[index].used = 1;
pMfsFat[index].open = 1;
return 1;
}
/**************************************************************
检查文件是否存在,如果文件存在返回文件句柄,如果不存在返回-1,被MFS_API_Open函数调用
**************************************************************/
signed int MFS_FAT_Exist(const char * pFileName)
{
signed int index;
MFS_FAT_sp pMfsFat;
pMfsFat = MFS_FAT_HEAD;
for(index = 0;index < MFS_FAT_MAXITEM;index++)
{
if(pMfsFat[index].used) /* FAT在使用 */
{
if(!strcmp(pMfsFat[index].fileName,pFileName)) /* 判断文件名 */
{
break;
}
}
}
if(index < MFS_FAT_MAXITEM)
{
(pMfsFat[index].open)++;
pMfsFat[index].filePos = 0; /* 每次打开文件,将文件指针设为0 */
return index;
}
else
{
/* 文件不存在 */
return -1;
}
}
/**************************************************************
检查文件是否打开
**************************************************************/
signed int MFS_FAT_IsOpen(signed int fileHandle)
{
MFS_FAT_sp pMfsFat;
pMfsFat = MFS_FAT_HEAD;
return pMfsFat[fileHandle].open;
}
/**************************************************************
关闭文件分区表项
**************************************************************/
signed int MFS_FAT_Close(MFS_HANDLE fileHandle)
{
MFS_FAT_sp pMfsFat;
pMfsFat = MFS_FAT_HEAD;
(pMfsFat[fileHandle].open)--;
if(pMfsFat[fileHandle].open < 0)
{
pMfsFat[fileHandle].open = 0;
}
pMfsFat[fileHandle].filePos = 0; /* 每次关闭文件,将文件指针设为0 */
return 1;
}
/**************************************************************
清除分区索引表项声明
**************************************************************/
signed int MFS_AIT_Clear(signed int index);
/**************************************************************
移除文件分区表项
**************************************************************/
int MFS_FAT_Remove(const char *pFileName)
{
signed int index;
MFS_FAT_sp pMfsFat;
pMfsFat = MFS_FAT_HEAD;
for(index = 0;index < MFS_FAT_MAXITEM;index++)
{
if(!strcmp(pMfsFat[index].fileName,pFileName))/* 检查文件名 */
{
break;
}
}
if(index < MFS_FAT_MAXITEM)
{
/* 清除AIT表 */
MFS_AIT_Clear(pMfsFat[index].fileIndex);
/* 清除FAT表 */
MFS_FAT_Clear(index);
return index;
}
else
{
return -1;
}
}
#endif
#define __MFS_AIT_
#ifdef __MFS_AIT_
/**************************************************************
分区索引表类型定义
**************************************************************/
typedef struct _tagMFS_AIT_s
{
unsigned int used; /* 分区是否被使用 */
signed int next; /* 下一个分区的索引 */
} MFS_AIT_s;
typedef MFS_AIT_s * MFS_AIT_sp;
/**************************************************************
分区索引表变量定义
**************************************************************/
#define MFS_AIT_MAXITEM 1000
MFS_AIT_s mfsAit[MFS_AIT_MAXITEM]; /* 分区索引表,最多可以包括1000个分区 */
#define MFS_AIT_HEAD &mfsAit[0] /* 分区索引表的第一项 */
int mfsAitMaxItem = MFS_AIT_MAXITEM; /* 初始化最大分区数 */
/**************************************************************
获取分区索引表的空项,返回-1代表没有空分区可以使用
**************************************************************/
int MFS_AIT_GetFreeItem(void)
{
int index;
MFS_AIT_sp pMfsAit;
pMfsAit = MFS_AIT_HEAD;
for(index = 0;index < mfsAitMaxItem;index++)
{
if(0 == pMfsAit[index].used)
{
pMfsAit[index].used = 1; /* 获取分区块将使用 */
break;
}
}
if(index < mfsAitMaxItem)
{
return index;
}
else
{
/* 所有分区都被使用 */
return -1;
}
}
/**************************************************************