做到這一點的一種方法是製作靜態的數據描述結構的常量表,以便簡單的讀/寫引擎可以與它們一起工作。
您需要定義一個結構,它可以表示您需要知道讀取或寫入單個結構的單個字段的everthing。
typedef struct {
char * name;
size_t offset;
size_t size;
int format_as;
void* format_struct; // if format_as & IS_STRUCT, this is the structure type
} field_info_t
enum {
AS_CHAR =1,
AS_SHORT,
AS_LONG,
// add other types here
AS_MASK = 0xFF,
// these flags can be OR'd with type to refine the behavior
IS_POINTER = 0x100,
IS_STRUCT = 0x200,
};
然後建立這些描述所有數據結構的表格。
#define FIELD_OFF(type, field) ((size_t)(LONG_PTR)&(((type *)0)->field))
#define FIELD_SIZE(type, field) (sizeof(((type *)0)->field))
static const field_info_t g_fs_directory_table_item_table[] = {
{ "inode",
FIELD_OFF(fs_directory_table_item_t, inode),
FIELD_SIZE(fs_directory_table_item_t, inode),
AS_LONG,
NULL
},
{ "filename",
FIELD_OFF(fs_directory_table_item_t, filename),
sizeof(filename_t),
AS_CHAR | IS_POINTER,
NULL
},
{ "other_field",
FIELD_OFF(fs_directory_table_item_t, other_field),
FIELD_SIZE(fs_directory_table_item_t, other_field),
AS_STRUCT,
&some_other_field_table,
},
};
然後讀寫引擎採取一個指向結構,和一個指針表描述的結構和讀/寫的各種字段。
void ReadStructure(FILE * fh, void * pStruct, field_info_t * pFields, int num_fields)
{
// this is just a rough sketch of the code.
for (int ii = 0; ii < num_fields; ++ii)
{
int * field_size = pFields[ii].size;
char * pfield = (char*)pStruct + pFields[ii].offset;
if (pFields[ii].format_as & AS_POINTER)
pfield = *(char**)pfield;
switch (pFields[ii].format_as & AS_MASK)
{
case AS_CHAR:
....
}
}
}
void WriteStructure(FILE * fh, void * pStruct, field_info_t * pFields, int num_fields);
你還是最終不得不保持field_info_t
陣列爲每個數據結構的,但一旦你擁有了它,你可以讀,寫,驗證和一組相當簡單的功能,漂亮地打印您的數據。
出於好奇,哪個FUSE? – falstro 2010-03-25 09:21:59
哦,並且'filename'是一個指針,或者當你的評論(和sizeof運算符的使用)暗示,一個數組? (在後一種情況下,你沒有問題..) – falstro 2010-03-25 09:23:19
這個FUSE:http://fuse.sourceforge.net/是的,'filename'是一個固定長度的字符數組。 (至少在可預見的將來。) – badp 2010-03-25 09:27:04