tOpen file with multiple lines - ve - a minimal text editor (work in progress) | |
git clone git://src.adamsgaard.dk/ve | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit fd944c194e43e14db7bf4fdaf5c5fbc726683c5e | |
parent 980ae0e805b66f9a92d2c36a920a1b6380e227a4 | |
Author: Anders Damsgaard <[email protected]> | |
Date: Tue, 6 Aug 2019 12:16:15 +0200 | |
Open file with multiple lines | |
Diffstat: | |
M byote.h | 2 +- | |
M io.c | 47 +++++++++++++++++++++++++----… | |
M io.h | 2 +- | |
M main.c | 9 ++++++--- | |
M output.c | 4 ++-- | |
M terminal.c | 1 + | |
6 files changed, 50 insertions(+), 15 deletions(-) | |
--- | |
diff --git a/byote.h b/byote.h | |
t@@ -16,7 +16,7 @@ struct editor_config { | |
int cursor_x, cursor_y; | |
int screen_rows, screen_cols; | |
int num_rows; | |
- eRow row; | |
+ eRow *row; | |
struct termios orig_termios; | |
int status_height; | |
int mode; /* 0: normal, 1: insert, 2: visual */ | |
diff --git a/io.c b/io.c | |
t@@ -1,17 +1,48 @@ | |
+/* add feature test macro for getline compatibility */ | |
+#define _DEFAULT_SOURCE | |
+#define _BSD_SOURCE | |
+#define _GNU_SOURCE | |
+ | |
#include <stdlib.h> | |
+#include <stdio.h> | |
#include <sys/types.h> | |
#include <string.h> | |
#include "byote.h" | |
+#include "terminal.h" | |
+ | |
+void editor_append_row(char *s, size_t len) | |
+{ | |
+ int i; | |
+ | |
+ E.row = realloc(E.row, sizeof(eRow) * (E.num_rows + 1)); | |
+ i = E.num_rows; | |
+ E.row[i].size = len; | |
+ E.row[i].chars = malloc(len + 1); | |
+ memcpy(E.row[i].chars, s, len); | |
+ E.row[i].chars[len] = '\0'; | |
+ ++E.num_rows; | |
+} | |
void | |
-file_open() | |
+file_open(char *filename) | |
{ | |
- char *line = "Hello, world!"; | |
- ssize_t linelen = 13; | |
+ FILE *fp; | |
+ char *line; | |
+ size_t linecap; | |
+ ssize_t linelen; | |
+ | |
+ fp = fopen(filename, "r"); | |
+ if (!fp) | |
+ die("fopen in file_open"); | |
- E.row.size = linelen; | |
- E.row.chars = malloc(linelen + 1); | |
- memcpy(E.row.chars, line, linelen); | |
- E.row.chars[linelen] = '\0'; | |
- E.num_rows = 1; | |
+ line = NULL; | |
+ linecap = 0; | |
+ while ((linelen = getline(&line, &linecap, fp)) != -1) { | |
+ while (linelen > 0 && (line[linelen - 1] == '\n' || | |
+ line[linelen - 1] == '\r')) | |
+ linelen--; | |
+ editor_append_row(line, linelen); | |
+ } | |
+ free(line); | |
+ fclose(fp); | |
} | |
diff --git a/io.h b/io.h | |
t@@ -1,6 +1,6 @@ | |
#ifndef IO_H_ | |
#define IO_H_ | |
-void file_open(); | |
+void file_open(char *filename); | |
#endif | |
diff --git a/main.c b/main.c | |
t@@ -4,12 +4,15 @@ | |
#include "io.h" | |
int | |
-/* main(int argc, char* argv[]) */ | |
-main() | |
+main(int argc, char* argv[]) | |
{ | |
enable_raw_mode(); | |
init_editor(); | |
- file_open(); | |
+ | |
+ if (argc >= 2) { | |
+ file_open(argv[1]); | |
+ } | |
+ | |
while (1) { | |
editor_refresh_screen(); | |
editor_process_keypress(); | |
diff --git a/output.c b/output.c | |
t@@ -77,10 +77,10 @@ editor_draw_rows(struct abuf *ab) | |
for (y = 0; y < E.screen_rows; ++y) { | |
if (y < E.num_rows) { | |
- len = E.row.size; | |
+ len = E.row[y].size; | |
if (len > E.screen_cols) | |
len = E.screen_cols; | |
- ab_append(ab, E.row.chars, len); | |
+ ab_append(ab, E.row[y].chars, len); | |
} else { | |
if (y == E.screen_rows-1) | |
diff --git a/terminal.c b/terminal.c | |
t@@ -112,6 +112,7 @@ init_editor() { | |
E.cursor_y = 0; | |
E.mode = 0; | |
E.num_rows = 0; | |
+ E.row = NULL; | |
if (get_window_size(&E.screen_rows, &E.screen_cols) == -1) | |
die("get_window_size"); | |
} |