WIP fixed enough things to pass basic file testing

This commit is contained in:
Christopher Haster
2018-05-26 13:50:06 -05:00
parent cd045ed2eb
commit ca9e43158d
4 changed files with 1243 additions and 1302 deletions

2429
lfs.c

File diff suppressed because it is too large Load Diff

112
lfs.h
View File

@@ -95,36 +95,25 @@ enum lfs_error {
// File types
enum lfs_type {
// file type
LFS_TYPE_REG = 0x01,
LFS_TYPE_DIR = 0x02,
LFS_TYPE_SUPERBLOCK = 0x0e,
// on disk structure
LFS_STRUCT_CTZ = 0x10,
LFS_STRUCT_DIR = 0x20,
LFS_STRUCT_INLINE = 0x30,
LFS_STRUCT_MOVED = 0x80,
// file types
LFS_TYPE_REG_ = 0x040,
LFS_TYPE_DIR_ = 0x050,
LFS_TYPE_REG = 0x040,
LFS_TYPE_DIR = 0x050,
// internally used types
LFS_TYPE_NAME_ = 0x010,
LFS_TYPE_MOVE_ = 0x080,
LFS_TYPE_DELETE_ = 0x090,
LFS_TYPE_NAME = 0x010,
LFS_TYPE_MOVE = 0x080,
LFS_TYPE_DELETE = 0x090,
LFS_TYPE_SUPERBLOCK_ = 0x0a0,
LFS_TYPE_SOFTTAIL_ = 0x0c0,
LFS_TYPE_HARDTAIL_ = 0x0d0,
LFS_TYPE_CRC_ = 0x0e0,
LFS_TYPE_SUPERBLOCK = 0x0a0,
LFS_TYPE_SOFTTAIL = 0x0c0,
LFS_TYPE_HARDTAIL = 0x0d0,
LFS_TYPE_CRC = 0x0e0,
// on disk structure
LFS_STRUCT_ATTR_ = 0x100,
LFS_STRUCT_INLINE_ = 0x000,
LFS_STRUCT_CTZ_ = 0x004,
LFS_STRUCT_DIR_ = 0x008,
LFS_STRUCT_ATTR = 0x100,
LFS_STRUCT_INLINE = 0x000,
LFS_STRUCT_CTZ = 0x004,
LFS_STRUCT_DIR = 0x008,
};
// File open flags
@@ -268,30 +257,9 @@ struct lfs_attr {
/// littlefs data structures ///
typedef struct lfs_entry {
lfs_off_t off;
lfs_size_t size;
struct lfs_disk_entry {
uint8_t type;
uint8_t elen;
uint8_t alen;
uint8_t nlen;
union {
struct {
lfs_block_t head;
lfs_size_t size;
} file;
lfs_block_t dir[2];
} u;
} d;
} lfs_entry_t;
typedef uint32_t lfs_tag_t;
typedef int32_t lfs_stag_t;
typedef struct lfs_entry_ {
uint32_t tag;
typedef struct lfs_entry {
lfs_tag_t tag;
union {
void *buffer;
lfs_block_t pair[2];
@@ -304,27 +272,20 @@ typedef struct lfs_entry_ {
lfs_off_t off;
} d;
} u;
} lfs_entry_t_;
} lfs_entry_t;
typedef struct lfs_entry_list_ {
lfs_entry_t_ e;
struct lfs_entry_list_ *next;
typedef struct lfs_entrylist {
lfs_entry_t e;
struct lfs_entrylist *next;
} lfs_entrylist_t;
typedef struct lfs_entry_attr {
struct lfs_disk_entry_attr {
uint8_t type;
uint8_t len;
} d;
} lfs_entry_attr_t;
typedef struct lfs_cache {
lfs_block_t block;
lfs_off_t off;
uint8_t *buffer;
} lfs_cache_t;
typedef struct lfs_file_ {
typedef struct lfs_file {
struct lfs_file *next;
lfs_block_t pair[2];
uint16_t id;
@@ -344,21 +305,6 @@ typedef struct lfs_file_ {
typedef struct lfs_dir {
struct lfs_dir *next;
lfs_block_t pair[2];
lfs_off_t off;
lfs_block_t head[2];
lfs_off_t pos;
struct lfs_disk_dir {
uint32_t rev;
lfs_size_t size;
lfs_block_t tail[2];
} d;
} lfs_dir_t;
typedef struct lfs_dir_ {
struct lfs_dir_ *next;
lfs_block_t pair[2];
lfs_block_t tail[2];
uint32_t rev;
@@ -372,23 +318,9 @@ typedef struct lfs_dir_ {
uint16_t id;
lfs_block_t head[2];
lfs_off_t pos;
} lfs_dir_t_;
} lfs_dir_t;
typedef struct lfs_superblock {
struct lfs_disk_superblock {
lfs_block_t root[2];
lfs_size_t block_size;
lfs_size_t block_count;
uint32_t version;
lfs_size_t inline_size;
lfs_size_t attrs_size;
lfs_size_t name_size;
} d;
} lfs_superblock_t;
typedef struct lfs_superblock_ {
lfs_block_t root[2];
char magic[8];
uint32_t version;
@@ -399,7 +331,7 @@ typedef struct lfs_superblock_ {
lfs_size_t inline_size;
lfs_size_t attrs_size;
lfs_size_t name_size;
} lfs_superblock_t_;
} lfs_superblock_t;
typedef struct lfs_free {
lfs_block_t off;

View File

@@ -88,6 +88,8 @@ const struct lfs_config cfg = {{
.erase = &lfs_emubd_erase,
.sync = &lfs_emubd_sync,
.name_size = 255,
.read_size = LFS_READ_SIZE,
.prog_size = LFS_PROG_SIZE,
.block_size = LFS_BLOCK_SIZE,

View File

@@ -117,6 +117,8 @@ tests/test.py << TEST
for (int i = 0; i < $LARGESIZE; i++) {
sprintf((char*)buffer, "test%d", i);
lfs_dir_read(&lfs, &dir[0], &info) => 1;
printf("nameee %s\n", info.name);
printf("expect %s\n", (char*)buffer);
strcmp(info.name, (char*)buffer) => 0;
info.type => LFS_TYPE_DIR;
}