From ce94e9fb87a484459cf658688b2681f774cf6684 Mon Sep 17 00:00:00 2001 From: Arthur Barraux Date: Mon, 6 Oct 2025 11:28:49 +0200 Subject: [PATCH] permission files --- include/data.h | 2 + include/init.h | 1 + include/input.h | 1 + main.c | 4 +- src/file_io.c | 154 ++++++++++++++++++++++++------------------------ 5 files changed, 84 insertions(+), 78 deletions(-) diff --git a/include/data.h b/include/data.h index d3e7c6a..77f0c70 100644 --- a/include/data.h +++ b/include/data.h @@ -68,6 +68,7 @@ struct editorConfig { struct keyBind_t* key_binds; int number_of_keybinds; + }; /** @@ -82,4 +83,5 @@ struct abuf { extern struct editorConfig E; + #endif diff --git a/include/init.h b/include/init.h index 3e9e3c2..a2186e5 100644 --- a/include/init.h +++ b/include/init.h @@ -1,6 +1,7 @@ #ifndef INIT_H_ #define INIT_H_ +#include "builtins.h" #include "data.h" #include "terminal.h" #include diff --git a/include/input.h b/include/input.h index aaf7a71..2a6c948 100644 --- a/include/input.h +++ b/include/input.h @@ -5,6 +5,7 @@ #include "define.h" #include "output.h" #include "terminal.h" +#include "builtins.h" #include // KEYS keycode diff --git a/main.c b/main.c index 922533c..da4a6c0 100644 --- a/main.c +++ b/main.c @@ -5,7 +5,8 @@ * interactions. \version 0.1 \date 21 septembre 2024 */ -#include +#include + #define _DEFAULT_SOURCE #define _BSD_SOURCE #define _GNU_SOURCE @@ -32,6 +33,7 @@ int main(int argc, char *argv[]) { editorSetStatusMessage("HELP: Ctrl-S = save | Ctrl-Q = quit"); + while (1) { editorRefreshScreen(); editorProcessKeypress(); diff --git a/src/file_io.c b/src/file_io.c index fc9b64f..1fd6066 100644 --- a/src/file_io.c +++ b/src/file_io.c @@ -16,98 +16,98 @@ extern int ftruncate(int fd, off_t length); extern struct editorConfig E; char *editorRowsToString(int *buffer_len) { - int tot_len = 0; - int j; - char *buf; - char *p; + int tot_len = 0; + int j; + char *buf; + char *p; - for (j = 0; j < E.numrows; ++j) { - tot_len += E.row[j].size + 1; - } - *buffer_len = tot_len; - buf = malloc(tot_len); - p = buf; - for (j = 0; j < E.numrows; ++j) { - memcpy(p, E.row[j].chars, E.row[j].size); - p += E.row[j].size; - *p = '\n'; - p++; - } + for (j = 0; j < E.numrows; ++j) { + tot_len += E.row[j].size + 1; + } + *buffer_len = tot_len; + buf = malloc(tot_len); + p = buf; + for (j = 0; j < E.numrows; ++j) { + memcpy(p, E.row[j].chars, E.row[j].size); + p += E.row[j].size; + *p = '\n'; + p++; + } - return buf; + return buf; } void editorCloseFile(void) { - E.cursor_x = 0; - E.cursor_y = 0; - E.rx = 0; - E.row_offset = 0; - E.col_offset = 0; - E.numrows = 0; - E.row = NULL; - E.dirty = 0; - E.filename = NULL; - E.status_msg[0] = '\0'; - E.status_msg_time = 0; - + E.cursor_x = 0; + E.cursor_y = 0; + E.rx = 0; + E.row_offset = 0; + E.col_offset = 0; + E.numrows = 0; + E.row = NULL; + E.dirty = 0; + E.filename = NULL; + E.status_msg[0] = '\0'; + E.status_msg_time = 0; } void editorOpen(char *filename) { - FILE *fp; + FILE *fp; - // Test if a file is already open - if (E.filename != NULL) { - editorCloseFile(); - } - - free(E.filename); - E.filename = strdup(filename); - - fp = fopen(filename, "a+"); - if (!fp) - die("fopen"); - - char *line = NULL; - size_t line_cap = 0; - ssize_t line_len; - - while ((line_len = getline(&line, &line_cap, fp)) != -1) { - while (line_len > 0 && - (line[line_len - 1] == '\n' || line[line_len - 1] == '\r')) { - --line_len; + // Test if a file is already open + if (E.filename != NULL) { + editorCloseFile(); + E.state = READ_AND_WRITE; } - editorInsertRow(E.numrows, line, line_len); - } - free(line); - fclose(fp); - E.dirty = 0; + + free(E.filename); + E.filename = strdup(filename); + + fp = fopen(filename, "a+"); + if (!fp) + die("fopen"); + + char *line = NULL; + size_t line_cap = 0; + ssize_t line_len; + + while ((line_len = getline(&line, &line_cap, fp)) != -1) { + while (line_len > 0 && + (line[line_len - 1] == '\n' || line[line_len - 1] == '\r')) { + --line_len; + } + editorInsertRow(E.numrows, line, line_len); + } + free(line); + fclose(fp); + E.dirty = 0; } void editorSave() { - int len; - char *buf; - int fd; - if (E.filename == NULL) { - E.filename = editorPrompt("Save as: %s (ESC to cancel)"); + int len; + char *buf; + int fd; if (E.filename == NULL) { - editorSetStatusMessage("Save aborted"); - return; + E.filename = editorPrompt("Save as: %s (ESC to cancel)"); + if (E.filename == NULL) { + editorSetStatusMessage("Save aborted"); + return; + } } - } - buf = editorRowsToString(&len); - fd = open(E.filename, O_RDWR | O_CREAT, 0644); - if (fd != -1) { - if (ftruncate(fd, len) != -1) { - if (write(fd, buf, len) == len) { + buf = editorRowsToString(&len); + fd = open(E.filename, O_RDWR | O_CREAT, 0644); + if (fd != -1) { + if (ftruncate(fd, len) != -1) { + if (write(fd, buf, len) == len) { + close(fd); + free(buf); + E.dirty = 0; + editorSetStatusMessage("%d bytes written to disk", len); + return; + } + } close(fd); - free(buf); - E.dirty = 0; - editorSetStatusMessage("%d bytes written to disk", len); - return; - } } - close(fd); - } - free(buf); - editorSetStatusMessage("Can't save! I/O error: %s", strerror(errno)); + free(buf); + editorSetStatusMessage("Can't save! I/O error: %s", strerror(errno)); }