📄 xsfstree.h
字号:
// XSFS B-Tree System
#ifndef __XSFSTREE_H
#define __XSFSTREE_H
#include "xsfs.h"
#include "xsfsbase.h"
#ifdef _MSC_VER
#pragma pack(push, 1)
#endif
#define MAX_XSFSNAME 64
typedef struct _XSFSNODE
{
_u32 flags;
char name[MAX_XSFSNAME];
_u32 attributes;
_u32 create_time;
_u32 modify_time;
_u32 access_time;
_u64 length;
_u32 data_entry;
_u32 child_unit;
} XSFSNODE;
// Node flags
#define NF_TYPEMASK 0x0000000f
#define NF_LONGNAME 0x00010000
#define NF_TYPE_FILE 0
#define NF_TYPE_DIR 1
#define NF_TYPE_HARDLN 2
#define NF_TYPE_SYMLN 3
#define NF_TYPE_LABEL 4
typedef struct _XSFSBNODE
{
_u32 b_left;
XSFSNODE node;
_u32 b_right;
} XSFSBNODE;
typedef struct _XSFSBHEAD
{
_u32 n_max;
_u32 n_total;
_u32 uplevel_unit;
_u32 uplevel_index;
_u32 parent_unit;
_u32 parent_index;
} XSFSBHEAD;
// FS Summary
#define MAX_BLOCKSIZE 512
#define DEF_BLOCKSIZE 80
typedef struct _XSFSROOT
{
_u32 block_size; // block size in stream SSI_FSTREE
_u32 n_blocks; // total blocks
_u32 n_streams; // number of streams in FSTBLOCKDEF
_u32 start_pos; // offset of first block in bytes
_u32 free_start; // first free block index (1-based)
XSFSNODE root;
} XSFSROOT;
typedef struct _FSTBLOCK // head of each block
{
_u32 flags;
_u32 next;
} FSTBLOCK;
// Block flags
#define BF_DELETED 0x80000000
#define BF_FIRST 0x00000001
#define BF_FINAL 0x00000002
typedef struct _FSTBLOCKDEF
{
_u32 bi_name, bo_name, l_name; // long filename
_u32 reference; // for hard links
// ... following are (bi_stream, bo_stream)
} FSTBLOCKDEF;
// File stream indices
#define FSI_DEFAULT 0
#define FSI_SYSTEM 1
#ifdef _MSC_VER
#pragma pack(pop)
#endif
#ifdef __cplusplus
extern "C" {
#endif
_u32 xsfsFindNode(HXSFS, _u32 root_unit, const char *name, XSFSNODE *result, int *index);
_u32 xsfsLocateNode(HXSFS, XSFSNODE *parent, const char *name, XSFSNODE *result, int *index);
int xsfsAddNode(HXSFS, XSFSNODE *parent, XSFSNODE *newnode, _u32 up_unit, int up_index);
int xsfsDelNodePos(HXSFS xsfs, XSFSNODE *parent, _u32 unit, int index);
int xsfsDelNode(HXSFS xsfs, XSFSNODE *parent, const char *name);
_u32 xsfsAllocDataEntry(HXSSTREAM, XSFSROOT*);
void xsfsFreeDataEntry(HXSSTREAM, XSFSROOT*, _u32);
int xsfsLoadDataStream(HXSSTREAM, XSFSROOT*, _u32, _u32, XSSTREAM*);
int xsfsSaveDataStream(HXSSTREAM, XSFSROOT*, _u32, _u32, XSSTREAM*);
int xsfsLoadRoot(HXSFS, XSSTREAM*, XSFSROOT*);
int xsfsSaveRoot(HXSFS, XSFSROOT*);
#ifdef __cplusplus
}
#endif
static inline int i_xsfs_node_num(HXSFS xsfs)
{ return (i_xsfs_unit_size(xsfs)-sizeof(XSFSBHEAD)-sizeof(_u32))/(sizeof(_u32)+sizeof(XSFSNODE)); }
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -