diff options
Diffstat (limited to 'movement/filesystem.c')
-rw-r--r-- | movement/filesystem.c | 39 |
1 files changed, 37 insertions, 2 deletions
diff --git a/movement/filesystem.c b/movement/filesystem.c index d122a7fa..2b345eda 100644 --- a/movement/filesystem.c +++ b/movement/filesystem.c @@ -166,6 +166,29 @@ bool filesystem_read_file(char *filename, char *buf, int32_t length) { return false; } +bool filesystem_read_line(char *filename, char *buf, int32_t *offset, int32_t length) { + memset(buf, 0, length + 1); + int32_t file_size = filesystem_get_file_size(filename); + if (file_size > 0) { + int err = lfs_file_open(&lfs, &file, filename, LFS_O_RDONLY); + if (err < 0) return false; + err = lfs_file_seek(&lfs, &file, *offset, LFS_SEEK_SET); + if (err < 0) return false; + err = lfs_file_read(&lfs, &file, buf, min(length - 1, file_size - *offset)); + if (err < 0) return false; + for(int i = 0; i < length; i++) { + (*offset)++; + if (buf[i] == '\n') { + buf[i] = 0; + break; + } + } + return lfs_file_close(&lfs, &file) == LFS_ERR_OK; + } + + return false; +} + static void filesystem_cat(char *filename) { info.type = 0; lfs_stat(&lfs, filename, &info); @@ -191,6 +214,14 @@ bool filesystem_write_file(char *filename, char *text, int32_t length) { return lfs_file_close(&lfs, &file) == LFS_ERR_OK; } +bool filesystem_append_file(char *filename, char *text, int32_t length) { + int err = lfs_file_open(&lfs, &file, filename, LFS_O_WRONLY | LFS_O_CREAT | LFS_O_APPEND); + if (err < 0) return false; + err = lfs_file_write(&lfs, &file, text, length); + if (err < 0) return false; + return lfs_file_close(&lfs, &file) == LFS_ERR_OK; +} + void filesystem_process_command(char *line) { printf("$ %s", line); char *command = strtok(line, " \n"); @@ -223,7 +254,7 @@ void filesystem_process_command(char *line) { memset(text, 0, 248); size_t pos = 0; char *word = strtok(NULL, " \n"); - while (strcmp(word, ">")) { + while (strcmp(word, ">") && strcmp(word, ">>")) { sprintf(text + pos, "%s ", word); pos += strlen(word) + 1; word = strtok(NULL, " \n"); @@ -235,8 +266,12 @@ void filesystem_process_command(char *line) { printf("usage: echo text > file\n"); } else if (strchr(filename, '/') || strchr(filename, '\\')) { printf("subdirectories are not supported\n"); - } else { + } else if (!strcmp(word, ">")) { filesystem_write_file(filename, text, strlen(text)); + filesystem_append_file(filename, "\n", 1); + } else if (!strcmp(word, ">>")) { + filesystem_append_file(filename, text, strlen(text)); + filesystem_append_file(filename, "\n", 1); } free(text); } else { |