ramdisk.h (3482B)
1 #ifndef RAMDISK_H 2 #define RAMDISK_H 3 4 #include <stdint.h> 5 #include <lua.h> 6 7 /* Ramdisk node types */ 8 typedef enum { 9 RAMDISK_FILE = 0, 10 RAMDISK_DIR = 1 11 } ramdisk_node_type_t; 12 13 /* Forward declarations */ 14 struct ramdisk_node; 15 16 /* Directory entry */ 17 typedef struct ramdisk_dir_entry { 18 char* name; 19 struct ramdisk_node* node; 20 struct ramdisk_dir_entry* next; 21 } ramdisk_dir_entry_t; 22 23 /* Ramdisk node (file or directory) */ 24 typedef struct ramdisk_node { 25 char* name; 26 ramdisk_node_type_t type; 27 struct ramdisk_node* parent; 28 29 union { 30 /* For files */ 31 struct { 32 uint8_t* data; 33 uint32_t size; 34 uint32_t capacity; 35 } file; 36 37 /* For directories */ 38 struct { 39 ramdisk_dir_entry_t* entries; 40 uint32_t entry_count; 41 } dir; 42 }; 43 } ramdisk_node_t; 44 45 /* File handle for C API */ 46 typedef struct { 47 ramdisk_node_t* node; 48 uint32_t position; 49 char mode; // 'r', 'w', 'a' 50 } ramdisk_handle_t; 51 52 /* Ramdisk operations */ 53 ramdisk_node_t* ramdisk_create_root(void); 54 void ramdisk_destroy_node(ramdisk_node_t* node); 55 56 /* Directory operations */ 57 ramdisk_node_t* ramdisk_create_dir(ramdisk_node_t* parent, const char* name); 58 ramdisk_node_t* ramdisk_create_file(ramdisk_node_t* parent, const char* name); 59 60 /* File operations */ 61 int ramdisk_write_file(ramdisk_node_t* file, const uint8_t* data, uint32_t size); 62 int ramdisk_append_file(ramdisk_node_t* file, const uint8_t* data, uint32_t size); 63 int ramdisk_read_file(ramdisk_node_t* file, uint8_t* buffer, uint32_t size, uint32_t* bytes_read); 64 void ramdisk_truncate_file(ramdisk_node_t* file); 65 66 /* Path traversal */ 67 ramdisk_node_t* ramdisk_traverse(ramdisk_node_t* root, const char* path); 68 ramdisk_node_t* ramdisk_find(ramdisk_node_t* start_node, const char* path); 69 char* ramdisk_get_full_path(ramdisk_node_t* node); 70 71 /* File handle operations */ 72 ramdisk_handle_t* ramdisk_open(ramdisk_node_t* root, const char* path, const char* mode); 73 int ramdisk_handle_read(ramdisk_handle_t* handle, uint8_t* buffer, uint32_t size, uint32_t* bytes_read); 74 int ramdisk_handle_write(ramdisk_handle_t* handle, const uint8_t* data, uint32_t size); 75 int ramdisk_handle_seek(ramdisk_handle_t* handle, int32_t offset, int whence); 76 uint32_t ramdisk_handle_tell(ramdisk_handle_t* handle); 77 void ramdisk_close(ramdisk_handle_t* handle); 78 79 /* Utility functions */ 80 int ramdisk_exists(ramdisk_node_t* root, const char* path); 81 int ramdisk_is_file(ramdisk_node_t* node); 82 int ramdisk_is_dir(ramdisk_node_t* node); 83 uint32_t ramdisk_get_file_size(ramdisk_node_t* file); 84 85 /* Directory listing */ 86 typedef struct { 87 char** names; 88 ramdisk_node_type_t* types; 89 uint32_t count; 90 } ramdisk_dir_list_t; 91 92 ramdisk_dir_list_t* ramdisk_list_dir(ramdisk_node_t* dir); 93 void ramdisk_free_dir_list(ramdisk_dir_list_t* list); 94 95 /* Lua bindings */ 96 int lua_ramdisk_create(lua_State* L); 97 int lua_ramdisk_open(lua_State* L); 98 int lua_ramdisk_read(lua_State* L); 99 int lua_ramdisk_write(lua_State* L); 100 int lua_ramdisk_close(lua_State* L); 101 int lua_ramdisk_seek(lua_State* L); 102 int lua_ramdisk_mkdir(lua_State* L); 103 int lua_ramdisk_exists(lua_State* L); 104 int lua_ramdisk_list(lua_State* L); 105 int lua_ramdisk_remove(lua_State* L); 106 int lua_ramdisk_find(lua_State* L); 107 108 /* Global C ramdisk root */ 109 extern ramdisk_node_t* c_ramdisk_root; 110 111 /* Packed ramdisk loading */ 112 int ramdisk_load_packed(ramdisk_node_t* root, const uint8_t* packed_data, uint32_t packed_size); 113 114 #endif /* RAMDISK_H */