tOpen file with multiple lines - ve - a minimal text editor (work in progress)
(HTM) git clone git://src.adamsgaard.dk/ve
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
(DIR) commit fd944c194e43e14db7bf4fdaf5c5fbc726683c5e
(DIR) parent 980ae0e805b66f9a92d2c36a920a1b6380e227a4
(HTM) Author: Anders Damsgaard <anders@adamsgaard.dk>
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(-)
---
(DIR) 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 */
(DIR) 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);
}
(DIR) 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
(DIR) 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();
(DIR) 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)
(DIR) 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");
}