You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

366 lines
9.8 KiB
C

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/****************************************************************************
* FileName : DSFileSystem.h *
* Programmer : AAAwen *
* Writen at : 2005.05.10 *
* Version : 1.0 *
* Description: define filesystem of flash *
* Last modify: 2005.05.10 *
****************************************************************************/
#ifndef __DSFILESYSTEM_H_ICL__
#define __DSFILESYSTEM_H_ICL__
#include "basetype.h"
#include <stdio.h>
//typedef char* HDSFILE;
/*!
清除数据流已经被读取的字节数
*/
#define SEEK_CLR_RCNT SEEK_END+10
#define SEEK_CUR_EX SEEK_END+11
// 修改DS中的配置文件系统
#define DS_FILESYSTEM_ADDR 0x3b0000
#define DS_FILESYSTEM_LEN (0x50000-4)
#define DS_SECTION_OUT -1 // 段名称长度越限
#define DS_SECTION_NOEXIST 0 // 段名称不存在
#define DS_SECTION_EXIST 1 // 段名称存在
#define DS_SECTION_SEARCH 2 // 段名称查找
typedef struct tsgDSFILE
{
/*!
文件内容长度
*/
long m_lContentLen;
/*!
文件读取的当前位置
*/
long m_lOffset;
/*!
文件读取的字节数量
*/
long m_lReadCount;
// 增加优化配置文件读取项
/*!
段名称是否存在
*/
long m_lSectionOk;
/*!
段名称行数
*/
long m_lSectionLines;
/*!
段名称行数增加标识
*/
long m_lSectionLinesAddFlag;
/*!
段在文件中的偏移位置
*/
long m_lSectionOffset;
/*!
段名称
*/
char m_szSection[64];
/*!
文件正文
*/
char *m_pContent;
}DSFILE, *HDSFILE;
#ifdef OS_WINDOWS
#pragma pack (push,1)
typedef struct tagDSFILESYSTEMHEAD
{
/*!
文件系统中文件数量
*/
int m_iFiles;
/*!
文件系统中首文件偏移
\note
第一个文件=this+m_iOffset
*/
int m_iOffset;
}DSFILESYSTEMHEAD;
typedef struct tagDSFILEHEAD
{
/*!
文件长度(文件内容+文件头)
*/
int m_iFileSize;
/*!
文件内容偏移
*/
int m_iOffset;
/*!
文件名长度
*/
int m_iFileNameLen;
/*!
文件名称
*/
char m_FileName[1];
}DSFILEHEAD, *pDSFILEHEAD;
typedef struct tagFILECONTENT
{
long m_lContentLen;
long m_lOffset;
char m_pContent[1];
}FILECONTENT, *pFILECONTENT;
#pragma pack (pop)
#else
typedef struct tagDSFILESYSTEMHEAD
{
/*!
文件系统中文件数量
*/
int m_iFiles ;
/*!
文件系统中首文件偏移
\note
第一个文件=this+m_iOffset
*/
int m_iOffset ;
}DSFILESYSTEMHEAD;
typedef struct tagDSFILEHEAD
{
/*!
文件长度(文件内容+文件头)
*/
int m_iFileSize ;
/*!
文件内容偏移
*/
int m_iOffset ;
/*!
文件名长度
*/
int m_iFileNameLen ;
/*!
文件名称
*/
char m_FileName[1] ;
}DSFILEHEAD, *pDSFILEHEAD;
typedef struct tagFILECONTENT
{
long m_lContentLen ;
long m_lOffset ;
char m_pContent[1] ;
}FILECONTENT, *pFILECONTENT;
#endif
/*!
\brief 将指定文件载入目的内存
\param szFileName -- 要载入的文件名
\param ppDestMem -- 目的内存指针的指针
\retval -- 返回分配内存长度
\note
如果内存分配失败或者文件为空返回0\n
pDestMem必须在使用后有调用者释放
*/
long LoadFile(const char *szFileName, char **ppDestMem);
/*!
\brief 将指定文件载入目的内存
\param szFileName -- 要载入的文件名
\param ppDestMem -- 目的内存指针的指针
\param pFSAddr -- 文件系统首地址指针
\retval -- 返回分配内存长度
\note
如果内存分配失败或者文件为空返回0\n
pDestMem必须在使用后有调用者释放
*/
long LoadFileInDSFS(const char *szFileName, char **ppDestMem, BYTE *pFSAddr);
/*!
\brief 设置数据流偏移量
\param stream -- 数据流指针
\param offset -- 与origin的偏移值
\param origin -- 初始位置
\retval -- 成功返回0
*/
DSLIB_API int DS_Seek(FILECONTENT *stream, long offset, int origin);
DSLIB_API char *DS_Gets(char *pDest, int iDestMax, FILECONTENT *stream);
/*!
\brief 获取文件长度
\param fp -- 已经打开的文件指针
\retval -- 返回文件长度
*/
DSLIB_API int GetFileLen(FILE *fp);
/*!
\brief 将指定文件载入目的内存
\param szFileName -- 要载入的文件名
\retval -- 返回文件句柄
\note
如果内存分配失败或者文件为空返回0\n
pDestMem必须在使用后有调用者释放
*/
DSLIB_API HDSFILE DSOpenFile(const char *szFileName);
DSLIB_API HDSFILE DSOpenFileEx(const char *szFileName);
/*!
\brief 将指定文件载入目的内存
\param szRootDir -- 文件系统的根路径
\param szFileName -- 要载入的文件名
\retval -- 返回文件句柄
\note
如果内存分配失败或者文件为空返回0\n
pDestMem必须在使用后有调用者释放
该函数仅适合于pc系统用来浏览文件系统信息
在嵌入式系统中参数1无意义
*/
DSLIB_API HDSFILE DSOpenFileEx3(const char *szRootDir, const char *szFileName);
DSLIB_API HDSFILE DSOpenFileEx2(const char *szRootDir, const char *szFSName, const char *szFileName);
/*!
\brief 关闭打开的文件
\param hFile -- 打开的文件句柄
\note
如果内存分配失败或者文件为空返回0\n
pDestMem必须在使用后有调用者释放
*/
DSLIB_API BOOL DSCloseFile(HDSFILE hFile);
/*!
\brief 从数据流中获取数据
\param buffer -- 获取数据缓冲区指针
\param size -- 获取数据单元的长度
\param count -- 获取数据单元的数量
\param hFile -- 数据流指针
\retval -- 成功返回实际的读取数据单元数量
*/
DSLIB_API size_t DSfread(void *buffer, size_t size, size_t count, HDSFILE hFile);
/*!
\brief 获取数据流一个字符串(以回车和换行结束)
\param string -- 获取字符串的缓冲区指针
\param origin -- 缓冲区长度
\param hFile -- 数据流指针
\retval -- 成功返回读取的字符串指针
*/
DSLIB_API char *DSfgets(char *string, int iMaxSize, HDSFILE hFile);
/*!
\brief 获取数据流一个字符串(以回车和换行结束)
\param string -- 获取字符串的缓冲区指针
\param origin -- 缓冲区长度
\param hFile -- 数据流指针
\param ioffset -- 当前位置读取偏移
\retval -- 成功返回读取的字符串指针
\note
读取指针不移动,需要用户干预
*/
DSLIB_API char *DSfgetsEx(char *string, int iMaxSize, HDSFILE hFile);
/*!
\brief 读取文件已经读取的数据量
\param hFile -- 数据流指针
\retval -- 实际读取的数据量
*/
DSLIB_API int DSfgetreadcount(HDSFILE hFile);
/*!
\brief 设置数据流偏移量
\param hFile -- 数据流指针
\param offset -- 与origin的偏移值
\param origin -- 初始位置
\retval -- 成功返回0
*/
DSLIB_API int DSfseek(HDSFILE hFile, long offset, int origin);
/*!
\brief 是否到数据流底部
\param hFile -- 数据流指针
\retval -- 成功返回0
*/
DSLIB_API int DSfeof(HDSFILE hFile);
/*!
\brief 是否到数据流底部
\param hFile -- 数据流指针
\retval -- 成功返回0
*/
DSLIB_API int DSfeofEx(HDSFILE hFile);
/*!
\brief 是否数据流全部浏览完毕
\param hFile -- 数据流指针
\retval -- 成功返回0,否则为浏览过的字节数
*/
DSLIB_API int DSfeob(HDSFILE hFile);
/*!
\brief 数据流的偏移量
\param hFile -- 数据流指针
\retval -- 返回偏移量
*/
DSLIB_API int DSftell(HDSFILE hFile);
DSLIB_API int DSHaveSection(char *pSection, HDSFILE hFile);
DSLIB_API int DSSaveSectionOffset(HDSFILE hFile);
DSLIB_API int DSRestoreSectionOffset(HDSFILE hFile);
DSLIB_API int DSAddSectionLines(int iLines, HDSFILE hFile);
DSLIB_API int DSSubSectionLines(int iLines, HDSFILE hFile);
DSLIB_API int DSSetSectionLinesAddFlag(int iFlag, HDSFILE hFile);
DSLIB_API int DSSectionisOver(int iReadLines, HDSFILE hFile);
/*!
\brief 合并所有文件
\param szListFileName -- 要合并的文件列表文件名称
\param szDestFileName -- 合并的目的文件
\param szDestDir -- 文件路径
\retval -- 成功返回TRUE
\note
合并后的文件必须是偶字节对齐
*/
DSLIB_API BOOL FsCombinAllFile(const char *szListFileName, const char *szDestFileName, const char *szDestDir);
/*!
\brief 文件分离
\param szCombinFile -- 合并的文件名称
\param szDestDir -- 要分离的文件目录
\retval -- 成功返回TRUE
*/
DSLIB_API BOOL FsSplitAllFile(const char *szCombinFile, const char *szDestDir);
//测试用
/*!
\brief 读取合并的文件(文件系统)
\param szCombinFile -- 合并的文件名称
\retval -- 成功返回TRUE
*/
DSLIB_API BYTE *FsReadCombinFile(const char *szCombinFile);
DSLIB_API BYTE *FsReadCombinFileEx(const char *szCombinFile);
/*!
\brief 装载文件系统
\param szFileSystem -- 文件系统名称
\param ppDestBuf -- 文件系统的目的缓冲区
\retval -- 成功返回TRUE
*/
DSLIB_API BOOL FsLoadFileSystem(const char *szFileSystem, BYTE **ppDestBuf);
/*!
\brief 卸载文件系统
\param ppDestBuf -- 文件系统的目的缓冲区
\retval -- 成功返回TRUE
*/
DSLIB_API BOOL FsUnLoadFileSystem(BYTE **ppDestBuf);
/*!
\brief 显示指定文件系统路径的文件名称
\param szPath -- 要显示的文件系统路径
\param szFileSystem -- 指定的文件系统
\retval -- 成功返回TRUE
*/
DSLIB_API BOOL FsDirFileName(const char *szPath, const char *szFileSystem);
DSLIB_API void FsDispHead(const char *szName, const char *szFileSystem);
BOOL FsNetToHost(BYTE *pFSBuf);
BOOL FsHostToNet(BYTE *pFSBuf);
void DispMemoryData(const BYTE *pu8Addr, int iLen, int iNumofLine);
#endif