Simple RAM file system.
Dependents: modem_ref_helper_for_v5_3_217 modem_ref_helper
Diff: ram_fs.cpp
- Revision:
- 0:befc17558de9
- Child:
- 1:73a2c1814a34
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ram_fs.cpp Thu May 04 13:15:20 2017 +0000 @@ -0,0 +1,121 @@ +#include "ram_fs.h" +#include "WizziDebug.h" + +static ram_fs_file_t* g_fs = NULL; + +static void ram_fs_append(ram_fs_file_t** file, ram_fs_file_t* file_new) +{ + if (*file == NULL) + { + *file = file_new; + return; + } + + ram_fs_append((ram_fs_file_t**)&((*file)->next), file_new); +} + +static ram_fs_file_t* ram_fs_get(ram_fs_file_t* file, uint8_t fid) +{ + if (file == NULL) + { + return NULL; + } + + if (file->file_id == fid) + { + return file; + } + + return ram_fs_get((ram_fs_file_t*)file->next, fid); +} + +static bool ram_fs_remove(ram_fs_file_t** file, uint8_t fid) +{ + if (*file == NULL) + { + // File does nor exist + return true; + } + + if ((*file)->file_id == fid) + { + ram_fs_file_t* file_old = *file; + *file = (ram_fs_file_t*)file_old->next; + FREE(file_old); + return false; + } + + return ram_fs_remove((ram_fs_file_t**)&((*file)->next), fid); +} + +void ram_fs_new(uint8_t file_id, uint8_t* header, uint8_t* data) +{ + ram_fs_file_t* file_new = (ram_fs_file_t*)MALLOC(sizeof(ram_fs_file_t)); + + file_new->file_id = file_id; + file_new->header = header; + file_new->data = data; + file_new->next = NULL; + + ram_fs_append(&g_fs, file_new); +} + +bool ram_fs_delete(uint8_t file_id) +{ + return ram_fs_remove(&g_fs, file_id); +} + +bool ram_fs_write(uint8_t file_id, uint16_t offset, uint16_t size, uint8_t* content) +{ + ram_fs_file_t* file; + + DPRINT("WF %d\r\n", file_id); + + // Retrieve pointer to file + file = ram_fs_get(g_fs, file_id); + + if (file == NULL) + { + return true; + } + + // Write the new data + memcpy((void*)(file->data+offset), (void*)content, size); + + return false; +} + +bool ram_fs_read(uint8_t file_id, uint16_t offset, uint16_t size, uint8_t* buf) +{ + ram_fs_file_t* file; + + DPRINT("RF %d\r\n", file_id); + + // Retrieve pointer to file + file = ram_fs_get(g_fs, file_id); + + if (file == NULL) + { + return true; + } + + // Read data + memcpy((void*)buf, (void*)(file->data+offset), size); + + return false; +} + +void* ram_fs_get_header(uint8_t file_id) +{ + ram_fs_file_t* file; + + DPRINT("RH %d\r\n", file_id); + + // Retrieve pointer to file + file = ram_fs_get(g_fs, file_id); + + ASSERT(file != NULL, "File %d does not exist!\r\n", file_id); + + // Return header pointer + return file->header; +}